     1                                  ; ****************************************************************************
     2                                  ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.10
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Last Update: 25/07/2025 (Previous: 17/07/2025)
     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[3866]              	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[3466]              	mov	[mem_1m_1k], cx
   234 00000017 8916[3666]              	mov	[mem_16m_64k], dx
   235                                  	; 24/11/2023
   236 0000001B 8916[180F]              	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[D341]                	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[1A0F]              	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[3666]              	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[3666]              	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[3B66]          <1> 	inc	byte [hdc]	; count of hard disks (EDD present)
    49 00000112 8816[3A66]          <1>         mov     [last_drv], dl  ; last hard disk number
    50 00000116 BB[BE65]            <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[3C66]            <1> 	mov	si, fd0_type
    68                              <1> L3:
    69                              <1> 	; 14/01/2015
    70 00000127 8816[3966]          <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[3C66]          <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[3B66]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[3966]          <1>         mov     [drv], dl
   111 00000153 8816[3A66]          <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[3B66]          <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[3966]          <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[3966]          <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[BE65]          <1> 	add	bx, hd0_type - 80h
   190 000001C3 800F80              <1> 	or      byte [bx], 80h  ; present sign (when lower nibble is 0)
   191 000001C6 A0[3B66]            <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[3966]          <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[3966]          <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[BE65]          <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[3C66]          <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[5E66]          <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[4266]          <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[4466]          <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[BE65]00        <1> 	mov	byte [bx+hd0_type-80h], 0
   482 000002E2 808F[E065]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[E065]FE        <1> 	and	byte [bx+drv.status-7Eh], 0FEh
   501                              <1> 	; 'diskio' procedure will check this bit !
   502                              <1> L11b:
   503 000002F8 3A16[3A66]          <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[3966]          <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[5E66]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[4266]          <1> 	mov	[bx+drv.size], ax
   587 00000348 8997[4466]          <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[A865]                  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 B97A0A0000              	mov	ecx, (bss_end - bss_start)/4
   537                                  	;shr	ecx, 2 ; bss section is already aligned for double words
   538 000003B9 BF[077A0100]            	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[34660000]        	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[F87C0100]          	mov	[free_pages], ecx
   570 000003D9 668B15[36660000]        	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[36660000]        	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[F87C0100]          	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[F47C0100]            	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[087D0100]          	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[F07C0100]          	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[007D0100]            	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[087D0100]        	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[F87C0100]          	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[F47C0100]          	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[F87C0100]          	sub	[free_pages], ecx ; 07/11/2014
   724                                  	;
   725 000004CD 8B35[F07C0100]          	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[F07C0100]          	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[F47C0100]          	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[047D0100]            	mov	[first_page], eax
   804 00000538 A3[FC7C0100]            	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[F07C0100]                    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[9E3F0100]            	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[3C3C0100]            	mov	esi, ilist
   906 0000059A 8D3D[087A0100]          	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[AE0D0000]            	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[AE650000]        	lidt 	[idtd]
   953                                  	;
   954                                  	; TSS descriptor setup ; 24/03/2015
   955 000005F3 B8[887C0100]            	mov	eax, task_state_segment
   956 000005F8 66A3[5A650000]          	mov	[gdt_tss0], ax
   957 000005FE C1C010                  	rol	eax, 16
   958 00000601 A2[5C650000]            	mov	[gdt_tss1], al
   959 00000606 8825[5F650000]          	mov	[gdt_tss2], ah
   960 0000060C 66C705[EE7C0100]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[8C7C0100]          	mov	[tss.esp0], esp	; 90000h ; 29/11/2023
  1016                                  				; <-- 97000h ; 04/12/2023 (max. 3072 bytes)
  1017 00000622 66C705[907C0100]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 E8E81C0000              	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[B7790100]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 E8903A0000              	call	print_kmsg
  1158                                  
  1159                                  	;mov	ah, 07h
  1160                                  
  1161 000006AB BE[99790100]            	mov	esi, vesa_vbe3_bios_msg
  1162                                  	;call	print_kmsg
  1163 000006B0 E88C3A0000              	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[6CA30100]          	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[6A650000]            	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[92650000]            	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[9A650000]            	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[A2650000]            	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[6CA30100]          	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[6CA30100]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[D3410000]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[E4A20100]            	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 E84D390000              	call	default_lfb_info
  1538                                  dmi:
  1539                                  	; 06/11/2014
  1540 0000080A E8D3380000              	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[3E660000]          	mov	edx, [hd0_type] ; hd0, hd1, hd2, hd3
  1555 0000081B 668B1D[3C660000]        	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[423F0100]            	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 E8551A0000              	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[A2790100]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[84790100]            	mov	esi, vbe2_bochs_vbios ; BOCH/QEMU vbios msg
  1634 0000086D B40E                    	mov	ah, 0Eh  ; Yellow font
  1635 0000086F E8C7380000              	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[DD790100]            	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 E8CF450000              	CALL	DSKETTE_SETUP	; Initialize Floppy Disks
  1671                                  	;
  1672 000008A1 09D2                    	or	edx, edx
  1673 000008A3 740C                            jz      short di3
  1674                                  di2:
  1675 000008A5 E8FC450000              	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 E800380000              	call	setup_rtc_int	; 22/05/2015 (dsectrpm.s)
  1682                                  	;
  1683 000008B6 E81D350100              	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 E88E300000              	call	set_lfbinfo_table
  1728                                  
  1729                                  	;;;
  1730                                  	; 28/11/2023
  1731                                  	; 20/10/2023 - TRDOS 386 v2.0.7
  1732 000008D3 8B35[74A30100]          	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[F47C0100]          	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 E850590000              	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[B8890100]          	inc	byte [fpready]
  1761                                  	; 80387 (FPU) is ready
  1762 000008F6 DBE3                    	fninit ; Initialize Floating-Point Unit
  1763                                  sysinit:
  1764                                  	; 30/06/2015
  1765 000008F8 E84D630000              	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[1E7D0100]          	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[207D0100]          	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 E868190000              	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[D3410000]4F        	cmp	byte [edid], 4Fh
  1858 00000948 753B                    	jne	short CRT_monitor	
  1859                                  
  1860 0000094A BE[E4A20100]            	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[7A690000]            	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[84690000]            	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[BC950100]          	mov	[cr3reg], ecx ; save current cr3 register value/content
  1972                                  
  1973                                  	; 14/01/2017
  1974 000009A4 3B0D[F07C0100]          	cmp 	ecx, [k_page_dir]
  1975 000009AA 7409                    	je	short T3
  1976                                  
  1977 000009AC 8B0D[F07C0100]          	mov	ecx, [k_page_dir]
  1978 000009B2 0F22D9                  	mov	cr3, ecx
  1979                                  T3:
  1980                                  	;sti				; INTERRUPTS BACK ON
  1981 000009B5 66FF05[707D0100]        	INC	word [TIMER_LOW]	; INCREMENT TIME
  1982 000009BC 7507                    	JNZ	short T4		; GO TO TEST_DAY
  1983 000009BE 66FF05[727D0100]        	INC	word [TIMER_HIGH]	; INCREMENT HIGH WORD OF TIME
  1984                                  T4:					; TEST_DAY
  1985 000009C5 66833D[727D0100]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[707D0100]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[707D0100]            	mov	[TIMER_LH], eax
  1996                                  	;	
  1997 000009E1 C605[747D0100]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[777D0100]            	mov	al, [MOTOR_COUNT]
  2008 000009EF FEC8                    	dec	al
  2009                                  	;mov	[CS:MOTOR_COUNT], al	; DECREMENT DISKETTE MOTOR CONTROL
  2010 000009F1 A2[777D0100]            	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[767D0100]          	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 E85E040000              	call 	u_timer			; TRANSFER CONTROL TO A USER ROUTINE
  2032                                  	; 23/05/2016
  2033 00000A0C E876170100              	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                                  	;;;
  2041                                  	; 21/08/2024
  2042 00000A16 803D[89890100]FF        	cmp	byte [p_change], 0FFh ; CTRL+BREAK signature
  2043 00000A1D 7424                    	je	short T9 ; current program will be forced to sysrelease
  2044                                  	;;;
  2045                                  rtc_int_2:
  2046                                  	; 26/12/2016
  2047                                  	;mov	ecx, [cr3reg]
  2048                                  	; 13/01/2017
  2049 00000A1F 803D[24950100]00        	cmp	byte [u.t_lock], 0  	; T_LOCK
  2050 00000A26 7730                    	ja	short timer_int_return  ; Timer Lock : 'sysrele' is needed !
  2051                                  	; 28/02/2017
  2052                                  	; We need to exit if the user's IRQ callback service is in progress!
  2053                                  	; (To prevent a conflict!)
  2054 00000A28 803D[28950100]00        	cmp	byte [u.r_lock], 0	; R_LOCK, IRQ callback service lock !
  2055 00000A2F 7727                    	ja	short timer_int_return  ; Timer Lock : 'sysrele' is needed !	
  2056                                  	; 15/01/2017
  2057 00000A31 803D[88890100]02        	cmp	byte [priority], 2
  2058 00000A38 733A                    	jnb	short T8  ; current process has a timer event (15/01/2017)
  2059                                  	; 22/05/2016
  2060 00000A3A 803D[89890100]00        	cmp	byte [p_change], 0 ; in 'set_run_sequence', in 'rtc_p'
  2061 00000A41 7615                    	jna	short timer_int_return ; 23/05/2016
  2062                                  
  2063                                  	; 15/01/2017
  2064                                  	; present process must be changed with high priority process	
  2065                                  T9:		; 21/08/2024
  2066                                  	;xor	al, al
  2067 00000A43 31C0                    	xor	eax, eax ; 26/12/2016
  2068 00000A45 A2[89890100]            	mov	[p_change], al ; 0
  2069                                  	;mov	byte [priority], 2 ; 15/01/2017 (there is a timer event)
  2070                                  
  2071 00000A4A 803D[A0940100]FF        	cmp     byte [sysflg], 0FFh ; user or system space ?
  2072 00000A51 7416                    	je	short rtc_int_3     ; user space ([sysflg]= 0FFh)
  2073                                  
  2074                                  	; system space, wait for 'sysret'
  2075                                  	; to change running process 	
  2076                                  	; with high priority (event) process
  2077                                  
  2078 00000A53 A2[F4940100]            	mov	[u.quant], al ; 0
  2079                                  
  2080                                  timer_int_return: ; 23/05/2016 - jump from 'rtc_int' ('rtc_int_2')
  2081 00000A58 8B0D[BC950100]          	mov 	ecx, [cr3reg] 	; previous value/content of cr3 register
  2082 00000A5E 0F22D9                   	mov	cr3, ecx	; restore cr3 register content
  2083                                  	;
  2084 00000A61 61                      	popad ; edi, esi, ebp, temp (icrement esp by 4), ebx, edx, ecx, eax
  2085                                  	;
  2086 00000A62 0FA9                    	pop	gs
  2087 00000A64 0FA1                    	pop	fs
  2088 00000A66 07                      	pop	es
  2089 00000A67 1F                      	pop	ds
  2090                                  	;
  2091 00000A68 CF                      	iretd	; return from interrupt
  2092                                  
  2093                                  rtc_int_3:
  2094 00000A69 FE05[A0940100]          	inc	byte [sysflg] 	; now, we are in system space
  2095                                  	;
  2096 00000A6F E94DC40000                      jmp     sysrelease ; change running process immediatelly 
  2097                                  
  2098                                  T8:
  2099                                  	; 13/01/2017 (eax -> ebx)
  2100                                  	; callback checking... (19/12/2016)
  2101 00000A74 31DB                    	xor	ebx, ebx
  2102 00000A76 871D[20950100]          	xchg	ebx, [u.tcb] ; callback address (0 = normal return)
  2103 00000A7C 09DB                    	or	ebx, ebx
  2104 00000A7E 74D8                    	jz	short timer_int_return
  2105                                  
  2106                                  	; Set user's callback routine as return address from this interrupt
  2107                                  	; and set normal return address as return address from callback
  2108                                  	; routine!!! (19/12/2016)
  2109                                  	
  2110                                  	; 14/01/2017
  2111                                  	; 13/01/2017 - Timer Lock (T_LOCK)
  2112 00000A80 FE05[24950100]          	inc	byte [u.t_lock]
  2113 00000A86 8A0D[A0940100]          	mov	cl, [sysflg]
  2114 00000A8C 880D[25950100]          	mov	[u.t_mode], cl 
  2115                                  
  2116 00000A92 8B2D[8C7C0100]          	mov	ebp, [tss.esp0] ; kernel stack address (for ring 0)
  2117 00000A98 83ED14                  	sub	ebp, 20		; eip, cs, eflags, esp, ss
  2118 00000A9B 892D[A4940100]           	mov	[u.sp], ebp
  2119 00000AA1 8925[A8940100]          	mov	[u.usp], esp
  2120                                  
  2121                                  	;or	word [ebp+8], 200h ; 22/01/2017, force enabling interrupts
  2122                                  
  2123 00000AA7 8B44241C                	mov	eax, [esp+28] ; pushed eax
  2124 00000AAB A3[AC940100]            	mov	[u.r0], eax
  2125                                  
  2126 00000AB0 E8B7030100              	call	wswap ; save user's registers & status
  2127                                  
  2128                                  	; software int is in ring 0 but timer int must return to ring 3
  2129                                  	; so, ring 3 return address and stack registers
  2130                                  	; (eip, cs, eflags, esp, ss) 
  2131                                  	; must be copied to timer int return
  2132                                  	; eip will be replaced by callback service routine address
  2133                                  
  2134 00000AB5 C605[A0940100]FF        	mov	byte [sysflg], 0FFh ; user mode
  2135                                  
  2136                                  	; system mode (system call)
  2137                                  	;mov	ebp, [u.sp] ; EIP (u), CS (UCODE), EFLAGS (u),
  2138                                  			    ; ESP (u), SS (UDATA)
  2139                                  
  2140 00000ABC 8B4510                  	mov	eax, [ebp+16]	; SS (UDATA
  2141 00000ABF 89E6                    	mov	esi, esp
  2142 00000AC1 50                      	push	eax
  2143 00000AC2 50                      	push	eax
  2144 00000AC3 89E7                    	mov	edi, esp
  2145 00000AC5 893D[A8940100]          	mov	[u.usp], edi
  2146 00000ACB B908000000              	mov	ecx, ((ESPACE/4) - 4) ; except DS, ES, FS, GS
  2147 00000AD0 F3A5                    	rep	movsd
  2148 00000AD2 B104                    	mov	cl, 4	
  2149 00000AD4 F3AB                    	rep	stosd
  2150 00000AD6 893D[A4940100]          	mov	[u.sp], edi
  2151 00000ADC 89EE                    	mov	esi, ebp
  2152 00000ADE B105                    	mov	cl, 5 ; EIP (u), CS (UCODE), EFLAGS (u), ESP (u), SS (UDATA)
  2153 00000AE0 F3A5                    	rep	movsd
  2154                                  
  2155 00000AE2 8B0D[04950100]          	mov	ecx, [u.pgdir]
  2156 00000AE8 890D[BC950100]          	mov	[cr3reg], ecx
  2157                                  
  2158                                  	; 13/01/207 (eax -> ebx)
  2159                                  	; EBX = callback routine address (virtual, not physical address!)
  2160                                  
  2161                                  	; 09/01/2017
  2162                                  	; !!! CALLBACK ROUTINE MUST BE ENDED/RETURNED WITH 'sysrele'
  2163                                  	;     system call !!!	
  2164                                  	; 25/12/2016
  2165                                  	; Callback Note: (19/12/2016)
  2166                                  	; !!! CALLBACK ROUTINE MUST BE ENDED/RETURNED WITH 'RETN' !!!
  2167                                  	;	pushf ; save flags	
  2168                                  	; 	<callback service code>
  2169                                  	; 	popf  ; restore flags
  2170                                  	; 	retn ; return to normal running address
  2171                                  	;
  2172                                  
  2173                                  	; 15/01/2017
  2174                                  	; 14/01/2017
  2175                                  	; 13/01/2017 (eax -> ebx)
  2176                                  	; 10/01/2017
  2177                                  set_callback_addr:
  2178                                  	; 09/01/2017 (**)
  2179                                  	; 02/01/2017 (*)
  2180                                  	; 25/12/2016 (*)
  2181                                  	; 19/12/2016 (TRDOS 386 feature only!)
  2182                                  	;
  2183                                  	; This routine sets return address
  2184                                  	; to start of user's interrupt
  2185                                  	; service (callback) address
  2186                                  	;; and sets callback 'retn' address to normal
  2187                                  	;; return address of user's running code! 
  2188                                  	;
  2189                                  	; INPUT:
  2190                                  	;	EBX = callback routine/service address
  2191                                  	;	      (virtual, not physical address!)	
  2192                                  	;	[u.sp] = kernel stack, points to
  2193                                  	;		 user's EIP,CS,EFLAGS,ESP,SS
  2194                                  	;		 registers.
  2195                                  	; OUTPUT:
  2196                                  	;	EIP (user) = callback (service) address
  2197                                  	;	CS (user) = UCODE
  2198                                  	;	EFLAGS (user) = flags before callback 	 
  2199                                  	;       ESP (user) = ESP-4 (user, before callback) 
  2200                                  	;	[ESP](user) = EIP (user) before callback
  2201                                  	;
  2202                                  	; Note: If CPU was in user mode while entering 
  2203                                  	;	the timer interrupt service routine,
  2204                                  	;	'IRET' will get return to callback routine
  2205                                  	;	immediately. If CPU was in system/kernel mode  
  2206                                  	;	'iret' will get return to system call and
  2207                                  	;	then, callback routine will be return address
  2208                                  	;	from system call. (User's callback/service code
  2209                                  	;	will be able to return to normal return address
  2210                                  	;	via an 'retn' at the end.) 
  2211                                  	;
  2212                                  	; Note(**): User's callback service code must be ended
  2213                                  	;	with a 'sysrele' sytstem call ! (09/01/2017)
  2214                                  	;
  2215                                  	;	For example:
  2216                                  	;
  2217                                  	;	timer_callback:
  2218                                  	;	    ...	 
  2219                                    	;	    inc	dword [time_counter]
  2220                                  	;	    ...
  2221                                  	;	    mov eax, 39 ; 'sysrele'
  2222                                  	;	    int 40h ; TRDOS 386 system call (interrupt)		
  2223                                  	;
  2224                                  	;
  2225                                  	;; Note(*): User's callback service code must preserve cpu 
  2226                                  	;;	flags if it has any instructions which changes
  2227                                  	;;	flags in the service code. (25/12/2016)
  2228                                  	;;
  2229                                  	;;	For example:
  2230                                  	;;
  2231                                  	;;	timer_callback:
  2232                                  	;;	    pushf ; save flags
  2233                                  	;;	    ; this instruction changes zero flag
  2234                                    	;;	    inc	dword [time_counter]
  2235                                  	;;	    popf ; restore flags
  2236                                  	;;	    retn ; return to normal user code
  2237                                  	;;		  (which is interrupted by the 
  2238                                  	;;		   timer interput) 	
  2239                                  	;;
  2240                                  
  2241                                  	; 15/01/2017
  2242 00000AEE 8B2D[A4940100]          	mov	ebp, [u.sp]; kernel's stack, points to EIP (user)
  2243 00000AF4 895D00                  	mov	[ebp], ebx
  2244 00000AF7 E95CFFFFFF              	jmp	timer_int_return
  2245                                  
  2246                                  	; 15/01/2017
  2247                                  	; 13/01/2017
  2248                                  	; 19/12/2016
  2249                                  	; 06/06/2016
  2250                                  	; 23/05/2016
  2251                                  	; 22/05/2016
  2252                                  	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
  2253                                  	; 26/02/2015
  2254                                  	; 07/09/2014
  2255                                  	; 25/08/2014
  2256                                  rtc_int:       ; Real Time Clock Interrupt (IRQ 8)
  2257                                  	; 22/05/2016
  2258 00000AFC 1E                      	push	ds ; ** ; 23/05/2016
  2259 00000AFD 50                      	push	eax ; *
  2260 00000AFE 66B81000                	mov	ax, KDATA
  2261 00000B02 8ED8                    	mov	ds, ax
  2262                                  	;
  2263 00000B04 8A25[6E7D0100]          	mov	ah, [RTC_2Hz] ;  2 Hz interrupt to 1 Hz function
  2264 00000B0A 80F401                  	xor	ah, 1
  2265 00000B0D 8825[6E7D0100]          	mov	[RTC_2Hz], ah ; 1 = 0.5 second, 0 = 1 second
  2266 00000B13 753B                    	jnz	short rtc_int_return ; half second
  2267                                  	; 1 second
  2268                                  rtc_int_0:
  2269                                  	; 22/05/2016
  2270 00000B15 58                      	pop	eax ; *
  2271                                  	;
  2272                                  	; 14/10/2015 ('timer_int')
  2273                                  	; Here, we are simulating system call entry (for task switch)
  2274                                  	; (If multitasking is enabled, 
  2275                                  	; 'clock' procedure may jump to 'sysrelease')
  2276                                  	;push	ds ; ** ; 23/05/2016
  2277 00000B16 06                      	push	es
  2278 00000B17 0FA0                    	push	fs
  2279 00000B19 0FA8                    	push	gs
  2280 00000B1B 60                      	pushad  ; eax, ecx, edx, ebx, esp -before pushad-, ebp, esi, edi
  2281 00000B1C 66B91000                	mov     cx, KDATA
  2282                                          ;mov    ds, cx ; 06/06/2016
  2283 00000B20 8EC1                            mov     es, cx
  2284 00000B22 8EE1                            mov     fs, cx
  2285 00000B24 8EE9                            mov     gs, cx
  2286                                  	;
  2287 00000B26 0F20D9                  	mov	ecx, cr3
  2288 00000B29 890D[BC950100]          	mov	[cr3reg], ecx ; save current cr3 register value/content
  2289                                  	;
  2290 00000B2F 803D[24950100]00        	cmp	byte [u.t_lock], 0 ; timer lock (callback) status ?
  2291 00000B36 7711                    	ja	short rtc_int_1	   ; yes
  2292                                  
  2293                                  	; 15/01/2017
  2294 00000B38 3B0D[F07C0100]          	cmp 	ecx, [k_page_dir]
  2295 00000B3E 7409                    	je	short rtc_int_1
  2296                                  
  2297 00000B40 8B0D[F07C0100]          	mov	ecx, [k_page_dir]
  2298 00000B46 0F22D9                  	mov	cr3, ecx
  2299                                  rtc_int_1:
  2300                                  	; Timer event (kernel) functions must be performed with
  2301                                  	; 1 second intervals - TRDOS 386 (TRDOS v2.0) feature ! -
  2302                                   	;	
  2303                                  	; 25/08/2014
  2304 00000B49 E818030000              	call	rtc_p  ; 19/05/2016 - major modification 
  2305                                  	
  2306                                  	; 23/05/2016
  2307 00000B4E 28E4                    	sub	ah, ah ; 0
  2308                                  	; 22/05/2016 - TRDOS 386 timer event modifications
  2309                                  rtc_int_return: ; 19/05/2016
  2310                                  	; 22/02/2015 - dsectpm.s
  2311                                  	; [ source: http://wiki.osdev.org/RTC ]
  2312                                  	; read status register C to complete procedure
  2313                                  	;(it is needed to get a next IRQ 8) 
  2314 00000B50 B00C                    	mov	al, 0Ch ; 
  2315 00000B52 E670                    	out	70h, al ; select register C
  2316 00000B54 90                      	nop
  2317 00000B55 E471                    	in	al, 71h ; just throw away contents
  2318                                  	; 22/02/2015
  2319 00000B57 B020                    	MOV	AL,EOI		; END OF INTERRUPT
  2320                                  	;CLI			; DISABLE INTERRUPTS TILL STACK CLEARED
  2321 00000B59 E6A0                    	OUT	INTB00,AL	; FOR CONTROLLER #2
  2322                                  
  2323                                  	; 23/05/2016
  2324 00000B5B B020                    	MOV	AL,EOI		; GET END OF INTERRUPT MASK
  2325 00000B5D FA                      	CLI			; DISABLE INTERRUPTS TILL STACK CLEARED
  2326 00000B5E E620                    	OUT	INTA00,AL	; END OF INTERRUPT TO 8259 - 1	
  2327                                  	;
  2328                                  	; 23/05/2016
  2329 00000B60 20E4                    	and	ah, ah
  2330                                  	;jz	rtc_int_2
  2331                                  	; 24/07/2022
  2332 00000B62 7505                    	jnz	short rtc_int_4
  2333 00000B64 E9B6FEFFFF              	jmp	rtc_int_2
  2334                                  rtc_int_4:
  2335                                  	; ah = 1 (half second)
  2336 00000B69 58                      	pop	eax ; *
  2337 00000B6A 1F                      	pop	ds  ; **
  2338 00000B6B CF                      	iretd
  2339                                  
  2340                                  ; ////////////////
  2341                                  
  2342                                  	; 28/08/2014
  2343                                  irq0:
  2344 00000B6C 6A00                            push 	dword 0
  2345 00000B6E EB48                    	jmp	short which_irq
  2346                                  irq1:
  2347 00000B70 6A01                            push 	dword 1
  2348 00000B72 EB44                    	jmp	short which_irq
  2349                                  irq2:
  2350 00000B74 6A02                            push 	dword 2
  2351 00000B76 EB40                    	jmp	short which_irq
  2352                                  irq3:
  2353                                  	; 20/11/2015
  2354                                  	; 24/10/2015
  2355 00000B78 2EFF15[11230100]        	call	dword [cs:com2_irq3]
  2356 00000B7F 6A03                    	push 	dword 3
  2357 00000B81 EB35                    	jmp	short which_irq
  2358                                  irq4:
  2359                                  	; 20/11/2015
  2360                                  	; 24/10/2015
  2361 00000B83 2EFF15[0D230100]        	call	dword [cs:com1_irq4]
  2362 00000B8A 6A04                            push 	dword 4
  2363 00000B8C EB2A                    	jmp	short which_irq
  2364                                  irq5:
  2365 00000B8E 6A05                            push 	dword 5
  2366 00000B90 EB26                    	jmp	short which_irq
  2367                                  irq6:
  2368 00000B92 6A06                            push 	dword 6
  2369 00000B94 EB22                    	jmp	short which_irq
  2370                                  irq7:
  2371 00000B96 6A07                            push 	dword 7
  2372 00000B98 EB1E                    	jmp	short which_irq
  2373                                  irq8:
  2374 00000B9A 6A08                            push 	dword 8
  2375 00000B9C EB1A                    	jmp	short which_irq
  2376                                  irq9:
  2377 00000B9E 6A09                            push 	dword 9
  2378 00000BA0 EB16                    	jmp	short which_irq
  2379                                  irq10:
  2380 00000BA2 6A0A                            push 	dword 10
  2381 00000BA4 EB12                    	jmp	short which_irq
  2382                                  irq11:
  2383 00000BA6 6A0B                            push 	dword 11
  2384 00000BA8 EB0E                    	jmp	short which_irq
  2385                                  irq12:
  2386 00000BAA 6A0C                            push 	dword 12
  2387 00000BAC EB0A                    	jmp	short which_irq
  2388                                  irq13:
  2389 00000BAE 6A0D                            push 	dword 13
  2390 00000BB0 EB06                    	jmp	short which_irq
  2391                                  irq14:
  2392 00000BB2 6A0E                            push 	dword 14
  2393 00000BB4 EB02                    	jmp	short which_irq
  2394                                  irq15:
  2395 00000BB6 6A0F                            push 	dword 15
  2396                                  	;jmp	short which_irq
  2397                                  
  2398                                  	; 22/01/2017
  2399                                  	; 19/10/2015
  2400                                  	; 29/08/2014
  2401                                  	; 21/08/2014
  2402                                  which_irq:
  2403 00000BB8 870424                  	xchg	eax, [esp]  ; 28/08/2014
  2404 00000BBB 53                      	push	ebx
  2405 00000BBC 56                      	push	esi
  2406 00000BBD 57                      	push	edi
  2407 00000BBE 1E                      	push 	ds
  2408 00000BBF 06                      	push 	es
  2409                                  	;
  2410 00000BC0 88C3                    	mov	bl, al
  2411                                  	;
  2412 00000BC2 B810000000              	mov	eax, KDATA
  2413 00000BC7 8ED8                    	mov	ds, ax
  2414 00000BC9 8EC0                    	mov	es, ax
  2415                                  	; 19/10/2015
  2416 00000BCB FC                      	cld
  2417                                          ; 27/08/2014
  2418 00000BCC 8105[323C0100]A000-             add     dword [scr_row], 0A0h
  2418 00000BD4 0000               
  2419                                  	;
  2420 00000BD6 B417                    	mov	ah, 17h	; blue (1) background, 
  2421                                  			; light gray (7) forecolor
  2422 00000BD8 8B3D[323C0100]                  mov     edi, [scr_row]
  2423 00000BDE B049                    	mov	al, 'I'
  2424 00000BE0 66AB                    	stosw
  2425 00000BE2 B052                    	mov	al, 'R'
  2426 00000BE4 66AB                    	stosw
  2427 00000BE6 B051                    	mov	al, 'Q'
  2428 00000BE8 66AB                    	stosw
  2429 00000BEA B020                    	mov	al, ' '
  2430 00000BEC 66AB                    	stosw
  2431 00000BEE 88D8                    	mov	al, bl
  2432 00000BF0 3C0A                    	cmp	al, 10
  2433 00000BF2 7208                    	jb	short ii1
  2434 00000BF4 B031                    	mov	al, '1'
  2435 00000BF6 66AB                    	stosw
  2436 00000BF8 88D8                    	mov	al, bl
  2437 00000BFA 2C0A                    	sub	al, 10
  2438                                  ii1:
  2439 00000BFC 0430                    	add	al, '0'
  2440 00000BFE 66AB                    	stosw
  2441 00000C00 B020                    	mov	al, ' '
  2442 00000C02 66AB                    	stosw
  2443 00000C04 B021                    	mov	al, '!'
  2444 00000C06 66AB                    	stosw
  2445 00000C08 B020                    	mov	al, ' '
  2446 00000C0A 66AB                    	stosw
  2447                                  	; 23/02/2015
  2448 00000C0C 80FB07                  	cmp	bl, 7 ; check for IRQ 8 to IRQ 15 
  2449 00000C0F 7604                    	jna	ii2
  2450                                  	; 22/01/2017
  2451 00000C11 B020                    	mov	al, 20h  ; END OF INTERRUPT COMMAND TO
  2452 00000C13 E6A0                    	out	0A0h, al ; the 2nd 8259
  2453                                  ii2:
  2454 00000C15 B020                    	mov	al, 20h  ; END OF INTERRUPT COMMAND TO
  2455 00000C17 E620                    	out	20h, al ; the 2nd 8259
  2456 00000C19 E9CA010000              	jmp     iiret
  2457                                  	;
  2458                                  	; 22/08/2014
  2459                                  	;mov	al, 20h ; END OF INTERRUPT COMMAND TO 8259
  2460                                  	;out	20h, al	; 8259 PORT
  2461                                  	;
  2462                                  	;pop	es
  2463                                  	;pop	ds
  2464                                  	;pop	edi
  2465                                  	;pop	esi
  2466                                  	;pop	ebx
  2467                                  	;pop 	eax
  2468                                  	;iret
  2469                                  
  2470                                  	; 02/04/2015
  2471                                  	; 25/08/2014
  2472                                  exc0:
  2473 00000C1E 6A00                            push 	dword 0
  2474 00000C20 E990000000                      jmp     cpu_except
  2475                                  exc1:
  2476 00000C25 6A01                            push 	dword 1
  2477 00000C27 E989000000                      jmp     cpu_except
  2478                                  exc2:
  2479 00000C2C 6A02                            push 	dword 2
  2480 00000C2E E982000000                      jmp     cpu_except
  2481                                  exc3:
  2482 00000C33 6A03                            push 	dword 3
  2483 00000C35 EB7E                            jmp     cpu_except
  2484                                  exc4:
  2485 00000C37 6A04                            push 	dword 4
  2486 00000C39 EB7A                            jmp     cpu_except
  2487                                  exc5:
  2488 00000C3B 6A05                            push 	dword 5
  2489 00000C3D EB76                            jmp     cpu_except
  2490                                  exc6:
  2491 00000C3F 6A06                            push 	dword 6
  2492 00000C41 EB72                            jmp     cpu_except
  2493                                  exc7:
  2494 00000C43 6A07                            push 	dword 7
  2495 00000C45 EB6E                            jmp     cpu_except
  2496                                  exc8:
  2497                                  	; [esp] = Error code
  2498 00000C47 6A08                            push 	dword 8
  2499 00000C49 EB5C                            jmp     cpu_except_en
  2500                                  exc9:
  2501 00000C4B 6A09                            push 	dword 9
  2502 00000C4D EB66                            jmp     cpu_except
  2503                                  exc10:
  2504                                  	; [esp] = Error code
  2505 00000C4F 6A0A                            push 	dword 10
  2506 00000C51 EB54                            jmp     cpu_except_en
  2507                                  exc11:
  2508                                  	; [esp] = Error code
  2509 00000C53 6A0B                            push 	dword 11
  2510 00000C55 EB50                            jmp     cpu_except_en
  2511                                  exc12:
  2512                                  	; [esp] = Error code
  2513 00000C57 6A0C                            push 	dword 12
  2514 00000C59 EB4C                            jmp     cpu_except_en
  2515                                  exc13:
  2516                                  	; [esp] = Error code
  2517 00000C5B 6A0D                            push 	dword 13
  2518 00000C5D EB48                            jmp     cpu_except_en
  2519                                  exc14:
  2520                                  	; [esp] = Error code
  2521 00000C5F 6A0E                            push 	dword 14
  2522 00000C61 EB44                    	jmp	short cpu_except_en
  2523                                  exc15:
  2524 00000C63 6A0F                            push 	dword 15
  2525 00000C65 EB4E                            jmp     cpu_except
  2526                                  exc16:
  2527 00000C67 6A10                            push 	dword 16
  2528 00000C69 EB4A                            jmp     cpu_except
  2529                                  exc17:
  2530                                  	; [esp] = Error code
  2531 00000C6B 6A11                            push 	dword 17
  2532 00000C6D EB38                    	jmp	short cpu_except_en
  2533                                  exc18:
  2534 00000C6F 6A12                            push 	dword 18
  2535 00000C71 EB42                    	jmp	short cpu_except
  2536                                  exc19:
  2537 00000C73 6A13                            push 	dword 19
  2538 00000C75 EB3E                    	jmp	short cpu_except
  2539                                  exc20:
  2540 00000C77 6A14                            push 	dword 20
  2541 00000C79 EB3A                    	jmp	short cpu_except
  2542                                  exc21:
  2543 00000C7B 6A15                            push 	dword 21
  2544 00000C7D EB36                    	jmp	short cpu_except
  2545                                  exc22:
  2546 00000C7F 6A16                            push 	dword 22
  2547 00000C81 EB32                    	jmp	short cpu_except
  2548                                  exc23:
  2549 00000C83 6A17                            push 	dword 23
  2550 00000C85 EB2E                    	jmp	short cpu_except
  2551                                  exc24:
  2552 00000C87 6A18                            push 	dword 24
  2553 00000C89 EB2A                    	jmp	short cpu_except
  2554                                  exc25:
  2555 00000C8B 6A19                            push 	dword 25
  2556 00000C8D EB26                    	jmp	short cpu_except
  2557                                  exc26:
  2558 00000C8F 6A1A                            push 	dword 26
  2559 00000C91 EB22                    	jmp	short cpu_except
  2560                                  exc27:
  2561 00000C93 6A1B                            push 	dword 27
  2562 00000C95 EB1E                    	jmp	short cpu_except
  2563                                  exc28:
  2564 00000C97 6A1C                            push 	dword 28
  2565 00000C99 EB1A                    	jmp	short cpu_except
  2566                                  exc29:
  2567 00000C9B 6A1D                            push 	dword 29
  2568 00000C9D EB16                    	jmp	short cpu_except
  2569                                  exc30:
  2570 00000C9F 6A1E                            push 	dword 30
  2571 00000CA1 EB04                    	jmp	short cpu_except_en
  2572                                  exc31:
  2573 00000CA3 6A1F                            push 	dword 31
  2574 00000CA5 EB0E                            jmp     short cpu_except
  2575                                  
  2576                                  	; 19/10/2015
  2577                                  	; 19/09/2015
  2578                                  	; 01/09/2015
  2579                                  	; 28/08/2015
  2580                                  	; 28/08/2014
  2581                                  cpu_except_en:
  2582 00000CA7 87442404                	xchg	eax, [esp+4] ; Error code
  2583 00000CAB 36A3[C0960100]          	mov	[ss:error_code], eax
  2584 00000CB1 58                      	pop	eax  ; Exception number
  2585 00000CB2 870424                  	xchg	eax, [esp]
  2586                                  		; eax = eax before exception
  2587                                  		; [esp] -> exception number
  2588                                  		; [esp+4] -> EIP to return
  2589                                  	; 22/01/2017
  2590                                  	; 19/10/2015
  2591                                  	; 19/09/2015
  2592                                  	; 01/09/2015
  2593                                  	; 28/08/2015
  2594                                  	; 29/08/2014
  2595                                  	; 28/08/2014
  2596                                  	; 25/08/2014
  2597                                  	; 21/08/2014
  2598                                  cpu_except:	; CPU Exceptions
  2599 00000CB5 FC                      	cld
  2600 00000CB6 870424                  	xchg	eax, [esp] 
  2601                                  		; eax = Exception number
  2602                                  		; [esp] = eax (before exception)	
  2603 00000CB9 53                      	push	ebx
  2604 00000CBA 56                      	push	esi
  2605 00000CBB 57                      	push	edi
  2606 00000CBC 1E                      	push 	ds
  2607 00000CBD 06                      	push 	es
  2608                                  	; 28/08/2015
  2609 00000CBE 66BB1000                	mov	bx, KDATA
  2610 00000CC2 8EDB                    	mov	ds, bx
  2611 00000CC4 8EC3                    	mov	es, bx
  2612 00000CC6 0F20DB                  	mov	ebx, cr3
  2613 00000CC9 53                      	push	ebx ; (*) page directory
  2614                                  	; 19/10/2015
  2615 00000CCA FC                      	cld
  2616                                  	; 25/03/2015
  2617 00000CCB 8B1D[F07C0100]          	mov	ebx, [k_page_dir]
  2618 00000CD1 0F22DB                  	mov	cr3, ebx
  2619                                  	; 28/08/2015
  2620 00000CD4 83F80E                  	cmp	eax, 0Eh ; 14, PAGE FAULT	
  2621 00000CD7 7510                    	jne	short cpu_except_nfp
  2622 00000CD9 E8A94D0000              	call	page_fault_handler
  2623 00000CDE 21C0                    	and 	eax, eax
  2624                                  	;jz	iiretp ; 01/09/2015
  2625                                  	; 24/07/2022
  2626 00000CE0 7505                    	jnz	short cpu_except_pf
  2627 00000CE2 E9FD000000              	jmp	iiretp
  2628                                  cpu_except_pf:	; 24/07/2022
  2629 00000CE7 B00E                    	mov	al, 0Eh ; 14
  2630                                  cpu_except_nfp:
  2631                                  	; 23/08/2016
  2632 00000CE9 803D[DE670000]03        	cmp	byte [CRT_MODE], 3
  2633 00000CF0 7409                    	je	short cpu_except_mode_3
  2634 00000CF2 50                      	push	eax
  2635 00000CF3 B003                    	mov	al, 3
  2636 00000CF5 E8490E0000              	call	_set_mode
  2637 00000CFA 58                      	pop	eax
  2638                                  cpu_except_mode_3:
  2639                                  	; 02/04/2015
  2640 00000CFB BB[FD080000]            	mov	ebx, hang
  2641 00000D00 875C241C                	xchg	ebx, [esp+28]
  2642                                  		; EIP (points to instruction which faults)
  2643                                  	  	; New EIP (hang)
  2644 00000D04 891D[C4960100]          	mov	[FaultOffset], ebx
  2645 00000D0A C744242008000000        	mov	dword [esp+32], KCODE ; kernel's code segment
  2646 00000D12 814C242400020000        	or	dword [esp+36], 200h ; enable interrupts (set IF)
  2647                                  	;
  2648 00000D1A 88C4                    	mov	ah, al
  2649 00000D1C 240F                    	and	al, 0Fh
  2650 00000D1E 3C09                    	cmp	al, 9
  2651 00000D20 7602                    	jna	short h1ok
  2652 00000D22 0407                    	add	al, 'A'-':'
  2653                                  h1ok:
  2654 00000D24 C0EC04                  	shr	ah, 4
  2655 00000D27 80FC09                  	cmp	ah, 9
  2656 00000D2A 7603                    	jna	short h2ok
  2657 00000D2C 80C407                  	add	ah, 'A'-':'
  2658                                  h2ok:	
  2659 00000D2F 86E0                    	xchg 	ah, al	
  2660 00000D31 66053030                	add	ax, '00'
  2661 00000D35 66A3[8C3E0100]          	mov	[excnstr], ax
  2662                                  	;
  2663                                  	; 29/08/2014
  2664 00000D3B A1[C4960100]            	mov	eax, [FaultOffset]
  2665 00000D40 51                      	push	ecx
  2666 00000D41 52                      	push	edx
  2667 00000D42 89E3                    	mov	ebx, esp
  2668                                  	; 28/08/2015
  2669 00000D44 B910000000              	mov	ecx, 16	  ; divisor value to convert binary number
  2670                                  			  ; to hexadecimal string
  2671                                  	;mov	ecx, 10	    ; divisor to convert	
  2672                                  			    ; binary number to decimal string
  2673                                  b2d1:
  2674 00000D49 31D2                    	xor	edx, edx
  2675 00000D4B F7F1                    	div	ecx
  2676                                  	;push	dx
  2677                                  	; 18/04/2021
  2678 00000D4D 52                      	push	edx
  2679 00000D4E 39C8                    	cmp	eax, ecx
  2680 00000D50 73F7                    	jnb	short b2d1
  2681 00000D52 BF[973E0100]            	mov	edi, EIPstr ; EIP value
  2682                                  			    ; points to instruction which faults	
  2683                                  	; 28/08/2015
  2684 00000D57 89C2                    	mov	edx, eax
  2685                                  b2d2:
  2686                                  	;add	al, '0'
  2687 00000D59 8A82[C3410000]          	mov	al, [edx+hexchrs]
  2688 00000D5F AA                      	stosb		    ; write hexadecimal digit to its place	
  2689 00000D60 39E3                    	cmp	ebx, esp
  2690 00000D62 7605                    	jna	short b2d3
  2691                                  	;pop	ax
  2692                                  	; 18/04/2021
  2693 00000D64 58                      	pop	eax
  2694 00000D65 88C2                    	mov	dl, al
  2695 00000D67 EBF0                    	jmp	short b2d2
  2696                                  b2d3:
  2697 00000D69 B068                    	mov 	al, 'h' ; 28/08/2015
  2698 00000D6B AA                      	stosb
  2699 00000D6C B020                    	mov	al, 20h	    ; space
  2700 00000D6E AA                      	stosb
  2701 00000D6F 30C0                    	xor	al, al	    ; to do it an ASCIIZ string	
  2702 00000D71 AA                      	stosb
  2703                                  	;
  2704 00000D72 5A                      	pop	edx
  2705 00000D73 59                      	pop	ecx
  2706                                  	;
  2707 00000D74 B44F                    	mov	ah, 4Fh	; red (4) background, 
  2708                                  			; white (F) forecolor
  2709 00000D76 BE[7C3E0100]            	mov	esi, exc_msg ; message offset
  2710                                  	;
  2711                                  	; 20/01/2017 (!cpu exception!)
  2712                                  	;
  2713 00000D7B 8105[323C0100]A000-             add	dword [scr_row], 0A0h
  2713 00000D83 0000               
  2714 00000D85 8B3D[323C0100]                  mov	edi, [scr_row]
  2715                                  	;	
  2716 00000D8B C605[A0940100]00        	mov	byte [sysflg], 0  ; system mode
  2717 00000D92 FB                              sti
  2718                                  	;
  2719 00000D93 E89FFBFFFF              	call 	printk
  2720                                  	;
  2721 00000D98 B410                    	mov	ah, 10h
  2722 00000D9A E87D010000              	call	int16h ; getc
  2723                                  	;
  2724 00000D9F B003                    	mov	al, 3
  2725 00000DA1 E89D0D0000              	call	_set_mode
  2726                                  	;
  2727                                  	;mov	eax, 1
  2728                                  	; 30/11/2023
  2729 00000DA6 31C0                    	xor	eax, eax
  2730 00000DA8 40                      	inc	eax
  2731                                  	; eax = 1	
  2732 00000DA9 E930C20000              	jmp	sysexit ; terminate process !!!
  2733                                  	
  2734                                  	; 22/01/2017
  2735                                  	; 18/04/2016
  2736                                  	; 28/08/2015
  2737                                  	; 23/02/2015
  2738                                  	; 20/08/2014
  2739                                  ignore_int:
  2740 00000DAE 50                      	push	eax
  2741 00000DAF 53                      	push	ebx ; 23/02/2015
  2742 00000DB0 56                      	push	esi
  2743 00000DB1 57                      	push	edi
  2744 00000DB2 1E                      	push 	ds
  2745 00000DB3 06                      	push 	es
  2746                                  	; 18/04/2016
  2747 00000DB4 66B81000                	mov	ax, KDATA
  2748 00000DB8 8ED8                    	mov	ds, ax
  2749 00000DBA 8EC0                    	mov	es, ax
  2750                                  	; 28/08/2015
  2751 00000DBC 0F20D8                  	mov	eax, cr3
  2752 00000DBF 50                      	push	eax ; (*) page directory
  2753                                  	;
  2754 00000DC0 B467                    	mov	ah, 67h	; brown (6) background, 
  2755                                  			; light gray (7) forecolor
  2756 00000DC2 BE[443D0100]            	mov	esi, int_msg ; message offset
  2757                                  piemsg:
  2758                                          ; 27/08/2014
  2759 00000DC7 8105[323C0100]A000-             add     dword [scr_row], 0A0h
  2759 00000DCF 0000               
  2760 00000DD1 8B3D[323C0100]                  mov     edi, [scr_row]
  2761                                          ;
  2762 00000DD7 E85BFBFFFF              	call 	printk
  2763                                  	;
  2764                                  	; 23/02/2015
  2765 00000DDC B020                    	mov	al, 20h  ; END OF INTERRUPT COMMAND TO
  2766 00000DDE E6A0                    	out	0A0h, al ; the 2nd 8259
  2767                                  	; 22/08/2014
  2768 00000DE0 B020                    	mov	al, 20h ; END OF INTERRUPT COMMAND TO 8259
  2769 00000DE2 E620                    	out	20h, al	; 8259 PORT
  2770                                  iiretp: 
  2771                                  	; 22/01/2017
  2772                                  	; 01/09/2015
  2773                                  	; 28/08/2015
  2774 00000DE4 58                      	pop	eax ; (*) page directory
  2775 00000DE5 0F22D8                  	mov	cr3, eax
  2776                                  iiret:
  2777 00000DE8 07                      	pop	es
  2778 00000DE9 1F                      	pop	ds
  2779 00000DEA 5F                      	pop	edi
  2780 00000DEB 5E                      	pop	esi
  2781 00000DEC 5B                      	pop	ebx ; 29/08/2014
  2782 00000DED 58                      	pop 	eax
  2783 00000DEE CF                      	iretd
  2784                                  
  2785                                  	; 23/05/2016
  2786                                  	; 22/08/2014
  2787                                  	; IBM PC/AT BIOS source code ----- 10/06/85 (bios.asm)
  2788                                  	; (INT 1Ah)
  2789                                  	;; Linux (v0.12) source code (main.c) by Linus Torvalds (1991)
  2790                                  time_of_day:
  2791 00000DEF E8E3560000              	call	UPD_IPR			; WAIT TILL UPDATE NOT IN PROGRESS
  2792 00000DF4 726F                            jc      short time_of_day_retn ; 23/05/2016
  2793 00000DF6 B000                    	mov	al, CMOS_SECONDS
  2794 00000DF8 E810570000              	call	CMOS_READ
  2795 00000DFD A2[607D0100]            	mov	[time_seconds], al 
  2796 00000E02 B002                    	mov	al, CMOS_MINUTES
  2797 00000E04 E804570000              	call	CMOS_READ
  2798 00000E09 A2[617D0100]            	mov	[time_minutes], al 
  2799 00000E0E B004                    	mov	al, CMOS_HOURS
  2800 00000E10 E8F8560000              	call	CMOS_READ
  2801 00000E15 A2[627D0100]                    mov     [time_hours], al
  2802 00000E1A B006                    	mov	al, CMOS_DAY_WEEK 
  2803 00000E1C E8EC560000              	call	CMOS_READ
  2804 00000E21 A2[637D0100]            	mov	[date_wday], al
  2805 00000E26 B007                     	mov	al, CMOS_DAY_MONTH
  2806 00000E28 E8E0560000              	call	CMOS_READ
  2807 00000E2D A2[647D0100]            	mov	[date_day], al
  2808 00000E32 B008                    	mov	al, CMOS_MONTH
  2809 00000E34 E8D4560000              	call	CMOS_READ
  2810 00000E39 A2[657D0100]            	mov	[date_month], al
  2811 00000E3E B009                    	mov	al, CMOS_YEAR
  2812 00000E40 E8C8560000              	call	CMOS_READ
  2813 00000E45 A2[667D0100]            	mov	[date_year], al
  2814 00000E4A B032                    	mov	al, CMOS_CENTURY
  2815 00000E4C E8BC560000              	call	CMOS_READ
  2816 00000E51 A2[677D0100]            	mov	[date_century], al
  2817                                  	;
  2818 00000E56 B000                    	mov	al, CMOS_SECONDS
  2819 00000E58 E8B0560000              	call 	CMOS_READ
  2820 00000E5D 3A05[607D0100]          	cmp	al, [time_seconds]
  2821 00000E63 758A                    	jne	short time_of_day
  2822                                  
  2823                                  time_of_day_retn:
  2824 00000E65 C3                      	retn
  2825                                  
  2826                                  	; 15/01/2017
  2827                                  	; 10/06/2016
  2828                                  	; 07/06/2016
  2829                                  	; 06/06/2016
  2830                                  	; 23/05/2016
  2831                                  rtc_p:
  2832 00000E66 B101                    	mov	cl, 1 ; 15/01/2017
  2833 00000E68 EB02                    	jmp	short rtc_p0
  2834                                  u_timer: 
  2835                                  	; Timer Events with 18.2 Hz Timer Ticks
  2836                                  	; (and also timer events with RTC seconds)
  2837 00000E6A 28C9                    	sub	cl, cl ; mov cl, 0 ; 15/01/2017
  2838                                  rtc_p0:
  2839                                  	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
  2840                                  	; Major Modification:
  2841                                  	; Check and Perform Timer Events (for RTC)
  2842                                  	; 25/08/2014 - 07/09/2014
  2843                                  	; Retro UNIX 386 v1:
  2844                                   	; Print Real Time Clock content
  2845                                  	
  2846                                  	; 15/01/2017
  2847 00000E6C 880D[88890100]          	mov	byte [priority], cl ; 0 or 1 (not 2)
  2848 00000E72 8A2D[8B890100]          	mov	ch, [timer_events]
  2849 00000E78 20ED                    	and	ch, ch
  2850 00000E7A 7420                    	jz	short rtc_p3
  2851                                  
  2852 00000E7C BE[C0950100]            	mov	esi, timer_set  ; beginning address of
  2853                                  				; timer events space
  2854                                  rtc_p1:
  2855 00000E81 8B06                    	mov	eax, [esi]	
  2856 00000E83 20C0                    	and	al, al ; 0 = free, >0 = process no.
  2857 00000E85 7416                    	jz	short rtc_p4
  2858                                  	;
  2859 00000E87 C1C810                  	ror	eax, 16
  2860                                  	; ah = response value, al = interrupt type
  2861                                  	; 15/01/2017
  2862                                  	; cl = interrupt source
  2863                                  	;       1 = RTC, 0 = PIT  	 	
  2864 00000E8A 38C8                    	cmp	al, cl 
  2865 00000E8C 750A                    	jne	short rtc_p2 ; not as requested or undefined !
  2866 00000E8E 3C01                    	cmp	al, 1 ; 1 ; RTC interrupt ?
  2867 00000E90 7410                    	je	short rtc_p5 ; yes, check for response
  2868                                  	; 06/06/2016 - 18.2 Hz Timer Ticks
  2869 00000E92 836E080A                	sub	dword [esi+8], 10 ; 1 tick = 10
  2870 00000E96 7613                    	jna	short rtc_p6  ; continue for responding
  2871                                  rtc_p2:
  2872                                  	; 15/01/2017 (cl -> ch)
  2873                                  	; 07/06/2016
  2874 00000E98 FECD                    	dec	ch    ; remain count of timer events	
  2875 00000E9A 7501                    	jnz	short rtc_p4
  2876                                  rtc_p3:	 
  2877 00000E9C C3                      	retn
  2878                                  rtc_p4:	
  2879                                  	;cmp	esi, timer_set + 240 ; 15*16 (last event)
  2880                                  	;jnb	short rtc_p3 ; end of timer event space
  2881 00000E9D 83C610                  	add	esi, 16 ; next timer event
  2882 00000EA0 EBDF                    	jmp	short rtc_p1
  2883                                  rtc_p5:	 
  2884                                  	; current timer count ; 06/06/2016 (182)
  2885 00000EA2 816E08B6000000          	sub	dword [esi+8], 182 ; 1 second (10*18.2)
  2886 00000EA9 77ED                    	ja	short rtc_p2  ; check for the next 
  2887                                  rtc_p6:	
  2888                                  	; it is the time of response! 
  2889 00000EAB 8B5E04                  	mov	ebx, [esi+4] ; set (count limit) value
  2890 00000EAE 895E08                  	mov	[esi+8], ebx ; reset count down value
  2891                                  			     ; to count limit
  2892                                  	; 19/12/2016
  2893                                  	; 10/12/2016 - timer callback modification
  2894 00000EB1 8B7E0C                  	mov	edi, [esi+12] ; response (or callback) address	
  2895 00000EB4 807E0100                	cmp	byte [esi+1], 0 ; >0 = callback
  2896 00000EB8 762A                    	jna	short rtc_p8
  2897                                  
  2898                                  	; timer callback !
  2899 00000EBA 0FB61E                  	movzx	ebx, byte [esi] ; process number (>0)
  2900 00000EBD 89D8                    	mov	eax, ebx
  2901 00000EBF C0E302                  	shl	bl, 2 ; *4
  2902 00000EC2 89BB[3C940100]          	mov	[ebx+p.tcb-4], edi ; user's callback service addr
  2903 00000EC8 3A05[FD940100]          	cmp	al, [u.uno]
  2904 00000ECE 7521                    	jne	short rtc_p9
  2905 00000ED0 893D[20950100]          	mov	[u.tcb], edi
  2906                                  rtc_p7:
  2907                                  	; 15/01/2017
  2908 00000ED6 B002                    	mov	al, 2
  2909 00000ED8 A2[88890100]            	mov	[priority], al ; 2
  2910                                  	; 10/01/2017
  2911                                  	;mov	byte [u.pri], 2
  2912 00000EDD A2[F6940100]            	mov	[u.pri], al ; 2
  2913 00000EE2 EBB4                    	jmp	short rtc_p2
  2914                                  rtc_p8:
  2915                                  	; response address is physical address of
  2916                                  	; the program's response (signal return) byte
  2917                                  	; 06/06/2016
  2918                                  	;mov	edi, [esi+12] ; response address
  2919 00000EE4 8827                    	mov	[edi], ah     ; response value 
  2920                                  	;
  2921 00000EE6 C1C010                  	rol	eax, 16
  2922                                  	; 15/01/2017
  2923 00000EE9 3A05[FD940100]          	cmp	al, [u.uno] ; running process ?
  2924 00000EEF 74E5                    	je	short rtc_p7
  2925                                  rtc_p9:
  2926                                  	; al = process number  ; 10/06/2016
  2927 00000EF1 B202                    	mov	dl, 2 ; priority, 2 = event (high)	
  2928 00000EF3 E844120100              	call	set_run_sequence ; 19/05/2016
  2929 00000EF8 EB9E                    	jmp	short rtc_p2 ; 10/06/2016
  2930                                  
  2931                                  ; Default IRQ 7 handler against spurious IRQs (from master PIC)
  2932                                  ; 25/02/2015 (source: http://wiki.osdev.org/8259_PIC)
  2933                                  default_irq7:
  2934                                  	;push	ax
  2935                                  	; 18/04/2021
  2936 00000EFA 50                      	push	eax
  2937 00000EFB B00B                    	mov	al, 0Bh  ; In-Service register
  2938 00000EFD E620                    	out	20h, al
  2939 00000EFF EB00                            jmp short $+2
  2940 00000F01 EB00                    	jmp short $+2
  2941 00000F03 E420                    	in	al, 20h
  2942 00000F05 2480                    	and 	al, 80h ; bit 7 (is it real IRQ 7 or fake?)
  2943 00000F07 7404                            jz      short irq7_iret ; Fake (spurious) IRQ, do not send EOI 
  2944 00000F09 B020                            mov     al, 20h ; EOI
  2945 00000F0B E620                    	out	20h, al 
  2946                                  irq7_iret:
  2947                                  	;pop	ax
  2948                                  	; 18/04/2021
  2949 00000F0D 58                      	pop	eax
  2950 00000F0E CF                      	iretd
  2951                                  	
  2952                                  bcd_to_ascii:
  2953                                  	; 25/08/2014
  2954                                  	; INPUT ->
  2955                                  	;	al = Packed BCD number
  2956                                  	; OUTPUT ->
  2957                                  	;	ax  = ASCII word/number
  2958                                  	;
  2959                                  	; Erdogan Tan - 1998 (proc_hex) - TRDOS.ASM (2004-2011)
  2960                                  	;
  2961 00000F0F D410                    	db	0D4h, 10h	; Undocumented inst. AAM
  2962                                  				; AH = AL / 10h
  2963                                  				; AL = AL MOD 10h
  2964 00000F11 660D3030                	or	ax, '00'	; Make it ASCII based
  2965                                  
  2966 00000F15 86E0                            xchg	ah, al 
  2967                                  	
  2968 00000F17 C3                      	retn
  2969                                  
  2970                                  ; 15/12/2020
  2971                                  real_mem_16m_64k: 
  2972 00000F18 0000                    	dw	0	; Real size of system memory (if > 16MB)
  2973                                  			; as number of 64K blocks - 256
  2974                                  			; (This is for saving real system memory
  2975                                  			; because if system memory is larger than
  2976                                  			; 3 GB and if a VESA VBE video bios
  2977                                  			; is detected, 'mem_16m_64K' may be
  2978                                  			; decreased to reserve LFB space 
  2979                                  			; at the end of system memory.)
  2980                                  			; Upper memory space from LFB base address
  2981                                  			; to 4GB will not be included by M.A.T.
  2982                                  def_LFB_addr:	
  2983 00000F1A 0000                    	dw	0 	; HW of default LFB addr (for mode 118h)	
  2984                                  	
  2985                                  
  2986                                  %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 00000F1C 9C                  <1> 	pushfd	; 28/08/2014
    42 00000F1D 0E                  <1> 	push 	cs
    43 00000F1E E826000000          <1> 	call 	KEYBOARD_IO_1 ; getc_int
    44 00000F23 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 00000F24 8A25[AA670000]      <1> 	mov	ah, [KB_FLAG_1]		; GET SYSTEM SHIFT KEY STATUS
    51 00000F2A 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 00000F2D C0E405              <1>         shl	ah, 5
    55 00000F30 A0[AA670000]        <1> 	mov	al, [KB_FLAG_1]		; GET SYSTEM SHIFT STATES BACK
    56 00000F35 2473                <1> 	and	al, 01110011b		; ELIMINATE SYS SHIFT, HOLD_STATE AND INS_SHIFT
    57 00000F37 08C4                <1> 	or	ah, al                  ; MERGE REMAINING BITS INTO AH
    58 00000F39 A0[AC670000]        <1> 	mov	al, [KB_FLAG_3]		; GET RIGHT CTL AND ALT
    59 00000F3E 240C                <1> 	and	al, 00001100b		; ELIMINATE LC_E0 AND LC_E1
    60 00000F40 08C4                <1> 	or	ah, al			; OR THE SHIFT FLAGS TOGETHER
    61                              <1> _K3:
    62 00000F42 A0[A9670000]        <1> 	mov	al, [KB_FLAG]		; GET THE SHIFT STATUS FLAGS
    63                              <1> 	; 24/07/2022
    64 00000F47 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 00000F49 80642408BE          <1>         and     byte [esp+8], 10111110b ; clear zero flag and cary flag
   171                              <1> 	;
   172 00000F4E 1E                  <1> 	push	ds			; SAVE CURRENT DS
   173 00000F4F 53                  <1> 	push	ebx			; SAVE BX TEMPORARILY
   174                              <1> 	;push	ecx			; SAVE CX TEMPORARILY
   175 00000F50 66BB1000            <1>         mov     bx, KDATA
   176 00000F54 8EDB                <1> 	mov	ds, bx			; PUT SEGMENT VALUE OF DATA AREA INTO DS
   177                              <1> 	; 14/01/2017
   178 00000F56 8B1C24              <1> 	mov	ebx, [esp]
   179                              <1> 	;; 15/01/2017
   180                              <1> 	; 02/01/2017
   181                              <1> 	;;mov	byte [intflg], 32h	; keyboard interrupt 
   182 00000F59 FB                  <1> 	sti
   183                              <1> 	;
   184 00000F5A 08E4                <1> 	or	ah, ah			; CHECK FOR (AH)= 00H
   185 00000F5C 7433                <1> 	jz	short _K1		; ASCII_READ
   186 00000F5E FECC                <1> 	dec	ah                      ; CHECK FOR (AH)= 01H
   187 00000F60 744C                <1>         jz      short _K2               ; ASCII_STATUS
   188 00000F62 FECC                <1> 	dec	ah			; CHECK FOR (AH)= 02H
   189 00000F64 74DC                <1>         jz	short _K3		; SHIFT STATUS
   190 00000F66 FECC                <1> 	dec	ah			; CHECK FOR (AH)= 03H	
   191 00000F68 746F                <1>         jz      short _K300		; SET TYPAMATIC RATE/DELAY
   192 00000F6A 80EC02              <1> 	sub	ah, 2			; CHECK FOR (AH)= 05H	
   193                              <1>         ;jz	short _K500		; KEYBOARD WRITE
   194                              <1> 	; 07/08/2022
   195 00000F6D 7505                <1> 	jnz	short _KIO1
   196 00000F6F E988000000          <1> 	jmp	_K500         
   197                              <1> _KIO1:	
   198 00000F74 80EC0B              <1> 	sub	ah, 11			; AH =  10H
   199 00000F77 740C                <1> 	jz	short _K1E		; EXTENDED ASCII READ
   200 00000F79 FECC                <1> 	dec	ah			; CHECK FOR (AH)= 11H
   201 00000F7B 7422                <1> 	jz	short _K2E		; EXTENDED_ASCII_STATUS
   202 00000F7D FECC                <1> 	dec	ah			; CHECK FOR (AH)= 12H
   203 00000F7F 74A3                <1> 	jz	short _K3E		; EXTENDED_SHIFT_STATUS
   204                              <1> _KIO_EXIT:
   205                              <1> 	; 02/01/2017
   206 00000F81 FA                  <1> 	cli
   207                              <1> 	;;mov	byte [intflg], 0 ;; 15/01/2017
   208                              <1> 	;
   209                              <1> 	;pop	ecx			; RECOVER REGISTER
   210 00000F82 5B                  <1> 	pop	ebx			; RECOVER REGISTER
   211 00000F83 1F                  <1> 	pop	ds			; RECOVER SEGMENT
   212 00000F84 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 00000F85 E89F000000          <1> 	call	_K1S			; GET A CHARACTER FROM THE BUFFER (EXTENDED)
   237 00000F8A E812010000          <1> 	call	_KIO_E_XLAT		; ROUTINE TO XLATE FOR EXTENDED CALLS
   238 00000F8F EBF0                <1> 	jmp	short _KIO_EXIT         ; GIVE IT TO THE CALLER
   239                              <1> _K1:	
   240 00000F91 E893000000          <1> 	call	_K1S			; GET A CHARACTER FROM THE BUFFER
   241 00000F96 E811010000          <1> 	call	_KIO_S_XLAT		; ROUTINE TO XLATE FOR STANDARD CALLS
   242 00000F9B 72F4                <1> 	jc	short _K1		; CARRY SET MEANS TROW CODE AWAY
   243                              <1> _K1A:
   244 00000F9D EBE2                <1> 	jmp	short _KIO_EXIT         ; RETURN TO CALLER
   245                              <1> 
   246                              <1> 	;-----	ASCII STATUS
   247                              <1> _K2E:	
   248 00000F9F E8D0000000          <1> 	call	_K2S			; TEST FOR CHARACTER IN BUFFER (EXTENDED)
   249 00000FA4 7420                <1> 	jz	short _K2B		; RETURN IF BUFFER EMPTY
   250 00000FA6 9C                  <1> 	pushf				; SAVE ZF FROM TEST
   251 00000FA7 E8F5000000          <1> 	call	_KIO_E_XLAT		; ROUTINE TO XLATE FOR EXTENDED CALLS
   252 00000FAC EB17                <1> 	jmp	short _K2A	        ; GIVE IT TO THE CALLER
   253                              <1> _K2:	
   254 00000FAE E8C1000000          <1> 	call	_K2S			; TEST FOR CHARACTER IN BUFFER
   255 00000FB3 7411                <1> 	jz	short _K2B		; RETURN IF BUFFER EMPTY
   256 00000FB5 9C                  <1> 	pushf				; SAVE ZF FROM TEST
   257 00000FB6 E8F1000000          <1> 	call	_KIO_S_XLAT		; ROUTINE TO XLATE FOR STANDARD CALLS
   258 00000FBB 7308                <1> 	jnc	short _K2A	        ; CARRY CLEAR MEANS PASS VALID CODE
   259 00000FBD 9D                  <1> 	popf				; INVALID CODE FOR THIS TYPE OF CALL
   260 00000FBE E866000000          <1> 	call	_K1S			; THROW THE CHARACTER AWAY
   261 00000FC3 EBE9                <1> 	jmp	short _K2		; GO LOOK FOR NEXT CHAR, IF ANY
   262                              <1> _K2A:
   263 00000FC5 9D                  <1> 	popf				; RESTORE ZF FROM TEST
   264                              <1> _K2B:
   265                              <1> 	; 02/01/2017
   266 00000FC6 FA                  <1> 	cli
   267                              <1> 	;; mov	byte [intflg], 0 ;; 15/01/2017
   268                              <1> 	;
   269                              <1> 	;pop	ecx			; RECOVER REGISTER
   270 00000FC7 5B                  <1> 	pop	ebx			; RECOVER REGISTER
   271 00000FC8 1F                  <1> 	pop	ds			; RECOVER SEGMENT
   272                              <1> 	; (*) 29/05/2016
   273                              <1> 	; (*) retf 4			; THROW AWAY (e)FLAGS
   274 00000FC9 7208                <1> 	jc	short _k2d
   275 00000FCB 7505                <1> 	jnz	short _k2c
   276 00000FCD 804C240840          <1> 	or	byte [esp+8], 01000000b	; set zero flag bit of eflags register
   277                              <1> _k2c:
   278 00000FD2 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 00000FD3 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 00000FD8 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 00000FD9 3C05                <1> 	cmp	al, 5			; CORRECT FUNCTION CALL?
   312 00000FDB 75A4                <1> 	jne	short _KIO_EXIT		; NO, RETURN
   313 00000FDD F6C3E0              <1> 	test	bl, 0E0h		; TEST FOR OUT-OF-RANGE RATE
   314 00000FE0 759F                <1> 	jnz	short _KIO_EXIT		; RETURN IF SO
   315 00000FE2 F6C7FC              <1> 	test	bh, 0FCh		; TEST FOR OUT-OF-RANGE DELAY
   316 00000FE5 759A                <1> 	jnz	short _KIO_EXIT		; RETURN IF SO
   317 00000FE7 B0F3                <1> 	mov	al, KB_TYPA_RD		; COMMAND FOR TYPAMATIC RATE/DELAY		
   318 00000FE9 E875060000          <1> 	call	SND_DATA		; SEND TO KEYBOARD	
   319                              <1> 	;mov	cx, 5			; SHIFT COUNT
   320                              <1> 	;shl	bh, cl			; SHIFT DELAY OVER
   321 00000FEE C0E705              <1> 	shl	bh, 5
   322 00000FF1 88D8                <1> 	mov	al, bl			; PUT IN RATE
   323 00000FF3 08F8                <1> 	or	al, bh			; AND DELAY
   324 00000FF5 E869060000          <1> 	call	SND_DATA		; SEND TO KEYBOARD	
   325 00000FFA EB85                <1>         jmp     _KIO_EXIT               ; RETURN TO CALLER
   326                              <1> 
   327                              <1> 	;-----	WRITE TO KEYBOARD BUFFER
   328                              <1> _K500:
   329 00000FFC 56                  <1> 	push	esi			; SAVE SI (esi)
   330 00000FFD FA                  <1> 	cli				; 
   331 00000FFE 8B1D[BA670000]      <1>      	mov	ebx, [BUFFER_TAIL]	; GET THE 'IN TO' POINTER TO THE BUFFER
   332 00001004 89DE                <1> 	mov	esi, ebx		; SAVE A COPY IN CASE BUFFER NOT FULL
   333 00001006 E8D1000000          <1> 	call	_K4			; BUMP THE POINTER TO SEE IF BUFFER IS FULL
   334 0000100B 3B1D[B6670000]      <1> 	cmp	ebx, [BUFFER_HEAD]	; WILL THE BUFFER OVERRUN IF WE STORE THIS?
   335 00001011 740D                <1> 	je	short _K502		; YES - INFORM CALLER OF ERROR		
   336 00001013 66890E              <1> 	mov	[esi], cx		; NO - PUT ASCII/SCAN CODE INTO BUFFER	
   337 00001016 891D[BA670000]      <1> 	mov	[BUFFER_TAIL], ebx	; ADJUST 'IN TO' POINTER TO REFLECT CHANGE
   338 0000101C 28C0                <1> 	sub	al, al			; TELL CALLER THAT OPERATION WAS SUCCESSFUL
   339 0000101E EB02                <1> 	jmp	short _K504		; SUB INSTRUCTION ALSO RESETS CARRY FLAG
   340                              <1> _K502:
   341 00001020 B001                <1> 	mov	al, 01h			; BUFFER FULL INDICATION
   342                              <1> _K504:
   343 00001022 FB                  <1> 	sti				
   344 00001023 5E                  <1> 	pop	esi			; RECOVER SI (esi)
   345 00001024 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 00001029 FA                  <1> 	cli	; 03/12/2014
   350 0000102A 8B1D[B6670000]      <1>         mov     ebx, [BUFFER_HEAD] 	; GET POINTER TO HEAD OF BUFFER
   351 00001030 3B1D[BA670000]      <1>         cmp     ebx, [BUFFER_TAIL] 	; TEST END OF BUFFER
   352                              <1> 	;jne	short _K1U		; IF ANYTHING IN BUFFER SKIP INTERRUPT
   353 00001036 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 00001038 FB                  <1> 	sti				; INTERRUPTS BACK ON DURING LOOP
   362 00001039 90                  <1> 	nop				; ALLOW AN INTERRUPT TO OCCUR
   363                              <1> _K1U:	
   364 0000103A FA                  <1> 	cli				; INTERRUPTS BACK OFF
   365 0000103B 8B1D[B6670000]      <1>         mov    	ebx, [BUFFER_HEAD] 	; GET POINTER TO HEAD OF BUFFER
   366 00001041 3B1D[BA670000]      <1>         cmp     ebx, [BUFFER_TAIL] 	; TEST END OF BUFFER
   367                              <1> _k1x:
   368 00001047 53                  <1> 	push	ebx			; SAVE ADDRESS		
   369 00001048 9C                  <1> 	pushf				; SAVE FLAGS
   370 00001049 E8C9060000          <1> 	call	MAKE_LED		; GO GET MODE INDICATOR DATA BYTE
   371 0000104E 8A1D[AB670000]      <1> 	mov	bl, [KB_FLAG_2] 	; GET PREVIOUS BITS
   372 00001054 30C3                <1> 	xor	bl, al			; SEE IF ANY DIFFERENT
   373 00001056 80E307              <1> 	and	bl, 07h	; KB_LEDS	; ISOLATE INDICATOR BITS
   374 00001059 7406                <1> 	jz	short _K1V		; IF NO CHANGE BYPASS UPDATE
   375 0000105B E863060000          <1> 	call	SND_LED1
   376 00001060 FA                  <1> 	cli				; DISABLE INTERRUPTS
   377                              <1> _K1V:
   378 00001061 9D                  <1> 	popf				; RESTORE FLAGS
   379 00001062 5B                  <1> 	pop	ebx			; RESTORE ADDRESS
   380 00001063 74D3                <1>         je      short _K1T              ; LOOP UNTIL SOMETHING IN BUFFER
   381                              <1> 	;
   382 00001065 668B03              <1> 	mov	ax, [ebx] 		; GET SCAN CODE AND ASCII CODE
   383 00001068 E86F000000          <1>         call    _K4                     ; MOVE POINTER TO NEXT POSITION
   384 0000106D 891D[B6670000]      <1>         mov     [BUFFER_HEAD], ebx      ; STORE VALUE IN VARIABLE
   385 00001073 C3                  <1> 	retn				; RETURN
   386                              <1> 
   387                              <1> 	;-----	READ THE KEY TO SEE IF ONE IS PRESENT -----
   388                              <1> _K2S:
   389 00001074 FA                  <1> 	cli				; INTERRUPTS OFF
   390 00001075 8B1D[B6670000]      <1>         mov     ebx, [BUFFER_HEAD]      ; GET HEAD POINTER
   391 0000107B 3B1D[BA670000]      <1>         cmp     ebx, [BUFFER_TAIL]      ; IF EQUAL (Z=1) THEN NOTHING THERE
   392 00001081 668B03              <1> 	mov	ax, [ebx]
   393 00001084 9C                  <1> 	pushf				; SAVE FLAGS
   394                              <1> 	;push	ax			; SAVE CODE
   395                              <1> 	; 12/04/2021
   396 00001085 50                  <1> 	push	eax
   397 00001086 E88C060000          <1> 	call	MAKE_LED		; GO GET MODE INDICATOR DATA BYTE
   398 0000108B 8A1D[AB670000]      <1> 	mov	bl, [KB_FLAG_2] 	; GET PREVIOUS BITS
   399 00001091 30C3                <1> 	xor	bl, al			; SEE IF ANY DIFFERENT
   400 00001093 80E307              <1> 	and	bl, 07h ; KB_LEDS	; ISOLATE INDICATOR BITS
   401 00001096 7405                <1> 	jz	short _K2T		; IF NO CHANGE BYPASS UPDATE
   402 00001098 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 0000109D 58                  <1> 	pop	eax
   407 0000109E 9D                  <1> 	popf				; RESTORE FLAGS
   408 0000109F FB                  <1> 	sti				; INTERRUPTS BACK ON
   409 000010A0 C3                  <1> 	retn				; RETURN
   410                              <1> 
   411                              <1> 	;-----	ROUTINE TO TRANSLATE SCAN CODE PAIRS FOR EXTENDED CALLS -----
   412                              <1> _KIO_E_XLAT:
   413 000010A1 3CF0                <1> 	cmp	al, 0F0h		; IS IT ONE OF THE FILL-INs?
   414 000010A3 7506                <1> 	jne	short _KIO_E_RET	; NO, PASS IT ON
   415 000010A5 08E4                <1>         or 	ah, ah			; AH = 0 IS SPECIAL CASE
   416 000010A7 7402                <1>         jz	short _KIO_E_RET        ; PASS THIS ON UNCHANGED
   417 000010A9 30C0                <1> 	xor	al, al			; OTHERWISE SET AL = 0
   418                              <1> _KIO_E_RET:				
   419 000010AB C3                  <1> 	retn				; GO BACK
   420                              <1> 
   421                              <1> 	;-----	ROUTINE TO TRANSLATE SCAN CODE PAIRS FOR STANDARD CALLS -----
   422                              <1> _KIO_S_XLAT:
   423 000010AC 80FCE0              <1> 	cmp	ah, 0E0h		; IS IT KEYPAD ENTER OR / ?
   424 000010AF 750F                <1> 	jne	short _KIO_S2		; NO, CONTINUE
   425 000010B1 3C0D                <1> 	cmp	al, 0Dh			; KEYPAD ENTER CODE?
   426 000010B3 7408                <1>         je	short _KIO_S1		; YES, MASSAGE A BIT
   427 000010B5 3C0A                <1> 	cmp	al, 0Ah			; CTRL KEYPAD ENTER CODE?
   428 000010B7 7404                <1>         je	short _KIO_S1		; YES, MASSAGE THE SAME
   429 000010B9 B435                <1> 	mov	ah, 35h			; NO, MUST BE KEYPAD /
   430                              <1> _kio_ret: ; 03/12/2014
   431 000010BB F8                  <1> 	clc
   432 000010BC C3                  <1> 	retn
   433                              <1> 	;jmp	short _KIO_USE		; GIVE TO CALLER
   434                              <1> _KIO_S1:				
   435 000010BD B41C                <1> 	mov	ah, 1Ch			; CONVERT TO COMPATIBLE OUTPUT
   436                              <1> 	;jmp	short _KIO_USE		; GIVE TO CALLER
   437 000010BF C3                  <1> 	retn
   438                              <1> _KIO_S2:		
   439 000010C0 80FC84              <1> 	cmp	ah, 84h			; IS IT ONE OF EXTENDED ONES?
   440 000010C3 7715                <1> 	ja	short _KIO_DIS		; YES, THROW AWAY AND GET ANOTHER CHAR
   441 000010C5 3CF0                <1> 	cmp	al, 0F0h		; IS IT ONE OF THE FILL-INs?
   442 000010C7 7506                <1>         jne	short _KIO_S3		; NO, TRY LAST TEST
   443 000010C9 08E4                <1> 	or	ah, ah			; AH = 0 IS SPECIAL CASE
   444 000010CB 740C                <1>         jz	short _KIO_USE		; PASS THIS ON UNCHANGED
   445 000010CD EB0B                <1> 	jmp	short _KIO_DIS		; THROW AWAY THE REST
   446                              <1> _KIO_S3:
   447 000010CF 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 000010D1 75E8                <1> 	jne	short _kio_ret
   450 000010D3 08E4                <1> 	or	ah, ah			; AH = 0 IS SPECIAL CASE
   451 000010D5 7402                <1>         jz	short _KIO_USE		; JUMP IF AH = 0
   452 000010D7 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 000010D9 C3                  <1> 	retn				; RETURN	
   457                              <1> _KIO_DIS:
   458 000010DA F9                  <1> 	stc				; SET CARRY TO INDICATE DISCARD CODE
   459 000010DB C3                  <1> 	retn				; RETURN
   460                              <1> 
   461                              <1> 	;-----	INCREMENT BUFFER POINTER ROUTINE -----
   462                              <1> _K4:    
   463 000010DC 43                  <1> 	inc     ebx
   464 000010DD 43                  <1> 	inc	ebx			; MOVE TO NEXT WORD IN LIST
   465 000010DE 3B1D[B2670000]      <1>         cmp     ebx, [BUFFER_END] 	; AT END OF BUFFER?
   466                              <1>         ;jne    short _K5               ; NO, CONTINUE
   467 000010E4 7206                <1> 	jb	short _K5
   468 000010E6 8B1D[AE670000]      <1>         mov     ebx, [BUFFER_START]     ; YES, RESET TO BUFFER BEGINNING
   469                              <1> _K5:
   470 000010EC 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 000010ED FB                  <1> 	sti				; ENABLE INTERRUPTS
   582                              <1> 	;push	ebp
   583 000010EE 50                  <1> 	push	eax
   584 000010EF 53                  <1> 	push	ebx
   585 000010F0 51                  <1> 	push	ecx
   586 000010F1 52                  <1> 	push	edx
   587 000010F2 56                  <1> 	push	esi
   588 000010F3 57                  <1> 	push	edi
   589 000010F4 1E                  <1> 	push	ds
   590 000010F5 06                  <1> 	push	es
   591 000010F6 FC                  <1> 	cld				; FORWARD DIRECTION
   592 000010F7 66B81000            <1> 	mov	ax, KDATA
   593 000010FB 8ED8                <1> 	mov	ds, ax
   594 000010FD 8EC0                <1> 	mov	es, ax
   595                              <1> 	;
   596                              <1> 	;-----	WAIT FOR KEYBOARD DISABLE COMMAND TO BE ACCEPTED
   597 000010FF B0AD                <1> 	mov	al, DIS_KBD		; DISABLE THE KEYBOARD COMMAND
   598 00001101 E84B050000          <1> 	call	SHIP_IT			; EXECUTE DISABLE
   599 00001106 FA                  <1> 	cli				; DISABLE INTERRUPTS
   600 00001107 B900000100          <1> 	mov	ecx, 10000h		; SET MAXIMUM TIMEOUT
   601                              <1> KB_INT_01:
   602 0000110C E464                <1> 	in	al, STATUS_PORT		; READ ADAPTER STATUS
   603 0000110E A802                <1> 	test	al, INPT_BUF_FULL	; CHECK INPUT BUFFER FULL STATUS BIT
   604 00001110 E0FA                <1> 	loopnz	KB_INT_01		; WAIT FOR COMMAND TO BE ACCEPTED
   605                              <1> 	;
   606                              <1> 	;-----	READ CHARACTER FROM KEYBOARD INTERFACE
   607 00001112 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 00001114 FB                  <1> 	sti				; ENABLE INTERRUPTS AGAIN
   621 00001115 3CFE                <1> 	cmp	al, KB_RESEND		; IS THE INPUT A RESEND
   622 00001117 740E                <1>         je      short KB_INT_4          ; GO IF RESEND
   623                              <1> 	;
   624                              <1> 	;-----	CHECK FOR RESPONSE TO A COMMAND TO KEYBOARD
   625 00001119 3CFA                <1> 	cmp	al, KB_ACK		; IS THE INPUT AN ACKNOWLEDGE
   626 0000111B 7514                <1>         jne     short KB_INT_2          ; GO IF NOT
   627                              <1> 	;
   628                              <1> 	;-----	A COMMAND TO THE KEYBOARD WAS ISSUED
   629 0000111D FA                  <1> 	cli				; DISABLE INTERRUPTS
   630 0000111E 800D[AB670000]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 00001125 EB76                <1> 	jmp	short ID_EX  ; K26
   634                              <1> 	;
   635                              <1> 	;-----	RESEND THE LAST BYTE
   636                              <1> KB_INT_4:
   637 00001127 FA                  <1> 	cli				; DISABLE INTERRUPTS
   638 00001128 800D[AB670000]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 0000112F 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 00001131 50                  <1> 	push	eax
   648 00001132 E8E0050000          <1> 	call	MAKE_LED		; GO GET MODE INDICATOR DATA BYTE
   649 00001137 8A1D[AB670000]      <1> 	mov	bl, [KB_FLAG_2] 	; GET PREVIOUS BITS
   650 0000113D 30C3                <1> 	xor	bl, al			; SEE IF ANY DIFFERENT
   651 0000113F 80E307              <1> 	and	bl, KB_LEDS		; ISOLATE INDICATOR BITS
   652 00001142 7405                <1> 	jz	short UP0		; IF NO CHANGE BYPASS UPDATE
   653 00001144 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 00001149 58                  <1> 	pop	eax
   658                              <1> ;------------------------------------------------------------------------
   659                              <1> ;	START OF KEY PROCESSING						;
   660                              <1> ;------------------------------------------------------------------------
   661 0000114A 88C4                <1> 	mov	ah, al			; SAVE SCAN CODE IN AH ALSO
   662                              <1> 	;
   663                              <1> 	;-----	TEST FOR OVERRUN SCAN CODE FROM KEYBOARD
   664 0000114C 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 0000114E 7505                <1> 	jne	short K16
   668 00001150 E9E8040000          <1> 	jmp	K62
   669                              <1> K16:	
   670 00001155 8A3D[AC670000]      <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 0000115B F6C7C0              <1> 	test 	bh, RD_ID+LC_AB 	; ARE WE DOING A READ ID?
   674 0000115E 7442                <1> 	jz	short NOT_ID		; CONTINUE IF NOT
   675 00001160 7914                <1> 	jns	short TST_ID_2		; IS THE RD_ID FLAG ON?
   676 00001162 3CAB                <1> 	cmp	al, ID_1		; IS THIS THE 1ST ID CHARACTER?
   677 00001164 7507                <1> 	jne	short RST_RD_ID
   678 00001166 800D[AC670000]40    <1> 	or	byte [KB_FLAG_3], LC_AB ; INDICATE 1ST ID WAS OK
   679                              <1> RST_RD_ID:
   680 0000116D 8025[AC670000]7F    <1> 	and	byte [KB_FLAG_3], ~RD_ID ; RESET THE READ ID FLAG
   681 00001174 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 00001176 8025[AC670000]BF    <1> 	and	byte [KB_FLAG_3], ~LC_AB ; RESET FLAG
   687 0000117D 3C54                <1> 	cmp	al, ID_2A		; IS THIS THE 2ND ID CHARACTER?
   688 0000117F 7415                <1>         je	short KX_BIT		; JUMP IF SO
   689 00001181 3C41                <1> 	cmp	al, ID_2		; IS THIS THE 2ND ID CHARACTER?
   690 00001183 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 00001185 F6C720              <1> 	test	bh, SET_NUM_LK 		; SHOULD WE SET NUM LOCK?
   696 00001188 740C                <1>         jz      short KX_BIT		; EXIT IF NOT
   697 0000118A 800D[A9670000]20    <1> 	or	byte [KB_FLAG], NUM_STATE ; FORCE NUM LOCK ON
   698 00001191 E816050000          <1> 	call	SND_LED			; GO SET THE NUM LOCK INDICATOR
   699                              <1> KX_BIT:
   700 00001196 800D[AC670000]10    <1> 	or	byte [KB_FLAG_3], KBX	; INDICATE ENHANCED KEYBOARD WAS FOUND
   701 0000119D E9CB010000          <1> ID_EX:	jmp     K26			; EXIT
   702                              <1> 	;
   703                              <1> NOT_ID:
   704 000011A2 3CE0                <1> 	cmp	al, MC_E0		; IS THIS THE GENERAL MARKER CODE?
   705 000011A4 7509                <1> 	jne	short TEST_E1
   706 000011A6 800D[AC670000]12    <1> 	or	byte [KB_FLAG_3], LC_E0+KBX ; SET FLAG BIT, SET KBX, AND
   707 000011AD EB0B                <1> 	jmp	short EXIT		; THROW AWAY THIS CODE
   708                              <1> 	; 12/04/2021
   709                              <1> 	;jmp	K26A	
   710                              <1> TEST_E1:	
   711 000011AF 3CE1                <1> 	cmp	al, MC_E1		; IS THIS THE PAUSE KEY?
   712 000011B1 750C                <1> 	jne	short NOT_HC
   713 000011B3 800D[AC670000]11    <1> 	or	byte [KB_FLAG_3], LC_E1+KBX ; SET FLAG BIT, SET KBX, AND
   714 000011BA E9B5010000          <1> EXIT:	jmp	K26A			; THROW AWAY THIS CODE
   715                              <1> 	;
   716                              <1> NOT_HC:
   717 000011BF 247F                <1> 	and	al, 07Fh		; TURN OFF THE BREAK BIT
   718 000011C1 F6C702              <1> 	test	bh, LC_E0		; LAST CODE THE E0 MARKER CODE
   719 000011C4 7410                <1> 	jz	short NOT_LC_E0		; JUMP IF NOT
   720                              <1> 	;
   721 000011C6 BF[96660000]        <1> 	mov	edi, _K6+6		; IS THIS A SHIFT KEY?
   722 000011CB AE                  <1> 	scasb
   723                              <1> 	;je	K26 ; K16B              ; YES, THROW AWAY & RESET FLAG
   724                              <1> 	; 12/04/2021
   725 000011CC 745B                <1> 	je	short K16B ; K26
   726 000011CE AE                  <1> 	scasb
   727 000011CF 756D                <1> 	jne	short K16A		; NO, CONTINUE KEY PROCESSING
   728                              <1> 	;jmp	short K16B		; YES, THROW AWAY & RESET FLAG
   729 000011D1 E997010000          <1> 	jmp	K26
   730                              <1> 	;
   731                              <1> NOT_LC_E0:
   732 000011D6 F6C701              <1> 	test	bh, LC_E1		; LAST CODE THE E1 MARKER CODE?
   733 000011D9 7425                <1> 	jz	short T_SYS_KEY		; JUMP IF NOT
   734 000011DB B904000000          <1> 	mov	ecx, 4			; LENGHT OF SEARCH
   735 000011E0 BF[94660000]        <1> 	mov	edi, _K6+4		; IS THIS AN ALT, CTL, OR SHIFT?
   736 000011E5 F2AE                <1> 	repne	scasb			; CHECK IT
   737 000011E7 74D1                <1> 	je	short EXIT		; THROW AWAY IF SO
   738                              <1> 	; 12/04/2021
   739                              <1> 	;je	K26A			
   740                              <1> 	;
   741 000011E9 3C45                <1> 	cmp	al, NUM_KEY		; IS IT THE PAUSE KEY?
   742 000011EB 753C                <1> 	jne	short K16B		; NO, THROW AWAY & RESET FLAG
   743                              <1> 	; 12/04/2021
   744                              <1> 	;jne	K26
   745 000011ED F6C480              <1> 	test	ah, 80h			; YES, IS IT THE BREAK OF THE KEY?
   746 000011F0 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 000011F2 F605[AA670000]08    <1> 	test	byte [KB_FLAG_1],HOLD_STATE ; NO, ARE WE PAUSED ALREADY?
   751 000011F9 752E                <1> 	jnz	short K16B		; YES, THROW AWAY
   752                              <1> 	; 12/04/2021
   753                              <1> 	;jnz	K26
   754 000011FB 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 00001200 3C54                <1> 	cmp	al, SYS_KEY		; IS IT THE SYSTEM KEY?
   759 00001202 753A                <1> 	jnz	short K16A		; CONTINUE IF NOT
   760                              <1> 	;
   761 00001204 F6C480              <1> 	test	ah, 80h			; CHECK IF THIS A BREAK CODE
   762 00001207 7525                <1> 	jnz	short K16C		; DO NOT TOUCH SYSTEM INDICATOR IF TRUE
   763                              <1> 	;
   764 00001209 F605[AA670000]04    <1> 	test	byte [KB_FLAG_1], SYS_SHIFT ; SEE IF IN SYSTEM KEY HELD DOWN 
   765 00001210 7517                <1> 	jnz	short K16B		; IF YES, DO NOT PROCESS SYSTEM INDICATOR	
   766                              <1> 	; 12/04/2021
   767                              <1> 	;jnz	K26		
   768                              <1> 	;
   769 00001212 800D[AA670000]04    <1> 	or	byte [KB_FLAG_1], SYS_SHIFT ; INDICATE SYSTEM KEY DEPRESSED
   770 00001219 B020                <1> 	mov	al, EOI			; END OF INTERRUPT COMMAND
   771 0000121B E620                <1> 	out	20h, al ;out INTA00, al	; SEND COMMAND TO INTERRUPT CONTROL PORT
   772                              <1> 					; INTERRUPT-RETURN-NO-EOI
   773 0000121D B0AE                <1> 	mov	al, ENA_KBD		; INSURE KEYBOARD IS ENABLED
   774 0000121F 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 00001224 E957010000          <1>         jmp     K27A                    ; END PROCESSING
   780                              <1> 	;
   781 00001229 E93F010000          <1> K16B:	jmp	K26			; IGNORE SYSTEM KEY
   782                              <1> 	;
   783                              <1> K16C:
   784 0000122E 8025[AA670000]FB    <1> 	and	byte [KB_FLAG_1], ~SYS_SHIFT ; TURN OFF SHIFT KEY HELD DOWN
   785 00001235 B020                <1> 	mov	al, EOI			; END OF INTERRUPT COMMAND
   786 00001237 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 00001239 E93B010000          <1> 	jmp     K27			; IGNORE SYSTEM KEY
   797                              <1> 	;
   798                              <1> 	;-----	TEST FOR SHIFT KEYS
   799                              <1> K16A:
   800 0000123E 8A1D[A9670000]      <1> 	mov	bl, [KB_FLAG]		; PUT STATE FLAGS IN BL
   801 00001244 BF[90660000]        <1> 	mov	edi, _K6		; SHIFT KEY TABLE offset
   802 00001249 B908000000          <1> 	mov	ecx, _K6L		; LENGTH
   803 0000124E F2AE                <1> 	repne	scasb			; LOOK THROUGH THE TABLE FOR A MATCH
   804 00001250 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 00001252 7405                <1> 	je	short K17
   808 00001254 E9FC000000          <1> 	jmp	K25
   809                              <1> 	;
   810                              <1> 	;------	SHIFT KEY FOUND
   811                              <1> K17:
   812 00001259 81EF[91660000]      <1>         sub     edi, _K6+1              ; ADJUST PTR TO SCAN CODE MATCH
   813 0000125F 8AA7[98660000]      <1>        	mov     ah, [edi+_K7]       	; GET MASK INTO AH
   814 00001265 B102                <1> 	mov	cl, 2			; SETUP COUNT FOR FLAG SHIFTS
   815 00001267 A880                <1> 	test	al, 80h			; TEST FOR BREAK KEY
   816                              <1> 	;jnz	short K23		; JUMP OF BREAK
   817                              <1> 	; 12/04/2021
   818 00001269 7405                <1> 	jz	short K17C
   819 0000126B E981000000          <1> 	jmp	K23
   820                              <1> 	;
   821                              <1> 	;-----	SHIFT MAKE FOUND, DETERMINE SET OR TOGGLE
   822                              <1> K17C:
   823 00001270 80FC10              <1> 	cmp	ah, SCROLL_SHIFT
   824 00001273 7324                <1> 	jae	short K18		; IF SCROLL SHIFT OR ABOVE, TOGGLE KEY
   825                              <1> 	;
   826                              <1> 	;-----	PLAIN SHIFT KEY, SET SHIFT ON
   827 00001275 0825[A9670000]      <1> 	or	[KB_FLAG], ah		; TURN ON SHIFT BIT
   828 0000127B 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 0000127D 7415                <1> 	jz	short k17f
   833                              <1> K17D:
   834 0000127F F6C702              <1> 	test	bh, LC_E0		; IS THIS ONE OF NEW KEYS?
   835 00001282 7408                <1> 	jz 	short K17E		; NO, JUMP
   836 00001284 0825[AC670000]      <1> 	or	[KB_FLAG_3], ah		; SET BITS FOR RIGHT CTRL, ALT
   837                              <1> 	;jmp	K26			; INTERRUPT RETURN
   838                              <1> 	; 12/04/2021
   839 0000128A EB08                <1> 	jmp	short k17f
   840                              <1> K17E:
   841 0000128C D2EC                <1> 	shr	ah, cl			; MOVE FLAG BITS TWO POSITIONS
   842 0000128E 0825[AA670000]      <1> 	or	[KB_FLAG_1], ah		; SET BITS FOR LEFT CTRL, ALT
   843                              <1> k17f:	; 12/04/2021
   844 00001294 E9D4000000          <1> 	jmp	K26
   845                              <1> 	;
   846                              <1> 	;-----	TOGGLED SHIFT KEY, TEST FOR 1ST MAKE OR NOT
   847                              <1> K18:					; SHIFT-TOGGLE
   848 00001299 F6C304              <1> 	test	bl, CTL_SHIFT 		; CHECK CTL SHIFT STATE
   849 0000129C 7402                <1> 	jz	short K18A              ; JUMP IF NOT CTL STATE
   850                              <1>         ;jnz	K25                     ; JUMP IF CTL STATE
   851                              <1> 	; 12/04/2021
   852 0000129E EB1C                <1> 	jmp	short k20a ; K25
   853                              <1> K18A:
   854 000012A0 3C52                <1> 	cmp	al, INS_KEY		; CHECK FOR INSERT KEY
   855 000012A2 7522                <1> 	jne	short K22		; JUMP IF NOT INSERT KEY
   856 000012A4 F6C308              <1> 	test	bl, ALT_SHIFT 		; CHECK FOR ALTERNATE SHIFT
   857 000012A7 7402                <1>       	jz	short K18B		; JUMP IF NOT ALTERNATE SHIFT	
   858                              <1>         ;jnz	K25			; JUMP IF ALTERNATE SHIFT
   859                              <1> 	; 12/04/2021
   860 000012A9 EB11                <1> 	jmp	short k20a ; K25
   861                              <1> K18B:
   862 000012AB F6C702              <1> 	test	bh, LC_E0 ;20/02/2015	; IS THIS NEW INSERT KEY?
   863 000012AE 7516                <1> 	jnz	short K22		; YES, THIS ONE'S NEVER A '0'
   864                              <1> K19:	
   865 000012B0 F6C320              <1> 	test	bl, NUM_STATE 		; CHECK FOR BASE STATE
   866 000012B3 750C                <1> 	jnz	short K21		; JUMP IF NUM LOCK IS ON
   867 000012B5 F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; TEST FOR SHIFT STATE
   868 000012B8 740C                <1> 	jz	short K22		; JUMP IF BASE STATE
   869                              <1> K20:					; NUMERIC ZERO, NOT INSERT KEY
   870 000012BA 88C4                <1> 	mov	ah, al			; PUT SCAN CODE BACK IN AH
   871                              <1> k20a:	; 12/04/2021
   872 000012BC E994000000          <1>         jmp     K25                     ; NUMERAL '0', STNDRD. PROCESSING
   873                              <1> K21:					; MIGHT BE NUMERIC
   874 000012C1 F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT
   875 000012C4 74F4                <1> 	jz	short K20		; IS NUMERIC, STD. PROC.
   876                              <1> 	;
   877                              <1> K22:					; SHIFT TOGGLE KEY HIT; PROCESS IT
   878 000012C6 8425[AA670000]      <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 000012CC 75C6                <1> 	jnz	short k17f ; K26
   882                              <1> K22A:
   883 000012CE 0825[AA670000]      <1>         or      [KB_FLAG_1], ah 	; INDICATE THAT THE KEY IS DEPRESSED
   884 000012D4 3025[A9670000]      <1> 	xor	[KB_FLAG], ah		; TOGGLE THE SHIFT STATE
   885                              <1> 	;
   886                              <1> 	;-----	TOGGLE LED IF CAPS, NUM  OR SCROLL KEY DEPRESSED
   887 000012DA F6C470              <1> 	test	ah, CAPS_SHIFT+NUM_SHIFT+SCROLL_SHIFT ; SHIFT TOGGLE?
   888 000012DD 7407                <1> 	jz	short K22B		; GO IF NOT
   889                              <1> 	;
   890                              <1> 	; 12/04/2021 (32 bit push/pop)
   891 000012DF 50                  <1> 	push	eax ; push ax		; SAVE SCAN CODE AND SHIFT MASK
   892 000012E0 E8C7030000          <1> 	call	SND_LED			; GO TURN MODE INDICATORS ON
   893 000012E5 58                  <1> 	pop	eax ; pop ax		; RESTORE SCAN CODE
   894                              <1> K22B:
   895 000012E6 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 000012E8 75AA                <1> 	jne	short k17f ; K26
   899 000012EA 88C4                <1> 	mov	ah, al		        ; SCAN CODE IN BOTH HALVES OF AX
   900 000012EC E999000000          <1>         jmp	K28                     ; FLAGS UPDATED, PROC. FOR BUFFER
   901                              <1> 	;
   902                              <1> 	;-----	BREAK SHIFT FOUND
   903                              <1> K23:					; BREAK-SHIFT-FOUND
   904 000012F1 80FC10              <1> 	cmp	ah, SCROLL_SHIFT	; IS THIS A TOGGLE KEY
   905 000012F4 F6D4                <1> 	not	ah			; INVERT MASK
   906 000012F6 7355                <1> 	jae	short K24		; YES, HANDLE BREAK TOGGLE
   907 000012F8 2025[A9670000]      <1> 	and	[KB_FLAG], ah		; TURN OFF SHIFT BIT
   908 000012FE 80FCFB              <1> 	cmp	ah, ~CTL_SHIFT		; IS THIS ALT OR CTL?
   909 00001301 7730                <1> 	ja	short K23D		; NO, ALL DONE
   910                              <1> 	;
   911 00001303 F6C702              <1> 	test	bh, LC_E0		; 2ND ALT OR CTL?
   912 00001306 7408                <1> 	jz	short K23A		; NO, HANSLE NORMALLY
   913 00001308 2025[AC670000]      <1> 	and 	[KB_FLAG_3], ah		; RESET BIT FOR RIGHT ALT OR CTL
   914 0000130E EB08                <1> 	jmp	short K23B		; CONTINUE
   915                              <1> K23A:
   916 00001310 D2FC                <1> 	sar	ah, cl			; MOVE THE MASK BIT TWO POSITIONS
   917 00001312 2025[AA670000]      <1> 	and	[KB_FLAG_1], ah		; RESET BIT FOR LEFT ALT AND CTL
   918                              <1> K23B:
   919 00001318 88C4                <1> 	mov	ah, al			; SAVE SCAN CODE
   920 0000131A A0[AC670000]        <1> 	mov	al, [KB_FLAG_3]		; GET RIGHT ALT & CTRL FLAGS
   921 0000131F D2E8                <1> 	shr	al, cl			; MOVE TO BITS 1 & 0
   922 00001321 0A05[AA670000]      <1> 	or	al, [KB_FLAG_1]		; PUT IN LEFT ALT & CTL FLAGS
   923 00001327 D2E0                <1> 	shl	al, cl			; MOVE BACK TO BITS 3 & 2
   924 00001329 240C                <1> 	and	al, ALT_SHIFT+CTL_SHIFT ; FILTER OUT OTHER GARBAGE
   925 0000132B 0805[A9670000]      <1> 	or	[KB_FLAG], al		; PUT RESULT IN THE REAL FLAGS	
   926 00001331 88E0                <1> 	mov	al, ah
   927                              <1> K23D:
   928 00001333 3CB8                <1> 	cmp	al, ALT_KEY+80h		; IS THIS ALTERNATE SHIFT RELEASE
   929 00001335 7536                <1> 	jne	short K26		; INTERRUPT RETURN
   930                              <1> 	;	
   931                              <1> 	;-----	ALTERNATE SHIFT KEY RELEASED, GET THE VALUE INTO BUFFER
   932 00001337 A0[AD670000]        <1> 	mov	al, [ALT_INPUT]
   933 0000133C B400                <1> 	mov	ah, 0			; SCAN CODE OF 0
   934 0000133E 8825[AD670000]      <1> 	mov	[ALT_INPUT], ah 	; ZERO OUT THE FIELD
   935 00001344 3C00                <1> 	cmp	al, 0			; WAS THE INPUT = 0?
   936 00001346 7425                <1> 	je	short K26		; INTERRUPT_RETURN
   937                              <1>         ; 29/01/2016
   938                              <1> 	;jmp	K61			; IT WASN'T, SO PUT IN BUFFER
   939 00001348 E9AB020000          <1> 	jmp	_K60
   940                              <1> 	;
   941                              <1> K24:					; BREAK-TOGGLE
   942 0000134D 2025[AA670000]      <1> 	and	[KB_FLAG_1], ah 	; INDICATE NO LONGER DEPRESSED
   943 00001353 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 00001355 3C80                <1> 	cmp	al, 80h			; TEST FOR BREAK KEY
   949 00001357 7314                <1> 	jae	short K26		; NOTHING FOR BREAK CHARS FROM HERE ON
   950 00001359 F605[AA670000]08    <1> 	test	byte [KB_FLAG_1], HOLD_STATE ; ARE WE IN HOLD STATE
   951 00001360 7428                <1> 	jz	short K28		; BRANCH AROUND TEST IF NOT
   952 00001362 3C45                <1> 	cmp	al, NUM_KEY
   953 00001364 7407                <1> 	je	short K26		; CAN'T END HOLD ON NUM_LOCK
   954 00001366 8025[AA670000]F7    <1> 	and	byte [KB_FLAG_1], ~HOLD_STATE ; TURN OFF THE HOLD STATE BIT
   955                              <1> K26:
   956 0000136D 8025[AC670000]FC    <1> 	and	byte [KB_FLAG_3], ~(LC_E0+LC_E1) ; RESET LAST CHAR H.C. FLAG
   957                              <1> K26A:					; INTERRUPT-RETURN
   958 00001374 FA                  <1> 	cli				; TURN OFF INTERRUPTS
   959 00001375 B020                <1> 	mov	al, EOI			; END OF INTERRUPT COMMAND
   960 00001377 E620                <1> 	out	20h, al	;out INTA00, al	; SEND COMMAND TO INTERRUPT CONTROL PORT
   961                              <1> K27:					; INTERRUPT-RETURN-NO-EOI
   962 00001379 B0AE                <1> 	mov	al, ENA_KBD		; INSURE KEYBOARD IS ENABLED
   963 0000137B E8D1020000          <1> 	call	SHIP_IT			; EXECUTE ENABLE
   964                              <1> K27A:
   965 00001380 FA                  <1> 	cli				; DISABLE INTERRUPTS
   966                              <1> 	;;mov	byte [intflg], 0 ; 07/01/2017 ;; 15/01/2017
   967 00001381 07                  <1> 	pop	es			; RESTORE REGISTERS
   968 00001382 1F                  <1> 	pop	ds
   969 00001383 5F                  <1> 	pop	edi
   970 00001384 5E                  <1> 	pop	esi
   971 00001385 5A                  <1> 	pop	edx
   972 00001386 59                  <1> 	pop	ecx
   973 00001387 5B                  <1> 	pop	ebx
   974 00001388 58                  <1> 	pop	eax
   975                              <1> 	;pop	ebp
   976 00001389 CF                  <1> 	iretd				; RETURN
   977                              <1> 
   978                              <1> 	;-----	NOT IN	HOLD STATE
   979                              <1> K28:					; NO-HOLD-STATE
   980 0000138A 3C58                <1> 	cmp	al, 88			; TEST FOR OUT-OF-RANGE SCAN CODES
   981 0000138C 77DF                <1> 	ja	short K26		; IGNORE IF OUT-OF-RANGE	
   982                              <1> 	;
   983 0000138E F6C308              <1> 	test	bl, ALT_SHIFT 		; ARE WE IN ALTERNATE SHIFT
   984 00001391 740E                <1>         jz	short K28A		; IF NOT ALTERNATE
   985                              <1>         ; 12/04/2021
   986                              <1> 	;jz	K38
   987                              <1> 	;
   988 00001393 F6C710              <1> 	test	bh, KBX			; IS THIS THE ENCHANCED KEYBOARD?
   989 00001396 740E                <1> 	jz	short K29		; NO, ALT STATE IS REAL
   990                              <1> 	 ;28/02/2015
   991 00001398 F605[AA670000]04    <1> 	test	byte [KB_FLAG_1], SYS_SHIFT ; YES, IS SYSREQ KEY DOWN?
   992 0000139F 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 000013A1 E9C4000000          <1> K28A:	jmp	K38
   997                              <1> 	;
   998                              <1> 	;-----	TEST FOR RESET KEY SEQUENCE (CTL ALT DEL)
   999                              <1> K29:					; TEST-RESET
  1000 000013A6 F6C304              <1> 	test	bl, CTL_SHIFT 		; ARE WE IN CONTROL SHIFT ALSO?
  1001 000013A9 740B                <1> 	jz	short K31		; NO_RESET
  1002 000013AB 3C53                <1> 	cmp	al, DEL_KEY		; CTL-ALT STATE, TEST FOR DELETE KEY
  1003 000013AD 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 000013AF B0FE                <1> 	mov	al, SHUT_CMD		; SHUTDOWN COMMAND
  1011 000013B1 E664                <1> 	out	STATUS_PORT, al		; SEND TO KEYBOARD CONTROL PORT
  1012                              <1> khere:
  1013 000013B3 F4                  <1> 	hlt				; WAIT FOR 80286 RESET
  1014 000013B4 EBFD                <1> 	jmp 	short khere		; INSURE HALT
  1015                              <1> 	;
  1016                              <1> 	;-----	IN ALTERNATE SHIFT, RESET NOT FOUND
  1017                              <1> K31:					; NO-RESET
  1018 000013B6 3C39                <1> 	cmp	al, 57			; TEST FOR SPACE KEY
  1019 000013B8 7507                <1> 	jne	short K311		; NOT THERE
  1020 000013BA B020                <1> 	mov	al, ' '			; SET SPACE CHAR
  1021                              <1> k31a:	; 12/04/2021
  1022 000013BC E929020000          <1>         jmp     K57                     ; BUFFER_FILL
  1023                              <1> K311:
  1024 000013C1 3C0F                <1> 	cmp	al, 15			; TEST FOR TAB KEY
  1025 000013C3 7506                <1> 	jne	short K312		; NOT THERE
  1026 000013C5 66B800A5            <1> 	mov	ax, 0A500h		; SET SPECIAL CODE FOR ALT-TAB
  1027                              <1>         ;jmp	K57			; BUFFER_FILL
  1028                              <1> 	; 12/04/2021
  1029 000013C9 EBF1                <1> 	jmp	short k31a
  1030                              <1> K312:
  1031 000013CB 3C4A                <1> 	cmp	al, 74			; TEST FOR KEY PAD -
  1032                              <1>         ;je	short K37B		; GO PROCESS
  1033                              <1> 	; 12/04/2021
  1034 000013CD 7404                <1> 	je	short k312a
  1035 000013CF 3C4E                <1> 	cmp	al, 78			; TEST FOR KEY PAD +
  1036                              <1>         ;je	short K37B		; GO PROCESS
  1037                              <1> 	; 12/04/2021
  1038 000013D1 7505                <1> 	jne	short K32
  1039                              <1> k312a:
  1040 000013D3 E988000000          <1> 	jmp	K37B	
  1041                              <1> 	;
  1042                              <1> 	;-----	LOOK FOR KEY PAD ENTRY
  1043                              <1> K32:					; ALT-KEY-PAD
  1044 000013D8 BF[6C660000]        <1> 	mov	edi, K30		; ALT-INPUT-TABLE offset
  1045 000013DD B90A000000          <1> 	mov	ecx, 10			; LOOK FOR ENTRY USING KEYPAD
  1046 000013E2 F2AE                <1> 	repne	scasb			; LOOK FOR MATCH
  1047 000013E4 7521                <1> 	jne	short K33		; NO_ALT_KEYPAD
  1048 000013E6 F6C702              <1> 	test	bh, LC_E0		; IS THIS ONE OF THE NEW KEYS?
  1049 000013E9 7579                <1>         jnz	short K37C		; YES, JUMP, NOT NUMPAD KEY
  1050 000013EB 81EF[6D660000]      <1> 	sub	edi, K30+1		; DI NOW HAS ENTRY VALUE
  1051 000013F1 A0[AD670000]        <1> 	mov	al, [ALT_INPUT] 	; GET THE CURRENT BYTE
  1052 000013F6 B40A                <1> 	mov	ah, 10			; MULTIPLY BY 10
  1053 000013F8 F6E4                <1> 	mul	ah
  1054 000013FA 6601F8              <1> 	add	ax, di			; ADD IN THE LATEST ENTRY
  1055 000013FD A2[AD670000]        <1> 	mov	[ALT_INPUT], al 	; STORE IT AWAY
  1056                              <1> K32A:
  1057 00001402 E966FFFFFF          <1>         jmp     K26                     ; THROW AWAY THAT KEYSTROKE
  1058                              <1> 	;
  1059                              <1> 	;-----	LOOK FOR SUPERSHIFT ENTRY
  1060                              <1> K33:					; NO-ALT-KEYPAD
  1061 00001407 C605[AD670000]00    <1>         mov     byte [ALT_INPUT], 0     ; ZERO ANY PREVIOUS ENTRY INTO INPUT
  1062 0000140E B91A000000          <1> 	mov	ecx, 26			; (DI),(ES) ALREADY POINTING
  1063 00001413 F2AE                <1> 	repne	scasb			; LOOK FOR MATCH IN ALPHABET
  1064 00001415 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 00001417 3C02                <1> 	cmp	al, 2			; KEY WITH '1' ON IT
  1069 00001419 7245                <1> 	jb	short K37B		; MUST BE ESCAPE
  1070 0000141B 3C0D                <1> 	cmp	al, 13			; IS IT IN THE REGION
  1071 0000141D 7705                <1> 	ja	short K35		; NO, ALT SOMETHING ELSE
  1072 0000141F 80C476              <1> 	add	ah, 118			; CONVERT PSEUDO SCAN CODE TO RANGE
  1073 00001422 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 00001424 3C57                <1> 	cmp	al, F11_M		; IS IT F11?	
  1078 00001426 7209                <1> 	jb	short K35A ; 20/02/2015	; NO, BRANCH
  1079 00001428 3C58                <1> 	cmp	al, F12_M		; IS IT F12?
  1080 0000142A 7705                <1> 	ja	short K35A ; 20/02/2015	; NO, BRANCH
  1081 0000142C 80C434              <1> 	add	ah, 52			; CONVERT TO PSEUDO SCAN CODE
  1082 0000142F EB2B                <1> 	jmp	short K37A		; GO FILL THE BUFFER
  1083                              <1> K35A:
  1084 00001431 F6C702              <1> 	test	bh, LC_E0		; DO WE HAVE ONE OF THE NEW KEYS?
  1085 00001434 741B                <1> 	jz	short K37		; NO, JUMP
  1086 00001436 3C1C                <1> 	cmp	al, 28			; TEST FOR KEYPAD ENTER
  1087 00001438 7506                <1>         jne     short K35B              ; NOT THERE
  1088 0000143A 66B800A6            <1> 	mov	ax, 0A600h		; SPECIAL CODE
  1089                              <1> 	;jmp	K57			; BUFFER FILL
  1090                              <1> 	; 12/04/2021
  1091 0000143E EB0C                <1> 	jmp	short k35c
  1092                              <1> K35B:
  1093 00001440 3C53                <1> 	cmp	al, 83			; TEST FOR DELETE KEY
  1094 00001442 7420                <1> 	je	short K37C		; HANDLE WITH OTHER EDIT KEYS
  1095 00001444 3C35                <1> 	cmp	al, 53			; TEST FOR KEYPAD /
  1096 00001446 75BA                <1> 	jne	short K32A		; NOT THERE, NO OTHER E0 SPECIALS
  1097                              <1>         ; 12/04/2021
  1098                              <1> 	;jne	K26
  1099 00001448 66B800A4            <1> 	mov	ax, 0A400h		; SPECIAL CODE1
  1100                              <1> k35c:	; 12/04/2021
  1101 0000144C E999010000          <1> 	jmp	K57			; BUFFER FILL
  1102                              <1> K37:
  1103 00001451 3C3B                <1> 	cmp	al, 59			; TEST FOR FUNCTION KEYS (F1)
  1104 00001453 720B                <1>         jb      short K37B		; NO FN, HANDLE W/OTHER EXTENDED
  1105 00001455 3C44                <1> 	cmp	al, 68			; IN KEYPAD REGION?
  1106 00001457 77A9                <1> 	ja	short K32A		; IF SO, IGNORE
  1107                              <1> 	; 12/04/2021
  1108                              <1> 	;ja	K26
  1109 00001459 80C42D              <1> 	add	ah, 45			; CONVERT TO PSEUDO SCAN CODE
  1110                              <1> K37A:
  1111 0000145C B000                <1> 	mov	al, 0			; ASCII CODE OF ZERO
  1112                              <1> 	;jmp	K57			; PUT IT IN THE BUFFER
  1113                              <1> 	; 12/04/2021
  1114 0000145E EBEC                <1> 	jmp	short k35c
  1115                              <1> K37B:
  1116 00001460 B0F0                <1> 	mov	al, 0F0h		; USE SPECIAL ASCII CODE
  1117                              <1> 	;jmp	K57			; PUT IT IN THE BUFFER
  1118                              <1> 	; 12/04/2021
  1119 00001462 EBE8                <1> 	jmp	short k35c
  1120                              <1> K37C:
  1121 00001464 0450                <1> 	add	al, 80			; CONVERT SCAN CODE (EDIT KEYS)
  1122 00001466 88C4                <1> 	mov	ah, al			; (SCAN CODE NOT IN AH FOR INSERT)
  1123 00001468 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 0000146A 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 0000146D 7505                <1> 	jnz	short K38A		; YES, START PROCESSING	
  1133 0000146F 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 00001474 3C46                <1> 	cmp	al, SCROLL_KEY		; TEST FOR BREAK
  1139 00001476 7530                <1> 	jne	short K39		; JUMP, NO-BREAK
  1140 00001478 F6C710              <1> 	test	bh, KBX			; IS THIS THE ENHANCED KEYBOARD?
  1141 0000147B 7405                <1> 	jz	short K38B		; NO, BREAK IS VALID	
  1142 0000147D F6C702              <1> 	test	bh, LC_E0		; YES, WAS LAST CODE AN E0?
  1143 00001480 7426                <1> 	jz	short K39		; NO-BREAK, TEST FOR PAUSE	
  1144                              <1> K38B:
  1145 00001482 8B1D[B6670000]      <1> 	mov	ebx, [BUFFER_HEAD] 	; RESET BUFFER TO EMPTY
  1146 00001488 891D[BA670000]      <1> 	mov	[BUFFER_TAIL], ebx
  1147 0000148E C605[A8670000]80    <1> 	mov	byte [BIOS_BREAK], 80h  ; TURN ON BIOS_BREAK BIT
  1148                              <1> 	;
  1149                              <1> 	;-----	ENABLE KEYBOARD
  1150 00001495 B0AE                <1> 	mov	al, ENA_KBD		; ENABLE KEYBOARD
  1151 00001497 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 0000149C E84D590000          <1> 	call	ctrlbrk ; control+break subroutine
  1157                              <1> 	;
  1158                              <1> 	;sub	ax, ax			; PUT OUT DUMMY CHARACTER
  1159                              <1>         ; 12/04/2021
  1160 000014A1 29C0                <1> 	sub	eax, eax
  1161 000014A3 E942010000          <1>         jmp     K57                     ; BUFFER_FILL
  1162                              <1> 	;
  1163                              <1> 	;-----	TEST FOR PAUSE
  1164                              <1> K39:					; NO_BREAK
  1165 000014A8 F6C710              <1> 	test	bh, KBX			; IS THIS THE ENHANCED KEYBOARD?
  1166 000014AB 7537                <1> 	jnz	short K41		; YES, THEN THIS CAN'T BE PAUSE	
  1167 000014AD 3C45                <1> 	cmp	al, NUM_KEY		; LOOK FOR PAUSE KEY
  1168 000014AF 7533                <1> 	jne	short K41		; NO-PAUSE
  1169                              <1> K39P:
  1170 000014B1 800D[AA670000]08    <1> 	or	byte [KB_FLAG_1], HOLD_STATE ; TURN ON THE HOLD FLAG
  1171                              <1> 	;
  1172                              <1> 	;-----	ENABLE KEYBOARD
  1173 000014B8 B0AE                <1> 	mov	al, ENA_KBD		; ENABLE KEYBOARD
  1174 000014BA E892010000          <1> 	call	SHIP_IT			; EXECUTE ENABLE
  1175                              <1> K39A:
  1176 000014BF B020                <1> 	mov	al, EOI			; END OF INTERRUPT TO CONTROL PORT
  1177 000014C1 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 000014C3 803D[DE670000]07    <1>         cmp     byte [CRT_MODE], 7      ; IS THIS BLACK AND WHITE CARD
  1181 000014CA 740A                <1>         je      short K40              	; YES, NOTHING TO DO
  1182 000014CC 66BAD803            <1> 	mov	dx, 03D8h		; PORT FOR COLOR CARD
  1183 000014D0 A0[DF670000]        <1>         mov     al, [CRT_MODE_SET] 	; GET THE VALUE OF THE CURRENT MODE
  1184 000014D5 EE                  <1> 	out	dx, al			; SET THE CRT MODE, SO THAT CRT IS ON
  1185                              <1> 	;
  1186                              <1> K40:					; PAUSE-LOOP
  1187 000014D6 F605[AA670000]08    <1>         test    byte [KB_FLAG_1], HOLD_STATE ; CHECK HOLD STATE FLAG
  1188 000014DD 75F7                <1> 	jnz	short K40		; LOOP UNTIL FLAG TURNED OFF
  1189                              <1> 	;
  1190 000014DF E995FEFFFF          <1>         jmp     K27                     ; INTERRUPT_RETURN_NO_EOI
  1191                              <1>         ;
  1192                              <1> 	;-----	TEST SPECIAL CASE KEY 55
  1193                              <1> K41:					; NO-PAUSE
  1194 000014E4 3C37                <1> 	cmp	al, 55			; TEST FOR */PRTSC KEY
  1195 000014E6 7513                <1> 	jne	short K42		; NOT-KEY-55
  1196 000014E8 F6C710              <1> 	test	bh, KBX			; IS THIS THE ENHANCED KEYBOARD?
  1197 000014EB 7405                <1> 	jz	short K41A		; NO, CTL-PRTSC IS VALID	
  1198 000014ED F6C702              <1> 	test	bh, LC_E0		; YES, WAS LAST CODE AN E0?
  1199 000014F0 7421                <1> 	jz	short K42B		; NO, TRANSLATE TO A FUNCTION
  1200                              <1> K41A:	
  1201 000014F2 66B80072            <1> 	mov	ax, 114*256		; START/STOP PRINTING SWITCH
  1202 000014F6 E9EF000000          <1>         jmp     K57                     ; BUFFER_FILL
  1203                              <1> 	;
  1204                              <1> 	;-----	SET UP TO TRANSLATE CONTROL SHIFT
  1205                              <1> K42:					; NOT-KEY-55
  1206 000014FB 3C0F                <1> 	cmp	al, 15			; IS IT THE TAB KEY?
  1207 000014FD 7414                <1> 	je	short K42B		; YES, XLATE TO FUNCTION CODE
  1208 000014FF 3C35                <1> 	cmp	al, 53			; IS IT THE / KEY?
  1209 00001501 750E                <1> 	jne	short K42A		; NO, NO MORE SPECIAL CASES	
  1210 00001503 F6C702              <1> 	test	bh, LC_E0		; YES, IS IT FROM THE KEY PAD?
  1211 00001506 7409                <1> 	jz	short K42A		; NO, JUST TRANSLATE
  1212 00001508 66B80095            <1> 	mov	ax, 9500h		; YES, SPECIAL CODE FOR THIS ONE
  1213 0000150C E9D9000000          <1> 	jmp	K57			; BUFFER FILL	
  1214                              <1> K42A: 
  1215                              <1> 	;;mov	ebx, _K8		; SET UP TO TRANSLATE CTL
  1216 00001511 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 00001513 BB[A0660000]        <1> 	mov	ebx, _K8		; SET UP TO TRANSLATE CTL
  1222                              <1> 	;jb	K56 ;; 20/02/2015
  1223                              <1> 	; 12/04/2021
  1224 00001518 7267                <1> 	jb	short K45F	
  1225 0000151A E9B9000000          <1> 	jmp	K64	
  1226                              <1>         ;
  1227                              <1> 	;-----	NOT IN CONTROL SHIFT
  1228                              <1> K44:					; NOT-CTL-SHIFT
  1229 0000151F 3C37                <1> 	cmp	al, 55			; PRINT SCREEN KEY?
  1230 00001521 7528                <1> 	jne	short K45		; NOT PRINT SCREEN
  1231 00001523 F6C710              <1> 	test	bh, KBX			; IS THIS ENHANCED KEYBOARD?
  1232 00001526 7407                <1> 	jz	short K44A		; NO, TEST FOR SHIFT STATE	
  1233 00001528 F6C702              <1> 	test	bh, LC_E0		; YES, LAST CODE A MARKER?
  1234 0000152B 7507                <1> 	jnz	short K44B		; YES, IS PRINT SCREEN
  1235 0000152D EB41                <1> 	jmp	short K45C		; NO, TRANSLATE TO '*' CHARACTER
  1236                              <1> K44A:
  1237 0000152F F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; NOT 101 KBD, SHIFT KEY DOWN?
  1238 00001532 743C                <1> 	jz	short K45C		; NO, TRANSLATE TO '*' CHARACTER
  1239                              <1> 	;
  1240                              <1> 	;-----	ISSUE INTERRUPT TO INDICATE PRINT SCREEN FUNCTION
  1241                              <1> K44B:
  1242 00001534 B0AE                <1> 	mov	al, ENA_KBD		; INSURE KEYBOARD IS ENABLED
  1243 00001536 E816010000          <1> 	call	SHIP_IT			; EXECUTE ENABLE
  1244 0000153B B020                <1> 	mov	al, EOI			; END OF CURRENT INTERRUPT
  1245 0000153D 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 0000153F 8025[AC670000]FC    <1>         and     byte [KB_FLAG_3], ~(LC_E0+LC_E1) ; ZERO OUT THESE FLAGS
  1251 00001546 E92EFEFFFF          <1>         jmp     K27                     ; GO BACK WITHOUT EOI OCCURRING
  1252                              <1> 	;
  1253                              <1> 	;-----	HANDLE IN-CORE KEYS
  1254                              <1> K45:					; NOT-PRINT-SCREEN
  1255 0000154B 3C3A                <1> 	cmp	al, 58			; TEST FOR IN-CORE AREA
  1256 0000154D 7734                <1> 	ja	short K46		; JUMP IF NOT
  1257 0000154F 3C35                <1> 	cmp	al, 53			; IS THIS THE '/' KEY?
  1258 00001551 7505                <1> 	jne	short K45A		; NO, JUMP
  1259 00001553 F6C702              <1> 	test	bh, LC_E0		; WAS THE LAST CODE THE MARKER?
  1260 00001556 7518                <1> 	jnz	short K45C		; YES, TRANSLATE TO CHARACTER
  1261                              <1> K45A:
  1262 00001558 B91A000000          <1> 	mov	ecx, 26			; LENGHT OF SEARCH
  1263 0000155D BF[76660000]        <1> 	mov	edi, K30+10		; POINT TO TABLE OF A-Z CHARS
  1264 00001562 F2AE                <1> 	repne	scasb			; IS THIS A LETTER KEY?
  1265                              <1> 		; 20/02/2015
  1266 00001564 7505                <1> 	jne	short K45B              ; NO, SYMBOL KEY
  1267                              <1> 	;
  1268 00001566 F6C340              <1> 	test	bl, CAPS_STATE		; ARE WE IN CAPS_LOCK?
  1269 00001569 750C                <1> 	jnz	short K45D		; TEST FOR SURE
  1270                              <1> K45B:
  1271 0000156B F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; ARE WE IN SHIFT STATE?
  1272 0000156E 750C                <1> 	jnz	short K45E		; YES, UPPERCASE
  1273                              <1> 					; NO, LOWERCASE
  1274                              <1> K45C:
  1275 00001570 BB[F8660000]        <1> 	mov	ebx, K10		; TRANSLATE TO LOWERCASE LETTERS
  1276 00001575 EB51                <1> 	jmp	short K56	
  1277                              <1> K45D:					; ALMOST-CAPS-STATE
  1278 00001577 F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; CL ON. IS SHIFT ON, TOO?
  1279 0000157A 75F4                <1> 	jnz	short K45C		; SHIFTED TEMP OUT OF CAPS STATE
  1280                              <1> K45E:
  1281 0000157C BB[50670000]        <1> 	mov	ebx, K11		; TRANSLATE TO UPPER CASE LETTERS
  1282 00001581 EB45                <1> K45F:	jmp	short K56
  1283                              <1> 	;
  1284                              <1> 	;-----	TEST FOR KEYS F1 - F10
  1285                              <1> K46:					; NOT IN-CORE AREA
  1286 00001583 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 00001585 7635                <1> 	jna	short K53		
  1290                              <1> 	;
  1291                              <1> 	;-----	HANDLE THE NUMERIC PAD KEYS
  1292                              <1> K47:					; NOT F1 - F10
  1293 00001587 3C53                <1> 	cmp	al, 83			; TEST NUMPAD KEYS
  1294 00001589 772D                <1> 	ja	short K52		; JUMP IF NOT
  1295                              <1> 	;
  1296                              <1> 	;-----	KEYPAD KEYS, MUST TEST NUM LOCK FOR DETERMINATION
  1297                              <1> K48:
  1298 0000158B 3C4A                <1> 	cmp	al, 74			; SPECIAL CASE FOR MINUS
  1299 0000158D 74ED                <1> 	je	short K45E		; GO TRANSLATE
  1300 0000158F 3C4E                <1> 	cmp	al, 78			; SPECIAL CASE FOR PLUS
  1301 00001591 74E9                <1> 	je	short K45E		; GO TRANSLATE
  1302 00001593 F6C702              <1> 	test	bh, LC_E0		; IS THIS ONE OFTHE NEW KEYS?
  1303 00001596 750A                <1> 	jnz	short K49		; YES, TRANSLATE TO BASE STATE
  1304                              <1> 	;		
  1305 00001598 F6C320              <1> 	test 	bl, NUM_STATE		; ARE WE IN NUM LOCK
  1306 0000159B 7514                <1> 	jnz	short K50		; TEST FOR SURE
  1307 0000159D F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; ARE WE IN SHIFT STATE?
  1308                              <1> 	;jnz	short K51		; IF SHIFTED, REALLY NUM STATE
  1309 000015A0 75DA                <1> 	jnz	short K45E
  1310                              <1> 	;
  1311                              <1> 	;-----	BASE CASE FOR KEYPAD
  1312                              <1> K49:					
  1313 000015A2 3C4C                <1> 	cmp	al, 76			; SPECIAL CASE FOR BASE STATE 5
  1314 000015A4 7504                <1> 	jne	short K49A		; CONTINUE IF NOT KEYPAD 5
  1315 000015A6 B0F0                <1> 	mov	al, 0F0h		; SPECIAL ASCII CODE	
  1316 000015A8 EB40                <1> 	jmp	short K57		; BUFFER FILL
  1317                              <1> K49A:
  1318 000015AA BB[F8660000]        <1> 	mov	ebx, K10		; BASE CASE TABLE	
  1319 000015AF 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 000015B1 F6C303              <1>         test    bl, LEFT_SHIFT+RIGHT_SHIFT
  1324 000015B4 75EC                <1> 	jnz 	short K49		; SHIFTED TEMP OUT OF NUM STATE
  1325 000015B6 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 000015B8 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 000015BA 74AF                <1> 	je	short K45B		
  1333                              <1> 	;
  1334                              <1> 	;-----	MUST BE F11 OR F12 
  1335                              <1> K53:					; F1 - F10 COME HERE, TOO
  1336 000015BC F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; TEST SHIFT STATE
  1337 000015BF 74E1                <1> 	jz	short K49		; JUMP, LOWER CASE PSEUDO SC'S
  1338                              <1> 		; 20/02/2015 
  1339 000015C1 BB[50670000]        <1> 	mov	ebx, K11		; UPPER CASE PSEUDO SCAN CODES
  1340 000015C6 EB10                <1> 	jmp	short K64		; TRANSLATE SCAN
  1341                              <1> 	;
  1342                              <1> 	;-----	TRANSLATE THE CHARACTER
  1343                              <1> K56:					; TRANSLATE-CHAR
  1344 000015C8 FEC8                <1> 	dec	al			; CONVERT ORIGIN
  1345 000015CA D7                  <1> 	xlat    			; CONVERT THE SCAN CODE TO ASCII
  1346 000015CB F605[AC670000]02    <1> 	test	byte [KB_FLAG_3], LC_E0	; IS THIS A NEW KEY?
  1347 000015D2 7416                <1> 	jz	short K57		; NO, GO FILL BUFFER
  1348 000015D4 B4E0                <1> 	mov	ah, MC_E0		; YES, PUT SPECIAL MARKER IN AH
  1349 000015D6 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 000015D8 FEC8                <1> 	dec	al			; CONVERT ORIGIN
  1354 000015DA D7                  <1>        	xlat    	                ; CTL TABLE SCAN
  1355 000015DB 88C4                <1> 	mov	ah, al			; PUT VALUE INTO AH
  1356 000015DD B000                <1> 	mov	al, 0			; ZERO ASCII CODE
  1357 000015DF F605[AC670000]02    <1> 	test	byte [KB_FLAG_3], LC_E0	; IS THIS A NEW KEY?
  1358 000015E6 7402                <1> 	jz	short K57		; NO, GO FILL BUFFER
  1359 000015E8 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 000015EA 3CFF                <1> 	cmp	al, -1			; IS THIS AN IGNORE CHAR
  1364 000015EC 7405                <1> 	je	short K59		; YES, DO NOTHING WITH IT
  1365                              <1> 	;je	K26			; YES, DO NOTHING WITH IT
  1366 000015EE 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 000015F1 7505                <1>         jne	short _K60		; NEAR_INTERRUPT_RETURN
  1371                              <1> K59:					; NEAR_INTERRUPT_RETURN
  1372 000015F3 E975FDFFFF          <1> 	jmp	K26			; INTERRUPT_RETURN
  1373                              <1> 
  1374                              <1> _K60: ; 29/01/2016
  1375 000015F8 80FC68              <1> 	cmp	ah, 68h	; ALT + F1 key
  1376 000015FB 721D                <1> 	jb	short K61
  1377 000015FD 80FC6F              <1> 	cmp	ah, 6Fh ; ALT + F8 key	
  1378 00001600 7718                <1> 	ja	short K61
  1379                              <1> 	;
  1380 00001602 8A1D[1E7D0100]      <1> 	mov	bl, [ACTIVE_PAGE]
  1381 00001608 80C368              <1> 	add	bl, 68h
  1382 0000160B 38E3                <1> 	cmp	bl, ah
  1383 0000160D 740B                <1> 	je	short K61
  1384                              <1> 	; 24/07/2022
  1385                              <1> 	;push	ax
  1386 0000160F 50                  <1> 	push	eax
  1387 00001610 88E0                <1> 	mov	al, ah
  1388 00001612 2C68                <1> 	sub	al, 68h
  1389 00001614 E850090000          <1> 	call	set_active_page
  1390 00001619 58                  <1> 	pop	eax
  1391                              <1> 	;pop	ax
  1392                              <1> K61:					; NOT-CAPS-STATE
  1393 0000161A 8B1D[BA670000]      <1> 	mov	ebx, [BUFFER_TAIL] 	; GET THE END POINTER TO THE BUFFER
  1394 00001620 89DE                <1> 	mov	esi, ebx		; SAVE THE VALUE
  1395 00001622 E8B5FAFFFF          <1> 	call	_K4			; ADVANCE THE TAIL
  1396 00001627 3B1D[B6670000]      <1> 	cmp	ebx, [BUFFER_HEAD] 	; HAS THE BUFFER WRAPPED AROUND
  1397 0000162D 740E                <1> 	je	short K62		; BUFFER_FULL_BEEP
  1398 0000162F 668906              <1> 	mov	[esi], ax		; STORE THE VALUE
  1399 00001632 891D[BA670000]      <1> 	mov	[BUFFER_TAIL], ebx 	; MOVE THE POINTER UP
  1400 00001638 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 0000163D B020                <1> 	mov	al, EOI			; ENABLE INTERRUPT CONTROLLER CHIP
  1415 0000163F E620                <1> 	out	INTA00, al
  1416 00001641 66B9A602            <1> 	mov	cx, 678			; DIVISOR FOR 1760 HZ
  1417 00001645 B304                <1> 	mov	bl, 4			; SHORT BEEP COUNT (1/16 + 1/64 DELAY)
  1418 00001647 E8420D0000          <1> 	call	beep			; GO TO COMMON BEEP HANDLER
  1419 0000164C 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 00001651 50                  <1> 	push	eax
  1432                              <1> 
  1433                              <1> 	;-----	WAIT FOR COMMAND TO ACCEPTED
  1434 00001652 FA                  <1> 	cli				; DISABLE INTERRUPTS TILL DATA SENT
  1435                              <1> 	; xor	ecx, ecx		; CLEAR TIMEOUT COUNTER
  1436 00001653 B900000100          <1> 	mov	ecx, 10000h			
  1437                              <1> S10:
  1438 00001658 E464                <1> 	in	al, STATUS_PORT		; READ KEYBOARD CONTROLLER STATUS
  1439 0000165A A802                <1> 	test	al, INPT_BUF_FULL	; CHECK FOR ITS INPUT BUFFER BUSY
  1440 0000165C 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 0000165E 58                  <1> 	pop	eax
  1445                              <1> 
  1446 0000165F E664                <1> 	out	STATUS_PORT, al		; SEND TO KEYBOARD CONTROLLER
  1447 00001661 FB                  <1> 	sti				; ENABLE INTERRUPTS AGAIN
  1448 00001662 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 00001663 50                  <1> 	push	eax ; push ax		; SAVE REGISTERS
  1460 00001664 53                  <1> 	push	ebx ; push bx
  1461 00001665 51                  <1> 	push	ecx
  1462 00001666 88C7                <1> 	mov	bh, al			; SAVE TRANSMITTED BYTE FOR RETRIES
  1463 00001668 B303                <1> 	mov	bl, 3			; LOAD RETRY COUNT
  1464                              <1> SD0:
  1465 0000166A FA                  <1> 	cli				; DISABLE INTERRUPTS
  1466 0000166B 8025[AB670000]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 00001672 B900000100          <1> 	mov	ecx, 10000h		; MAXIMUM WAIT COUNT
  1470                              <1> SD5:
  1471 00001677 E464                <1> 	in	al, STATUS_PORT		; READ KEYBOARD PROCESSOR STATUS PORT
  1472 00001679 A802                <1> 	test	al, INPT_BUF_FULL	; CHECK FOR ANY PENDING COMMAND
  1473 0000167B E0FA                <1> 	loopnz	SD5			; WAIT FOR COMMAND TO BE ACCEPTED
  1474                              <1> 	;
  1475 0000167D 88F8                <1> 	mov	al, bh			; REESTABLISH BYTE TO TRANSMIT
  1476 0000167F E660                <1> 	out	PORT_A, al		; SEND BYTE
  1477 00001681 FB                  <1> 	sti				; ENABLE INTERRUPTS
  1478                              <1> 	;mov	cx, 01A00h		; LOAD COUNT FOR 10 ms+
  1479 00001682 B9FFFF0000          <1> 	mov	ecx, 0FFFFh
  1480                              <1> SD1:
  1481 00001687 F605[AB670000]30    <1> 	test	byte [KB_FLAG_2], KB_FE+KB_FA ; SEE IF EITHER BIT SET
  1482 0000168E 750F                <1> 	jnz	short SD3		; IF SET, SOMETHING RECEIVED GO PROCESS
  1483 00001690 E2F5                <1> 	loop	SD1			; OTHERWISE WAIT
  1484                              <1> SD2:
  1485 00001692 FECB                <1> 	dec	bl			; DECREMENT RETRY COUNT
  1486 00001694 75D4                <1> 	jnz	short SD0		; RETRY TRANSMISSION
  1487 00001696 800D[AB670000]80    <1> 	or	byte [KB_FLAG_2], KB_ERR ; TURN ON TRANSMIT ERROR FLAG
  1488 0000169D EB09                <1> 	jmp	short SD4		; RETRIES EXHAUSTED FORGET TRANSMISSION
  1489                              <1> SD3:
  1490 0000169F F605[AB670000]10    <1> 	test	byte [KB_FLAG_2], KB_FA ; SEE IF THIS IS AN ACKNOWLEDGE
  1491 000016A6 74EA                <1> 	jz	short SD2		; IF NOT, GO RESEND
  1492                              <1> SD4:	
  1493 000016A8 59                  <1> 	pop	ecx			; RESTORE REGISTERS
  1494 000016A9 5B                  <1> 	pop	ebx ; pop bx
  1495 000016AA 58                  <1> 	pop	eax ; pop ax
  1496 000016AB 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 000016AC FA                  <1> 	cli				; TURN OFF INTERRUPTS
  1506 000016AD F605[AB670000]40    <1> 	test	byte [KB_FLAG_2], KB_PR_LED ; CHECK FOR MODE INDICATOR UPDATE
  1507 000016B4 755F                <1> 	jnz 	short SL1		; DON'T UPDATE AGAIN IF UPDATE UNDERWAY
  1508                              <1> 	;
  1509 000016B6 800D[AB670000]40    <1> 	or	byte [KB_FLAG_2], KB_PR_LED ; TURN ON UPDATE IN PROCESS
  1510 000016BD B020                <1> 	mov	al, EOI			; END OF INTERRUPT COMMAND
  1511 000016BF E620                <1> 	out	20h, al ;out INTA00, al	; SEND COMMAND TO INTERRUPT CONTROL PORT
  1512 000016C1 EB11                <1> 	jmp	short SL0		; GO SEND MODE INDICATOR COMMAND
  1513                              <1> SND_LED1:
  1514 000016C3 FA                  <1> 	cli				; TURN OFF INTERRUPTS
  1515 000016C4 F605[AB670000]40    <1> 	test	byte [KB_FLAG_2], KB_PR_LED ; CHECK FOR MODE INDICATOR UPDATE
  1516 000016CB 7548                <1> 	jnz	short SL1		; DON'T UPDATE AGAIN IF UPDATE UNDERWAY
  1517                              <1> 	;
  1518 000016CD 800D[AB670000]40    <1> 	or	byte [KB_FLAG_2], KB_PR_LED ; TURN ON UPDATE IN PROCESS
  1519                              <1> SL0:
  1520 000016D4 B0ED                <1> 	mov	al, LED_CMD		; LED CMD BYTE
  1521 000016D6 E888FFFFFF          <1> 	call	SND_DATA		; SEND DATA TO KEYBOARD
  1522 000016DB FA                  <1> 	cli
  1523 000016DC E836000000          <1> 	call	MAKE_LED		; GO FORM INDICATOR DATA BYTE
  1524 000016E1 8025[AB670000]F8    <1> 	and	byte [KB_FLAG_2], 0F8h	; ~KB_LEDS ; CLEAR MODE INDICATOR BITS
  1525 000016E8 0805[AB670000]      <1> 	or	[KB_FLAG_2], al 	; SAVE PRESENT INDICATORS FOR NEXT TIME
  1526 000016EE F605[AB670000]80    <1> 	test	byte [KB_FLAG_2], KB_ERR ; TRANSMIT ERROR DETECTED
  1527 000016F5 750F                <1> 	jnz	short SL2		; IF SO, BYPASS SECOND BYTE TRANSMISSION
  1528                              <1> 	;
  1529 000016F7 E867FFFFFF          <1> 	call	SND_DATA		; SEND DATA TO KEYBOARD
  1530 000016FC FA                  <1> 	cli				; TURN OFF INTERRUPTS
  1531 000016FD F605[AB670000]80    <1> 	test	byte [KB_FLAG_2], KB_ERR ; TRANSMIT ERROR DETECTED
  1532 00001704 7408                <1> 	jz	short SL3		; IF NOT, DON'T SEND AN ENABLE COMMAND
  1533                              <1> SL2:
  1534 00001706 B0F4                <1> 	mov	al, KB_ENABLE		; GET KEYBOARD CSA ENABLE COMMAND
  1535 00001708 E856FFFFFF          <1> 	call	SND_DATA		; SEND DATA TO KEYBOARD
  1536 0000170D FA                  <1> 	cli				; TURN OFF INTERRUPTS
  1537                              <1> SL3:
  1538 0000170E 8025[AB670000]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 00001715 FB                  <1> 	sti				; ENABLE INTERRUPTS
  1541 00001716 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 00001717 A0[A9670000]        <1> 	mov	al, [KB_FLAG]		; GET CAPS & NUM LOCK INDICATORS
  1552 0000171C 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 0000171E C0C004              <1> 	rol	al, 4 ; 20/02/2015
  1556 00001721 2407                <1> 	and	al, 07h			; MAKE SURE ONLY MODE BITS ON
  1557                              <1> 	;pop	cx
  1558 00001723 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 ///
  2987                                  
  2988                                  %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 00001724 9C                  <1> 	pushfd
    35 00001725 0E                  <1> 	push	cs
    36 00001726 E851000000          <1> 	call	VIDEO_IO_1
    37 0000172B 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 0000172C [FD1A0000]          <1> M1:	dd	SET_MODE	; TABLE OF ROUTINES WITHIN VIDEO I/O
   191 00001730 [B31E0000]          <1> 	dd	SET_CTYPE
   192 00001734 [E11E0000]          <1> 	dd	SET_CPOS
   193 00001738 [051F0000]          <1> 	dd	READ_CURSOR
   194                              <1> 	;dd	VIDEO_RETURN	; READ_LPEN
   195 0000173C [FB1A0000]          <1> 	dd	set_mode_ncm	; Set mode without clearing video memory
   196 00001740 [4B1F0000]          <1> 	dd	ACT_DISP_PAGE
   197 00001744 [D51F0000]          <1> 	dd	SCROLL_UP
   198 00001748 [EC200000]          <1> 	dd	SCROLL_DOWN
   199 0000174C [6B210000]          <1> 	dd	READ_AC_CURRENT
   200 00001750 [C8210000]          <1> 	dd	WRITE_AC_CURRENT
   201 00001754 [EE210000]          <1> 	dd	WRITE_C_CURRENT
   202 00001758 [F62A0000]          <1> 	dd	SET_COLOR
   203 0000175C [5E2B0000]          <1> 	dd	WRITE_DOT
   204 00001760 [2D2B0000]          <1> 	dd	READ_DOT
   205 00001764 [78220000]          <1> 	dd	WRITE_TTY
   206 00001768 [E31A0000]          <1> 	dd	VIDEO_STATE
   207 0000176C [2B360000]          <1> 	dd	vga_pal_funcs	; 10/08/2016 (TRDOS 386)
   208 00001770 [43300000]          <1> 	dd	font_setup	; 10/07/2016 (TRDOS 386)
   209 00001774 [321B0000]          <1> 	dd	VIDEO_RETURN	; RESERVED
   210 00001778 [EE230000]          <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 0000177C 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 0000177D 80FC14              <1> 	cmp	ah, M1L/4
   252 00001780 7205                <1> 	jb	short VGA_func
   253                              <1> 
   254 00001782 80FC4F              <1> 	cmp	ah, 4Fh
   255 00001785 7532                <1> 	jne	short M4 ; invalid !
   256                              <1> 
   257                              <1> VGA_func: ; 26/11/2020
   258 00001787 06                  <1> 	push	es ; *
   259 00001788 1E                  <1> 	push	ds ; **			; SAVE WORK AND PARAMETER REGISTERS
   260                              <1> 
   261                              <1> 	; 26/11/2020
   262 00001789 50                  <1> 	push	eax ; -
   263                              <1> 	
   264 0000178A 66B81000            <1> 	mov	ax, KDATA 		; POINT DS: TO DATA SEGMENT
   265 0000178E 8ED8                <1> 	mov	ds, ax
   266 00001790 8EC0                <1> 	mov	es, ax
   267                              <1> 
   268                              <1> 	; 26/11/2020
   269 00001792 58                  <1> 	pop	eax ; +
   270                              <1> 	;
   271 00001793 FB                  <1> 	sti
   272 00001794 80FC4F              <1> 	cmp	ah, 4Fh
   273 00001797 747A                <1> 	je	short VBE_func
   274                              <1> 
   275                              <1> 	; 04/12/2020
   276 00001799 A3[80890100]        <1> 	mov	[video_eax], eax
   277                              <1> 
   278                              <1> 	; 21/12/2020
   279 0000179E 803D[DE670000]FF    <1> 	cmp	byte [CRT_MODE], 0FFh	; Current mode is a VESA VBE mode ?
   280 000017A5 7213                <1> 	jb	short VGA_func_std
   281                              <1> 
   282 000017A7 08E4                <1> 	or	ah, ah			; set mode ?
   283 000017A9 750F                <1> 	jnz	short VGA_func_std	; no
   284                              <1> 
   285 000017AB 803D[86090000]03    <1> 	cmp	byte [vbe3], 3		; (real) VESA VBE 3 video bios ?
   286 000017B2 7506                <1> 	jne	short VGA_func_std	; no
   287                              <1> 
   288 000017B4 E995010000          <1> 	jmp	vesa_vbe3_pmi
   289                              <1> 
   290                              <1> 	; 21/12/2020
   291                              <1> M4:					; COMMAND NOT VALID
   292 000017B9 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 000017BA 80FC0F              <1> 	cmp	ah, 0Fh
   298 000017BD 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 000017BF 803D[64A30100]00    <1> 	cmp	byte [pmi32], 0		; 32 bit protected mode interface for
   308 000017C6 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 000017C8 20E4                <1> 	and	ah, ah ; is this set mode ?
   314 000017CA 7413                <1> 	jz	short vbe_pmi32_2 ; yes
   315                              <1> 
   316 000017CC 80FC04              <1> 	cmp	ah, 04h	 ; set mode ('no clear memory' option)
   317 000017CF 742B                <1> 	je	short VGA_funcs_0
   318                              <1> 
   319                              <1> 	; 07/12/2020
   320 000017D1 803D[DE670000]07    <1> 	cmp	byte [CRT_MODE], 7 ; current mode > 7 ?
   321 000017D8 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 000017DA 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 000017DF 803D[DE670000]07    <1> 	cmp	byte [CRT_MODE], 7 ; current mode > 7 ?
   347 000017E6 77F2                <1> 	ja	short vbe_pmi32_1  ; yes
   348                              <1> 
   349 000017E8 3C07                <1> 	cmp	al, 7	; requested mode > 7 ?
   350 000017EA 7610                <1> 	jna	short VGA_funcs_0  ; no (CGA)
   351                              <1> 
   352 000017EC 3C13                <1> 	cmp	al, 13h
   353 000017EE 76EA                <1> 	jna	short vbe_pmi32_1
   354                              <1> 
   355 000017F0 A880                <1> 	test	al, 80h
   356 000017F2 7408                <1> 	jz	short VGA_funcs_0  ; unknown or special
   357                              <1> 
   358 000017F4 3C87                <1> 	cmp	al, 87h	; requested mode > 7 ? 
   359                              <1> 			; (with no clear mem ops)
   360 000017F6 7604                <1> 	jna	short VGA_funcs_0  ; no (CGA)
   361                              <1> 
   362 000017F8 3C93                <1> 	cmp	al, 93h
   363 000017FA 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 000017FC 52                  <1> 	push	edx ; ***
   372 000017FD 51                  <1> 	push	ecx ; ****
   373 000017FE 53                  <1> 	push	ebx ; *****
   374 000017FF 56                  <1> 	push	esi ; ******
   375 00001800 57                  <1> 	push	edi ; *******
   376 00001801 55                  <1> 	push	ebp ; ********
   377                              <1> 
   378                              <1> 	;mov	[video_eax], eax ; 12/05/2016 
   379 00001802 BF00800B00          <1> 	mov	edi, 0B8000h		; GET offset FOR COLOR CARD
   380                              <1> 
   381                              <1> 	; 23/03/2016
   382 00001807 C0E402              <1> 	shl	ah, 2  ; dword		; TIMES 2 FOR WORD TABLE LOOKUP
   383 0000180A 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 0000180D FFA6[2C170000]      <1> 	jmp	dword [esi+M1]		; GO TO SELECTED FUNCTION
   394                              <1> 
   395                              <1> VBE_func:
   396                              <1> 	; 26/11/2020
   397                              <1> 	;sti
   398 00001813 55                  <1> 	push	ebp ; *** ; 27/11/2020	
   399 00001814 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 00001815 0F20DE              <1> 	mov	esi, cr3
   412 00001818 56                  <1> 	push	esi ; *****
   413                              <1> 	;cmp	esi, [k_page_dir]
   414                              <1> 	;je	short VBE_func_x
   415 00001819 8B35[F07C0100]      <1> 	mov	esi, [k_page_dir]
   416 0000181F 0F22DE              <1> 	mov	cr3, esi
   417                              <1> ;VBE_func_x:
   418 00001822 803D[86090000]02    <1> 	cmp	byte [vbe3], 2
   419 00001829 7744                <1> 	ja	short VESA_VBE3_PMI_CALL ; VBE3 video bios ('PMID')
   420                              <1> 	;je	short VBE_func_0  ; Bochs/Qemu/VirtualBox emulator
   421 0000182B 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 0000182D 8A25[87090000]      <1> 	mov	ah, [vbe2bios]
   431 00001833 80FCC0              <1> 	cmp	ah, 0C0h		
   432 00001836 7261                <1> 	jb	short VBE_unknown 	
   433 00001838 80FCC5              <1> 	cmp	ah, 0C5h
   434 0000183B 775C                <1> 	ja	short VBE_unknown
   435                              <1> 
   436                              <1> 	; TRDOS 386 is running on BOCHS or QEMU
   437 0000183D B44F                <1> 	mov	ah, 4Fh
   438                              <1> VBE_func_1:
   439 0000183F 0FB6F0              <1> 	movzx	esi, al ; VESA VBE function number
   440                              <1> 	;shl	si, 2 ; dword
   441                              <1> 	; 02/08/2022
   442 00001842 C1E602              <1> 	shl	esi, 2
   443 00001845 6683FE14            <1> 	cmp	si, N1L
   444 00001849 734E                <1> 	jnb	short VBE_unknown
   445                              <1> 	;sti
   446                              <1> 	
   447 0000184B FF96[5B180000]      <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 00001851 FA                  <1> 	cli
   453                              <1> 	; 29/11/2023 - TRDOS 386 v2.0.7
   454 00001852 5E                  <1> 	pop	esi ; *****
   455                              <1> 	;cmp	esi, [k_page_dir]
   456                              <1> 	;je	short VBE_bios_return_x
   457 00001853 0F22DE              <1> 	mov	cr3, esi
   458                              <1> ;VBE_bios_return_x:	
   459 00001856 5E                  <1> 	pop	esi ; ****
   460 00001857 5D                  <1> 	pop	ebp ; *** ; 27/11/2020
   461 00001858 07                  <1> 	pop	es  ; **
   462 00001859 1F                  <1> 	pop	ds  ; *
   463 0000185A CF                  <1> 	iretd
   464                              <1> 
   465                              <1> 	; 26/11/2020
   466                              <1> N1:
   467 0000185B [BC180000]          <1> 	dd	vbe_biosfn_return_ctrl_info
   468 0000185F [E3380000]          <1> 	dd	vbe_biosfn_return_mode_info
   469 00001863 [9D390000]          <1> 	dd	vbe_biosfn_set_mode
   470 00001867 [6D3A0000]          <1> 	dd	vbe_biosfn_return_current_mode
   471 0000186B [8C3A0000]          <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 0000186F 0FB6F0              <1> 	movzx	esi, al ; VESA VBE 3 function number
   500                              <1> 	;shl	si, 2 ; dword
   501                              <1> 	; 02/08/2022
   502 00001872 C1E602              <1> 	shl	esi, 2
   503 00001875 6683FE14            <1> 	cmp	si, P1L
   504 00001879 731E                <1> 	jnb	short VBE_unknown
   505                              <1> 	;sti
   506                              <1> 
   507 0000187B 57                  <1> 	push	edi ; *****
   508                              <1> 
   509 0000187C FF96[85180000]      <1> 	call	dword [esi+P1] ; call VBE 3 function
   510                              <1> 
   511 00001882 5F                  <1> 	pop	edi ; *****
   512                              <1> 		
   513 00001883 EBCC                <1> 	jmp	short VBE_bios_return
   514                              <1> 
   515                              <1> P1:
   516 00001885 [9F180000]          <1> 	dd	vbe3_pmfn_return_ctrl_info
   517 00001889 [C2180000]          <1> 	dd	vbe3_pmfn_return_mode_info
   518 0000188D [FE180000]          <1> 	dd	vbe3_pmfn_set_mode
   519 00001891 [F9180000]          <1> 	dd	vbe3_pmfn_return_current_mode
   520 00001895 [071A0000]          <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 00001899 66B80001            <1> 	mov	ax, 0100h  ; ah = 1 : Function call failed	
   575                              <1> 			   ; al = 0 : Function is not supported	
   576                              <1> 	
   577 0000189D 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 0000189F 21FF                <1> 	and	edi, edi
   609 000018A1 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 000018A3 57                  <1> 	push	edi
   635 000018A4 51                  <1> 	push	ecx
   636 000018A5 BE007E0900          <1> 	mov	esi, VBE3INFOBLOCK
   637                              <1> 	;mov	ecx, 512
   638                              <1> 	; 02/08/2022
   639 000018AA 29C9                <1> 	sub	ecx, ecx
   640 000018AC B502                <1> 	mov	ch, 2
   641                              <1> 	; ecx = 512
   642 000018AE E8FDF60000          <1> 	call	transfer_to_user_buffer
   643 000018B3 59                  <1> 	pop	ecx
   644 000018B4 5F                  <1> 	pop	edi
   645 000018B5 720F                <1> 	jc	short vbe3_func_fail
   646                              <1> 
   647 000018B7 31C0                <1> 	xor	eax, eax
   648 000018B9 B04F                <1> 	mov	al, 4Fh ; successful
   649                              <1> ;vbe_ctrl_info_retn:
   650 000018BB 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 000018BC 21FF                <1> 	and	edi, edi
   670 000018BE 7406                <1> 	jz	short vbe3_func_fail ; invalid buffer addr !
   671 000018C0 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 000018C2 09FF                <1> 	or	edi, edi
   698 000018C4 7506                <1> 	jnz	short _vbe3_pmfn_return_mode_info
   699                              <1> 
   700                              <1> vbe3_func_fail:
   701 000018C6 B84F010000          <1> 	mov	eax, 014Fh ; ah = 1 : Function call failed
   702                              <1> 			   ; al = 4Fh : Function is supported
   703 000018CB C3                  <1> 	retn
   704                              <1> 	
   705                              <1> 	; jump from '_vbe_biosfn_return_mode_info' 
   706                              <1> _vbe3_pmfn_return_mode_info:
   707 000018CC 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 000018CD BF00060000          <1> 	mov	edi, VBE3MODEINFOBLOCK-VBE3SAVERESTOREBLOCK
   720                              <1> 	; ES selector base address = VBE3SAVERESTOREBLOCK 
   721 000018D2 E812010000          <1> 	call	int10h_32bit_pmi
   722                              <1> 
   723 000018D7 5F                  <1> 	pop	edi
   724                              <1> 
   725                              <1> 	;cmp	ax, 004Fh
   726                              <1> 	;jne	short vbe3_func_retn  ; failed !
   727                              <1> 
   728 000018D8 21FF                <1> 	and	edi, edi
   729                              <1> 	;jz	short vbe3_func_success
   730                              <1> 	; 21/12/2020
   731 000018DA 741C                <1> 	jz	short vbe3_func_retn
   732                              <1> 
   733 000018DC 6683F84F            <1> 	cmp	ax, 004Fh
   734 000018E0 7516                <1> 	jne	short vbe3_func_retn  ; failed !
   735                              <1> 
   736 000018E2 51                  <1> 	push	ecx
   737 000018E3 BE007C0900          <1> 	mov	esi, VBE3MODEINFOBLOCK		
   738                              <1> 	;mov	ecx, 256
   739                              <1> 	; 02/08/2022
   740 000018E8 29C9                <1> 	sub	ecx, ecx
   741 000018EA FEC5                <1> 	inc	ch
   742                              <1> 	; ecx = 256
   743 000018EC E8BFF60000          <1> 	call	transfer_to_user_buffer
   744 000018F1 59                  <1> 	pop	ecx
   745 000018F2 72D2                <1> 	jc	short vbe3_func_fail
   746                              <1> 
   747 000018F4 31C0                <1> 	xor	eax, eax
   748 000018F6 B04F                <1> 	mov	al, 4Fh ; successful
   749                              <1> vbe3_func_success:
   750                              <1> vbe3_func_retn:	
   751 000018F8 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 000018F9 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 000018FE 57                  <1> 	push	edi ; *****
   843 000018FF F6C708              <1> 	test	bh, 8	; Use user specified CRTC values
   844 00001902 7530                <1> 	jnz	short vbe3_sm_3  ; for refresh rate
   845                              <1> vbe3_sm_4:
   846 00001904 80E7C1              <1> 	and	bh, 0C1h ; use bit 15, 14, 8 only (for bh)
   847                              <1> 	;mov	[vbe_mode_x], bh
   848                              <1> 
   849 00001907 803D[DE670000]03    <1> 	cmp	byte [CRT_MODE], 3 ; is current mode 03h ?
   850 0000190E 7509                <1> 	jne	short vbe3_sm_1    ; no
   851                              <1> 
   852                              <1> 	; save mode 03h video pages and cursor positions
   853 00001910 57                  <1> 	push	edi ; **!***	
   854 00001911 51                  <1> 	push	ecx ; ******
   855                              <1> 	;push	esi
   856                              <1> 	
   857 00001912 E8CE040000          <1> 	call	save_mode3_multiscreen
   858                              <1> 	
   859                              <1> 	;pop	esi
   860 00001917 59                  <1> 	pop	ecx ; ******
   861 00001918 5F                  <1> 	pop	edi ; **!***
   862                              <1> vbe3_sm_1:
   863                              <1> 	; ax = 4F02h
   864                              <1> 	; bx = video mode number (vbe2 type)
   865 00001919 E8CB000000          <1> 	call	int10h_32bit_pmi 
   866                              <1> 			; call to far call to VBE3 PMI
   867                              <1> 
   868 0000191E 6683F84F            <1> 	cmp	ax, 004Fh ; succeeded ?
   869 00001922 750E                <1> 	jne	short vbe3_sm_2
   870                              <1> 	; set current mode byte/sign to extended (SVGA) mode
   871 00001924 C605[DE670000]FF    <1> 	mov	byte [CRT_MODE], 0FFh ; VESA VBE mode
   872                              <1> 	; set current VBE mode word to bx input
   873 0000192B 66891D[66A30100]    <1> 	mov	[video_mode], bx
   874                              <1> vbe3_sm_2:
   875                              <1> 	; 22/12/2020
   876 00001932 5F                  <1> 	pop	edi ; ***** 
   877 00001933 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 00001934 51                  <1> 	push	ecx
   883 00001935 89FE                <1> 	mov	esi, edi
   884 00001937 BF807D0900          <1> 	mov	edi, VBE3CRTCINFOBLOCK
   885                              <1> 	;mov	ecx, 64
   886                              <1> 	; 02/08/2022
   887 0000193C 29C9                <1> 	sub	ecx, ecx
   888 0000193E B140                <1> 	mov	cl, 64
   889 00001940 E8B5F60000          <1> 	call	transfer_from_user_buffer
   890 00001945 59                  <1> 	pop	ecx
   891                              <1> 	; set offset (es base addr is VBE3SAVERESTOREBLOCK) 
   892 00001946 81EF00760900        <1> 	sub	edi, VBE3SAVERESTOREBLOCK
   893 0000194C 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 0000194E 50                  <1> 	push	eax
   913 0000194F 0F20D8              <1> 	mov	eax, cr3
   914 00001952 870424              <1> 	xchg	eax, [esp] ; **!**
   915 00001955 50                  <1> 	push	eax
   916                              <1> 	;cmp	esi, [k_page_dir]
   917                              <1> 	;je	short vesa_vbe3_pmi_x
   918 00001956 A1[F07C0100]        <1> 	mov	eax, [k_page_dir]
   919 0000195B 0F22D8              <1> 	mov	cr3, eax
   920                              <1> ;vesa_vbe3_pmi_x:
   921 0000195E 58                  <1> 	pop	eax
   922                              <1> 
   923                              <1> 	; 06/12/2020
   924 0000195F 20E4                <1> 	and	ah, ah	; 0 = set mode function
   925 00001961 7402                <1> 	jz	short vbe3_pmi_0
   926 00001963 EB7D                <1> 	jmp	vbe3_pmi_9 
   927                              <1> 
   928                              <1> vbe3_pmi_0:
   929                              <1> 	; 07/12/2020
   930 00001965 88C4                <1> 	mov	ah, al
   931 00001967 80E480              <1> 	and	ah, 80h ; 0 or 80h
   932 0000196A 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 0000196C 8825[8F890100]      <1> 	mov	byte [noclearmem], ah ; 0 or 80h
   947                              <1> 	; check current video mode if it is 03h
   948 00001972 803D[DE670000]03    <1> 	cmp	byte [CRT_MODE], 3 ; current mode
   949 00001979 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 0000197B 56                  <1> 	push	esi
   962 0000197C 57                  <1> 	push	edi
   963 0000197D 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 0000197E E862040000          <1> 	call	save_mode3_multiscreen
   983                              <1> 
   984 00001983 59                  <1> 	pop	ecx
   985 00001984 5F                  <1> 	pop	edi
   986 00001985 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 00001986 A2[DE670000]        <1> 	mov	[CRT_MODE], al
   992 0000198B 3C03                <1> 	cmp	al, 3
   993 0000198D 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 0000198F 800D[8D890100]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 00001996 E84E000000          <1> 	call	int10h_32bit_pmi	
  1007                              <1> 
  1008 0000199B 803D[DE670000]03    <1> 	cmp	byte [CRT_MODE], 3  ; new video mode
  1009                              <1> 	;jne	vbe3_pmi_8	; video mode <> 03h
  1010 000019A2 7532                <1> 	jne	short vbe3_pmi_8	
  1011                              <1> 
  1012                              <1> 	;push	eax ; 04/12/2020
  1013 000019A4 53                  <1> 	push	ebx
  1014 000019A5 51                  <1> 	push	ecx
  1015 000019A6 52                  <1> 	push	edx
  1016 000019A7 57                  <1> 	push	edi ; 03/12/2020
  1017                              <1> 
  1018                              <1> 	; 12/12/2020
  1019 000019A8 56                  <1> 	push	esi
  1020 000019A9 E869040000          <1> 	call	restore_mode3_multiscreen
  1021 000019AE 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 000019AF B405                <1> 	mov	ah, 05h ; set current video page
  1076                              <1> 	;al = video page
  1077 000019B1 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 000019B6 0FB6D8              <1> 	movzx	ebx, al
  1082 000019B9 D0E3                <1> 	shl	bl, 1
  1083 000019BB 81C3[0E7D0100]      <1> 	add	ebx, CURSOR_POSN
  1084 000019C1 668B13              <1> 	mov	dx, [ebx]
  1085 000019C4 6621D2              <1> 	and	dx, dx		
  1086 000019C7 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 000019C9 88C7                <1> 	mov	bh, al
  1091 000019CB B402                <1> 	mov	ah, 02h ; set cursor position
  1092 000019CD 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 000019D2 5F                  <1> 	pop	edi
  1111 000019D3 5A                  <1> 	pop	edx
  1112 000019D4 59                  <1> 	pop	ecx
  1113 000019D5 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 000019D6 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 000019D8 870424              <1> 	xchg	eax, [esp] ; **!**
  1122                              <1> 	;cmp	eax, [k_page_dir]
  1123                              <1> 	;je	short vesa_vbe3_pmi_retn_x
  1124 000019DB 0F22D8              <1> 	mov	cr3, eax
  1125                              <1> ;vesa_vbe3_pmi_retn_x:
  1126 000019DE 58                  <1> 	pop	eax
  1127                              <1> 	;
  1128 000019DF 07                  <1> 	pop	es  ; **
  1129 000019E0 1F                  <1> 	pop	ds  ; *
  1130 000019E1 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 000019E2 E802000000          <1> 	call	int10h_32bit_pmi
  1138 000019E7 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 000019E9 56                  <1> 	push	esi
  1157 000019EA C1E010              <1> 	shl	eax, 16  ; move function number (ax) to hw
  1158 000019ED 8B35[6CA30100]      <1> 	mov	esi, [pmid_addr] ; linear address of
  1159                              <1> 				 ; PMInfo.Entrypoint pointer
  1160                              <1> 	;mov	ax, [esi+PMInfo.EntryPoint]	
  1161 000019F3 668B06              <1> 	mov	ax, [esi]	 
  1162 000019F6 C1C010              <1> 	rol	eax, 16 ; move PM entry address to hw
  1163                              <1> 			; and move function number to lw (ax)
  1164 000019F9 5E                  <1> 	pop	esi
  1165                              <1> 
  1166                              <1> 	; top of stack: ; (*)
  1167                              <1> 	; return (the caller) address of "int10h_32bit_pmi"
  1168                              <1> 
  1169 000019FA E965EDFFFF          <1> 	jmp	_VBE3PMI_fcall ; will return to the caller (*)
  1170                              <1> 
  1171                              <1> _vbe3_pmfn_srs_8:
  1172                              <1> 	; 17/01/2021
  1173 000019FF 31DB                <1> 	xor 	ebx, ebx ; points to VBE3SAVERESTOREBLOCK
  1174                              <1> _vbe3_pmfn_srs_9: ; 24/01/2021
  1175 00001A01 66B8044F            <1> 	mov	ax, 4F04h
  1176 00001A05 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 00001A07 21DB                <1> 	and	ebx, ebx ; user's buffer address
  1201 00001A09 750A                <1> 	jnz	short _vbe3_pmfn_save_restore_state
  1202                              <1> 
  1203 00001A0B 08D2                <1> 	or	dl, dl
  1204 00001A0D 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 00001A0F B84F010000          <1> 	mov	eax, 014Fh ; ah = 1 : Function call failed
  1214                              <1> 			   ; al = 4Fh : Function is supported
  1215                              <1> _vbe3_srs_retn:
  1216 00001A14 C3                  <1> 	retn
  1217                              <1> 
  1218                              <1> _vbe3_pmfn_save_restore_state:
  1219 00001A15 20D2                <1> 	and	dl, dl
  1220 00001A17 7555                <1> 	jnz	short _vbe3_pmfn_srs_2
  1221                              <1> _vbe3_pmfn_srs:
  1222 00001A19 31DB                <1> 	xor	ebx, ebx
  1223                              <1> _vbe3_pmfn_srs_0:
  1224                              <1> 	; 24/01/2021
  1225 00001A1B 83F90F              <1> 	cmp	ecx, 0Fh
  1226                              <1> 	;ja	short _vbe3_pmfn_srs_1
  1227 00001A1E 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 00001A20 80E1FD              <1> 	and	cl, ~2 ; and cl, not 2
  1234                              <1> 	
  1235                              <1> 	; 24/01/2021
  1236                              <1> 	;mov	bl, 1
  1237 00001A23 FEC3                <1> 	inc	bl ; = 1
  1238                              <1> 	;shl	bx, cl 
  1239                              <1> 	; 02/08/2022
  1240 00001A25 D3E3                <1> 	shl	ebx, cl
  1241 00001A27 66231D[70A30100]    <1> 	and	bx, [vbe3stbsflags]
  1242 00001A2E 7415                <1> 	jz	short _vbe3_pmfn_srs_1
  1243                              <1> 	;mov	bx, cx
  1244 00001A30 89CB                <1> 	mov	ebx, ecx ; <= 15
  1245 00001A32 D0E3                <1> 	shl	bl, 1 ; 0, 2, 8 .. 30
  1246 00001A34 668B9B[3D3B0000]    <1> 	mov	bx, [vbestatebufsize+ebx]
  1247 00001A3B 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 00001A3D C1EB06              <1> 	shr	ebx, 6
  1252                              <1> 	;mov	ax, 4Fh
  1253 00001A40 28E4                <1> 	sub	ah, ah
  1254 00001A42 B04F                <1> 	mov	al, 4Fh
  1255 00001A44 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 00001A45 E8B7FFFFFF          <1> 	call	_vbe3_pmfn_srs_9	
  1263 00001A4A 6683F84F            <1> 	cmp	ax, 004Fh
  1264 00001A4E 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 00001A50 B001                <1> 	mov	al, 1
  1271                              <1> 	;shl	ax, cl		
  1272                              <1> 	; 02/08/2022
  1273 00001A52 D3E0                <1> 	shl	eax, cl
  1274 00001A54 660905[70A30100]    <1> 	or	[vbe3stbsflags], ax ; set flag for state option
  1275                              <1> 	; 23/01/2021
  1276 00001A5B 89DF                <1> 	mov	edi, ebx
  1277 00001A5D 89C8                <1> 	mov	eax, ecx
  1278 00001A5F D0E0                <1> 	shl	al, 1
  1279                              <1> 	;shl	di, 6 ; * 64
  1280                              <1> 	; 02/08/2022
  1281 00001A61 C1E706              <1> 	shl	edi, 6
  1282 00001A64 6689B8[3D3B0000]    <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 00001A6B B04F                <1> 	mov	al, 4Fh
  1287 00001A6D 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 00001A6E F6C1FD              <1> 	test	cl, ~2 ; test cl, not 2
  1297 00001A71 749C                <1> 	jz	short _vbe3_pmfn_srs_fail
  1298                              <1> 
  1299 00001A73 80FA02              <1> 	cmp	dl, 2
  1300 00001A76 7748                <1> 	ja	short _vbe3_pmfn_srs_5
  1301                              <1> 
  1302                              <1> 	;and	cl, ~2 ; and cl, not 2
  1303                              <1> 
  1304 00001A78 53                  <1> 	push	ebx ; * ; buffer address
  1305                              <1> 	; save or restore state
  1306                              <1> 	; (get required buffer size at first)
  1307 00001A79 52                  <1> 	push	edx ; **
  1308 00001A7A 28D2                <1> 	sub	dl, dl ; 0
  1309 00001A7C E898FFFFFF          <1> 	call	_vbe3_pmfn_srs
  1310 00001A81 5A                  <1> 	pop	edx ; **
  1311                              <1> 	; 24/01/2021
  1312 00001A82 5B                  <1> 	pop	ebx ; *
  1313 00001A83 08E4                <1> 	or	ah, ah
  1314 00001A85 7538                <1> 	jnz	short _vbe3_pmfn_srs_4 ; error
  1315                              <1> 
  1316                              <1> 	; edi = buffer size in bytes
  1317 00001A87 81FF00080000        <1> 	cmp	edi, 2048
  1318 00001A8D 772B                <1> 	ja	short _vbe3_pmfn_srs_3
  1319                              <1> 
  1320 00001A8F 80FA01              <1> 	cmp	dl, 1
  1321 00001A92 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 00001A94 E842000000          <1> 	call	_vbe3_pmfn_srs_7
  1330                              <1> 	
  1331 00001A99 6683F84F            <1> 	cmp	ax, 004Fh
  1332 00001A9D 7520                <1> 	jne	short _vbe3_pmfn_srs_4
  1333                              <1> 
  1334 00001A9F 09DB                <1> 	or	ebx, ebx  ; kernel ('sysvideo') ?
  1335 00001AA1 741C                <1> 	jz	short _vbe3_pmfn_srs_4 ; yes
  1336                              <1> 
  1337                              <1> 	; the caller is user
  1338 00001AA3 51                  <1> 	push	ecx ; *
  1339 00001AA4 89F9                <1> 	mov	ecx, edi ; state buffer size
  1340 00001AA6 BE00760900          <1> 	mov	esi, VBE3SAVERESTOREBLOCK ; source
  1341                              <1> 					; (vbe3 pmi buff)
  1342 00001AAB 89DF                <1> 	mov	edi, ebx	; destination (user buff)
  1343 00001AAD E8FEF40000          <1> 	call	transfer_to_user_buffer
  1344 00001AB2 59                  <1> 	pop	ecx ; *
  1345 00001AB3 7205                <1> 	jc	short _vbe3_pmfn_srs_3
  1346                              <1> 
  1347 00001AB5 29C0                <1> 	sub	eax, eax
  1348 00001AB7 B04F                <1> 	mov	al, 4Fh
  1349 00001AB9 C3                  <1> 	retn
  1350                              <1> 
  1351                              <1> 	; 24/01/2021
  1352                              <1> _vbe3_pmfn_srs_3:
  1353 00001ABA B84F010000          <1> 	mov	eax, 014Fh
  1354                              <1> _vbe3_pmfn_srs_4:
  1355 00001ABF C3                  <1> 	retn
  1356                              <1> _vbe3_pmfn_srs_5:
  1357 00001AC0 31C0                <1> 	xor	eax, eax
  1358 00001AC2 FEC4                <1> 	inc	ah
  1359                              <1> 	; eax = 0100h, function is not supported
  1360 00001AC4 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 00001AC5 09DB                <1> 	or	ebx, ebx ; 0 ?	
  1368 00001AC7 7412                <1> 	jz	short _vbe3_pmfn_srs_7 ; 'sysvideo' call
  1369                              <1> 	; 24/01/2021
  1370                              <1> 	;jz	_vbe3_pmfn_srs_8
  1371 00001AC9 89DE                <1> 	mov	esi, ebx
  1372                              <1> 	; esi = user's video state buffer
  1373 00001ACB 51                  <1> 	push	ecx ; *
  1374 00001ACC 89F9                <1> 	mov	ecx, edi ; state buffer size
  1375 00001ACE BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK ; destination
  1376                              <1> 					; (vbe3 pmi buff)
  1377                              <1> 	;mov	esi, ebx	; source (user buff)
  1378 00001AD3 E822F50000          <1> 	call	transfer_from_user_buffer
  1379 00001AD8 59                  <1> 	pop	ecx ; *
  1380 00001AD9 72DF                <1> 	jc	short _vbe3_pmfn_srs_3
  1381                              <1> _vbe3_pmfn_srs_7:
  1382 00001ADB 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 00001ADC E81EFFFFFF          <1> 	call	_vbe3_pmfn_srs_8
  1389 00001AE1 5B                  <1> 	pop	ebx ; *
  1390 00001AE2 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 00001AE3 8A25[E0670000]      <1> 	mov	ah, [CRT_COLS]	; GET NUMBER OF COLUMNS
  1406 00001AE9 A0[DE670000]        <1> 	mov	al, [CRT_MODE]	; CURRENT MODE
  1407                              <1> 	;movzx	esi, al
  1408                              <1> 	;mov	ah, [esi+M6] 
  1409                              <1> 	; BH = active page
  1410 00001AEE 8A3D[1E7D0100]      <1> 	mov	bh, [ACTIVE_PAGE] ; GET CURRENT ACTIVE PAGE
  1411 00001AF4 FA                  <1> 	cli	; 02/01/2017
  1412 00001AF5 5D                  <1> 	pop	ebp		; RECOVER REGISTERS
  1413 00001AF6 5F                  <1> 	pop	edi
  1414 00001AF7 5E                  <1> 	pop	esi
  1415 00001AF8 59                  <1> 	pop	ecx		; DISCARD SAVED BX
  1416 00001AF9 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 00001AFB 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 00001AFD 803D[DE670000]FF    <1> 	cmp	byte [CRT_MODE], 0FFh ; VESA VBE graphics mode
  1457 00001B04 7220                <1> 	jb	short _set_mode_      ; signature  	
  1458                              <1> 				      ; VBE mode number is in	 
  1459                              <1> 				      ; [video_mode] bit 0to8
  1460 00001B06 88C3                <1> 	mov	bl, al ; save video mode
  1461 00001B08 E87C230000          <1> 	call	dispi_get_enable
  1462 00001B0D 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 00001B0E 31C0                <1> 	xor	eax, eax ; 0 
  1466 00001B10 E849230000          <1> 	call	dispi_set_enable
  1467 00001B15 88D8                <1> 	mov	al, bl ; restore video mode
  1468 00001B17 E827000000          <1> 	call	_set_mode
  1469 00001B1C 58                  <1> 	pop	eax ; restore current VBE dispi status 
  1470 00001B1D 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 00001B1F E83A230000          <1> 	call	dispi_set_enable
  1478 00001B24 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 00001B26 E818000000          <1> 	call	_set_mode ; 24/06/2016 (set_txt_mode)
  1496                              <1> 	; 26/11/2020
  1497 00001B2B 7305                <1> 	jnc	short VIDEO_RETURN
  1498                              <1> 
  1499                              <1> 	; 26/11/2020
  1500                              <1> _video_func_err:
  1501 00001B2D 31C0                <1> 	xor	eax, eax ; function call failed
  1502 00001B2F 48                  <1> 	dec	eax  ; 0FFFFFFFFh ; - 1	
  1503 00001B30 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 00001B32 A1[80890100]        <1> 	mov	eax, [video_eax] ; 12/05/2016
  1512                              <1> _video_return:
  1513 00001B37 FA                  <1> 	cli ; 02/01/2017
  1514 00001B38 5D                  <1> 	pop	ebp ; ******** ; 26/11/2020
  1515 00001B39 5F                  <1> 	pop	edi ; *******
  1516 00001B3A 5E                  <1> 	pop	esi ; ******
  1517 00001B3B 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 00001B3C 59                  <1> 	pop	ecx ; **** ; 26/11/2020
  1524 00001B3D 5A                  <1> 	pop	edx ; ***
  1525 00001B3E 1F                  <1> 	pop	ds  ; **
  1526 00001B3F 07                  <1> 	pop	es  ; *	; RECOVER SEGMENTS
  1527 00001B40 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 00001B41 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 00001B43 88C4                <1> 	mov	ah, al
  1575 00001B45 80E480              <1> 	and	ah, 80h
  1576                              <1> 	;mov	[noclearmem], al
  1577 00001B48 8825[8F890100]      <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 00001B4E 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 00001B50 3C03                <1> 	cmp	al, 03h	    ; mode 3, 80x25 text, 16 colors
  1622 00001B52 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 00001B54 08E4                <1> 	or	ah, ah ; 80h or 0 ('noclearmem' option)
  1628 00001B56 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 00001B58 3805[DE670000]      <1> 	cmp	[CRT_MODE], al	; 03h
  1636 00001B5E 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 00001B60 C605[8D890100]80    <1> 	mov	byte [p_crt_mode], 80h ; clear page sign
  1649 00001B67 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 00001B69 803D[DE670000]03    <1> 	cmp	byte [CRT_MODE], 3 ; is current mode 03h?
  1655 00001B70 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 00001B72 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 00001B77 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 00001B79 800D[8D890100]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 00001B80 A2[DE670000]        <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 00001B85 88C4                <1> 	mov	ah, al
  1739 00001B87 B910000000          <1> 	mov	ecx, vga_mode_count
  1740 00001B8C BE[FA670000]        <1> 	mov	esi, vga_modes
  1741 00001B91 31DB                <1> 	xor	ebx, ebx
  1742                              <1> _sm_4:
  1743 00001B93 AC                  <1> 	lodsb
  1744 00001B94 38C4                <1> 	cmp	ah, al
  1745 00001B96 7406                <1> 	je	short _sm_5
  1746 00001B98 FEC3                <1> 	inc	bl
  1747 00001B9A 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 00001B9C F9                  <1> 	stc	; unimplemented video mode ! (cf=1)
  1755                              <1> 
  1756 00001B9D 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 00001B9E 8A83[4A680000]      <1> 	mov	al, [ebx+vga_memmodel]
  1766 00001BA4 A2[A6890100]        <1> 	mov	[VGA_MTYPE], al
  1767                              <1> 
  1768 00001BA9 89DF                <1> 	mov	edi, ebx
  1769 00001BAB 81C7[5A680000]      <1> 	add	edi, vga_dac_s 	
  1770 00001BB1 C0E302              <1> 	shl	bl, 2 ; byte -> dword
  1771 00001BB4 81C3[0A680000]      <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 00001BBA 8B33                <1> 	mov	esi, [ebx]
  1779 00001BBC 89F3                <1> 	mov	ebx, esi
  1780 00001BBE 83C614              <1> 	add	esi, vga_p_cm_pos ; ebx + 20
  1781 00001BC1 668B06              <1> 	mov	ax, [esi]       ; get the cursor mode from the table
  1782 00001BC4 66A3[F7670000]      <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 00001BCA E893020000          <1> 	call	cursor_shape_fix
  1786                              <1> 	; al = 14, ah = 15 (If [CHAR_HEIGHT] = 16)
  1787 00001BCF 668906              <1> 	mov	[esi], ax
  1788                              <1> 
  1789 00001BD2 56                  <1> 	push	esi ; *	
  1790                              <1> 
  1791                              <1> 	; 17/04/2021
  1792 00001BD3 B603                <1> 	mov	dh, 03h
  1793                              <1> 	;
  1794 00001BD5 8A25[E5670000]      <1> 	mov	ah, [VGA_MODESET_CTL]
  1795 00001BDB 80E408              <1> 	and	ah, 8 ; default palette loading ?
  1796 00001BDE 7520                <1> 	jnz	short _sm_6
  1797                              <1> 	;mov	dx, 3C6h ; VGAREG_PEL_MASK (DAC mask register)
  1798                              <1> 	; 17/04/2021
  1799 00001BE0 B2C6                <1> 	mov	dl, 0C6h
  1800 00001BE2 B0FF                <1> 	mov	al, 0FFh ; PEL mask
  1801 00001BE4 EE                  <1> 	out	dx, al
  1802 00001BE5 8A27                <1> 	mov	ah, [edi] ; DAC model (selection number)
  1803 00001BE7 E8F80F0000          <1> 	call	load_dac_palette
  1804                              <1> 	; ecx = 0
  1805 00001BEC F605[E5670000]02    <1> 	test	byte [VGA_MODESET_CTL], 2 ; gray scale summing
  1806 00001BF3 740B                <1> 	jz	short _sm_6
  1807 00001BF5 53                  <1> 	push	ebx
  1808 00001BF6 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 00001BF8 FEC5                <1> 	inc	ch
  1814                              <1> 	; ecx = 256
  1815 00001BFA E837100000          <1> 	call	gray_scale_summing
  1816 00001BFF 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 00001C00 B2DA                <1> 	mov	dl, 0DAh ; dx = 3DAh
  1822 00001C02 EC                  <1> 	in	al, dx
  1823                              <1> 	; Set Attribute Ctl
  1824 00001C03 89DE                <1> 	mov	esi, ebx ; addr of params tbl for selected mode
  1825 00001C05 83C623              <1> 	add	esi, 35  ; actl regs
  1826 00001C08 30E4                <1> 	xor	ah, ah ; 0
  1827                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  1828                              <1> 	; 17/04/2021
  1829 00001C0A B2C0                <1> 	mov	dl, 0C0h
  1830                              <1> _sm_7:
  1831 00001C0C 88E0                <1> 	mov	al, ah
  1832 00001C0E EE                  <1> 	out	dx, al ; index
  1833 00001C0F AC                  <1> 	lodsb
  1834                              <1> 	; DX = 3C0h = VGAREG_ACTL_WRITE_DATA
  1835 00001C10 EE                  <1> 	out	dx, al ; value
  1836 00001C11 FEC4                <1> 	inc	ah
  1837 00001C13 80FC14              <1> 	cmp	ah, 20 ; number of actl registers
  1838 00001C16 72F4                <1> 	jb	short _sm_7
  1839                              <1> 	;
  1840 00001C18 88E0                <1> 	mov	al, ah ; 20
  1841 00001C1A EE                  <1> 	out	dx, al ; index
  1842 00001C1B 28C0                <1> 	sub	al, al ; 0
  1843 00001C1D EE                  <1> 	out	dx, al ; value
  1844                              <1> 	;
  1845                              <1> 	; Set Sequencer Ctl
  1846 00001C1E 89DE                <1> 	mov	esi, ebx ; addr of params tbl for selected mode
  1847 00001C20 83C605              <1> 	add	esi, 5 ; sequ regs
  1848                              <1> 	;
  1849                              <1> 	;mov	dx, 3C4h  ; VGAREG_SEQU_ADDRESS
  1850                              <1> 	; 17/04/2021
  1851 00001C23 B2C4                <1> 	mov	dl, 0C4h
  1852 00001C25 EE                  <1> 	out	dx, al ; 0
  1853                              <1> 	;inc	dx ; 3C5h ; VGAREG_SEQU_DATA
  1854                              <1> 	; 17/04/2021
  1855 00001C26 FEC2                <1> 	inc	dl ; dx = 3C5h	
  1856 00001C28 B003                <1> 	mov	al, 3
  1857 00001C2A EE                  <1> 	out	dx, al
  1858 00001C2B B401                <1> 	mov	ah, 1	
  1859                              <1> _sm_8:
  1860 00001C2D 88E0                <1> 	mov	al, ah
  1861                              <1> 	;mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  1862                              <1> 	;dec	dx
  1863                              <1> 	; 17/04/2021
  1864 00001C2F FECA                <1> 	dec	dl ; dx = 3C4h
  1865 00001C31 EE                  <1> 	out	dx, al ; index
  1866 00001C32 AC                  <1> 	lodsb
  1867                              <1> 	;inc	dx ; 3C5h ; VGAREG_SEQU_DATA
  1868                              <1> 	; 17/04/2021
  1869 00001C33 FEC2                <1> 	inc	dl
  1870 00001C35 EE                  <1> 	out	dx, al
  1871 00001C36 80FC04              <1> 	cmp	ah, 4 ; number of sequ regs
  1872 00001C39 7304                <1> 	jnb	short _sm_9		
  1873 00001C3B FEC4                <1> 	inc	ah 
  1874 00001C3D EBEE                <1> 	jmp	short _sm_8
  1875                              <1> _sm_9:
  1876                              <1> 	; Set Grafx Ctl
  1877 00001C3F 89DE                <1> 	mov	esi, ebx ; addr of params tbl for selected mode
  1878 00001C41 83C637              <1> 	add	esi, 55 ; grdc regs
  1879 00001C44 30E4                <1> 	xor	ah, ah ; 0
  1880                              <1> _sm_10:
  1881 00001C46 88E0                <1> 	mov	al, ah
  1882                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  1883                              <1> 	; 17/04/2021
  1884 00001C48 B2CE                <1> 	mov	dl, 0CEh
  1885 00001C4A EE                  <1> 	out	dx, al	
  1886 00001C4B AC                  <1> 	lodsb
  1887                              <1> 	;inc	dx ; 3CFh ; VGAREG_GRDC_DATA
  1888                              <1> 	; 17/04/2021
  1889 00001C4C FEC2                <1> 	inc	dl ; 3CFh
  1890 00001C4E EE                  <1> 	out	dx, al
  1891 00001C4F FEC4                <1> 	inc	ah
  1892 00001C51 80FC09              <1> 	cmp	ah, 9 ; number of grdc regs
  1893 00001C54 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 00001C56 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 00001C58 66B81100            <1> 	mov	ax, 11h
  1905 00001C5C 66EF                <1> 	out	dx, ax
  1906 00001C5E 89DE                <1> 	mov	esi, ebx ; addr of params tbl for selected mode
  1907 00001C60 83C60A              <1> 	add	esi, 10 ; crtc regs
  1908                              <1> 	; ah = 0
  1909                              <1> _sm_11:
  1910 00001C63 88E0                <1> 	mov	al, ah
  1911                              <1> 	; dx = 3D4h = VGAREG_VGA_CRTC_ADDRESS
  1912 00001C65 EE                  <1> 	out	dx, al ; index
  1913 00001C66 AC                  <1> 	lodsb
  1914                              <1> 	;inc	dx  ; VGAREG_VGA_CRTC_ADDRESS + 1
  1915                              <1> 	; 17/04/2021
  1916 00001C67 FEC2                <1> 	inc	dl
  1917 00001C69 EE                  <1> 	out	dx, al ; value
  1918 00001C6A 80FC18              <1> 	cmp	ah, 24 ; number of crtc registers - 1
  1919 00001C6D 7306                <1> 	jnb	short _sm_12
  1920 00001C6F FEC4                <1> 	inc	ah
  1921                              <1> 	;dec	dx ; 3D4h
  1922                              <1> 	; 17/04/2021
  1923 00001C71 FECA                <1> 	dec	dl
  1924 00001C73 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 00001C75 B2CC                <1> 	mov	dl, 0CCh
  1930 00001C77 8A4309              <1> 	mov	al, [ebx+9] ; misc reg
  1931 00001C7A 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 00001C7B B2C0                <1> 	mov	dl, 0C0h
  1937 00001C7D B020                <1> 	mov	al, 20h  
  1938 00001C7F EE                  <1>         out     dx, al   ; set bit 5 to 1
  1939                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  1940                              <1> 	; 17/04/2021
  1941 00001C80 B2DA                <1> 	mov	dl, 0DAh
  1942 00001C82 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 00001C83 F605[8F890100]80    <1> 	test	byte [noclearmem], 80h
  1949 00001C8A 753B                <1> 	jnz	short _sm_15	
  1950                              <1> 
  1951                              <1> 	; 29/07/2016
  1952 00001C8C 31C0                <1> 	xor	eax, eax
  1953                              <1> 	;mov	ecx, 4000h ; 16K words (32K)
  1954                              <1> 	; 02/08/2022
  1955 00001C8E 29C9                <1> 	sub	ecx, ecx
  1956 00001C90 B540                <1> 	mov	ch, 40h
  1957                              <1> 	; ecx = 4000h 
  1958 00001C92 803D[A6890100]02    <1> 	cmp     byte [VGA_MTYPE], 2  ; CTEXT, MTEXT, CGA
  1959 00001C99 7715                <1> 	ja	short _sm_14    ; no ? (0A0000h)
  1960 00001C9B BF00800B00          <1> 	mov	edi, 0B8000h
  1961 00001CA0 7409                <1> 	je	short _sm_13	; CGA graphics mode
  1962                              <1> 	; 08/08/2016
  1963 00001CA2 A3[A2890100]        <1> 	mov	[VGA_INT43H], eax ; 0 ; default font 
  1964 00001CA7 66B82007            <1> 	mov	ax, 0720h	; CGA text mode
  1965                              <1> _sm_13:
  1966 00001CAB F366AB              <1> 	rep	stosw
  1967 00001CAE EB17                <1> 	jmp	short _sm_15
  1968                              <1> 
  1969                              <1> _sm_14:
  1970 00001CB0 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 00001CB5 B2C4                <1> 	mov	dl, 0C4h
  1975 00001CB7 B002                <1> 	mov	al, 2
  1976 00001CB9 EE                  <1> 	out	dx, al
  1977                              <1> 	;mov	dx, 3C5h ; VGAREG_SEQU_DATA
  1978                              <1> 	;inc	dx
  1979                              <1> 	; 17/04/2021
  1980 00001CBA FEC2                <1> 	inc	dl ; 3C5h
  1981 00001CBC EC                  <1> 	in	al, dx ; mmask
  1982                              <1> 	;push	ax
  1983                              <1> 	; 12/04/2021
  1984 00001CBD 50                  <1> 	push	eax
  1985 00001CBE B00F                <1> 	mov	al, 0Fh ; all planes
  1986 00001CC0 EE                  <1> 	out	dx, al
  1987 00001CC1 30C0                <1> 	xor	al, al ; 0
  1988 00001CC3 F3AB                <1> 	rep	stosd	; ecx = 163684 (64K)
  1989                              <1> 	;pop	ax
  1990                              <1> 	; 12/04/2021
  1991 00001CC5 58                  <1> 	pop	eax
  1992 00001CC6 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 00001CC7 668B03              <1> 	mov	ax, [ebx] ; num of columns, 'twidth'
  1997 00001CCA A2[E0670000]        <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 00001CCF FEC4                <1> 	inc	ah ; 09/07/2016
  2002 00001CD1 8825[E6670000]      <1> 	mov	[VGA_ROWS], ah
  2003                              <1> 	; 10/08/2016
  2004 00001CD7 8A4302              <1> 	mov	al, [ebx+2]
  2005 00001CDA A2[E2670000]        <1> 	mov	[CHAR_HEIGHT], al 
  2006                              <1> 	; 29/07/2016
  2007                              <1> 	; length of regen buffer in bytes
  2008 00001CDF 668B4B03            <1> 	mov	cx, [ebx+3] ; 'slength_l'
  2009 00001CE3 66890D[90890100]    <1> 	mov	[CRT_LEN], cx
  2010                              <1> 	;
  2011                              <1> 	; 27/07/2016
  2012 00001CEA 30E4                <1> 	xor	ah, ah
  2013 00001CEC A0[1E7D0100]        <1> 	mov	al, [ACTIVE_PAGE] ; may be > 0 for mode 3
  2014                              <1> 	;mul	word [CRT_LEN] ; 4096 for mode 3
  2015 00001CF1 66F7E1              <1> 	mul	cx ; 29/07/2016
  2016 00001CF4 66A3[0C7D0100]      <1> 	mov	[CRT_START], ax
  2017                              <1> 	;
  2018 00001CFA B060                <1> 	mov	al, 60h
  2019                              <1> 	;cmp	byte [noclearmem], 0
  2020                              <1> 	;jna	short _sm_16
  2021                              <1> 	;add	al, 80h
  2022 00001CFC 0A05[8F890100]      <1> 	or	al, [noclearmem] ; 17/11/2020
  2023                              <1> _sm_16:
  2024 00001D02 A2[E3670000]        <1> 	mov	[VGA_VIDEO_CTL], al
  2025 00001D07 C605[E4670000]F9    <1> 	mov	byte [VGA_SWITCHES], 0F9h
  2026 00001D0E 8025[E5670000]7F    <1> 	and	byte [VGA_MODESET_CTL], 7Fh
  2027                              <1> 
  2028 00001D15 5E                  <1> 	pop	esi ; *
  2029                              <1> 
  2030                              <1> 	; 26/07/2016
  2031                              <1> 	; 07/07/2016
  2032 00001D16 668B0D[F7670000]    <1> 	mov	cx, [CURSOR_MODE] ; restore cursor mode (initial value)
  2033 00001D1D 66870E              <1> 	xchg	cx, [esi] ; cl = start line, ch = end line
  2034                              <1> 			  ; reset to initial value
  2035 00001D20 86E9                <1> 	xchg 	ch, cl  ; ch = start line, cl = end line  
  2036 00001D22 66890D[F7670000]    <1> 	mov	[CURSOR_MODE], cx ; save (fixed) cursor mode
  2037                              <1> 
  2038                              <1> 	; 27/07/2016
  2039 00001D29 803D[A6890100]02    <1> 	cmp	byte [VGA_MTYPE], 2 ; CTEXT, MTEXT
  2040 00001D30 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 00001D32 B40A                <1> 	mov	ah, 10	; 6845 register for cursor set
  2048 00001D34 E81F060000          <1> 	call	m16	; output cx register
  2049                              <1> 	
  2050                              <1> 	; 25/07/2016
  2051 00001D39 803D[DE670000]03    <1>         cmp     byte [CRT_MODE], 03h
  2052 00001D40 7507                <1> 	jne	short _sm_17
  2053                              <1> 	; 26/07/2016
  2054                              <1> 
  2055 00001D42 A0[1E7D0100]        <1> 	mov	al, [ACTIVE_PAGE]
  2056 00001D47 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 00001D49 29C0                <1> 	sub	eax, eax ; 17/11/2020
  2061 00001D4B BF[0E7D0100]        <1> 	mov	edi, CURSOR_POSN
  2062 00001D50 AB                  <1> 	stosd	
  2063 00001D51 AB                  <1> 	stosd
  2064 00001D52 AB                  <1> 	stosd
  2065 00001D53 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 00001D54 803D[A6890100]02    <1> 	cmp	byte [VGA_MTYPE], 2 ; CTEXT, MTEXT
  2071                              <1> 	;jnb	_sm_23
  2072                              <1> 	; 04/08/2022
  2073 00001D5B 7205                <1> 	jb	short _sm_24
  2074 00001D5D 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 00001D62 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 00001D64 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 00001D69 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 00001D6D 66B80300            <1> 	mov	ax, 03h
  2099 00001D71 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 00001D73 30C0                <1> 	xor	al, al
  2108 00001D75 3805[8D890100]      <1>         cmp     [p_crt_mode], al ; 0 
  2109 00001D7B 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 00001D7D 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 00001D82 803D[DE670000]03    <1> 	cmp	byte [CRT_MODE], 3  ; new video mode
  2156 00001D89 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 00001D8B A0[8E890100]        <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 00001D90 F605[8D890100]7F    <1> 	test    byte [p_crt_mode], 7Fh ; 83h or 80h or 03h
  2171 00001D97 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 00001D99 A2[1E7D0100]        <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 00001D9E 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 00001DA3 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 00001DA8 F605[8F890100]80    <1> 	test	byte [noclearmem], 80h
  2221 00001DAF 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 00001DB1 66B82007            <1> 	mov	ax, 0720h
  2228                              <1> 	; 26/11/2020
  2229                              <1> 	;mov	ecx, 2048 ; 4096/2
  2230                              <1> 	; 02/08/2022
  2231 00001DB5 29C9                <1> 	sub	ecx, ecx
  2232 00001DB7 B508                <1> 	mov	ch, 08h
  2233                              <1> 	; ecx = 0800h
  2234 00001DB9 BF00800B00          <1> 	mov	edi, 0B8000h ; [crt_base]
  2235 00001DBE 66033D[0C7D0100]    <1> 	add	di, [CRT_START]
  2236 00001DC5 F366AB              <1> 	rep	stosw	; FILL THE REGEN BUFFER WITH BLANKS
  2237                              <1> 	;
  2238                              <1> 	; 19/11/2020
  2239 00001DC8 A0[1E7D0100]        <1> 	mov	al, [ACTIVE_PAGE] ; 0 to 7 (for video mode 3)
  2240 00001DCD 0FB6D8              <1> 	movzx	ebx, al
  2241 00001DD0 D0E3                <1> 	shl	bl, 1
  2242 00001DD2 66898B[0E7D0100]    <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 00001DD9 8025[8D890100]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 00001DE0 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 00001DE5 BE00800B00          <1> 	mov	esi, 0B8000h
  2270 00001DEA BF00800900          <1> 	mov	edi, 98000h ; 30/07/2016
  2271                              <1> 	;mov	ecx, (0B8000h-0B0000h)/4
  2272                              <1> 	; 02/08/2022
  2273 00001DEF 29C9                <1> 	sub	ecx, ecx
  2274 00001DF1 B520                <1> 	mov	ch, 20h
  2275                              <1> 	; ecx = 2000h 
  2276 00001DF3 F3A5                <1> 	rep	movsd
  2277                              <1> 	
  2278 00001DF5 C605[8D890100]03    <1> 	mov	byte [p_crt_mode], 3 ; previous mode, backup sign
  2279                              <1> 	; 26/11/2020
  2280 00001DFC 860D[1E7D0100]      <1> 	xchg	cl, [ACTIVE_PAGE]
  2281 00001E02 880D[8E890100]      <1> 	mov	[p_crt_page], cl  ; save as previous active page
  2282                              <1> 	
  2283                              <1> 	; save cursor positions
  2284 00001E08 BE[0E7D0100]        <1> 	mov	esi, CURSOR_POSN
  2285 00001E0D BF[92890100]        <1> 	mov	edi, cursor_pposn ; cursor positions backup
  2286 00001E12 B104                <1> 	mov	cl, 4
  2287 00001E14 F3A5                <1> 	rep	movsd
  2288 00001E16 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 00001E17 A0[8E890100]        <1> 	mov	al, [p_crt_page] ; previous mode 3 active page
  2304 00001E1C A2[1E7D0100]        <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 00001E21 66C705[0C7D0100]00- <1> 	mov	word [CRT_START], 0
  2313 00001E29 00                  <1>
  2314                              <1> 
  2315                              <1> 	; check active page and set it again if it is not 0
  2316 00001E2A 08C0                <1> 	or	al, al
  2317                              <1> 	;;jz	short vbe3_pmi_7
  2318                              <1> 	;jz	short _restore_mode3_multiscreen
  2319 00001E2C 740F                <1> 	jz	short r_m3_ms_1
  2320 00001E2E 88C1                <1> 	mov	cl, al
  2321                              <1> ;vbe3_pmi_5:
  2322                              <1> r_m3_ms_0:
  2323 00001E30 668105[0C7D0100]00- <1> 	add	word [CRT_START], 4096
  2323 00001E38 10                  <1>
  2324 00001E39 FEC9                <1> 	dec	cl
  2325                              <1> 	;jnz	short vbe3_pmi_5
  2326 00001E3B 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 00001E3D BE00800900          <1> 	mov	esi, 98000h ; 30/07/2016 
  2335 00001E42 BF00800B00          <1> 	mov	edi, 0B8000h
  2336                              <1> 	;mov	cx, 2000h ; 8K dwords (32K)
  2337                              <1> 	;mov	ecx, 2000h
  2338                              <1> 	; 02/08/2022
  2339 00001E47 29C9                <1> 	sub	ecx, ecx
  2340 00001E49 B520                <1> 	mov	ch, 20h
  2341                              <1> 	; ecx = 2000h 
  2342 00001E4B F3A5                <1> 	rep	movsd
  2343                              <1> 
  2344                              <1> 	; 19/11/2020
  2345 00001E4D 880D[8D890100]      <1> 	mov	[p_crt_mode], cl ; reset ('case 3' end condition)
  2346                              <1> 
  2347                              <1> 	; restore cursor positions
  2348 00001E53 BE[92890100]        <1> 	mov	esi, cursor_pposn
  2349 00001E58 BF[0E7D0100]        <1> 	mov	edi, CURSOR_POSN
  2350                              <1> 	;mov	ecx, 4	; restore all cursor positions (16 bytes)
  2351 00001E5D B104                <1> 	mov	cl, 4
  2352 00001E5F F3A5                <1> 	rep 	movsd
  2353 00001E61 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 00001E62 803D[E2670000]08    <1> 	cmp	byte [CHAR_HEIGHT], 8
  2378 00001E69 7647                <1> 	jna	short csf_3
  2379 00001E6B 80FC08              <1> 	cmp	ah, 8
  2380 00001E6E 7342                <1> 	jnb	short csf_3
  2381 00001E70 3C20                <1> 	cmp	al, 20h
  2382 00001E72 733E                <1> 	jnb	short csf_3
  2383                              <1> 	;
  2384                              <1> 	;push	ax
  2385                              <1> 	; 12/04/2021
  2386 00001E74 50                  <1> 	push	eax
  2387                              <1> 	; {
  2388                              <1>    	; if(CL!=(CH+1))	
  2389 00001E75 FEC0                <1> 	inc	al
  2390 00001E77 38C4                <1> 	cmp	ah, al   ; ah != al + 1
  2391 00001E79 740F                <1>         je      short csf_1
  2392                              <1> 	; CH = ((CH+1) * cheight / 8) -1;
  2393 00001E7B 8A25[E2670000]      <1> 	mov	ah, [CHAR_HEIGHT]
  2394 00001E81 F6E4                <1> 	mul	ah
  2395 00001E83 C0E803              <1> 	shr	al, 3 ; / 8
  2396 00001E86 FEC8                <1> 	dec	al ; - 1
  2397 00001E88 EB0E                <1> 	jmp	short csf_2 
  2398                              <1> csf_1: 	
  2399                              <1>  	; }
  2400                              <1>    	; else		; ah = al + 1
  2401                              <1>     	; {
  2402 00001E8A FEC4                <1> 	inc	ah	; ah = ah + 1   
  2403                              <1> 	; CH = ((CL+1) * cheight / 8) - 2;
  2404 00001E8C A0[E2670000]        <1> 	mov	al, [CHAR_HEIGHT]
  2405 00001E91 F6E4                <1> 	mul	ah
  2406 00001E93 C0E803              <1> 	shr	al, 3 ; / 8
  2407 00001E96 2C02                <1> 	sub	al, 2 ; - 2
  2408                              <1> 	; al = 14 (if [CHAR_HEIGHT] = 16)
  2409                              <1> csf_2:
  2410 00001E98 880424              <1> 	mov	[esp], al
  2411 00001E9B 8A642401            <1> 	mov	ah, [esp+1]
  2412                              <1> 	; CL = ((CL+1) * cheight / 8) - 1;
  2413 00001E9F FEC4                <1> 	inc	ah 
  2414 00001EA1 A0[E2670000]        <1> 	mov	al, [CHAR_HEIGHT]
  2415 00001EA6 F6E4                <1> 	mul	ah
  2416 00001EA8 C0E803              <1> 	shr	al, 3 ; / 8
  2417 00001EAB FEC8                <1> 	dec	al ; - 1
  2418 00001EAD 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 00001EB1 58                  <1> 	pop	eax
  2424                              <1> csf_3:
  2425 00001EB2 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 00001EB3 803D[DE670000]07    <1> 	cmp	byte [CRT_MODE], 7
  2432                              <1> 	;ja	VIDEO_RETURN ; 12/09/2016
  2433                              <1> 	; 04/08/2022
  2434 00001EBA 7738                <1> 	ja	short set_cpos_inv_vp
  2435 00001EBC E805000000          <1> 	call	_set_ctype
  2436 00001EC1 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 00001EC6 89C8                <1> 	mov	eax, ecx
  2472                              <1> 
  2473 00001EC8 86C4                <1> 	xchg	al, ah
  2474                              <1> 	; AL = start line, AH = stop line
  2475 00001ECA 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 00001ECF 89C1                <1> 	mov	ecx, eax
  2480 00001ED1 86E9                <1> 	xchg	ch, cl
  2481                              <1> 	; CH = start line (fixed), CL = stop line (fixed)
  2482                              <1> 	;
  2483 00001ED3 B40A                <1> 	mov	ah, 10	; 6845 register for cursor set
  2484 00001ED5 66890D[F7670000]    <1> 	mov	[CURSOR_MODE], cx ; save in data area
  2485                              <1> 	;call	m16	; output cx register
  2486                              <1> 	;retn
  2487 00001EDC 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 00001EE1 80FF07              <1> 	cmp	bh, 7 ; video page > 7 ; 07/07/2016
  2495                              <1> 	;ja	VIDEO_RETURN
  2496                              <1> 	; 02/08/2022
  2497 00001EE4 770E                <1> 	ja	short set_cpos_inv_vp
  2498                              <1> 	;
  2499 00001EE6 803D[DE670000]07    <1> 	cmp	byte [CRT_MODE], 7
  2500 00001EED 770A                <1> 	ja	short vga_set_cpos ; 12/09/2016	
  2501 00001EEF E839040000          <1> 	call	_set_cpos
  2502                              <1> set_cpos_inv_vp:   ; 02/08/2022
  2503 00001EF4 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 00001EF9 668915[0E7D0100]    <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 00001F00 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 00001F05 80FF07              <1> 	cmp	bh, 7 ; video page > 7 (invalid)
  2545 00001F08 7606                <1> 	jna	short read_cursor_1
  2546                              <1> 	; invalid video page (input) 
  2547 00001F0A 31C9                <1> 	xor	ecx, ecx ; 0
  2548 00001F0C 31D2                <1> 	xor	edx, edx ; 0
  2549 00001F0E EB15                <1> 	jmp	short read_cursor_2
  2550                              <1> read_cursor_1:
  2551                              <1> 	; 12/09/2016
  2552 00001F10 803D[DE670000]07    <1> 	cmp	byte [CRT_MODE], 7 ; vga mode
  2553 00001F17 7727                <1> 	ja	short vga_get_cpos
  2554                              <1> 	;
  2555 00001F19 E815000000          <1> 	call	get_cpos
  2556 00001F1E 0FB70D[F7670000]    <1> 	movzx	ecx, word [CURSOR_MODE]
  2557                              <1> read_cursor_2:
  2558 00001F25 5D                  <1> 	pop	ebp
  2559 00001F26 5F                  <1> 	pop	edi
  2560 00001F27 5E                  <1> 	pop	esi
  2561 00001F28 5B                  <1> 	pop	ebx
  2562 00001F29 58                  <1> 	pop	eax  ; DISCARD SAVED CX AND DX
  2563 00001F2A 58                  <1> 	pop	eax
  2564 00001F2B A1[80890100]        <1> 	mov	eax, [video_eax] ; 12/05/2016
  2565                              <1> 	;;15/01/2017
  2566                              <1> 	;;mov	byte [intflg], 0 ; 07/01/2017
  2567 00001F30 1F                  <1> 	pop	ds
  2568 00001F31 07                  <1> 	pop	es
  2569 00001F32 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 00001F33 D0E7                <1> 	shl	bh, 1 ; WORD OFFSET
  2577 00001F35 0FB6F7              <1> 	movzx	esi, bh 
  2578 00001F38 0FB796[0E7D0100]    <1> 	movzx	edx, word [esi+CURSOR_POSN]
  2579 00001F3F C3                  <1> 	retn
  2580                              <1> 
  2581                              <1> vga_get_cpos:
  2582                              <1> 	; 12/09/2016
  2583                              <1> 	; get cursor position (vga)
  2584 00001F40 0FB715[0E7D0100]    <1> 	movzx	edx, word [CURSOR_POSN] ; cursor pos for pg 0
  2585 00001F47 31C9                <1> 	xor	ecx, ecx ; Cursor Mode = 0 (invalid)
  2586 00001F49 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 00001F4B 3C07                <1> 	cmp	al, 7	; > 7 = invalid video page number
  2606                              <1> 	;ja	VIDEO_RETURN
  2607 00001F4D 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 00001F4F 8A25[DE670000]      <1> 	mov	ah, [CRT_MODE]
  2612 00001F55 80FC03              <1> 	cmp	ah, 3
  2613 00001F58 7605                <1> 	jna	short adp_1 ; mode 01h, 00h (01h), 02h (03h), 03h
  2614 00001F5A 80FC07              <1> 	cmp	ah, 7	    ; mode 07h (03h)
  2615 00001F5D 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 00001F5F E805000000          <1> 	call	set_active_page
  2621                              <1> adp_2:
  2622 00001F64 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 00001F69 A2[1E7D0100]        <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 00001F6E 0FB6C0              <1> 	movzx	eax, al
  2641 00001F71 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 00001F73 66F725[90890100]    <1> 	mul	word [CRT_LEN]  ; get saved length of regen buffer
  2647                              <1> 				; display page times regen length
  2648                              <1> 	; 10/12/2013
  2649 00001F7A 66A3[0C7D0100]      <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 00001F80 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 00001F82 D1E9                <1> 	shr	ecx, 1
  2658 00001F84 B40C                <1> 	mov	ah, 12	; 6845 register for start address
  2659 00001F86 E8CD030000          <1> 	call	m16
  2660                              <1> 	;sal	bx, 1
  2661                              <1> 	; 01/09/2014
  2662 00001F8B D0E3                <1> 	shl	bl, 1	; *2 for word offset
  2663 00001F8D 81C3[0E7D0100]      <1> 	add	ebx, CURSOR_POSN
  2664 00001F93 668B13              <1> 	mov	dx, [ebx] ; get cursor for this page
  2665                              <1> 	; 16/01/2016
  2666                              <1> 	;call	m18
  2667                              <1> 	;retn
  2668 00001F96 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 00001F9B 31C0                <1> 	xor	eax, eax ; 02/09/2014
  2695 00001F9D B050                <1> 	mov	al, 80   ; determine bytes to row	
  2696 00001F9F 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 00001FA1 00D0                <1> 	add	al, dl
  2701 00001FA3 80D400              <1> 	adc	ah, 0
  2702                              <1> 	; 02/08/2022
  2703 00001FA6 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 00001FA8 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 00001FA9 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 00001FAC 31F6                <1> 	xor	esi, esi
  2727 00001FAE D0E1                <1> 	shl	cl, 1
  2728 00001FB0 668B91[0E7D0100]    <1> 	mov	dx, [ecx+CURSOR_POSN]
  2729 00001FB7 740B                <1> 	jz	short p21
  2730 00001FB9 D0E9                <1> 	shr	cl, 1
  2731                              <1> p20:
  2732 00001FBB 660335[90890100]    <1> 	add	si, [CRT_LEN] ; 24/06/2016
  2733                              <1> 	;add	si, 80*25*2 ; add length of buffer for one page
  2734 00001FC2 E2F7                <1> 	loop	p20
  2735                              <1> p21:
  2736 00001FC4 6621D2              <1> 	and	dx, dx
  2737 00001FC7 7407                <1> 	jz	short p22
  2738 00001FC9 E8CDFFFFFF          <1> 	call 	position ; determine location in regen in page
  2739 00001FCE 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 00001FD0 66BADA03            <1> 	mov	dx, 03DAh ; status port
  2745                              <1> 	; cx = 0
  2746 00001FD4 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 00001FD5 38F5                <1> 	cmp	ch, dh
  2781                              <1> 	;ja	VIDEO_RETURN
  2782                              <1> 	; 04/08/2022
  2783 00001FD7 7709                <1> 	ja	short _s_u_retn
  2784                              <1> 
  2785 00001FD9 38D1                <1> 	cmp	cl, dl
  2786                              <1> 	;ja	VIDEO_RETURN
  2787                              <1> 	; 04/08/2022
  2788 00001FDB 7705                <1> 	ja	short _s_u_retn
  2789                              <1> 	;
  2790 00001FDD E805000000          <1> 	call	_scroll_up
  2791                              <1> _s_u_retn:
  2792 00001FE2 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 00001FE7 E89B000000          <1> 	call	test_line_count ; 16/01/2016
  2806                              <1> 
  2807 00001FEC 8A25[DE670000]      <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 00001FF2 80FC04              <1> 	cmp	ah, 4
  2813 00001FF5 720A                <1>  	jb	short n0	
  2814 00001FF7 80FC07              <1> 	cmp	ah, 7 ; TEST FOR BW CARD 
  2815                              <1> 		      ;	(80x25 text, mono)
  2816 00001FFA 7405                <1> 	je	short n0 ; same with mode 3 for TRDOS 386
  2817 00001FFC E91B050000          <1> 	jmp	GRAPHICS_UP
  2818                              <1> n0:
  2819                              <1> 	; 07/07/2016
  2820 00002001 80FF07              <1> 	cmp	bh, 7 ; video page number
  2821 00002004 7606                <1> 	jna	short n1
  2822 00002006 8A3D[1E7D0100]      <1> 	mov	bh, [ACTIVE_PAGE]
  2823                              <1> n1:
  2824 0000200C 88DC                <1> 	mov	ah, bl ; attribute
  2825                              <1> 	;push	ax ; *
  2826                              <1> 	; 12/04/2021
  2827 0000200E 50                  <1> 	push	eax ; *
  2828                              <1> 	;mov 	esi, [CRT_BASE]
  2829 0000200F BE00800B00          <1>         mov     esi, 0B8000h  
  2830 00002014 3A3D[1E7D0100]      <1>         cmp     bh, [ACTIVE_PAGE]
  2831 0000201A 750B                <1> 	jne	short n2
  2832                              <1> 	;
  2833 0000201C 66A1[0C7D0100]      <1>         mov     ax, [CRT_START]
  2834 00002022 6601C6              <1>         add     si, ax
  2835 00002025 EB11                <1>         jmp     short n4
  2836                              <1> n2:
  2837 00002027 20FF                <1>         and     bh, bh
  2838 00002029 740D                <1> 	jz	short n4
  2839 0000202B 88F8                <1> 	mov	al, bh
  2840                              <1> n3:
  2841 0000202D 660335[90890100]    <1>         add	si, [CRT_LEN]
  2842 00002034 FEC8                <1>         dec	al
  2843 00002036 75F5                <1> 	jnz	short n3
  2844                              <1> n4:	
  2845 00002038 E85B000000          <1> 	call	scroll_position ; 16/01/2016
  2846 0000203D 7420                <1>         jz      short n6 
  2847                              <1> 
  2848 0000203F 01CE                <1>         add     esi, ecx ; from address for scroll
  2849 00002041 88F5                <1> 	mov	ch, dh  ; #rows in block
  2850 00002043 28C5                <1> 	sub	ch, al	; #rows to be moved
  2851                              <1> n5:
  2852 00002045 E88A000000          <1> 	call	n10 ; 16/01/2016
  2853                              <1> 	
  2854 0000204A 51                  <1>         push	ecx
  2855 0000204B 0FB60D[E0670000]    <1> 	movzx	ecx, byte [CRT_COLS] 
  2856 00002052 00C9                <1> 	add	cl, cl
  2857 00002054 01CE                <1>         add	esi, ecx  ; next line
  2858 00002056 01CF                <1>         add	edi, ecx
  2859 00002058 59                  <1> 	pop	ecx
  2860                              <1> 
  2861 00002059 FECD                <1> 	dec	ch	 ; count of lines to move
  2862 0000205B 75E8                <1> 	jnz	short n5 ; row loop
  2863                              <1> 	; ch = 0
  2864 0000205D 88C6                <1> 	mov	dh, al	 ; #rows
  2865                              <1> n6:
  2866                              <1> 	; attribute in ah
  2867 0000205F B020                <1> 	mov	al, ' '	 ; fill with blanks
  2868                              <1> n7:
  2869 00002061 E87B000000          <1> 	call	n11 ; 16/01/2016
  2870                              <1> 
  2871 00002066 8A0D[E0670000]      <1> 	mov	cl, [CRT_COLS]
  2872 0000206C 00C9                <1> 	add	cl, cl
  2873 0000206E 01CF                <1>         add	edi, ecx
  2874                              <1> 
  2875 00002070 FECE                <1> 	dec	dh
  2876 00002072 75ED                <1> 	jnz	short n7
  2877                              <1> n16:
  2878 00002074 3A3D[1E7D0100]      <1> 	cmp	bh, [ACTIVE_PAGE]
  2879 0000207A 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 0000207C A0[DF670000]        <1> 	mov	al, [CRT_MODE_SET] ; get the value of mode set
  2885 00002081 66BAD803            <1> 	mov	dx, 03D8h ; always set color card port
  2886 00002085 EE                  <1> 	out	dx, al
  2887                              <1> n8:
  2888 00002086 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 00002087 08C0                <1> 	or	al, al
  2896 00002089 740C                <1> 	jz	short al_set2
  2897                              <1> 	;push	dx
  2898                              <1> 	; 12/04/2021
  2899 0000208B 52                  <1> 	push	edx
  2900 0000208C 28EE                <1> 	sub	dh, ch  ; subtract upper row from lower row number
  2901 0000208E FEC6                <1> 	inc	dh	; adjust difference by 1
  2902 00002090 38C6                <1> 	cmp	dh, al 	; line count = amount of rows in window?
  2903 00002092 7502                <1> 	jne	short al_set1 ; if not the we're all set
  2904 00002094 30C0                <1> 	xor	al, al	; otherwise set al to zero
  2905                              <1> al_set1:
  2906                              <1> 	;pop	dx
  2907                              <1> 	; 12/04/2021
  2908 00002096 5A                  <1> 	pop	edx
  2909                              <1> al_set2:
  2910 00002097 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 00002098 52                  <1> 	push	edx
  2924 00002099 6689CA              <1> 	mov	dx, cx	; now, upper left position in DX
  2925 0000209C E8FAFEFFFF          <1> 	call	position
  2926 000020A1 01C6                <1> 	add	esi, eax
  2927 000020A3 89F7                <1> 	mov	edi, esi
  2928                              <1> 	;pop	dx	; lower right position in DX
  2929                              <1> 	; 12/04/2021
  2930 000020A5 5A                  <1> 	pop	edx
  2931 000020A6 6629CA              <1> 	sub	dx, cx
  2932 000020A9 FEC6                <1> 	inc	dh	; dh = #rows 
  2933 000020AB FEC2                <1> 	inc	dl	; dl = #cols in block
  2934 000020AD 59                  <1> 	pop	ecx 	; return address
  2935                              <1> 	;pop	ax	; * ; al = line count, ah = attribute
  2936                              <1> 	; 12/04/2021
  2937 000020AE 58                  <1> 	pop	eax ; (*)
  2938 000020AF 51                  <1> 	push	ecx	; return address
  2939 000020B0 0FB7C8              <1> 	movzx	ecx, ax
  2940 000020B3 8A25[E0670000]      <1> 	mov	ah, [CRT_COLS]
  2941 000020B9 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 000020BB 01C0                <1> 	add	eax, eax
  2946                              <1> 	;
  2947                              <1> 	;push	ax	; offset 
  2948                              <1> 	;push	dx
  2949                              <1> 	; 12/04/2021
  2950 000020BD 50                  <1> 	push	eax	; offset 
  2951 000020BE 52                  <1> 	push	edx
  2952                              <1> 	;
  2953                              <1> 	; 04/04/2014
  2954 000020BF 66BADA03            <1> 	mov	dx, 3DAh ; guaranteed to be color card here	
  2955                              <1> n9:                      ; wait_display_enable
  2956 000020C3 EC                  <1>         in      al, dx   ; get port
  2957 000020C4 A808                <1> 	test	al, RVRT ; wait for vertical retrace	
  2958 000020C6 74FB                <1> 	jz	short n9 ; wait_display_enable
  2959 000020C8 B025                <1> 	mov	al, 25h
  2960 000020CA B2D8                <1> 	mov	dl, 0D8h ; address control port
  2961 000020CC 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 000020CD 5A                  <1> 	pop	edx	; #rows, #cols
  2966 000020CE 58                  <1>        	pop	eax	; offset
  2967 000020CF 6691                <1> 	xchg	ax, cx	; 
  2968                              <1> 	; ecx = offset, al = line count, ah = attribute
  2969                              <1> 	;
  2970 000020D1 08C0                <1> 	or	al, al
  2971 000020D3 C3                  <1> 	retn
  2972                              <1> n10:
  2973                              <1> 	; Move rows
  2974 000020D4 88D1                <1> 	mov	cl, dl	; get # of cols to move
  2975 000020D6 56                  <1> 	push	esi
  2976 000020D7 57                  <1> 	push	edi	; save start address
  2977                              <1> n10r:
  2978 000020D8 66A5                <1> 	movsw		; move that line on screen
  2979 000020DA FEC9                <1> 	dec	cl
  2980 000020DC 75FA                <1>         jnz     short n10r
  2981 000020DE 5F                  <1> 	pop	edi
  2982 000020DF 5E                  <1> 	pop	esi	; recover addresses
  2983 000020E0 C3                  <1> 	retn
  2984                              <1> n11:
  2985                              <1> 	; Clear rows
  2986                              <1>                 	; dh =  #rows
  2987 000020E1 88D1                <1>         mov	cl, dl	; get # of cols to clear
  2988 000020E3 57                  <1>         push    edi     ; save address
  2989                              <1> n11r:
  2990 000020E4 66AB                <1>         stosw           ; store fill character
  2991 000020E6 FEC9                <1> 	dec	cl
  2992 000020E8 75FA                <1>         jnz     short n11r
  2993 000020EA 5F                  <1>         pop     edi     ; recover address
  2994 000020EB 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 000020EC 38F5                <1> 	cmp	ch, dh
  3025                              <1> 	;ja	VIDEO_RETURN
  3026 000020EE 7709                <1> 	ja	short _s_d_retn ; 18/11/2020
  3027 000020F0 38D1                <1> 	cmp	cl, dl
  3028                              <1> 	;ja	VIDEO_RETURN
  3029 000020F2 7705                <1> 	ja	short _s_d_retn ; 18/11/2020
  3030                              <1> 	;
  3031 000020F4 E805000000          <1> 	call	_scroll_down
  3032                              <1> _s_d_retn:
  3033 000020F9 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 000020FE FD                  <1> 	std		; DIRECTION FOR SCROLL DOWN
  3048                              <1> 	; !!!!
  3049 000020FF E883FFFFFF          <1> 	call	test_line_count ; 16/01/2016
  3050                              <1> 	
  3051 00002104 8A25[DE670000]      <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 0000210A 80FC04              <1> 	cmp	ah, 4
  3057 0000210D 720A                <1>  	jb	short _n0	
  3058 0000210F 80FC07              <1> 	cmp	ah, 7 ; TEST FOR BW CARD 
  3059                              <1> 		      ;	(80x25 text, mono)
  3060 00002112 7405                <1> 	je	short _n0 ; same with mode 3 for TRDOS 386
  3061 00002114 E9D5060000          <1> 	jmp	GRAPHICS_DOWN
  3062                              <1> _n0:
  3063                              <1> 	; 07/07/2016
  3064 00002119 80FF07              <1> 	cmp	bh, 7 ; video page number
  3065 0000211C 7606                <1> 	jna	short n12
  3066 0000211E 8A3D[1E7D0100]      <1> 	mov	bh, [ACTIVE_PAGE]
  3067                              <1> 	;
  3068                              <1> n12:			; CONTINUE_DOWN
  3069 00002124 88DC                <1> 	mov	ah, bl
  3070                              <1> 	;push	ax	; * ; save attribute in ah
  3071                              <1> 	; 12/04/2021
  3072 00002126 50                  <1> 	push	eax
  3073 00002127 6689D0              <1> 	mov	ax, dx	; LOWER RIGHT CORNER
  3074 0000212A E869FFFFFF          <1> 	call	scroll_position	; GET REGEN LOCATION
  3075 0000212F 741F                <1> 	jz	short n14
  3076 00002131 29CE                <1> 	sub	esi, ecx  ; SI IS FROM ADDRESS
  3077 00002133 88F5                <1> 	mov	ch, dh  ; #rows in block
  3078 00002135 28C5                <1> 	sub	ch, al	; #rows to be moved
  3079                              <1> n13:
  3080 00002137 E898FFFFFF          <1> 	call	n10	; MOVE ONE ROW
  3081                              <1> 
  3082 0000213C 51                  <1> 	push	ecx
  3083 0000213D 8A0D[E0670000]      <1> 	mov	cl, [CRT_COLS] 
  3084 00002143 00C9                <1> 	add	cl, cl
  3085 00002145 29CE                <1>         sub	esi, ecx  ; next line
  3086 00002147 29CF                <1>         sub	edi, ecx
  3087 00002149 59                  <1>         pop	ecx
  3088                              <1> 	
  3089 0000214A FECD                <1> 	dec	ch	 ; count of lines to move
  3090 0000214C 75E9                <1> 	jnz	short n13 ; row loop
  3091                              <1> 	; ch = 0
  3092 0000214E 88C6                <1> 	mov	dh, al	 ; #rows
  3093                              <1> n14:
  3094                              <1> 	; attribute in ah
  3095 00002150 B020                <1> 	mov	al, ' '	 ; fill with blanks
  3096                              <1> n15:
  3097 00002152 E88AFFFFFF          <1> 	call	n11 ; 16/01/2016
  3098                              <1> 
  3099 00002157 8A0D[E0670000]      <1> 	mov	cl, [CRT_COLS]
  3100 0000215D 00C9                <1> 	add	cl, cl
  3101 0000215F 29CF                <1>         sub	edi, ecx
  3102                              <1>         
  3103 00002161 FECE                <1> 	dec	dh
  3104 00002163 75ED                <1> 	jnz	short n15
  3105                              <1> 	;
  3106                              <1> 	; 18/11/2020
  3107 00002165 FC                  <1> 	cld	; clear direction flag	
  3108                              <1> 	;
  3109 00002166 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 0000216B 803D[DE670000]07    <1>         cmp     byte [CRT_MODE], 7 ; 6!?
  3137 00002172 7607                <1> 	jna	short read_ac_c
  3138 00002174 31C0                <1> 	xor	eax, eax
  3139 00002176 E9BCF9FFFF          <1>         jmp     _video_return 
  3140                              <1> read_ac_c:
  3141 0000217B E805000000          <1> 	call	_read_ac_current
  3142                              <1> 	; 12/05/2016
  3143                              <1>         ;jmp     VIDEO_RETURN
  3144 00002180 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 00002185 8A25[DE670000]      <1> 	mov	ah, [CRT_MODE] ; current video mode	
  3166 0000218B 80FC04              <1> 	cmp	ah, 4
  3167 0000218E 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 00002190 80FC07              <1> 	cmp	ah, 7 ; TEST FOR BW CARD (80x25 monochrome text)
  3173 00002193 7405                <1> 	je	short p10	 ; same with mode 3 in TRDOS 386
  3174 00002195 E9A0080000          <1> 	jmp	GRAPHICS_READ
  3175                              <1> p10:
  3176 0000219A 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 0000219F 803D[DE670000]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 000021A6 7516                <1> 	jne	short p13
  3198                              <1> 
  3199                              <1> 	; 05/12/2020
  3200 000021A8 3A3D[1E7D0100]      <1> 	cmp     bh, [ACTIVE_PAGE]
  3201 000021AE 750E                <1> 	jne	short p13 
  3202                              <1> 
  3203                              <1> 	; WAIT FOR HORIZONTAL RETRACE OR VERTICAL RETRACE IF COLOR 80
  3204                              <1> p11:
  3205 000021B0 FB                  <1> 	sti		; enable interrupts first
  3206                              <1> 	; 05/12/2020
  3207 000021B1 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 000021B2 FA                  <1> 	cli 		; block interrupts for single loop
  3212 000021B3 EC                  <1> 	in	al, dx	; get status from the adapter
  3213 000021B4 A801                <1> 	test	al, RHRZ ; is horizontal retrace low
  3214 000021B6 75F8                <1> 	jnz	short p11 ; wait until it is
  3215                              <1> p12:			;  wait for either retrace high
  3216 000021B8 EC                  <1> 	in	al, dx ; get status again
  3217 000021B9 A809                <1> 	test	al, RVRT+RHRZ ; is horizontal or vertical retrace high
  3218 000021BB 74FB                <1> 	jz	short p12 ; wait until either retrace active
  3219                              <1> ;p14:
  3220 000021BD FB                  <1> 	sti
  3221                              <1> p13:
  3222 000021BE 81C600800B00        <1> 	add	esi, 0B8000h 
  3223 000021C4 668B06              <1> 	mov	ax, [esi]
  3224                              <1> 
  3225 000021C7 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 000021C8 803D[DE670000]07    <1> 	cmp	byte [CRT_MODE], 7 ; 6!?
  3254 000021CF 760A                <1> 	jna	short write_ac_c
  3255                              <1> 
  3256 000021D1 E8B60A0000          <1> 	call	vga_write_char_attr
  3257 000021D6 E957F9FFFF          <1> 	jmp     VIDEO_RETURN	
  3258                              <1> 
  3259                              <1> write_ac_c:
  3260 000021DB E834000000          <1> 	call	_write_c_current
  3261                              <1> 
  3262 000021E0 0FB6F7              <1> 	movzx	esi, bh ; video page number (0 to 7)	
  3263 000021E3 889E[E7670000]      <1> 	mov	[esi+chr_attrib], bl ; color/attribute
  3264                              <1> 
  3265 000021E9 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 000021EE 803D[DE670000]07    <1> 	cmp	byte [CRT_MODE], 7 ; 6!?
  3292 000021F5 760A                <1> 	jna	short write_c_c
  3293                              <1> 
  3294 000021F7 E8900A0000          <1> 	call	vga_write_char_only
  3295 000021FC E931F9FFFF          <1> 	jmp     VIDEO_RETURN	
  3296                              <1> 
  3297                              <1> write_c_c:
  3298                              <1> 	;and	bh, 7 ; video page number (<= 7)
  3299 00002201 0FB6F7              <1> 	movzx	esi, bh	
  3300 00002204 8A9E[E7670000]      <1> 	mov	bl, [esi+chr_attrib]
  3301                              <1> 
  3302 0000220A E805000000          <1> 	call	_write_c_current
  3303 0000220F 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 00002214 8A25[DE670000]      <1> 	mov	ah, [CRT_MODE] ; current video mode	
  3320 0000221A 80FC04              <1> 	cmp	ah, 4
  3321 0000221D 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 0000221F 80FC07              <1> 	cmp	ah, 7 ; TEST FOR BW CARD
  3327 00002222 7405                <1> 	je	short p40
  3328 00002224 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 00002229 52                  <1> 	push	edx ; *
  3337 0000222A 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 0000222C 50                  <1> 	push	eax ; ** ; save character & attribute/color
  3342 0000222D 51                  <1> 	push	ecx ; ***
  3343 0000222E E876FDFFFF          <1> 	call 	find_position  ; get regen location and port address
  3344                              <1> 	;pop	cx
  3345                              <1> 	; 12/04/2021
  3346 00002233 59                  <1> 	pop	ecx ; ***
  3347                              <1> 	; esi = regen location
  3348                              <1> 	; dx = status port
  3349                              <1> 	;
  3350 00002234 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 0000223A 803D[DE670000]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 00002241 751A                <1> 	jne	short p44
  3369                              <1> p46:
  3370                              <1> 	; 05/12/2020
  3371 00002243 3A3D[1E7D0100]      <1> 	cmp     bh, [ACTIVE_PAGE]
  3372 00002249 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 0000224B FB                  <1> 	sti		; enable interrupts first
  3378 0000224C 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 0000224D FA                  <1> 	cli 		; block interrupts for single loop
  3383 0000224E EC                  <1> 	in	al, dx	; get status from the adapter
  3384 0000224F A808                <1> 	test	al, RVRT ; check for vertical retrace first
  3385 00002251 7509                <1> 	jnz	short p43 ; Do fast write now if vertical retrace
  3386 00002253 A801                <1> 	test	al, RHRZ ; is horizontal retrace low
  3387 00002255 75F4                <1> 	jnz	short p41 ; wait until it is
  3388                              <1> p42:			;  wait for either retrace high
  3389 00002257 EC                  <1> 	in	al, dx ; get status again
  3390 00002258 A809                <1> 	test	al, RVRT+RHRZ ; is horizontal or vertical retrace high
  3391 0000225A 74FB                <1> 	jz	short p42 ; wait until either retrace active
  3392                              <1> p43:	
  3393 0000225C FB                  <1> 	sti
  3394                              <1> p44:
  3395 0000225D 668B0424            <1> 	mov	ax, [esp] ; restore the character (al) & attribute (ah)
  3396 00002261 668906              <1> 	mov	[esi], ax
  3397                              <1> 
  3398 00002264 6649                <1> 	dec	cx
  3399 00002266 740D                <1> 	jz	short p45
  3400                              <1> 
  3401 00002268 46                  <1> 	inc	esi
  3402 00002269 46                  <1> 	inc	esi
  3403                              <1> 
  3404                              <1> 	; 05/12/2020
  3405 0000226A 803D[DE670000]03    <1> 	cmp	byte [CRT_MODE], 03h
  3406 00002271 75EA                <1> 	jne	short p44
  3407                              <1> 	;jmp	short p41
  3408 00002273 EBCE                <1> 	jmp	short p46
  3409                              <1> p45:	
  3410                              <1> 	;pop	ax
  3411                              <1> 	;pop	dx
  3412                              <1> 	; 12/04/2021
  3413 00002275 58                  <1> 	pop	eax ; **
  3414 00002276 5A                  <1> 	pop	edx ; *
  3415 00002277 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 00002278 803D[DE670000]07    <1>         cmp     byte [CRT_MODE], 7
  3455 0000227F 760A                <1> 	jna 	short write_tty_cga
  3456                              <1> 
  3457 00002281 E8EB0C0000          <1> 	call	vga_write_teletype
  3458 00002286 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 0000228B E818000000          <1> 	call	_write_tty_m3
  3465 00002290 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 00002295 FA                  <1> 	cli	; disable interrupts
  3515                              <1> 	;
  3516                              <1> 	; 01/09/2014
  3517 00002296 803D[DE670000]03    <1> 	cmp	byte [CRT_MODE], 3
  3518 0000229D 7409                <1> 	je	short _write_tty_m3
  3519                              <1> 	;
  3520                              <1> set_mode_3:
  3521 0000229F 53                  <1> 	push	ebx
  3522 000022A0 50                  <1> 	push	eax
  3523                              <1> 	;call	_set_mode
  3524                              <1> 	; 18/11/2020 
  3525 000022A1 E89BF8FFFF          <1> 	call	set_txt_mode  ; set video mode to 03h 
  3526 000022A6 58                  <1> 	pop	eax
  3527 000022A7 5B                  <1> 	pop	ebx
  3528                              <1> 	;
  3529                              <1> _write_tty_m3: ; 24/06/2016 (m3 -> _write_tty_m3)
  3530 000022A8 0FB6F7              <1> 	movzx 	esi, bh ; 12/05/2016
  3531                              <1> 	;shl	si, 1
  3532                              <1> 	; 02/08/2022
  3533 000022AB D1E6                <1> 	shl	esi, 1
  3534 000022AD 81C6[0E7D0100]      <1> 	add	esi, CURSOR_POSN
  3535 000022B3 668B16              <1> 	mov	dx, [esi]
  3536                              <1> 	;
  3537                              <1> 	; dx now has the current cursor position
  3538                              <1> 	;
  3539 000022B6 3C0D                <1> 	cmp	al, 0Dh	; CR	; is it carriage return or control character
  3540                              <1> 	;jbe	short u8
  3541                              <1> 	; 17/04/2021
  3542 000022B8 7241                <1> 	jb	short u8
  3543 000022BA 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 000022BC 29C9                <1> 	sub	ecx, ecx
  3554 000022BE FEC1                <1> 	inc	cl ; ecx = 1
  3555                              <1> 	; cx = count of characters to write
  3556                              <1> 	;
  3557 000022C0 E84FFFFFFF          <1> 	call	_write_c_current ; 16/01/2015
  3558                              <1> 	;
  3559                              <1> 	; position the cursor for next char
  3560 000022C5 FEC2                <1> 	inc	dl		; next column
  3561 000022C7 3A15[E0670000]      <1> 	cmp	dl, [CRT_COLS]  ; test for column overflow 
  3562                              <1> 	;jne	_set_cpos
  3563                              <1> 	; 02/08/2022
  3564 000022CD 7402                <1> 	je	short u13
  3565 000022CF EB5C                <1> 	jmp	_set_cpos
  3566                              <1> u13:
  3567 000022D1 B200                <1> 	mov	dl, 0		; column = 0
  3568                              <1> u10:				; (line feed found)
  3569 000022D3 80FE18              <1> 	cmp	dh, 25-1 	; check for last row
  3570 000022D6 721F                <1> 	jb 	short u6
  3571                              <1> 	;
  3572                              <1> 	; scroll required
  3573                              <1> u1:	
  3574                              <1> 	; SET CURSOR POSITION (04/12/2013)
  3575 000022D8 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 000022DD 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 000022E2 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 000022E4 29C9                <1> 	sub	ecx, ecx
  3605                              <1> 	;mov	dx, 184Fh ; dl = 79 (column), dh = 24 (row)
  3606                              <1> 	; 18/11/2020
  3607 000022E6 B618                <1> 	mov	dh, 25-1
  3608 000022E8 8A15[E0670000]      <1> 	mov	dl, [CRT_COLS]
  3609 000022EE FECA                <1> 	dec	dl
  3610                              <1> 	;
  3611 000022F0 B001                <1> 	mov	al, 1		; scroll 1 line up
  3612                              <1> 		; ah = attribute
  3613                              <1> 	;mov	bl, al ; 12/05/2016
  3614 000022F2 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 000022F7 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 000022F9 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 000022FB 3C0A                <1> 	cmp	al, 0Ah		; is it a line feed (0Ah)
  3636 000022FD 74D4                <1> 	je	short u10
  3637 000022FF 3C07                <1> 	cmp	al, 07h 	; is it a bell
  3638 00002301 747C                <1> 	je	short u11
  3639 00002303 3C08                <1> 	cmp	al, 08h		; is it a backspace
  3640                              <1> 	;jne	short u0
  3641 00002305 741C                <1> 	je	short bs	; 12/12/2013
  3642                              <1> 	; 12/12/2013 (tab stop)
  3643 00002307 3C09                <1> 	cmp	al, 09h		; is it a tab stop
  3644 00002309 75B1                <1> 	jne	short u0
  3645 0000230B 88D0                <1> 	mov	al, dl
  3646                              <1> 	;cbw
  3647 0000230D 30E4                <1> 	xor	ah, ah ; 09/12/2017
  3648 0000230F B108                <1> 	mov	cl, 8
  3649 00002311 F6F1                <1> 	div	cl
  3650 00002313 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 00002315 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 00002316 B020                <1> 	mov	al, 20h ; al = space (blank) 
  3665                              <1> 			; bl = color/attribute
  3666 00002318 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 0000231D 59                  <1> 	pop	ecx ; *
  3675 0000231E FEC9                <1> 	dec	cl
  3676 00002320 75F3                <1> 	jnz	short tsloop
  3677 00002322 C3                  <1> 	retn
  3678                              <1> bs:	
  3679                              <1> 	; back space found
  3680                              <1> 
  3681 00002323 08D2                <1> 	or	dl, dl 		; is it already at start of line
  3682                              <1> 	;je	short u7 	; set_cursor
  3683 00002325 7406                <1> 	jz	short _set_cpos
  3684                              <1> 	;dec	dx     		; no -- just move it back
  3685                              <1> 	; 17/04/2021
  3686 00002327 FECA                <1> 	dec	dl		; move to 1 column back
  3687                              <1> 	;jmp	short u7
  3688 00002329 EB02                <1> 	jmp	short _set_cpos
  3689                              <1> 
  3690                              <1> 	; carriage return found
  3691                              <1> u9:
  3692 0000232B 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 0000232D BE[0E7D0100]        <1> 	mov	esi, CURSOR_POSN
  3726 00002332 0FB6C7              <1>         movzx   eax, bh	; BH = video page number
  3727                              <1> ;	or	al, al
  3728                              <1> ;	jz	short _set_cpos_0
  3729 00002335 D0E0                <1>         shl     al, 1   ; word offset
  3730 00002337 01C6                <1>         add     esi, eax
  3731                              <1> ;_set_cpos_0:
  3732 00002339 668916              <1> 	mov	[esi], dx ; save the pointer
  3733 0000233C 383D[1E7D0100]      <1> 	cmp	[ACTIVE_PAGE], bh
  3734 00002342 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 00002344 E852FCFFFF          <1> 	call	position ; determine location in regen buffer	
  3742 00002349 668B0D[0C7D0100]    <1> 	mov	cx, [CRT_START]
  3743 00002350 6601C1              <1> 	add	cx, ax  ; add char position in regen buffer
  3744                              <1> 			; to the start address (offset) for this page
  3745 00002353 66D1E9              <1> 	shr	cx, 1	; divide by 2 for char only count
  3746 00002356 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 00002358 FA                  <1> 	cli
  3754                              <1> 	;mov	dx, [addr_6845] ; address register
  3755 00002359 66BAD403            <1> 	mov 	dx, 03D4h ; I/O address of color card
  3756 0000235D 88E0                <1> 	mov	al, ah	; get value
  3757 0000235F EE                  <1> 	out	dx, al	; register set
  3758                              <1> 	;inc	dx	; data register
  3759                              <1> 	; 17/04/2021
  3760 00002360 FEC2                <1> 	inc	dl
  3761 00002362 EB00                <1> 	jmp	$+2	; i/o delay
  3762 00002364 88E8                <1> 	mov	al, ch	; data
  3763 00002366 EE                  <1> 	out	dx, al	
  3764                              <1> 	;dec	dx	
  3765                              <1> 	; 17/04/2021
  3766 00002367 FECA                <1> 	dec	dl
  3767 00002369 88E0                <1> 	mov	al, ah
  3768 0000236B FEC0                <1> 	inc	al	; point to other data register
  3769 0000236D EE                  <1> 	out	dx, al	; set for second register
  3770                              <1> 	;inc	dx
  3771                              <1> 	; 17/04/2021
  3772 0000236E FEC2                <1> 	inc	dl
  3773 00002370 EB00                <1> 	jmp	$+2	; i/o delay
  3774 00002372 88C8                <1> 	mov	al, cl	; second data value
  3775 00002374 EE                  <1> 	out	dx, al
  3776 00002375 FB                  <1> 	sti
  3777                              <1> m17:
  3778 00002376 C3                  <1> 	retn
  3779                              <1> 
  3780                              <1> _beep:
  3781                              <1> 	; 12/02/2021 (TRDOS v2.0.3)
  3782 00002377 FA                  <1> 	cli
  3783 00002378 E811000000          <1> 	call	beep
  3784 0000237D FB                  <1> 	sti
  3785 0000237E 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 0000237F FB                  <1> 	sti
  3796 00002380 3A3D[1E7D0100]      <1> 	cmp	bh, [ACTIVE_PAGE]
  3797 00002386 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 00002388 66B93305            <1> 	mov	cx, 1331 	; divisor for 896 hz tone
  3801 0000238C 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 0000238E 9C                  <1> 	pushfd  ; 18/01/2014	; save interrupt status
  3829 0000238F FA                  <1> 	cli			; block interrupts during update
  3830 00002390 B0B6                <1> 	mov	al, 10110110b	; select timer 2, lsb, msb binary
  3831 00002392 E643                <1> 	out	TIMER+3, al 	; write timer mode register
  3832 00002394 EB00                <1> 	jmp	$+2		; I/O delay
  3833 00002396 88C8                <1> 	mov	al, cl		; divisor for hz (low)
  3834 00002398 E642                <1> 	out	TIMER+2,AL	; write timer 2 count - lsb
  3835 0000239A EB00                <1> 	jmp	$+2		; I/O delay
  3836 0000239C 88E8                <1> 	mov	al, ch		; divisor for hz (high)
  3837 0000239E E642                <1> 	out	TIMER+2, al	; write timer 2 count - msb
  3838 000023A0 E461                <1> 	in	al, PORT_B	; get current setting of port
  3839 000023A2 88C4                <1> 	mov	ah, al		; save that setting
  3840 000023A4 0C03                <1> 	or	al, GATE2+SPK2	; gate timer 2 and turn speaker on
  3841 000023A6 E661                <1> 	out	PORT_B, al	; and restore interrupt status
  3842                              <1> 	; 12/02/2021
  3843 000023A8 9D                  <1> 	popfd	; 18/01/2014
  3844                              <1> 	;sti
  3845                              <1> g7:				; 1/64 second per count (bl)
  3846 000023A9 B90B040000          <1> 	mov	ecx, 1035	; delay count for 1/64 of a second
  3847 000023AE E828000000          <1> 	call	waitf		; go to beep delay 1/64 count
  3848 000023B3 FECB                <1> 	dec	bl		; (bl) length count expired?
  3849 000023B5 75F2                <1> 	jnz	short g7	; no - continue beeping speaker
  3850                              <1> 	;
  3851 000023B7 9C                  <1> 	pushfd	; 12/02/2021	; save interrupt status
  3852 000023B8 FA                  <1> 	cli  	; 18/01/2014	; block interrupts during update
  3853 000023B9 E461                <1> 	in	al, PORT_B	; get current port value
  3854                              <1>         ;or	al, not (GATE2+SPK2) ; isolate current speaker bits in case
  3855 000023BB 0CFC                <1>         or      al, ~(GATE2+SPK2)
  3856 000023BD 20C4                <1>         and	ah, al		; someone turned them off during beep
  3857 000023BF 88E0                <1> 	mov	al, ah		; recover value of port
  3858                              <1>         ;or	al, not (GATE2+SPK2) ; force speaker data off
  3859 000023C1 0CFC                <1> 	or 	al, ~(GATE2+SPK2) ; isolate current speaker bits in case
  3860 000023C3 E661                <1> 	out	PORT_B, al	; and stop speaker timer
  3861 000023C5 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 000023C6 66B90B04            <1> 	mov	cx, 1035
  3866 000023CA E80C000000          <1> 	call	waitf		; minimum delay between all beeps
  3867 000023CF 9C                  <1> 	pushfd			; save interrupt status
  3868 000023D0 FA                  <1> 	cli			; block interrupts during update
  3869 000023D1 E461                <1> 	in	al, PORT_B	; get current port value in case
  3870 000023D3 2403                <1> 	and	al, GATE2+SPK2	; someone turned them on
  3871 000023D5 08E0                <1> 	or	al, ah		; recover value of port_b
  3872 000023D7 E661                <1> 	out	PORT_B, al	; restore speaker status
  3873 000023D9 9D                  <1> 	popfd			; restore interrupt flag state
  3874                              <1> u12:	
  3875 000023DA 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 000023DB 50                  <1> 	push	eax
  3920                              <1> 	; 16/12/2014
  3921                              <1> 	;shr	cx, 1			; convert to count of 30 micro seconds
  3922 000023DC 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 000023DE E461                <1> 	in	al, PORT_B		; IN AL,SYS1
  3941 000023E0 A810                <1> 	test	al, 010h
  3942 000023E2 74FA                <1> 	JZ	short WR_STATE_0
  3943                              <1> WR_STATE_1:
  3944 000023E4 E461                <1> 	in	al, PORT_B		; IN AL,SYS1
  3945 000023E6 A810                <1> 	test	al, 010h
  3946 000023E8 75FA                <1> 	jnz	short WR_STATE_1
  3947 000023EA E2F2                <1>         loop    WR_STATE_0
  3948                              <1> 	;
  3949                              <1> 	;pop	ax			; RESTORE (AH)
  3950                              <1> 	; 11/04/2021
  3951 000023EC 58                  <1> 	pop	eax
  3952 000023ED 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 000023EE A2[8C890100]        <1> 	mov	[w_str_cmd], al		; save (AL) command
  3989 000023F3 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 000023F5 7361                <1> 	jnb	short P55
  3993                              <1> 
  3994                              <1>         ;jcxz	VIDEO_RETURN		; IF ZERO LENGTH STRING THEN RETURN
  3995                              <1> 
  3996 000023F7 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 000023FA 89EE                <1> 	mov	esi, ebp ; user buffer
  4003 000023FC BF00000700          <1> 	mov	edi, Cluster_Buffer  ; system buffer
  4004 00002401 E8F4EB0000          <1> 	call	transfer_from_user_buffer
  4005                              <1> 	;pop	ecx
  4006                              <1> 	;jc	VIDEO_RETURN
  4007                              <1> 	; 02/08/2022
  4008 00002406 7250                <1> 	jc	short P55
  4009                              <1> 	; ecx = transfer (byte) count = character count
  4010 00002408 BD00000700          <1> 	mov	ebp, Cluster_Buffer
  4011                              <1> 	; 12/09/2016
  4012 0000240D 803D[DE670000]07    <1> 	cmp	byte [CRT_MODE], 7 ; 6?!
  4013                              <1> 	;ja	vga_write_string
  4014                              <1> 	; 02/08/2022
  4015 00002414 7605                <1> 	jna	short P57
  4016 00002416 E99C000000          <1> 	jmp	vga_write_string
  4017                              <1> P57:
  4018 0000241B 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 0000241E D1E6                <1> 	sal	esi, 1
  4022                              <1> 	; *****
  4023 00002420 66FFB6[0E7D0100]    <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 00002427 51                  <1> 	push	ecx ; ****
  4029 00002428 53                  <1> 	push	ebx ; *** ; 18/11/2020
  4030 00002429 56                  <1> 	push	esi ; **
  4031 0000242A 52                  <1> 	push	edx ; *
  4032 0000242B E8FDFEFFFF          <1> 	call	_set_cpos
  4033                              <1> P50:
  4034 00002430 8A4500              <1> 	mov	al, [ebp]		; GET CHARACTER FROM INPUT STRING
  4035 00002433 45                  <1> 	inc	ebp			; BUMP POINTER TO CHARACTER
  4036                              <1> 
  4037                              <1> ;-----	TEST FOR SPECIAL CHARACTER'S
  4038                              <1> 
  4039 00002434 3C08                <1> 	cmp	al, 08h			; IS IT A BACKSPACE
  4040 00002436 7410                <1> 	je	short P51		; BACK_SPACE
  4041 00002438 3C0D                <1> 	cmp	al, 0Dh ; CR		; IS IT CARRIAGE RETURN
  4042 0000243A 740C                <1> 	je	short P51		; CAR_RET
  4043 0000243C 3C0A                <1> 	cmp	al, 0Ah ; LF		; IS IT A LINE FEED
  4044 0000243E 7408                <1> 	je	short P51		; LINE_FEED
  4045                              <1> 	; 18/11/2020
  4046 00002440 3C09                <1> 	cmp	al, 09h			; is it a tab stop
  4047 00002442 7404                <1> 	je	short P51
  4048                              <1> 	;
  4049 00002444 3C07                <1> 	cmp	al, 07h			; IS IT A BELL
  4050 00002446 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 00002448 E85BFEFFFF          <1> 	call	_write_tty_m3
  4056                              <1> 
  4057 0000244D 5A                  <1> 	pop	edx ; *
  4058 0000244E 5E                  <1> 	pop	esi ; **
  4059                              <1> 
  4060 0000244F 668B96[0E7D0100]    <1> 	mov	dx, [esi+CURSOR_POSN]	; GET CURRENT CURSOR POSITION
  4061 00002456 EB44                <1> 	jmp	short P54		; SET CURSOR POSITION AND CONTINUE
  4062                              <1> P55:
  4063 00002458 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 0000245D 29C9                <1> 	sub	ecx, ecx
  4068 0000245F FEC1                <1> 	inc	cl
  4069                              <1> 	; ecx = 1
  4070 00002461 803D[8C890100]02    <1> 	cmp	byte [w_str_cmd], 2	; IS THE ATTRIBUTE IN THE STRING
  4071 00002468 7204                <1> 	jb	short P53		; IF NOT THEN SKIP
  4072 0000246A 8A5D00              <1> 	mov	bl, [ebp]		; ELSE GET NEW ATTRIBUTE
  4073 0000246D 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 0000246E E8A1FDFFFF          <1> 	call	_write_c_current
  4079                              <1> 	
  4080 00002473 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 00002474 0FB6F7              <1> 	movzx	esi, bh ; video page number (0 to 7)	
  4088 00002477 889E[E7670000]      <1> 	mov	[esi+chr_attrib], bl ; color/attribute
  4089                              <1> 
  4090 0000247D FEC2                <1> 	inc	dl			; INCREMENT COLUMN COUNTER
  4091 0000247F 3A15[E0670000]      <1> 	cmp	dl, [CRT_COLS]		; IF COLS ARE WITHIN RANGE FOR THIS MODE
  4092                              <1> 	;jb	short P54		;    THEN GO TO COLUMNS SET
  4093 00002485 7214                <1> 	jb	short P56 ; 05/12/2020
  4094 00002487 FEC6                <1> 	inc	dh			; BUMP ROW COUNTER BY ONE
  4095 00002489 28D2                <1> 	sub	dl, dl			; SET COLUMN COUNTER TO ZERO
  4096 0000248B 80FE19              <1> 	cmp	dh, 25			; IF ROWS ARE LESS THAN 25 THEN
  4097                              <1> 	;jb	short P54		; GO TO ROWS_COLUMNS_SET
  4098 0000248E 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 00002490 B00A                <1> 	mov	al, 0Ah	; line feed
  4106                              <1> 
  4107 00002492 E811FEFFFF          <1> 	call	_write_tty_m3
  4108                              <1> 	
  4109 00002497 66BA0018            <1> 	mov	dx, 1800h		; Column = 0, Row = 24
  4110                              <1> P56:	
  4111                              <1> 	; 05/12/2020
  4112                              <1> 	; 18/11/2020
  4113 0000249B 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 0000249C 5B                  <1> 	pop	ebx ; ***
  4120 0000249D 59                  <1> 	pop	ecx ; ****
  4121                              <1> 
  4122                              <1> 	;loop	P50			; DO IT ONCE MORE UNTIL (CX) = ZERO
  4123 0000249E 6649                <1> 	dec	cx
  4124 000024A0 7585                <1> 	jnz	short P50next
  4125                              <1> 
  4126 000024A2 665A                <1> 	pop	dx  ; *****		; RESTORE OLD CURSOR COORDINATES
  4127                              <1> 	
  4128 000024A4 F605[8C890100]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 000024AB 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 000024AD E87BFEFFFF          <1> 	call	_set_cpos
  4137                              <1> P58:
  4138 000024B2 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 000024B7 80FEFF              <1> 	cmp	dh, 0FFh
  4182 000024BA 7407                <1> 	je	short vga_wstr_1 ; user current cursor position
  4183                              <1> vga_wstr_0:
  4184                              <1> 	; set cursor position
  4185 000024BC 668915[0E7D0100]    <1> 	mov	[CURSOR_POSN], dx ; save cursor pos for pg 0
  4186                              <1> vga_wstr_1:
  4187 000024C3 66FF35[0E7D0100]    <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 000024CA F605[8C890100]02    <1> 	test	byte [w_str_cmd], 2
  4202 000024D1 751D                <1> 	jnz	short vga_wstr_3
  4203 000024D3 881D[1F7D0100]      <1> 	mov	[ccolor], bl
  4204                              <1> vga_wstr_2:
  4205 000024D9 51                  <1> 	push	ecx
  4206 000024DA 8A4500              <1> 	mov	al, [ebp]
  4207 000024DD E88F0A0000          <1> 	call	vga_write_teletype
  4208 000024E2 59                  <1> 	pop	ecx
  4209 000024E3 6649                <1> 	dec	cx
  4210 000024E5 741E                <1> 	jz	short vga_wstr_4
  4211 000024E7 45                  <1> 	inc	ebp
  4212 000024E8 8A1D[1F7D0100]      <1> 	mov	bl, [ccolor]
  4213 000024EE EBE9                <1> 	jmp	short vga_wstr_2
  4214                              <1> vga_wstr_3:
  4215 000024F0 51                  <1> 	push	ecx
  4216 000024F1 8A4500              <1> 	mov	al, [ebp]
  4217 000024F4 45                  <1> 	inc	ebp
  4218 000024F5 8A5D00              <1> 	mov	bl, [ebp]
  4219 000024F8 E8740A0000          <1> 	call	vga_write_teletype
  4220 000024FD 59                  <1> 	pop	ecx
  4221 000024FE 6649                <1> 	dec	cx
  4222 00002500 7403                <1> 	jz	short vga_wstr_4
  4223 00002502 45                  <1> 	inc	ebp
  4224 00002503 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 00002505 665A                <1> 	pop	dx ; word [CURSOR_POSN] ; *
  4232                              <1> 	;test	al, 1
  4233 00002507 F605[8C890100]01    <1> 	test	byte [w_str_cmd], 1
  4234                              <1> 	;jnz	VIDEO_RETURN
  4235                              <1> 	; 04/08/2022
  4236 0000250E 7507                <1> 	jnz	short vga_wstr_5
  4237 00002510 668915[0E7D0100]    <1> 	mov 	[CURSOR_POSN], dx
  4238                              <1> vga_wstr_5:
  4239 00002517 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 0000251C 80FC07              <1> 	cmp	ah, 7
  4273 0000251F 7762                <1> 	ja	short vga_graphics_up
  4274                              <1> 	;je	n0
  4275                              <1> 
  4276 00002521 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 00002523 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 00002525 E8BA050000          <1> 	call	GRAPH_POSN
  4285                              <1> 	;movzx	edi, ax			; SAVE RESULT AS DESTINATION ADDRESS
  4286                              <1> 	; 03/08/2022
  4287 0000252A 89C7                <1> 	mov	edi, eax
  4288                              <1> 
  4289                              <1> ;-----	DETERMINE SIZE OF WINDOW
  4290                              <1> 
  4291 0000252C 6629CA              <1> 	sub	dx, cx
  4292 0000252F 6681C20101          <1>         add     dx, 101h                ; ADJUST VALUES
  4293 00002534 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 00002537 803D[DE670000]06    <1> 	cmp	byte [CRT_MODE], 6	; TEST FOR MEDIUM RES
  4298 0000253E 7304                <1>         jnc	short _R7_              ; FIND_SOURCE
  4299                              <1> 
  4300                              <1> ;-----	MEDIUM RES UP
  4301 00002540 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 00002542 D1E7                <1> 	sal	edi, 1
  4305                              <1> 
  4306                              <1> ;-----	DETERMINE THE SOURCE ADDRESS IN THE BUFFER
  4307                              <1> _R7_:                                   ; FIND_SOURCE
  4308 00002544 81C700800B00        <1> 	add	edi, 0B8000h
  4309 0000254A C0E702              <1> 	sal	bh, 2			; multiply number of lines by 4
  4310 0000254D 7430                <1>         jz	short _R11              ; IF ZERO, THEN BLANK ENTIRE FIELD
  4311 0000254F B050                <1> 	mov	al, 80			; 80 BYTES/ROW
  4312 00002551 F6E7                <1> 	mul	bh			; determine offset to source
  4313                              <1> 	;movzx	esi, ax			; offset to source
  4314                              <1> 	; 03/08/2022
  4315 00002553 89C6                <1> 	mov	esi, eax
  4316 00002555 01FE                <1> 	add	esi, edi		; SET UP SOURCE
  4317 00002557 88F4                <1> 	mov	ah, dh			; NUMBER OF ROWS IN FIELD
  4318 00002559 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 0000255B E8FD030000          <1>         call    _R17                    ; MOVE ONE ROW
  4323 00002560 6681EEB01F          <1> 	sub	si, 2000h-80		; MOVE TO NEXT ROW
  4324 00002565 6681EFB01F          <1> 	sub	di, 2000h-80
  4325 0000256A FECC                <1> 	dec	ah			; NUMBER OF ROWS TO MOVE
  4326 0000256C 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 0000256E 88D8                <1> 	mov	al, bl			; attribute to fill with
  4331                              <1> _R10_:
  4332 00002570 E804040000          <1>         call    _R18                    ; CLEAR THAT ROW
  4333 00002575 6681EFB01F          <1> 	sub	di, 2000h-80		; POINT TO NEXT LINE
  4334 0000257A FECF                <1> 	dec	bh			; number of lines to fill
  4335 0000257C 75F2                <1> 	jnz	short _R10_             ; CLEAR LOOP
  4336 0000257E C3                  <1> 	retn				; EVERYYHING DONE
  4337                              <1> 
  4338                              <1> _R11:                                   ; BLANK_FIELD
  4339 0000257F 88F7                <1> 	mov	bh, dh			; set blank count to everything in field
  4340 00002581 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 00002583 88C7                <1> 	mov	bh, al ; 31/07/2016
  4370 00002585 BE[02680000]        <1> 	mov	esi, vga_g_modes
  4371 0000258A 89F7                <1> 	mov	edi, esi
  4372 0000258C 83C708              <1> 	add	edi, vga_g_mode_count
  4373                              <1> vga_g_up_0:
  4374 0000258F AC                  <1> 	lodsb
  4375 00002590 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  4376 00002592 7405                <1> 	je	short vga_g_up_1
  4377 00002594 39FE                <1> 	cmp	esi, edi
  4378 00002596 72F7                <1> 	jb	short vga_g_up_0
  4379                              <1> 	;xor	bh, bh ; 31/07/2016)
  4380 00002598 C3                  <1> 	retn	; nothing to do
  4381                              <1> vga_g_up_1:
  4382 00002599 88F8                <1> 	mov	al, bh ; 31/07/2016
  4383 0000259B 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 0000259E 3A35[E6670000]      <1> 	cmp	dh, [VGA_ROWS]
  4392 000025A4 7208                <1> 	jb	short vga_g_up_2
  4393 000025A6 8A35[E6670000]      <1> 	mov	dh, [VGA_ROWS]
  4394 000025AC FECE                <1> 	dec	dh
  4395                              <1> vga_g_up_2:
  4396 000025AE 3A15[E0670000]      <1> 	cmp	dl, [CRT_COLS]  ; = [VGA_COLS]
  4397 000025B4 7208                <1> 	jb	short vga_g_up_3
  4398 000025B6 8A15[E0670000]      <1> 	mov	dl, [CRT_COLS]
  4399 000025BC FECA                <1> 	dec	dl
  4400                              <1> vga_g_up_3:	
  4401 000025BE 3A05[E6670000]      <1> 	cmp	al, [VGA_ROWS]
  4402 000025C4 7602                <1> 	jna	short vga_g_up_4
  4403 000025C6 28C0                <1> 	sub	al, al ; 0
  4404                              <1> vga_g_up_4:
  4405 000025C8 88D7                <1> 	mov	bh, dl ; clr
  4406 000025CA 28CF                <1> 	sub	bh, cl ; cul
  4407 000025CC FEC7                <1> 	inc	bh ; cols = clr-cul+1
  4408                              <1> 
  4409 000025CE 20C0                <1> 	and	al, al ; nblines = 0
  4410 000025D0 7559                <1> 	jnz	short vga_g_up_6
  4411 000025D2 20ED                <1> 	and	ch, ch ; rul = 0
  4412 000025D4 7555                <1> 	jnz	short vga_g_up_6
  4413 000025D6 20C9                <1> 	and	cl, cl ; cul = 0
  4414 000025D8 7551                <1> 	jnz	short vga_g_up_6
  4415                              <1> 
  4416                              <1> 	;push	ax
  4417                              <1> 	; 12/04/2021
  4418 000025DA 50                  <1> 	push	eax
  4419 000025DB A0[E6670000]        <1> 	mov	al, [VGA_ROWS]
  4420 000025E0 FEC8                <1> 	dec	al  
  4421 000025E2 38C6                <1> 	cmp	dh, al ; rlr = nbrows-1
  4422 000025E4 7545                <1> 	jne	short vga_g_up_5
  4423 000025E6 A0[E0670000]        <1>         mov     al, [CRT_COLS]  ; = VGA_COLS
  4424 000025EB FEC8                <1> 	dec	al 
  4425 000025ED 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 000025EF 58                  <1> 	pop	eax
  4430 000025F0 7539                <1> 	jne	short vga_g_up_5
  4431                              <1> 
  4432 000025F2 66B80502            <1> 	mov	ax, 0205h
  4433 000025F6 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4434 000025FA 66EF                <1> 	out	dx, ax
  4435 000025FC A0[E6670000]        <1> 	mov	al, [VGA_ROWS]
  4436 00002601 8A25[E0670000]      <1> 	mov	ah, [CRT_COLS] ; = [VGA_COLS]
  4437 00002607 F6E4                <1> 	mul	ah
  4438 00002609 0FB7D0              <1> 	movzx	edx, ax
  4439                              <1> 	; 08/08/2016
  4440 0000260C 0FB605[E2670000]    <1> 	movzx	eax, byte [CHAR_HEIGHT]
  4441 00002613 F7E2                <1> 	mul	edx
  4442                              <1> 	; eax = byte count	
  4443 00002615 89C1                <1> 	mov	ecx, eax
  4444                              <1> 	;; 07/08/2016
  4445                              <1> 	;shl	dx, 3 ; * 8 ; * [CHAR_HEIGHT]
  4446                              <1> 	;mov	ecx, edx
  4447 00002617 88D8                <1> 	mov	al, bl ; fill value for blanked lines
  4448 00002619 BF00000A00          <1> 	mov	edi, 0A0000h
  4449 0000261E F3AA                <1> 	rep	stosb		
  4450                              <1> 	
  4451                              <1> 	;mov	ax, 5
  4452                              <1> 	; 03/08/2022
  4453 00002620 30E4                <1> 	xor	ah, ah
  4454 00002622 B005                <1> 	mov	al, 5
  4455                              <1> 
  4456 00002624 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4457 00002628 66EF                <1> 	out	dx, ax ; 0005h	
  4458                              <1> 
  4459 0000262A 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 0000262B 803E04              <1> 	cmp	byte [esi], PLANAR4
  4474 0000262E 7424                <1> 	je	short vga_g_up_planar
  4475 00002630 803E03              <1> 	cmp	byte [esi], PLANAR1
  4476 00002633 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 00002635 08C0                <1> 	or	al, al
  4489 00002637 7414                <1> 	jz	short vga_g_up_l2
  4490 00002639 88C4                <1> 	mov	ah, al
  4491 0000263B 00EC                <1> 	add	ah, ch ; i+nblines
  4492                              <1> 	;jc	short vga_g_up_l2	
  4493 0000263D 38F4                <1> 	cmp	ah, dh
  4494 0000263F 770C                <1> 	ja	short vga_g_up_l2
  4495                              <1> 	; else
  4496                              <1> 	;  vgamem_copy_pl4(cul,i+nblines,i,cols,nbcols,cheight);
  4497 00002641 E8F2000000          <1> 	call	vgamem_copy_l8
  4498                              <1> vga_g_up_l1:
  4499 00002646 FEC5                <1> 	inc	ch
  4500 00002648 38F5                <1> 	cmp	ch, dh
  4501 0000264A 76E9                <1> 	jna	short vga_g_up_l0
  4502 0000264C C3                  <1> 	retn
  4503                              <1> vga_g_up_l2:
  4504                              <1> 	; vgamem_fill_pl4(cul,i,cols,nbcols,cheight,attr);
  4505 0000264D E84C010000          <1> 	call	vgamem_fill_l8
  4506 00002652 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 00002654 20C0                <1> 	and	al, al
  4517 00002656 7414                <1> 	jz	short vga_g_up_pl2	
  4518 00002658 88C4                <1> 	mov	ah, al
  4519 0000265A 00EC                <1> 	add	ah, ch ; i+nblines
  4520                              <1> 	;jc	short vga_g_up_pl2
  4521 0000265C 38F4                <1> 	cmp	ah, dh
  4522 0000265E 770C                <1> 	ja	short vga_g_up_pl2
  4523                              <1> 	; else
  4524                              <1> 	;  vgamem_copy_pl4(cul,i+nblines,i,cols,nbcols,cheight);
  4525 00002660 E80E000000          <1> 	call	vgamem_copy_pl4
  4526                              <1> vga_g_up_pl1:
  4527 00002665 FEC5                <1> 	inc	ch 
  4528 00002667 38F5                <1> 	cmp	ch, dh
  4529 00002669 76E9                <1> 	jna	short vga_g_up_pl0
  4530 0000266B C3                  <1> 	retn
  4531                              <1> vga_g_up_pl2:
  4532                              <1> 	; vgamem_fill_pl4(cul,i,cols,nbcols,cheight,attr);
  4533 0000266C E870000000          <1> 	call	vgamem_fill_pl4
  4534 00002671 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 00002673 52                  <1> 	push	edx
  4554 00002674 50                  <1> 	push	eax
  4555                              <1> 
  4556                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0105)
  4557 00002675 66B80501            <1> 	mov	ax, 0105h
  4558 00002679 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4559 0000267D 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 0000267F 0FB6542401          <1> 	movzx	edx, byte [esp+1]
  4565                              <1> 	; 08/08/2016
  4566 00002684 0FB605[E2670000]    <1> 	movzx	eax, byte [CHAR_HEIGHT]
  4567 0000268B 8A25[E0670000]      <1> 	mov	ah, [CRT_COLS] ; nbcols
  4568 00002691 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 00002693 50                  <1> 	push	eax ; cheight * nbcols
  4573 00002694 F7E2                <1> 	mul	edx ; * ysrc
  4574                              <1> 	; eax = ysrc * cheight * nbcols
  4575                              <1> 	; edx = 0
  4576 00002696 88CA                <1> 	mov	dl, cl ; edx = xstart	
  4577 00002698 01D0                <1>  	add	eax, edx
  4578 0000269A 89C6                <1> 	mov	esi, eax ; src
  4579 0000269C 88EA                <1> 	mov	dl, ch ; ydest
  4580 0000269E 58                  <1> 	pop	eax ; cheight * nbcols
  4581 0000269F F7E2                <1> 	mul	edx
  4582                              <1> 	; eax = ydest * cheight * nbcols
  4583 000026A1 88CA                <1> 	mov	dl, cl ; edx = xstart	
  4584 000026A3 01D0                <1>  	add	eax, edx
  4585 000026A5 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 000026A7 51                  <1> 	push	ecx
  4593 000026A8 B900000A00          <1> 	mov	ecx, 0A0000h
  4594 000026AD 01CE                <1> 	add	esi, ecx
  4595 000026AF 01CF                <1> 	add	edi, ecx
  4596                              <1> 	; 08/08/2016
  4597 000026B1 8A35[E2670000]      <1> 	mov	dh, [CHAR_HEIGHT]
  4598                              <1> 	;; 07/08/2016
  4599                              <1> 	;mov	dh, 8 ; 07/08/2016
  4600 000026B7 28D2                <1> 	sub	dl, dl ; i
  4601                              <1> vgamem_copy_pl4_0:
  4602 000026B9 56                  <1> 	push	esi
  4603 000026BA 57                  <1> 	push	edi
  4604 000026BB 0FB605[E0670000]    <1> 	movzx	eax, byte [CRT_COLS]
  4605 000026C2 F6E2                <1> 	mul	dl
  4606                              <1> 	; eax = i * nbcols
  4607 000026C4 01C7                <1> 	add	edi, eax ; dest+i*nbcols
  4608 000026C6 01C6                <1> 	add	esi, eax
  4609 000026C8 0FB6CF              <1> 	movzx	ecx, bh ; cols
  4610 000026CB F3A4                <1> 	rep	movsb
  4611 000026CD 5F                  <1> 	pop	edi
  4612 000026CE 5E                  <1> 	pop	esi
  4613 000026CF FECE                <1> 	dec	dh
  4614 000026D1 75E6                <1> 	jnz	short vgamem_copy_pl4_0
  4615                              <1> vgamem_copy_pl4_1:
  4616 000026D3 59                  <1> 	pop	ecx
  4617                              <1> 
  4618                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0005);
  4619 000026D4 66B80500            <1> 	mov	ax, 0005h
  4620 000026D8 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4621 000026DC 66EF                <1> 	out	dx, ax
  4622                              <1> 
  4623 000026DE 58                  <1> 	pop	eax
  4624 000026DF 5A                  <1> 	pop	edx
  4625                              <1> 
  4626 000026E0 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 000026E1 52                  <1> 	push	edx
  4645 000026E2 50                  <1> 	push	eax
  4646                              <1> 
  4647                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0205)
  4648 000026E3 66B80502            <1> 	mov	ax, 0205h
  4649 000026E7 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4650 000026EB 66EF                <1> 	out	dx, ax
  4651                              <1> 
  4652                              <1>       	; 08/08/2016
  4653 000026ED 0FB605[E2670000]    <1> 	movzx   eax, byte [CHAR_HEIGHT]
  4654 000026F4 F6E5                <1> 	mul	ch
  4655                              <1> 	;; 07/08/2016
  4656                              <1> 	;movzx	eax, ch
  4657                              <1> 	;shl	ax, 3 ; * 8 ; * [CHAR_HEIGHT]
  4658 000026F6 0FB615[E0670000]    <1> 	movzx	edx, byte [CRT_COLS] ; = [VGA_COLS]
  4659 000026FD F7E2                <1> 	mul	edx
  4660                              <1> 	; edx  = 0
  4661 000026FF 88CA                <1> 	mov	dl, cl 
  4662 00002701 01D0                <1> 	add	eax, edx
  4663 00002703 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 00002705 81C700000A00        <1> 	add	edi, 0A0000h
  4670 0000270B 51                  <1> 	push	ecx
  4671                              <1> 	; 08/08/2016
  4672 0000270C 8A35[E2670000]      <1> 	mov	dh, [CHAR_HEIGHT]
  4673                              <1> 	;; 07/08/2016
  4674                              <1> 	;mov	dh, 8 ; 07/08/2016
  4675 00002712 28D2                <1> 	sub	dl, dl ; i
  4676                              <1> vgamem_fill_pl4_0:
  4677 00002714 57                  <1> 	push	edi
  4678 00002715 0FB605[E0670000]    <1> 	movzx	eax, byte [CRT_COLS]
  4679 0000271C F6E2                <1> 	mul	dl
  4680                              <1> 	; eax = i * nbcols
  4681 0000271E 01C7                <1> 	add	edi, eax ; dest+i*nbcols
  4682 00002720 88D8                <1> 	mov	al, bl ; attr ; 04/08/2016
  4683 00002722 0FB6CF              <1> 	movzx	ecx, bh ; cols
  4684 00002725 F3AA                <1>  	rep	stosb
  4685 00002727 5F                  <1> 	pop	edi
  4686 00002728 75EA                <1> 	jnz	short vgamem_fill_pl4_0
  4687                              <1> vgamem_fill_pl4_1:
  4688 0000272A 59                  <1> 	pop	ecx
  4689                              <1> 
  4690                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0005);
  4691 0000272B 66B80500            <1> 	mov	ax, 0005h
  4692 0000272F 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4693 00002733 66EF                <1> 	out	dx, ax
  4694                              <1> 
  4695 00002735 58                  <1> 	pop	eax
  4696 00002736 5A                  <1> 	pop	edx 
  4697                              <1> 	
  4698 00002737 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 00002738 52                  <1> 	push	edx
  4722 00002739 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 0000273A 0FB6D4              <1> 	movzx	edx, ah ; ysrc
  4732                              <1> 	; 08/08/2016
  4733 0000273D 0FB605[E2670000]    <1> 	movzx	eax, byte [CHAR_HEIGHT]
  4734 00002744 8A25[E0670000]      <1> 	mov	ah, [CRT_COLS] ; nbcols
  4735 0000274A 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 0000274C 50                  <1> 	push	eax ; cheight * nbcols
  4740 0000274D F7E2                <1> 	mul	edx ; * ysrc
  4741                              <1> 	; eax = ysrc * cheight * nbcols
  4742                              <1> 	; edx = 0
  4743 0000274F 88CA                <1> 	mov	dl, cl ; edx = xstart
  4744 00002751 01D0                <1>  	add	eax, edx
  4745 00002753 89C6                <1> 	mov	esi, eax ; src
  4746                              <1> 	;shl	si, 3 ; * 8 ; 06/08/2016
  4747                              <1> 	; 02/08/2022
  4748 00002755 C1E603              <1> 	shl	esi, 3
  4749 00002758 88EA                <1> 	mov	dl, ch ; ydest
  4750 0000275A 58                  <1> 	pop	eax ; cheight * nbcols
  4751 0000275B F7E2                <1> 	mul	edx
  4752                              <1> 	; eax = ydest * cheight * nbcols
  4753 0000275D 88CA                <1> 	mov	dl, cl ; edx = xstart	
  4754 0000275F 01D0                <1>  	add	eax, edx
  4755 00002761 89C7                <1> 	mov	edi, eax ; dest
  4756                              <1> 	;shl	di, 3 ; * 8 ; 06/08/2016
  4757                              <1> 	; 02/08/2022
  4758 00002763 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 00002766 51                  <1> 	push	ecx
  4766 00002767 B900000A00          <1> 	mov	ecx, 0A0000h
  4767 0000276C 01CE                <1> 	add	esi, ecx
  4768 0000276E 01CF                <1> 	add	edi, ecx
  4769                              <1> 	; 08/08/2016
  4770 00002770 8A35[E2670000]      <1> 	mov	dh, [CHAR_HEIGHT]
  4771                              <1> 	;; 07/08/2016
  4772                              <1> 	;mov	dh, 8 ; 07/08/2016
  4773 00002776 28D2                <1> 	sub	dl, dl ; i
  4774                              <1> vgamem_copy_l8_0:
  4775 00002778 56                  <1> 	push	esi
  4776 00002779 57                  <1> 	push	edi
  4777 0000277A 0FB605[E0670000]    <1> 	movzx	eax, byte [CRT_COLS]
  4778 00002781 F6E2                <1> 	mul	dl
  4779                              <1> 	; eax = i * nbcols
  4780                              <1> 	;shl	ax, 3 ; * 8 ; 06/08/2016
  4781                              <1> 	; 02/08/2022
  4782 00002783 C1E003              <1> 	shl	eax, 3
  4783 00002786 01C7                <1> 	add	edi, eax ; dest+i*nbcols
  4784 00002788 01C6                <1> 	add	esi, eax
  4785 0000278A 0FB6CF              <1> 	movzx	ecx, bh ; cols
  4786                              <1> 	;shl	cx, 3 ; * 8 ; 06/08/2016
  4787                              <1> 	; 02/08/2022
  4788 0000278D C1E103              <1> 	shl	ecx, 3
  4789 00002790 F3A4                <1> 	rep	movsb
  4790 00002792 5F                  <1> 	pop	edi
  4791 00002793 5E                  <1> 	pop	esi
  4792 00002794 FEC2                <1> 	inc	dl ; 06/08/2016
  4793 00002796 FECE                <1> 	dec	dh
  4794 00002798 75DE                <1> 	jnz	short vgamem_copy_l8_0
  4795                              <1> vgamem_copy_l8_1:
  4796 0000279A 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 0000279B 58                  <1> 	pop	eax
  4804 0000279C 5A                  <1> 	pop	edx
  4805                              <1> 
  4806 0000279D 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 0000279E 52                  <1> 	push	edx
  4829 0000279F 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 000027A0 0FB605[E2670000]    <1> 	movzx   eax, byte [CHAR_HEIGHT]
  4838 000027A7 F6E5                <1> 	mul	ch
  4839                              <1> 	;; 07/08/2016
  4840                              <1> 	;movzx	eax, ch
  4841                              <1> 	;shl	ax, 3 ; * 8 ; * [CHAR_HEIGHT]
  4842 000027A9 0FB615[E0670000]    <1> 	movzx	edx, byte [CRT_COLS] ; = [VGA_COLS]
  4843 000027B0 F7E2                <1> 	mul	edx
  4844                              <1> 	; edx  = 0
  4845 000027B2 88CA                <1> 	mov	dl, cl 
  4846 000027B4 01D0                <1> 	add	eax, edx
  4847 000027B6 89C7                <1> 	mov	edi, eax
  4848                              <1> 	;shl	di, 3 ; * 8 ; 06/08/2016
  4849                              <1> 	; 02/08/2022
  4850 000027B8 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 000027BB 81C700000A00        <1> 	add	edi, 0A0000h
  4857 000027C1 51                  <1> 	push	ecx
  4858                              <1> 	; 08/08/2016
  4859 000027C2 8A35[E2670000]      <1> 	mov	dh, [CHAR_HEIGHT]
  4860                              <1> 	;; 07/08/2016
  4861                              <1> 	;mov	dh, 8 ; 07/08/2016
  4862 000027C8 28D2                <1> 	sub	dl, dl ; i
  4863                              <1> vgamem_fill_l8_0:
  4864 000027CA 57                  <1> 	push	edi
  4865 000027CB 0FB605[E0670000]    <1> 	movzx	eax, byte [CRT_COLS]
  4866 000027D2 F6E2                <1> 	mul	dl
  4867                              <1> 	; eax = i * nbcols
  4868                              <1> 	;shl	ax, 3 ; * 8 ; 06/08/2016
  4869                              <1> 	; 02/08/2022
  4870 000027D4 C1E003              <1> 	shl	eax, 3
  4871 000027D7 01C7                <1> 	add	edi, eax ; dest+i*nbcols
  4872 000027D9 88D8                <1> 	mov	al, bl ; attr ; 04/08/2016
  4873 000027DB 0FB6CF              <1> 	movzx	ecx, bh ; cols
  4874                              <1> 	;shl	cx, 3 ; * 8 ; 06/08/2016
  4875                              <1>  	; 02/08/2022
  4876 000027DE C1E103              <1> 	shl	ecx, 3
  4877 000027E1 F3AA                <1> 	rep	stosb
  4878 000027E3 5F                  <1> 	pop	edi
  4879 000027E4 FEC2                <1> 	inc	dl ; 06/08/2016
  4880 000027E6 FECE                <1> 	dec	dh
  4881 000027E8 75E0                <1> 	jnz	short vgamem_fill_l8_0
  4882                              <1> vgamem_fill_l8_1:
  4883 000027EA 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 000027EB 58                  <1> 	pop	eax
  4891 000027EC 5A                  <1> 	pop	edx 
  4892                              <1> 
  4893 000027ED 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 000027EE 80FC07              <1> 	cmp	ah, 7
  4928 000027F1 7769                <1>         ja	short vga_graphics_down ; 03/08/2022
  4929                              <1> 	;je	_n0
  4930                              <1> 
  4931 000027F3 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 000027F5 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 000027F7 E8E8020000          <1> 	call	GRAPH_POSN
  4940                              <1> 	;movzx	edi, ax			; SAVE RESULT AS DESTINATION ADDRESS
  4941                              <1> 	; 03/08/2022
  4942 000027FC 89C7                <1> 	mov	edi, eax
  4943                              <1> 
  4944                              <1> ;-----	DETERMINE SIZE OF WINDOW
  4945                              <1> 
  4946 000027FE 6629CA              <1> 	sub	dx, cx
  4947 00002801 6681C20101          <1>         add     dx, 101h                ; ADJUST VALUES
  4948 00002806 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 00002809 803D[DE670000]06    <1> 	cmp	byte [CRT_MODE], 6	; TEST FOR MEDIUM RES
  4953 00002810 7305                <1> 	jnc	short _R12              ; FIND_SOURCE_DOWN
  4954                              <1> 
  4955                              <1> ;-----	MEDIUM RES DOWN
  4956 00002812 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 00002814 D1E7                <1> 	sal	edi, 1
  4960                              <1> 	;inc	di			; POINT TO LAST BYTE
  4961                              <1> 	; 03/08/2022
  4962 00002816 47                  <1> 	inc	edi
  4963                              <1> 
  4964                              <1> ;-----	DETERMINE THE SOURCE ADDRESS IN THE BUFFER
  4965                              <1> 
  4966                              <1> _R12:                                   ; FIND_SOURCE_DOWN
  4967 00002817 81C700800B00        <1> 	add	edi, 0B8000h		
  4968 0000281D 6681C7F000          <1> 	add	di, 240			; POINT TO LAST ROW OF PIXELS
  4969 00002822 C0E702              <1> 	sal	bh, 2			; multiply number of lines by 4
  4970 00002825 74(06)              <1> 	jz	short 6			; IF ZERO, THEN BLANK ENTIRE FIELD
  4971 00002827 B050                <1> 	mov	al, 80			; 80 BYTES/ROW
  4972 00002829 F6E7                <1> 	mul	bh			; determine offset to source
  4973 0000282B 89FE                <1> 	mov	esi, edi		; SET UP SOURCE
  4974                              <1> 	;sub	si, ax			; SUBTRACT THE OFFSET
  4975                              <1> 	; 03/08/2022
  4976 0000282D 29C6                <1> 	sub	esi, eax
  4977 0000282F 88F4                <1> 	mov	ah, dh			; NUMBER OF ROWS IN FIELD
  4978 00002831 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 00002833 E825010000          <1>         call    _R17                    ; MOVE ONE ROW
  4984 00002838 6681EE5020          <1> 	sub	si, 2000h+80		; MOVE TO NEXT ROW
  4985 0000283D 6681EF5020          <1> 	sub	di, 2000h+80
  4986 00002842 FECC                <1> 	dec	ah			; NUMBER OF ROWS TO MOVE
  4987 00002844 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 00002846 88D8                <1> 	mov	al, bl			; attribute to fill with
  4992                              <1> _R15_:                                  ; CLEAR_LOOP_DOWN
  4993 00002848 E82C010000          <1> 	call	_R18			; CLEAR A ROW
  4994 0000284D 6681EF5020          <1> 	sub	di, 2000h+80		; POINT TO NEXT LINE
  4995 00002852 FECF                <1> 	dec	bh			; number of lines to fill
  4996 00002854 75F2                <1>         jnz	short _R15_             ; CLEAR_LOOP_DOWN
  4997                              <1> 	; 18/11/2020
  4998 00002856 FC                  <1> 	cld				; RESET THE DIRECTION FLAG
  4999                              <1> 	
  5000 00002857 C3                  <1> 	retn				; EVERYTHING DONE
  5001                              <1> 
  5002                              <1> _R16:                                   ; BLANK_FIELD_DOWN
  5003 00002858 88F7                <1> 	mov	bh, dh			; set blank count to everything in field
  5004 0000285A 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 0000285C FC                  <1>         cld     ; !!! Clear direction flag !!! 
  5032                              <1> 
  5033 0000285D 88C7                <1> 	mov	bh, al ; 31/07/2016
  5034                              <1> 
  5035 0000285F BE[FA670000]        <1> 	mov	esi, vga_modes
  5036 00002864 89F7                <1> 	mov	edi, esi
  5037 00002866 83C710              <1> 	add	edi, vga_mode_count
  5038                              <1> vga_g_down_0:
  5039 00002869 AC                  <1> 	lodsb
  5040 0000286A 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  5041 0000286C 7405                <1> 	je	short vga_g_down_1
  5042 0000286E 39FE                <1> 	cmp	esi, edi
  5043 00002870 72F7                <1> 	jb	short vga_g_down_0
  5044                              <1> 	; xor 	bh, bh	; 31/07/2016
  5045 00002872 C3                  <1> 	retn	; nothing to do
  5046                              <1> vga_g_down_1:
  5047 00002873 88F8                <1> 	mov	al, bh ; 31/07/2016
  5048 00002875 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 00002878 3A35[E6670000]      <1> 	cmp	dh, [VGA_ROWS]
  5057 0000287E 7208                <1> 	jb	short vga_g_down_2
  5058 00002880 8A35[E6670000]      <1> 	mov	dh, [VGA_ROWS]
  5059 00002886 FECE                <1> 	dec	dh
  5060                              <1> vga_g_down_2:
  5061 00002888 3A15[E0670000]      <1> 	cmp	dl, [CRT_COLS]  ; = [VGA_COLS]
  5062 0000288E 7208                <1> 	jb	short vga_g_down_3
  5063 00002890 8A15[E0670000]      <1> 	mov	dl, [CRT_COLS]
  5064 00002896 FECA                <1> 	dec	dl
  5065                              <1> vga_g_down_3:	
  5066 00002898 3A05[E6670000]      <1> 	cmp	al, [VGA_ROWS]
  5067 0000289E 7602                <1> 	jna	short vga_g_down_4
  5068 000028A0 28C0                <1> 	sub	al, al ; 0
  5069                              <1> vga_g_down_4:
  5070 000028A2 88F7                <1> 	mov	bh, dh ; clr
  5071 000028A4 28CF                <1> 	sub	bh, cl ; cul
  5072 000028A6 FEC7                <1> 	inc	bh ; cols = clr-cul+1
  5073                              <1> 
  5074 000028A8 20C0                <1> 	and	al, al ; nblines = 0
  5075 000028AA 7559                <1> 	jnz	short vga_g_down_6
  5076 000028AC 20ED                <1> 	and	ch, ch ; rul = 0
  5077 000028AE 7555                <1> 	jnz	short vga_g_down_6
  5078 000028B0 20C9                <1> 	and	cl, cl ; cul = 0
  5079 000028B2 7551                <1> 	jnz	short vga_g_down_6
  5080                              <1> 
  5081 000028B4 50                  <1> 	push	eax ; push ax ; 12/04/2021
  5082 000028B5 A0[E6670000]        <1> 	mov	al, [VGA_ROWS]
  5083 000028BA FEC8                <1> 	dec	al  
  5084 000028BC 38C6                <1> 	cmp	dh, al ; rlr = nbrows-1
  5085 000028BE 7545                <1> 	jne	short vga_g_down_5
  5086 000028C0 A0[E0670000]        <1>         mov     al, [CRT_COLS]  ; = VGA_COLS
  5087 000028C5 FEC8                <1> 	dec	al 
  5088 000028C7 38C2                <1>  	cmp	dl, al ; clr = nbcols-1
  5089                              <1> 	;jne	short vga_g_down_5
  5090                              <1>  	; 12/04/2021
  5091 000028C9 58                  <1> 	pop	eax ; pop ax
  5092 000028CA 7539                <1> 	jne	short vga_g_down_5
  5093                              <1> 
  5094 000028CC 66B80502            <1> 	mov	ax, 0205h
  5095 000028D0 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  5096 000028D4 66EF                <1> 	out	dx, ax
  5097 000028D6 A0[E6670000]        <1> 	mov	al, [VGA_ROWS]
  5098 000028DB 8A25[E0670000]      <1> 	mov	ah, [CRT_COLS] ; = [VGA_COLS]
  5099 000028E1 F6E4                <1> 	mul	ah
  5100 000028E3 0FB7D0              <1> 	movzx	edx, ax
  5101                              <1> 	; 08/08/2016
  5102 000028E6 0FB605[E2670000]    <1> 	movzx	eax, byte [CHAR_HEIGHT]
  5103 000028ED F7E2                <1> 	mul	edx
  5104                              <1> 	; eax = byte count	
  5105 000028EF 89C1                <1> 	mov	ecx, eax
  5106                              <1> 	;; 07/08/2016
  5107                              <1> 	;shl	dx, 3 ; * 8 ; * [CHAR_HEIGHT]
  5108                              <1> 	;mov	ecx, edx
  5109 000028F1 88D8                <1> 	mov	al, bl ; fill value for blanked lines
  5110 000028F3 BF00000A00          <1> 	mov	edi, 0A0000h
  5111 000028F8 F3AA                <1> 	rep	stosb			
  5112                              <1> 	
  5113                              <1> 	; 03/08/2022
  5114 000028FA 30E4                <1> 	xor	ah, ah ; 0 
  5115                              <1> 	
  5116 000028FC B005                <1> 	mov	al, 5
  5117 000028FE 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  5118 00002902 66EF                <1> 	out	dx, ax ; 0005h	
  5119                              <1> 
  5120 00002904 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 00002905 803E04              <1> 	cmp	byte [esi], PLANAR4
  5134 00002908 742C                <1> 	je	short vga_g_down_planar
  5135 0000290A 803E03              <1> 	cmp	byte [esi], PLANAR1
  5136 0000290D 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 0000290F 08C0                <1> 	or	al, al
  5149 00002911 741C                <1> 	jz	short vga_g_down_l2
  5150 00002913 88C4                <1> 	mov	ah, al
  5151 00002915 00EC                <1> 	add	ah, ch
  5152                              <1> 	;jc	short vga_g_down_l2	
  5153 00002917 86EE                <1> 	xchg	ch, dh
  5154 00002919 38E5                <1> 	cmp	ch, ah
  5155 0000291B 7212                <1> 	jb	short vga_g_down_l2
  5156 0000291D 88EC                <1> 	mov	ah, ch
  5157 0000291F 28C4                <1> 	sub	ah, al ; ah = i - nblines
  5158                              <1> 	; else
  5159                              <1> 	; vgamem_copy_pl4(cul,i,i-nblines,cols,nbcols,cheight);
  5160 00002921 E812FEFFFF          <1> 	call	vgamem_copy_l8
  5161                              <1> vga_g_down_l1:
  5162 00002926 86F5                <1> 	xchg	dh, ch
  5163 00002928 FECE                <1> 	dec	dh 
  5164 0000292A 38EE                <1> 	cmp	dh, ch
  5165 0000292C 73E1                <1> 	jnb	short vga_g_down_l0
  5166 0000292E C3                  <1> 	retn
  5167                              <1> 
  5168                              <1> vga_g_down_l2:
  5169                              <1> 	; vgamem_fill_pl4(cul,i,cols,nbcols,cheight,attr);
  5170 0000292F E86AFEFFFF          <1> 	call	vgamem_fill_l8
  5171 00002934 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 00002936 08C0                <1> 	or	al, al
  5182 00002938 741C                <1> 	jz	short vga_g_down_pl2
  5183 0000293A 88C4                <1> 	mov	ah, al
  5184 0000293C 00EC                <1> 	add	ah, ch
  5185                              <1> 	;jc	short vga_g_down_pl2	
  5186 0000293E 86EE                <1> 	xchg	ch, dh
  5187 00002940 38E5                <1> 	cmp	ch, ah
  5188 00002942 7212                <1> 	jb	short vga_g_down_pl2
  5189 00002944 88EC                <1> 	mov	ah, ch
  5190 00002946 28C4                <1> 	sub	ah, al ; ah = i - nblines
  5191                              <1> 	; else
  5192                              <1> 	; vgamem_copy_pl4(cul,i,i-nblines,cols,nbcols,cheight);
  5193 00002948 E826FDFFFF          <1> 	call	vgamem_copy_pl4
  5194                              <1> vga_g_down_pl1:
  5195 0000294D 86F5                <1> 	xchg	dh, ch
  5196 0000294F FECE                <1> 	dec	dh 
  5197 00002951 38EE                <1> 	cmp	dh, ch
  5198 00002953 73E1                <1> 	jnb	short vga_g_down_pl0
  5199 00002955 C3                  <1> 	retn
  5200                              <1> 
  5201                              <1> vga_g_down_pl2:
  5202                              <1> 	; vgamem_fill_pl4(cul,i,cols,nbcols,cheight,attr);
  5203 00002956 E886FDFFFF          <1> 	call	vgamem_fill_pl4
  5204 0000295B 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 0000295D 0FB6CA              <1> 	movzx	ecx, dl			; NUMBER OF BYTES IN THE ROW
  5215 00002960 56                  <1> 	push	esi
  5216 00002961 57                  <1> 	push	edi			; SAVE POINTERS
  5217 00002962 F3A4                <1> 	rep	movsb			; MOVE THE EVEN FIELD
  5218 00002964 5F                  <1> 	pop	edi
  5219 00002965 5E                  <1> 	pop	esi
  5220 00002966 6681C60020          <1> 	add	si, 2000h
  5221 0000296B 6681C70020          <1> 	add	di, 2000h		; POINT TO THE ODD FIELD
  5222 00002970 56                  <1> 	push	esi
  5223 00002971 57                  <1> 	push	edi			; SAVE THE POINTERS
  5224 00002972 88D1                <1> 	mov	cl, dl			; COUNT BACK
  5225 00002974 F3A4                <1> 	rep	movsb			; MOVE THE ODD FIELD
  5226 00002976 5F                  <1> 	pop	edi
  5227 00002977 5E                  <1> 	pop	esi			; POINTERS BACK
  5228 00002978 C3                  <1> 	retn				; RETURN TO CALLER
  5229                              <1> 
  5230                              <1> ;-----	CLEAR A SINGLE ROW
  5231                              <1> 
  5232                              <1> _R18:
  5233 00002979 0FB6CA              <1> 	movzx	ecx, dl			; NUMBER OF BYTES IN FIELD
  5234 0000297C 57                  <1> 	push	edi			; SAVE POINTER
  5235 0000297D F3AA                <1> 	rep	stosb			; STORE THE NEW VALUE
  5236 0000297F 5F                  <1> 	pop	edi			; POINTER BACK
  5237 00002980 6681C70020          <1> 	add	di, 2000h		; POINT TO ODD FIELD
  5238 00002985 57                  <1> 	push	edi
  5239 00002986 88D1                <1> 	mov	cl, dl
  5240 00002988 F3AA                <1> 	rep	stosb			; FILL THE ODD FIELD
  5241 0000298A 5F                  <1> 	pop	edi
  5242 0000298B 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 0000298C 25FF000000          <1> 	and 	eax, 0FFh		; ZERO TO HIGH OF CODE POINT
  5282 00002991 50                  <1> 	push	eax			; SAVE CODE POINT VALUE
  5283                              <1> 
  5284                              <1> ;-----	DETERMINE POSITION IN REGEN BUFFER TO PUT CODE POINTS
  5285                              <1> 
  5286 00002992 E846010000          <1> 	call	S26			; FIND LOCATION IN REGEN BUFFER
  5287 00002997 89C7                <1> 	mov	edi, eax		; REGEN POINTER IN DI
  5288                              <1> 
  5289                              <1> ;-----	DETERMINE REGION TO GET CODE POINTS FROM
  5290                              <1> 
  5291 00002999 58                  <1> 	pop	eax			; RECOVER CODE POINT
  5292                              <1> 
  5293 0000299A BE[84530100]        <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 0000299F C1E003              <1> 	sal	eax, 3
  5300 000029A2 01C6                <1> 	add	esi, eax		; SI HAS OFFSET OF DESIRED CODES
  5301                              <1> 	
  5302 000029A4 803D[DE670000]06    <1> 	cmp	byte [CRT_MODE], 6
  5303 000029AB 7231                <1> 	jc	short S6		; TEST FOR MEDIUM RESOLUTION MODE
  5304                              <1> 
  5305                              <1> ;-----	HIGH RESOLUTION MODE
  5306                              <1> 
  5307 000029AD 81C700800B00        <1> 	add	edi, 0B8000h
  5308                              <1> S1:					; HIGH_CHAR
  5309 000029B3 57                  <1> 	push	edi			; SAVE REGEN POINTER
  5310 000029B4 56                  <1> 	push	esi			; SAVE CODE POINTER
  5311 000029B5 B604                <1> 	mov	dh, 4			; NUMBER OF TIMES THROUGH LOOP
  5312                              <1> S2:
  5313 000029B7 AC                  <1> 	lodsb				; GET BYTE FROM CODE POINTS
  5314 000029B8 F6C380              <1> 	test	bl, 80h			; SHOULD WE USE THE FUNCTION
  5315 000029BB 7515                <1> 	jnz	short S5		; TO PUT CHAR IN
  5316 000029BD AA                  <1> 	stosb				; STORE IN REGEN BUFFER
  5317 000029BE AC                  <1> 	lodsb
  5318                              <1> S4:
  5319 000029BF 8887FF1F0000        <1> 	mov	[edi+2000h-1], al	; STORE IN SECOND HALF
  5320 000029C5 83C74F              <1> 	add	edi, 79			; MOVE TO NEXT ROW IN REGEN
  5321 000029C8 FECE                <1> 	dec	dh			; DONE WITH LOOP
  5322 000029CA 75EB                <1> 	jnz	short S2
  5323 000029CC 5E                  <1> 	pop	esi
  5324 000029CD 5F                  <1> 	pop	edi			; RECOVER REGEN POINTER
  5325 000029CE 47                  <1> 	inc	edi			; POINT TO NEXT CHAR POSITION
  5326 000029CF E2E2                <1> 	loop	S1			; MORE CHARS TO WRITE
  5327 000029D1 C3                  <1> 	retn
  5328                              <1> 
  5329                              <1> S5:
  5330 000029D2 3207                <1> 	xor	al, [edi]		; EXCLUSIVE OR WITH CURRENT
  5331 000029D4 AA                  <1> 	stosb				; STORE THE CODE POINT
  5332 000029D5 AC                  <1> 	lodsb				; AGAIN FOR ODD FIELD
  5333 000029D6 3287FF1F0000        <1> 	xor	al, [edi+2000h-1]
  5334 000029DC EBE1                <1> 	jmp	short S4		; BACK TO MAINSTREAM
  5335                              <1> 
  5336                              <1> ;-----	MEDIUM RESOLUTION WRITE
  5337                              <1> S6:					; MED_RES_WRITE
  5338 000029DE 88DA                <1> 	mov	dl, bl			; SAVE HIGH COLOR BIT
  5339                              <1> 	; 03/08/2022
  5340 000029E0 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 000029E2 80E303              <1> 	and	bl, 3			; ISOLATE THE COLOR BITS ( LOW 2 BITS )
  5344 000029E5 B055                <1> 	mov	al, 055h		; GET BIT CONVERSION MULTIPLIER
  5345 000029E7 F6E3                <1> 	mul	bl			; EXPAND 2 COLOR BITS TO 4 REPLICATIONS
  5346 000029E9 88C3                <1> 	mov	bl, al			; PLACE BACK IN WORK REGISTER
  5347 000029EB 88C7                <1> 	mov	bh, al			; EXPAND TO 8 REPLICATIONS OF COLOR BITS
  5348 000029ED 81C700800B00        <1> 	add	edi, 0B8000h
  5349                              <1> S7:                                     ; MED_CHAR
  5350 000029F3 57                  <1> 	push	edi			; SAVE REGEN POINTER
  5351 000029F4 56                  <1> 	push	esi			; SAVE THE CODE POINTER
  5352 000029F5 B604                <1> 	mov	dh, 4			; NUMBER OF LOOPS
  5353                              <1> S8:
  5354 000029F7 AC                  <1> 	lodsb				; GET CODE POINT
  5355 000029F8 E8B1000000          <1> 	call	S21			; DOUBLE UP ALL THE BITS
  5356 000029FD 6621D8              <1> 	and	ax, bx			; CONVERT TO FOREGROUND COLOR ( 0 BACK )
  5357 00002A00 86E0                <1> 	xchg	ah, al			; SWAP HIGH/LOW BYTES FOR WORD MOVE
  5358 00002A02 F6C280              <1> 	test	dl, 80h			; IS THIS XOR FUNCTION
  5359 00002A05 7403                <1> 	jz	short S9		; NO, STORE IT IN AS IS
  5360 00002A07 663307              <1> 	xor	ax, [edi]		; DO FUNCTION WITH LOW/HIGH
  5361                              <1> S9:
  5362 00002A0A 668907              <1> 	mov	[edi], ax		; STORE FIRST BYTE HIGH, SECOND LOW
  5363 00002A0D AC                  <1> 	lodsb				; GET CODE POINT
  5364 00002A0E E89B000000          <1> 	call	S21
  5365 00002A13 6621D8              <1> 	and	ax, bx			; CONVERT TO COLOR
  5366 00002A16 86E0                <1> 	xchg	ah, al			; SWAP HIGH/LOW BYTES FOR WORD MOVE
  5367 00002A18 F6C280              <1> 	test	dl, 80h			; AGAIN, IS THIS XOR FUNCTION
  5368 00002A1B 7407                <1> 	jz	short _S10		; NO, JUST STORE THE VALUES
  5369 00002A1D 66338700200000      <1> 	xor	ax, [edi+2000h]		; FUNCTION WITH FIRST HALF LOW
  5370                              <1> _S10:
  5371 00002A24 66898700200000      <1> 	mov	[edi+2000h], ax		; STORE SECOND PORTION HIGH
  5372 00002A2B 6683C750            <1> 	add	di, 80			; POINT TO NEXT LOCATION
  5373 00002A2F FECE                <1> 	dec	dh
  5374 00002A31 75C4                <1> 	jnz	short S8		; KEEP GOING
  5375 00002A33 5E                  <1> 	pop	esi			; RECOVER CODE POINTER
  5376 00002A34 5F                  <1> 	pop	edi			; RECOVER REGEN POINTER
  5377 00002A35 47                  <1> 	inc	edi			; POINT TO NEXT CHAR POSITION
  5378 00002A36 47                  <1> 	inc	edi
  5379 00002A37 E2BA                <1> 	loop	S7			; MORE TO WRITE
  5380 00002A39 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 00002A3A E89E000000          <1> 	call	S26			; CONVERTED TO OFFSET IN REGEN
  5392 00002A3F 89C6                <1> 	mov	esi, eax		; SAVE IN SI
  5393 00002A41 81C600800B00        <1> 	add	esi, 0B8000h		; 01/07/2016
  5394 00002A47 83EC08              <1> 	sub	esp, 8			; ALLOCATE SPACE FOR THE READ CODE POINT
  5395 00002A4A 89E5                <1> 	mov	ebp, esp		; POINTER TO SAVE AREA
  5396                              <1> 
  5397                              <1> ;-----	DETERMINE GRAPHICS MODES
  5398 00002A4C B604                <1> 	mov	dh, 4			; number of passes ; 01/07/2016
  5399 00002A4E 803D[DE670000]06    <1> 	cmp	byte [CRT_MODE], 6
  5400 00002A55 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 00002A57 8A06                <1> 	mov	al, [esi] 		; GET FIRST BYTE
  5407 00002A59 884500              <1> 	mov	[ebp], al 		; SAVE IN STORAGE AREA
  5408 00002A5C 45                  <1> 	inc	ebp			; NEXT LOCATION
  5409 00002A5D 8A8600200000        <1> 	mov	al, [esi+2000h]		; GET LOWER REGION BYTE
  5410 00002A63 884500              <1> 	mov	[ebp], al 		; ADJUST AND STORE
  5411 00002A66 45                  <1> 	inc	ebp
  5412 00002A67 83C650              <1> 	add	esi, 80			; POINTER INTO REGEN
  5413 00002A6A FECE                <1> 	dec	dh			; LOOP CONTROL
  5414 00002A6C 75E9                <1> 	jnz	short S11		; DO IT SOME MORE
  5415 00002A6E 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 00002A70 D1E6                <1> 	sal	esi, 1
  5422                              <1> 	;mov	dh, 4			; NUMBER OF PASSES
  5423                              <1> S13:
  5424 00002A72 E84B000000          <1> 	call	S23			; GET BYTES FROM REGEN INTO SINGLE SAVE
  5425 00002A77 81C6FE1F0000        <1> 	add	esi, 2000h-2		; GO TO LOWER REGION
  5426 00002A7D E840000000          <1> 	call	S23			; GET THIS PAIR INTO SAVE
  5427 00002A82 81EEB21F0000        <1> 	sub	esi, 2000h-80+2		; ADJUST POINTER BACK INTO UPPER
  5428 00002A88 FECE                <1> 	dec	dh
  5429 00002A8A 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 00002A8C BF[84530100]        <1> 	mov	edi, CRT_CHAR_GEN	; ESTABLISH ADDRESSING
  5434 00002A91 83ED08              <1> 	sub	ebp, 8			; ADJUST POINTER TO START OF SAVE AREA
  5435 00002A94 89EE                <1> 	mov	esi, ebp
  5436                              <1> S15:
  5437                              <1> 	;mov	ax, 256			; NUMBER TO TEST AGAINST
  5438                              <1> 	; 03/08/2022
  5439 00002A96 29C0                <1> 	sub	eax, eax
  5440 00002A98 FEC4                <1> 	inc	ah
  5441                              <1> 	; eax = 256
  5442                              <1> S16:
  5443 00002A9A 56                  <1> 	push	esi			; SAVE SAVE AREA POINTER
  5444 00002A9B 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 00002A9C A7                  <1> 	cmpsd				; compare first 4 bytes 
  5448 00002A9D 7501                <1> 	jne	short S17		; 
  5449 00002A9F A7                  <1> 	cmpsd				; compare last 4 bytes
  5450                              <1> S17:
  5451 00002AA0 5F                  <1> 	pop	edi			; RECOVER THE POINTERS
  5452 00002AA1 5E                  <1> 	pop	esi
  5453                              <1> 	;jz	short S18		; IF ZERO FLAG SET, THEN MATCH OCCURRED
  5454 00002AA2 7406                <1> 	je	short S18
  5455                              <1> 	;				; NO MATCH, MOVE ON TO NEXT
  5456 00002AA4 83C708              <1> 	add	edi, 8			; NEXT CODE POINT
  5457                              <1> 	;dec	ax			; LOOP CONTROL
  5458                              <1> 	; 03/08/2022
  5459 00002AA7 48                  <1> 	dec	eax
  5460 00002AA8 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 00002AAA 83C408              <1> 	add	esp, 8			; READJUST THE STACK, THROW AWAY SAVE
  5465 00002AAD 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 00002AAE 51                  <1> 	push	ecx
  5481                              <1> 	;;mov	cx, 8			; SHIFT COUNT REGISTER FOR ONE BYTE
  5482                              <1> 	;mov	cl, 8
  5483 00002AAF B408                <1> 	mov	ah, 8
  5484                              <1> S22:
  5485 00002AB1 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 00002AB3 66D1D9              <1> 	rcr	cx, 1
  5490 00002AB6 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 00002AB9 FECC                <1> 	dec	ah
  5498 00002ABB 75F4                <1> 	jnz	short S22
  5499 00002ABD 6689C8              <1> 	mov	ax, cx
  5500                              <1> 	;pop	cx			; RECOVER REGISTER
  5501                              <1> 	; 12/04/2021
  5502 00002AC0 59                  <1> 	pop	ecx
  5503 00002AC1 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 00002AC2 66AD                <1> 	lodsw				; GET FIRST BYTE AND SECOND BYTES
  5522 00002AC4 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 00002AC6 29C9                <1> 	sub	ecx, ecx
  5526 00002AC8 B5C0                <1> 	mov	ch, 0C0h
  5527                              <1> 	; ecx = 0C000h
  5528                              <1> 	;mov	dl, 0			; RESULT REGISTER
  5529                              <1> 	; 03/08/2022
  5530 00002ACA 28D2                <1> 	sub	dl, dl
  5531                              <1> S24:
  5532                              <1> 	;test	ax, cx			; IS THIS SECTION BACKCROUND?
  5533                              <1>         ; 03/08/2022
  5534 00002ACC 85C8                <1> 	test	eax, ecx
  5535 00002ACE 7401                <1> 	jz	short S25               ; IF ZERO, IT IS BACKGROUND (CARRY=0)
  5536 00002AD0 F9                  <1> 	stc				; WASN'T, SO SET CARRY
  5537                              <1> S25:
  5538 00002AD1 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 00002AD3 C1E902              <1> 	shr	ecx, 2
  5542 00002AD6 73F4                <1> 	jnc	short S24		; DO IT AGAIN IF MASK DIDN'T FALL OUT
  5543 00002AD8 885500              <1> 	mov	[ebp], dl 		; STORE RESULT IN SAVE AREA
  5544 00002ADB 45                  <1> 	inc	ebp			; ADJUST POINTER
  5545 00002ADC 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 00002ADD 0FB705[0E7D0100]    <1> 	movzx	eax, word [CURSOR_POSN]	; GET CURRENT CURSOR
  5563                              <1> GRAPH_POSN:
  5564 00002AE4 53                  <1> 	push	ebx			; SAVE REGISTER
  5565 00002AE5 0FB6D8              <1> 	movzx	ebx, al			; SAVE A COPY OF CURRENT CURSOR
  5566 00002AE8 A0[E0670000]        <1> 	mov	al, [CRT_COLS]		; GET BYTES PER COLUMN
  5567 00002AED F6E4                <1> 	mul	ah			; MULTIPLY BY ROWS
  5568                              <1> 	;shl	ax, 2			; MULTIPLY * 4 SINCE 4 ROWS/BYTE
  5569                              <1> 	; 02/08/2022
  5570 00002AEF C1E002              <1> 	shl	eax, 2
  5571 00002AF2 01D8                <1> 	add	eax, ebx		; DETERMINE OFFSET
  5572 00002AF4 5B                  <1> 	pop	ebx			; RECOVER POINTER
  5573 00002AF5 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 00002AF6 803D[DE670000]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 00002AFD 7605                <1> 	jna	short M21
  5600 00002AFF 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 00002B04 66BAD903            <1> 	mov	dx, 3D9h
  5606 00002B08 A0[E1670000]        <1> 	mov	al, [CRT_PALETTE] 	; GET THE CURRENT PALETTE VALUE
  5607 00002B0D 08FF                <1> 	or	bh, bh			; IS THIS COLOR 0?
  5608 00002B0F 7512                <1> 	jnz	short M20		; OUTPUT COLOR 1
  5609                              <1> 
  5610                              <1> ;-----	HANDLE COLOR 0 BY SETTING THE BACKGROUND COLOR
  5611                              <1> 
  5612 00002B11 24E0                <1> 	and	al, 0E0h 		; TURN OFF LOW 5 BITS OF CURRENT
  5613 00002B13 80E31F              <1> 	and	bl, 01Fh 		; TURN OFF HIGH 3 BITS OF INPUT VALUE
  5614 00002B16 08D8                <1> 	or	al, bl			; PUT VALUE INTO REGISTER
  5615                              <1> M19:					; OUTPUT THE PALETTE
  5616 00002B18 EE                  <1> 	out	dx, al			; OUTPUT COLOR SELECTION TO 3D9 PORT
  5617 00002B19 A2[E1670000]        <1> 	mov	[CRT_PALETTE], al 	; SAVE THE COLOR VALUE
  5618 00002B1E 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 00002B23 24DF                <1> 	and	al, 0DFH 		; TURN OFF PALETTE SELECT BIT
  5624 00002B25 D0EB                <1> 	shr	bl, 1			; TEST THE LOW ORDER BIT OF BL
  5625 00002B27 73EF                <1> 	jnc	short M19		; ALREADY DONE
  5626 00002B29 0C20                <1> 	or	al, 20H			; TURN ON PALETTE SELECT BIT
  5627 00002B2B 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 00002B2D 8A25[DE670000]      <1> 	mov	ah,  [CRT_MODE]
  5653 00002B33 80FC07              <1> 	cmp	ah, 7 ; 6!?
  5654 00002B36 760A                <1> 	jna	short read_dot_cga
  5655                              <1> 
  5656 00002B38 E8B3030000          <1> 	call	vga_read_pixel
  5657                              <1> 	; al = pixel value
  5658                              <1> read_dot_retn:	; 03/08/2022
  5659 00002B3D E9F5EFFFFF          <1> 	jmp	_video_return
  5660                              <1> 
  5661                              <1> read_dot_cga:
  5662                              <1> 	;je	VIDEO_RETURN ; 7	
  5663 00002B42 80FC04              <1> 	cmp	ah, 4 ; graphics ? 
  5664                              <1> 	;jb	VIDEO_RETURN ; no, text mode, nothing to do
  5665                              <1> 	; 03/08/2022
  5666 00002B45 72F6                <1> 	jb	short read_dot_retn
  5667                              <1> 
  5668 00002B47 E84F000000          <1> 	call	R3			; DETERMINE BYTE POSITION OF DOT
  5669 00002B4C 8A06                <1> 	mov	al, [esi]		; GET THE BYTE
  5670 00002B4E 20E0                <1> 	and	al, ah			; MASK OFF THE OTHER BITS IN THE BYTE
  5671 00002B50 D2E0                <1> 	shl	al, cl			; LEFT JUSTIFY THE VALUE
  5672 00002B52 88F1                <1> 	mov	cl, dh			; GET NUMBER OF BITS IN RESULT
  5673 00002B54 D2C0                <1> 	rol	al, cl			; RIGHT JUSTIFY THE RESULT
  5674                              <1> 	;jmp	VIDEO_RETURN		; RETURN FROM VIDEO I/O
  5675 00002B56 0FB6C0              <1> 	movzx	eax, al
  5676 00002B59 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 00002B5E 8A25[DE670000]      <1> 	mov	ah, [CRT_MODE]
  5688 00002B64 80FC07              <1> 	cmp	ah, 7 ; 6!?
  5689 00002B67 760A                <1> 	jna	short write_dot_cga
  5690                              <1> 	
  5691 00002B69 E8F2020000          <1> 	call	vga_write_pixel
  5692                              <1> write_dot_retn:	; 03/08/2022
  5693 00002B6E E9BFEFFFFF          <1> 	jmp	VIDEO_RETURN
  5694                              <1> 
  5695                              <1> write_dot_cga:
  5696                              <1> 	;je	VIDEO_RETURN ; 7	
  5697 00002B73 80FC04              <1> 	cmp	ah, 4 ; graphics ? 
  5698                              <1> 	;jb	VIDEO_RETURN ; no, text mode, nothing to do
  5699                              <1> 	; 03/08/2022
  5700 00002B76 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 00002B78 50                  <1> 	push	eax
  5706 00002B79 E81D000000          <1> 	call	R3			; DETERMINE BYTE POSITION OF THE DOT
  5707 00002B7E D2E8                <1> 	shr	al, cl			; SHIFT TO SET UP THE BITS FOR OUTPUT
  5708 00002B80 20E0                <1> 	and	al, ah			; STRIP OFF THE OTHER BITS
  5709 00002B82 8A0E                <1> 	mov	cl, [esi]		; GET THE CURRENT BYTE
  5710                              <1> 	;pop	bx			; RECOVER XOR FLAG
  5711                              <1> 	; 12/04/2021
  5712 00002B84 5B                  <1> 	pop	ebx
  5713 00002B85 F6C380              <1> 	test	bl, 80h			; IS IT ON
  5714 00002B88 750D                <1> 	jnz	short R2		; YES, XOR THE DOT
  5715 00002B8A F6D4                <1> 	not	ah			; SET MASK TO REMOVE THE INDICATED BITS
  5716 00002B8C 20E1                <1> 	and	cl, ah
  5717 00002B8E 08C8                <1> 	or	al, cl			; OR IN THE NEW VALUE OF THOSE BITS
  5718                              <1> R1:					; FINISH_DOT
  5719 00002B90 8806                <1> 	mov	[esi], al		; RESTORE THE BYTE IN MEMORY
  5720                              <1> 	;;pop	AX
  5721 00002B92 E99BEFFFFF          <1> 	jmp	VIDEO_RETURN		; RETURN FROM VIDEO I/O
  5722                              <1> R2:					; XOR_DOT
  5723 00002B97 30C8                <1> 	xor	al, cl			; EXCLUSIVE OR THE DOTS
  5724 00002B99 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 00002B9B 0FB7F0              <1> 	movzx	esi, ax			; WILL SAVE AL AND AH DURING OPERATION
  5749 00002B9E B028                <1> 	mov	al, 40
  5750 00002BA0 F6E2                <1> 	mul	dl			; AX= ADDRESS OF START OF INDICATED ROW
  5751 00002BA2 A808                <1> 	test	al, 08H 		; TEST FOR EVEN/ODD ROW CALCULATED
  5752 00002BA4 7404                <1> 	JZ	short R4		; JUMP IF EVEN ROW
  5753 00002BA6 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 00002BAA 96                  <1> 	xchg	esi, eax
  5758 00002BAB 81C600800B00        <1> 	add	esi, 0B8000h
  5759                              <1> 	;mov	dx, cx			; COLUMN VALUE TO DX
  5760 00002BB1 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 00002BB4 66BBC002            <1> 	mov	bx, 2C0h
  5771 00002BB8 66B90203            <1> 	mov	cx, 302h 		; SET PARMS FOR MED RES
  5772 00002BBC 803D[DE670000]06    <1> 	cmp	byte [CRT_MODE], 6
  5773 00002BC3 7208                <1> 	jc	short R5		; HANDLE IF MED RES
  5774 00002BC5 66BB8001            <1> 	mov	bx, 180h
  5775 00002BC9 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 00002BCD 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 00002BCF D3EA                <1> 	shr	edx, cl
  5787 00002BD1 01D6                <1> 	add	esi, edx
  5788 00002BD3 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 00002BD5 28C9                <1> 	sub	cl, cl			; ZERO INTO STORAGE LOCATION
  5793                              <1> R6:
  5794 00002BD7 D0C8                <1> 	ror	al, 1			; LEFT JUSTIFY VALUE IN AL (FOR WRITE)
  5795 00002BD9 00E9                <1> 	add	cl, ch			; ADD IN THE BIT OFFSET VALUE
  5796 00002BDB FECF                <1> 	dec	bh			; LOOP CONTROL
  5797 00002BDD 75F8                <1> 	jnz	short R6		; ON EXIT, CL HAS COUNT TO RESTORE BITS
  5798 00002BDF 88DC                <1> 	mov	ah, bl			;  GET MASK TO AH
  5799 00002BE1 D2EC                <1> 	shr	ah, cl			;  MOVE THE MASK TO CORRECT LOCATION
  5800 00002BE3 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 00002BE4 66BAC803            <1> 	mov	dx, 3C8h  ; VGAREG_DAC_WRITE_ADDRESS
  5821 00002BE8 28C0                <1> 	sub	al, al ; 0
  5822 00002BEA 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 00002BEB FEC2                <1> 	inc	dl ; dx = 3C9h
  5826                              <1> 	;mov	ecx, 256   ; always 256*3 values
  5827                              <1> 	; 02/08/2022
  5828 00002BED 31C9                <1> 	xor	ecx, ecx
  5829 00002BEF FEC5                <1> 	inc	ch	
  5830                              <1> 	; ecx = 256
  5831                              <1> 
  5832                              <1> 	;push	esi
  5833 00002BF1 88E0                <1> 	mov	al, ah
  5834 00002BF3 B43F                <1> 	mov	ah, 3Fh	; 3Fh except DAC selection number 3
  5835 00002BF5 3C02                <1> 	cmp 	al, 2
  5836 00002BF7 7414                <1> 	je	short l_dac_p_2
  5837 00002BF9 7719                <1> 	ja	short l_dac_p_3
  5838 00002BFB 20C0                <1> 	and	al, al
  5839 00002BFD 7507                <1> 	jnz	short l_dac_p_1
  5840                              <1> l_dac_p_0:
  5841 00002BFF BE[444E0100]        <1> 	mov	esi, palette0
  5842 00002C04 EB15                <1> 	jmp	short l_dac_p_4	
  5843                              <1> l_dac_p_1:
  5844 00002C06 BE[044F0100]        <1> 	mov	esi, palette1
  5845 00002C0B EB0E                <1> 	jmp	short l_dac_p_4
  5846                              <1> l_dac_p_2:
  5847 00002C0D BE[C44F0100]        <1> 	mov	esi, palette2
  5848 00002C12 EB07                <1> 	jmp	short l_dac_p_4
  5849                              <1> l_dac_p_3:
  5850 00002C14 B4FF                <1> 	mov	ah, 0FFh ; dac registers
  5851 00002C16 BE[84500100]        <1> 	mov	esi, palette3
  5852                              <1> l_dac_p_4:
  5853 00002C1B AC                  <1> 	lodsb
  5854 00002C1C EE                  <1> 	out	dx, al  ; Red
  5855 00002C1D AC                  <1> 	lodsb
  5856 00002C1E EE                  <1> 	out	dx, al	; Green
  5857 00002C1F AC                  <1> 	lodsb
  5858 00002C20 EE                  <1> 	out	dx, al	; Blue
  5859 00002C21 20E4                <1> 	and	ah, ah
  5860 00002C23 7405                <1> 	jz	short l_dac_p_5	
  5861 00002C25 FECC                <1> 	dec	ah
  5862 00002C27 E2F2                <1> 	loop	l_dac_p_4
  5863                              <1> 	;pop	esi
  5864 00002C29 C3                  <1> 	retn
  5865                              <1> l_dac_p_5:
  5866                              <1> 	; 29/07/2016
  5867 00002C2A FEC9                <1> 	dec	cl
  5868 00002C2C 7407                <1> 	jz	short l_dac_p_7
  5869                              <1> 	;
  5870 00002C2E 28C0                <1> 	sub	al, al ; 0
  5871                              <1> l_dac_p_6:
  5872 00002C30 EE                  <1> 	out	dx, al ; outb(VGAREG_DAC_DATA,0);
  5873 00002C31 EE                  <1> 	out	dx, al
  5874 00002C32 EE                  <1> 	out	dx, al
  5875 00002C33 E2FB                <1> 	loop	l_dac_p_6
  5876                              <1> l_dac_p_7:
  5877                              <1> 	;pop	esi
  5878 00002C35 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 00002C36 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5900 00002C3A EC                  <1> 	in	al, dx
  5901 00002C3B 30C0                <1> 	xor	al, al ; 0
  5902                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  5903                              <1> 	; 03/08/2022
  5904 00002C3D B2C0                <1> 	mov	dl, 0C0h
  5905 00002C3F 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 00002C40 B2C7                <1> 	mov	dl, 0C7h
  5912 00002C42 88D8                <1> 	mov	al, bl
  5913 00002C44 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 00002C45 B2C9                <1> 	mov	dl, 0C9h
  5920 00002C47 EC                  <1> 	in	al, dx ; red
  5921 00002C48 B44D                <1> 	mov	ah, 77 ; 0.3* Red
  5922 00002C4A F6E4                <1> 	mul	ah
  5923                              <1> 	;push	ax
  5924                              <1> 	; 12/04/2021
  5925 00002C4C 50                  <1> 	push	eax
  5926 00002C4D EC                  <1> 	in	al, dx ; green
  5927 00002C4E B497                <1> 	mov	ah, 151  ; 0.59 * Green
  5928 00002C50 F6E4                <1> 	mul	ah
  5929                              <1> 	;push	ax
  5930                              <1> 	; 12/04/2021
  5931 00002C52 50                  <1> 	push	eax
  5932 00002C53 EC                  <1> 	in	al, dx ; blue
  5933 00002C54 B41C                <1> 	mov	ah, 28 ; 0.11 * Blue
  5934 00002C56 F6E4                <1> 	mul	ah
  5935                              <1> 	;pop	dx
  5936                              <1> 	; 12/04/2021
  5937 00002C58 5A                  <1> 	pop	edx
  5938 00002C59 6601D0              <1> 	add	ax, dx
  5939                              <1> 	;pop	dx
  5940                              <1> 	; 12/04/2021
  5941 00002C5C 5A                  <1> 	pop	edx
  5942 00002C5D 6601D0              <1> 	add	ax, dx
  5943 00002C60 66058000            <1> 	add	ax, 80h  
  5944 00002C64 B03F                <1> 	mov	al, 3Fh
  5945 00002C66 38C4                <1> 	cmp	ah, al	; if(i>0x3f)i=0x3f
  5946 00002C68 7602                <1> 	jna	short g_s_s_2
  5947 00002C6A 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 00002C6C B2C8                <1> 	mov	dl, 0C8h
  5952 00002C6E 88D8                <1> 	mov	al, bl ; color index
  5953 00002C70 EE                  <1> 	out	dx, al
  5954 00002C71 88E0                <1> 	mov	al, ah ; intensity
  5955                              <1> 	;inc	dx ; 3C9h ; VGAREG_DAC_DATA
  5956                              <1> 	; 03/08/2022
  5957 00002C73 FEC2                <1> 	inc	dl
  5958 00002C75 EE                  <1> 	out	dx, al ; R (R=G=B)
  5959 00002C76 88E0                <1> 	mov	al, ah ; intensity
  5960 00002C78 EE                  <1> 	out	dx, al ; G (R=G=B)
  5961 00002C79 88E0                <1>  	mov	al, ah ; intensity
  5962 00002C7B EE                  <1> 	out	dx, al ; B (R=G=B)
  5963                              <1> 	;dec	cx
  5964                              <1> 	; 03/08/2022
  5965 00002C7C 49                  <1> 	dec	ecx
  5966 00002C7D 7404                <1> 	jz	short g_s_s_3
  5967 00002C7F FEC3                <1> 	inc	bl    ; next color index value
  5968 00002C81 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 00002C83 B2DA                <1> 	mov	dl, 0DAh
  5973 00002C85 EC                  <1> 	in	al, dx
  5974 00002C86 B020                <1> 	mov	al, 20h
  5975                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  5976                              <1> 	; 03/08/2022
  5977 00002C88 B2C0                <1> 	mov	dl, 0C0h 
  5978 00002C8A EE                  <1> 	out	dx, al ; 20h -> set bit 5
  5979                              <1> 		        ; (after loading palette regs)
  5980 00002C8B 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 00002C8C 8A25[DE670000]      <1> 	mov 	ah, [CRT_MODE]
  6001 00002C92 668B15[0E7D0100]    <1> 	mov	dx, [CURSOR_POSN] ; cursor pos for page 0
  6002                              <1> 
  6003 00002C99 BE[FA670000]        <1> 	mov	esi, vga_modes
  6004 00002C9E 89F7                <1> 	mov	edi, esi
  6005 00002CA0 83C710              <1> 	add	edi, vga_mode_count
  6006                              <1> vga_wca_0:
  6007 00002CA3 AC                  <1> 	lodsb
  6008 00002CA4 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  6009 00002CA6 7405                <1> 	je	short vga_wca_2
  6010 00002CA8 39FE                <1> 	cmp	esi, edi
  6011 00002CAA 72F7                <1> 	jb	short vga_wca_0
  6012                              <1> vga_wca_1:
  6013 00002CAC C3                  <1> 	retn	; nothing to do
  6014                              <1> vga_wca_2:
  6015 00002CAD 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 00002CB0 803E04              <1> 	cmp	byte [esi], PLANAR4
  6021 00002CB3 741D                <1> 	je	short vga_wca_planar
  6022 00002CB5 803E03              <1> 	cmp	byte [esi], PLANAR1
  6023 00002CB8 7418                <1> 	je	short vga_wca_planar
  6024                              <1> vga_wca_linear8:
  6025                              <1> 	; while((count-->0) && (xcurs<nbcols))
  6026                              <1> 	; CX = count
  6027 00002CBA 6621C9              <1> 	and	cx, cx
  6028 00002CBD 74ED                <1> 	jz	short vga_wca_1
  6029 00002CBF 3A15[E0670000]      <1> 	cmp	dl, [CRT_COLS]
  6030 00002CC5 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 00002CC7 E81E000000          <1> 	call	write_gfx_char_lin	 
  6035 00002CCC 6649                <1> 	dec	cx ; count
  6036 00002CCE FEC2                <1> 	inc	dl ; xcurs
  6037 00002CD0 EBE8                <1> 	jmp	short vga_wca_linear8
  6038                              <1> vga_wca_planar:
  6039                              <1> 	; while((count-->0) && (xcurs<nbcols))
  6040                              <1> 	; CX = count
  6041 00002CD2 6621C9              <1> 	and	cx, cx
  6042 00002CD5 74D5                <1> 	jz	short vga_wca_1
  6043 00002CD7 3A15[E0670000]      <1> 	cmp	dl, [CRT_COLS]
  6044 00002CDD 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 00002CDF E8A7000000          <1> 	call	write_gfx_char_pl4
  6049 00002CE4 6649                <1> 	dec	cx ; count
  6050 00002CE6 FEC2                <1> 	inc	dl ; xcurs
  6051 00002CE8 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 00002CEA 51                  <1> 	push	ecx
  6074 00002CEB 53                  <1> 	push	ebx
  6075 00002CEC 52                  <1> 	push	edx
  6076 00002CED 50                  <1> 	push	eax
  6077                              <1> 	; addr=xcurs*8+ycurs*nbcols*64;
  6078                              <1> 	; 08/08/2016
  6079 00002CEE 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 00002CF1 A0[E0670000]        <1> 	mov	al, [CRT_COLS]
  6085 00002CF6 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 00002CF8 C1E003              <1> 	shl	eax, 3
  6090                              <1> 	;sub	dh, dh
  6091                              <1> 	;shl	dx, 3 ; xcurs * 8
  6092                              <1> 	;movzx	edi, dx
  6093 00002CFB BF00000A00          <1> 	mov	edi, 0A0000h
  6094 00002D00 30F6                <1> 	xor	dh, dh
  6095 00002D02 6689D7              <1> 	mov	di, dx
  6096                              <1> 	;movzx	edi, dl
  6097 00002D05 66C1E703            <1> 	shl	di, 3 ; xcurs * 8
  6098                              <1> 	;xor	dh, dh
  6099 00002D09 8A15[E2670000]      <1> 	mov	dl, [CHAR_HEIGHT]
  6100 00002D0F 66F7E2              <1> 	mul	dx
  6101                              <1> 	; eax = ycurs*nbcols*8*[CHAR_HEIGHT]
  6102                              <1> 	;add	edi, eax ; addr
  6103                              <1> 	;add	edi, 0A0000h
  6104 00002D12 6601C7              <1> 	add	di, ax
  6105                              <1> 	;shl	si, 3 ; car * 8
  6106 00002D15 30E4                <1> 	xor	ah, ah
  6107 00002D17 A0[E2670000]        <1> 	mov	al, [CHAR_HEIGHT]
  6108 00002D1C 66F7E6              <1> 	mul	si
  6109 00002D1F 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 00002D22 A1[A2890100]        <1> 	mov	eax, [VGA_INT43H]
  6116 00002D27 09C0                <1> 	or	eax, eax ; 0 ?
  6117 00002D29 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 00002D2B 01C6                <1> 	add	esi, eax
  6130                              <1> wgfxl_1:
  6131 00002D2D 28FF                <1> 	sub	bh, bh ; i = 0
  6132                              <1> wgfxl_2:
  6133                              <1> 	; for(i=0;i<8;i++)
  6134 00002D2F 57                  <1> 	push	edi ; addr
  6135 00002D30 0FB605[E0670000]    <1> 	movzx	eax, byte [CRT_COLS] ; nbcols
  6136 00002D37 F6E7                <1> 	mul	bh ; nbcols*i
  6137                              <1> 	;shl	ax, 3 ; i*nbcols*8
  6138                              <1>  	; 02/08/2022
  6139 00002D39 C1E003              <1> 	shl	eax, 3
  6140                              <1> 	; dest=addr+i*nbcols*8;
  6141 00002D3C 01C7                <1> 	add	edi, eax ; dest + j ; j = 0
  6142 00002D3E B180                <1> 	mov	cl, 80h ; mask = 0x80;
  6143                              <1> 	; esi = fdata + src + i
  6144                              <1> 	; for(j=0;j<8;j++)
  6145 00002D40 29D2                <1> 	sub	edx, edx ; j = 0
  6146                              <1> wgfxl_3:
  6147 00002D42 8A06                <1> 	mov	al, [esi] ; al = fdata[src+i]
  6148 00002D44 20C8                <1> 	and	al, cl ; if (fdata[src+i] & mask)
  6149 00002D46 7402                <1> 	jz	short wgfxl_4  ; data = 0, zf = 1
  6150 00002D48 88D8                <1> 	mov	al, bl ; data = attr;
  6151                              <1> wgfxl_4:
  6152                              <1> 	; write_byte(0xa000,dest+j,data);		
  6153 00002D4A AA                  <1> 	stosb  ; dest + j (+ 0A0000h)
  6154                              <1> 	;inc	dl ; j++
  6155                              <1> 	;cmp	dl, 8
  6156 00002D4B 80FA07              <1> 	cmp	dl, 7
  6157 00002D4E 720E                <1> 	jb	short wgfxl_5
  6158 00002D50 5F                  <1> 	pop	edi
  6159                              <1> 	; 08/08/2016
  6160                              <1> 	;cmp	bh, 7
  6161                              <1> 	;jnb	short wgfxl_6
  6162 00002D51 FEC7                <1> 	inc	bh ; i++
  6163 00002D53 3A3D[E2670000]      <1> 	cmp	bh, [CHAR_HEIGHT]
  6164 00002D59 7309                <1> 	jnb	short wgfxl_6
  6165 00002D5B 46                  <1> 	inc	esi
  6166 00002D5C EBD1                <1> 	jmp	short wgfxl_2
  6167                              <1> wgfxl_5:
  6168 00002D5E D0E9                <1> 	shr	cl, 1 ; mask >>= 1;
  6169 00002D60 FEC2                <1> 	inc	dl ; j++
  6170 00002D62 EBDE                <1>         jmp     short wgfxl_3
  6171                              <1> wgfxl_6:
  6172 00002D64 58                  <1> 	pop	eax
  6173 00002D65 5A                  <1> 	pop	edx
  6174 00002D66 5B                  <1> 	pop	ebx
  6175 00002D67 59                  <1> 	pop	ecx
  6176 00002D68 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 00002D69 A0[E2670000]        <1> 	mov	al, [CHAR_HEIGHT]
  6182 00002D6E 3C08                <1> 	cmp	al, 8
  6183 00002D70 7507                <1> 	jne	short wfxl_8
  6184 00002D72 B8[84530100]        <1> 	mov	eax, vgafont8
  6185 00002D77 EBB2                <1> 	jmp	short wgfxl_0
  6186                              <1> wfxl_8:
  6187 00002D79 3C0E                <1> 	cmp	al, 14
  6188 00002D7B 7507                <1> 	jne	short wfxl_9
  6189 00002D7D B8[845B0100]        <1> 	mov	eax, vgafont14
  6190 00002D82 EBA7                <1> 	jmp	short wgfxl_0
  6191                              <1> wfxl_9:
  6192 00002D84 B8[84690100]        <1> 	mov	eax, vgafont16
  6193 00002D89 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 00002D8B 51                  <1> 	push	ecx
  6213 00002D8C 53                  <1> 	push	ebx
  6214 00002D8D 52                  <1> 	push	edx
  6215 00002D8E 50                  <1> 	push	eax
  6216                              <1> wgfxpl_f0:
  6217                              <1> 	; switch(cheight)
  6218 00002D8F 8A25[E2670000]      <1> 	mov	ah, [CHAR_HEIGHT]
  6219 00002D95 80FC10              <1> 	cmp	ah, 16 ; case 16:
  6220 00002D98 7507                <1> 	jne	short wgfxpl_f1
  6221                              <1> 	; fdata = &vgafont16;
  6222 00002D9A BE[84690100]        <1> 	mov	esi, vgafont16
  6223 00002D9F EB13                <1> 	jmp	short wgfxpl_f3
  6224                              <1> wgfxpl_f1:
  6225 00002DA1 80FC0E              <1> 	cmp	ah, 14 ; case 14:
  6226 00002DA4 7507                <1> 	jne	short wgfxpl_f2
  6227 00002DA6 BE[845B0100]        <1> 	mov	esi, vgafont14
  6228 00002DAB EB07                <1> 	jmp	short wgfxpl_f3
  6229                              <1> wgfxpl_f2:
  6230                              <1> 	; default:
  6231                              <1> 	;  fdata = &vgafont8;
  6232 00002DAD BE[84530100]        <1> 	mov	esi, vgafont8
  6233 00002DB2 B408                <1> 	mov	ah, 8	
  6234                              <1> wgfxpl_f3:
  6235                              <1> 	; al = car
  6236 00002DB4 F6E4                <1> 	mul	ah ; ah = cheight
  6237 00002DB6 25FFFF0000          <1> 	and	eax, 0FFFFh ; car * cheight
  6238                              <1> 	; src = car * cheight;
  6239 00002DBB 01C6                <1> 	add	esi, eax ; esi = fdata[src+i]
  6240                              <1> 	; addr=xcurs*8+ycurs*nbcols*64;
  6241 00002DBD 88F0                <1> 	mov	al, dh ; ycurs
  6242 00002DBF 8A25[E0670000]      <1> 	mov	ah, [CRT_COLS] ; nbcols
  6243 00002DC5 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 00002DC7 C1E003              <1> 	shl	eax, 3
  6249                              <1> 	;sub	dh, dh ; 0
  6250                              <1> 	;shl	dx, 3 ; xcurs * 8
  6251                              <1> 	;movzx	edi, dx
  6252 00002DCA 0FB6FA              <1> 	movzx	edi, dl
  6253                              <1> 	;shl	di, 3 ; xcurs * 8
  6254                              <1> 	; 02/08/2022
  6255 00002DCD C1E703              <1> 	shl	edi, 3
  6256 00002DD0 30F6                <1> 	xor	dh, dh
  6257 00002DD2 8A15[E2670000]      <1> 	mov	dl, [CHAR_HEIGHT]
  6258 00002DD8 66F7E2              <1> 	mul	dx
  6259                              <1> 	; eax = ycurs*nbcols*8*[CHAR_HEIGHT]
  6260 00002DDB 01C7                <1> 	add	edi, eax ; addr
  6261 00002DDD 81C700000A00        <1> 	add	edi, 0A0000h
  6262                              <1> 	;
  6263                              <1> 	; outw(VGAREG_SEQU_ADDRESS, 0x0f02);
  6264                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0205);
  6265 00002DE3 66BAC403            <1> 	mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  6266 00002DE7 66B8020F            <1> 	mov	ax, 0F02h
  6267 00002DEB 66EF                <1> 	out	dx, ax
  6268 00002DED 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  6269 00002DF1 66B80502            <1> 	mov	ax, 0205h
  6270 00002DF5 66EF                <1> 	out	dx, ax
  6271                              <1> 	;
  6272 00002DF7 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  6273 00002DFB F6C380              <1> 	test	bl, 80h ; if(attr&0x80)
  6274 00002DFE 7406                <1> 	jz	short wgfxpl_f4 ; else
  6275                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x1803);
  6276 00002E00 66B80318            <1> 	mov	ax, 1803h
  6277 00002E04 EB04                <1> 	jmp	short wgfxpl_f5
  6278                              <1> wgfxpl_f4:
  6279                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0003);
  6280 00002E06 66B80300            <1> 	mov	ax, 0003h	
  6281                              <1> wgfxpl_f5:
  6282 00002E0A 66EF                <1> 	out	dx, ax
  6283                              <1> 	;	
  6284 00002E0C 28FF                <1> 	sub	bh, bh ; i = 0
  6285                              <1> wgfxpl_0:
  6286                              <1> 	; for(i=0;i<cheight;i++)
  6287 00002E0E 57                  <1> 	push	edi ; addr
  6288 00002E0F 0FB605[E0670000]    <1> 	movzx	eax, byte [CRT_COLS] ; nbcols
  6289 00002E16 F6E7                <1> 	mul	bh ; nbcols*i
  6290                              <1> 	; dest=addr+i*nbcols
  6291 00002E18 01C7                <1> 	add	edi, eax ; dest
  6292 00002E1A B580                <1> 	mov	ch, 80h ; mask = 0x80;
  6293                              <1> 	; for(j=0;j<8;j++)
  6294 00002E1C 28C9                <1> 	sub	cl, cl ; j = 0
  6295                              <1> wgfxpl_1:
  6296 00002E1E 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 00002E20 88EC                <1> 	mov	ah, ch
  6302 00002E22 B008                <1> 	mov	al, 8
  6303 00002E24 66EF                <1> 	out	dx, ax
  6304 00002E26 8A07                <1> 	mov	al, [edi] ; ? (io delay?)
  6305                              <1> 	;
  6306 00002E28 28C0                <1> 	sub	al, al ; attr = 0
  6307                              <1> 	; if (fdata[src+i] & mask)
  6308 00002E2A 842E                <1> 	test	byte [esi], ch
  6309 00002E2C 7404                <1> 	jz	short wgfxpl_2  ; zf = 1
  6310                              <1> 	; write_byte(0xa000,dest,attr&0x0f);
  6311 00002E2E 88D8                <1> 	mov	al, bl ; attr;
  6312 00002E30 240F                <1> 	and	al, 0Fh	; attr&0x0f
  6313                              <1> wgfxpl_2:
  6314                              <1> 	; write_byte(0xa000,dest,0x00);		
  6315 00002E32 8807                <1> 	mov	[edi], al ; dest (+ 0A0000h)
  6316 00002E34 FEC1                <1> 	inc	cl ; j++
  6317 00002E36 80F908              <1> 	cmp	cl, 8
  6318 00002E39 72E3                <1> 	jb	short wgfxpl_1
  6319 00002E3B 5F                  <1> 	pop	edi
  6320                              <1> 	; 08/08/2016
  6321                              <1> 	;cmp	bh, 7
  6322                              <1> 	;jnb	short wgfxpl_3
  6323 00002E3C FEC7                <1> 	inc	bh ; i++
  6324 00002E3E 3A3D[E2670000]      <1> 	cmp	bh, [CHAR_HEIGHT]
  6325 00002E44 7303                <1> 	jnb	short wgfxpl_3
  6326 00002E46 46                  <1> 	inc	esi
  6327 00002E47 EBC5                <1> 	jmp	short wgfxpl_0
  6328                              <1> wgfxpl_3:
  6329                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  6330 00002E49 66B808FF            <1>   	mov	ax, 0FF08h
  6331 00002E4D 66EF                <1> 	out	dx, ax
  6332 00002E4F 66B80500            <1> 	mov	ax, 0005h
  6333 00002E53 66EF                <1> 	out	dx, ax
  6334 00002E55 66B80300            <1> 	mov	ax, 0003h
  6335 00002E59 66EF                <1> 	out	dx, ax
  6336                              <1> 	;
  6337 00002E5B 58                  <1> 	pop	eax
  6338 00002E5C 5A                  <1> 	pop	edx
  6339 00002E5D 5B                  <1> 	pop	ebx
  6340 00002E5E 59                  <1> 	pop	ecx
  6341 00002E5F 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 00002E60 88C3                <1> 	mov	bl, al ; pixel value
  6361                              <1> 	;mov 	ah, [CRT_MODE]
  6362 00002E62 BE[FA670000]        <1> 	mov	esi, vga_modes
  6363 00002E67 89F7                <1> 	mov	edi, esi
  6364 00002E69 83C710              <1> 	add	edi, vga_mode_count
  6365                              <1> vga_wp_0:
  6366 00002E6C AC                  <1> 	lodsb
  6367 00002E6D 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  6368 00002E6F 7405                <1> 	je	short vga_wp_1
  6369 00002E71 39FE                <1> 	cmp	esi, edi
  6370 00002E73 72F7                <1> 	jb	short vga_wp_0
  6371 00002E75 C3                  <1> 	retn	; nothing to do
  6372                              <1> vga_wp_1:
  6373 00002E76 83C64F              <1> 	add	esi, vga_memmodel - (vga_modes + 1)  
  6374                              <1> 	; [ESI] = VGA memory model number (LINEAR8, PLANAR4, PLANAR1)
  6375 00002E79 BF00000A00          <1> 	mov	edi, 0A0000h
  6376                              <1> 	;
  6377 00002E7E 803E04              <1> 	cmp	byte [esi], PLANAR4
  6378 00002E81 741C                <1> 	je	short vga_wp_planar
  6379 00002E83 803E03              <1> 	cmp	byte [esi], PLANAR1
  6380 00002E86 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 00002E88 0FB605[E0670000]    <1> 	movzx	eax, byte [CRT_COLS] ; = [VGA_COLS] ; nbcols
  6384                              <1>      	;shl	ax, 3 ; * 8
  6385                              <1> 	; 02/08/2022
  6386 00002E8F C1E003              <1> 	shl	eax, 3
  6387 00002E92 66F7E2              <1> 	mul	dx
  6388 00002E95 50                  <1> 	push	eax
  6389                              <1> 	;mov	edi, 0A0000h
  6390 00002E96 6601CF              <1> 	add	di, cx
  6391 00002E99 58                  <1> 	pop	eax
  6392 00002E9A 01C7                <1> 	add	edi, eax ; addr
  6393                              <1> 	; write_byte(0xa000,addr,AL);
  6394 00002E9C 881F                <1> 	mov	[edi], bl
  6395 00002E9E C3                  <1> 	retn    
  6396                              <1> vga_wp_planar:
  6397                              <1> 	; addr = CX/8+DX*read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS);
  6398 00002E9F 0FB7C1              <1> 	movzx	eax, cx
  6399 00002EA2 66C1E803            <1> 	shr	ax, 3 ; CX/8
  6400 00002EA6 50                  <1> 	push	eax
  6401 00002EA7 28E4                <1> 	sub	ah, ah ; 0
  6402 00002EA9 A0[E0670000]        <1> 	mov	al, [CRT_COLS] ; = [VGA_COLS] ; nbcols
  6403 00002EAE 66F7E2              <1> 	mul	dx
  6404                              <1> 	;mov	edi, 0A0000h
  6405 00002EB1 6601C7              <1>         add     di, ax
  6406 00002EB4 58                  <1> 	pop	eax
  6407 00002EB5 01C7                <1> 	add	edi, eax ; addr
  6408 00002EB7 80E107              <1> 	and	cl, 7
  6409 00002EBA B580                <1> 	mov	ch, 80h ; mask
  6410 00002EBC D2ED                <1> 	shr	ch, cl 	; mask = 0x80 >> (CX & 0x07);
  6411                              <1> 	
  6412                              <1> 	; outw(VGAREG_GRDC_ADDRESS, (mask << 8) | 0x08);
  6413 00002EBE 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  6414 00002EC2 88EC                <1> 	mov	ah, ch
  6415 00002EC4 B008                <1> 	mov	al, 8
  6416 00002EC6 66EF                <1> 	out	dx, ax
  6417                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0205);
  6418 00002EC8 66B80502            <1> 	mov	ax, 0205h
  6419 00002ECC 66EF                <1> 	out	dx, ax
  6420                              <1> 	; data = read_byte(0xa000,addr);
  6421 00002ECE 8A07                <1> 	mov	al, [edi] ; (delay?)	
  6422                              <1> 	; if (AL & 0x80)
  6423                              <1> 	; {
  6424                              <1> 	;  outw(VGAREG_GRDC_ADDRESS, 0x1803);
  6425                              <1> 	; }
  6426 00002ED0 F6C380              <1> 	test	bl, 80h
  6427 00002ED3 7406                <1> 	jz	short vga_wp_2
  6428 00002ED5 66B80318            <1> 	mov	ax, 1803h
  6429 00002ED9 66EF                <1> 	out	dx, ax
  6430                              <1> vga_wp_2:	
  6431                              <1> 	; write_byte(0xa000,addr,AL);
  6432 00002EDB 881F                <1> 	mov	[edi], bl
  6433                              <1> 	;
  6434                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  6435 00002EDD 66B808FF            <1>   	mov	ax, 0FF08h
  6436 00002EE1 66EF                <1> 	out	dx, ax
  6437 00002EE3 66B80500            <1> 	mov	ax, 0005h
  6438 00002EE7 66EF                <1> 	out	dx, ax
  6439 00002EE9 66B80300            <1> 	mov	ax, 0003h
  6440 00002EED 66EF                <1> 	out	dx, ax
  6441                              <1> 	;
  6442 00002EEF 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 00002EF0 BE[FA670000]        <1> 	mov	esi, vga_modes
  6462 00002EF5 89F7                <1> 	mov	edi, esi
  6463 00002EF7 83C710              <1> 	add	edi, vga_mode_count
  6464                              <1> vga_rp_0:
  6465 00002EFA AC                  <1> 	lodsb
  6466 00002EFB 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  6467 00002EFD 7405                <1> 	je	short vga_rp_1
  6468 00002EFF 39FE                <1> 	cmp	esi, edi
  6469 00002F01 72F7                <1> 	jb	short vga_rp_0
  6470 00002F03 C3                  <1> 	retn	; nothing to do
  6471                              <1> vga_rp_1:
  6472 00002F04 83C64F              <1> 	add	esi, vga_memmodel - (vga_modes + 1)  
  6473                              <1> 	; [ESI] = VGA memory model number (LINEAR8, PLANAR4, PLANAR1)
  6474 00002F07 BF00000A00          <1> 	mov	edi, 0A0000h
  6475                              <1> 	;
  6476 00002F0C 803E04              <1> 	cmp	byte [esi], PLANAR4
  6477 00002F0F 741C                <1> 	je	short vga_rp_planar
  6478 00002F11 803E03              <1> 	cmp	byte [esi], PLANAR1
  6479 00002F14 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 00002F16 0FB605[E0670000]    <1> 	movzx	eax, byte [CRT_COLS] ; = [VGA_COLS] ; nbcols
  6483                              <1>      	;shl	ax, 3 ; * 8
  6484                              <1> 	; 02/08/2022
  6485 00002F1D C1E003              <1> 	shl	eax, 3
  6486 00002F20 66F7E2              <1> 	mul	dx
  6487 00002F23 50                  <1> 	push	eax
  6488                              <1> 	;mov	edi, 0A0000h
  6489 00002F24 6601CF              <1> 	add	di, cx
  6490 00002F27 58                  <1> 	pop	eax
  6491 00002F28 01C7                <1> 	add	edi, eax ; addr
  6492                              <1> 	; attr=read_byte(0xa000,addr);
  6493 00002F2A 8A07                <1> 	mov	al, [edi] ; pixel value
  6494 00002F2C C3                  <1> 	retn    
  6495                              <1> vga_rp_planar:
  6496                              <1> 	; addr = CX/8+DX*read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS);
  6497 00002F2D 0FB7C1              <1> 	movzx	eax, cx
  6498 00002F30 66C1E803            <1> 	shr	ax, 3 ; CX/8
  6499 00002F34 50                  <1> 	push	eax
  6500 00002F35 28E4                <1> 	sub	ah, ah ; 0
  6501 00002F37 A0[E0670000]        <1> 	mov	al, [CRT_COLS] ; = [VGA_COLS] ; nbcols
  6502 00002F3C 66F7E2              <1> 	mul	dx
  6503                              <1> 	;mov	edi, 0A0000h
  6504 00002F3F 6601C7              <1>         add     di, ax
  6505 00002F42 58                  <1> 	pop	eax
  6506 00002F43 01C7                <1> 	add	edi, eax ; addr
  6507 00002F45 80E107              <1> 	and	cl, 7
  6508 00002F48 B580                <1> 	mov	ch, 80h ; mask
  6509 00002F4A D2ED                <1> 	shr	ch, cl 	; mask = 0x80 >> (CX & 0x07);
  6510                              <1> 	; attr = 0x00;
  6511 00002F4C 30DB                <1> 	xor	bl, bl ; attr = bl = 0, 
  6512 00002F4E 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 00002F50 88CC                <1> 	mov	ah, cl ; i << 8
  6521 00002F52 B004                <1> 	mov	al, 4  ; | 0x04
  6522 00002F54 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  6523 00002F58 66EF                <1> 	out	dx, ax
  6524                              <1> 	; data = read_byte(0xa000,addr) & mask;
  6525 00002F5A 8A07                <1> 	mov	al, [edi]
  6526 00002F5C 20E8                <1> 	and	al, ch ; & mask
  6527                              <1> 	; if (data > 0) attr |= (0x01 << i);
  6528 00002F5E 08C0                <1> 	or	al, al
  6529 00002F60 7408                <1> 	jz	short vga_rp_3 ; al = 0 
  6530 00002F62 B701                <1> 	mov	bh, 1
  6531 00002F64 D2E7                <1> 	shl	bh, cl ; (0x01 << i)
  6532 00002F66 08FB                <1> 	or	bl, bh ; attr |= (0x01 << i)
  6533 00002F68 88D8                <1> 	mov	al, bl ; pixel value	
  6534                              <1> vga_rp_3:	
  6535 00002F6A C3                  <1> 	retn
  6536                              <1> 
  6537                              <1> vga_beeper:
  6538                              <1> 	; 04/08/2016  (TRDOS 386 = TRDOS v2.0)
  6539 00002F6B FB                  <1> 	sti
  6540                              <1> 	;mov	bh, [ACTIVE_PAGE]
  6541 00002F6C 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 00002F71 8A25[DE670000]      <1> 	mov 	ah, [CRT_MODE]
  6573 00002F77 88C7                <1> 	mov	bh, al ; character
  6574 00002F79 668B15[0E7D0100]    <1> 	mov	dx, [CURSOR_POSN] ; cursor pos for page 0
  6575                              <1> 
  6576 00002F80 BE[02680000]        <1> 	mov	esi, vga_g_modes
  6577 00002F85 89F7                <1> 	mov	edi, esi
  6578 00002F87 83C708              <1> 	add	edi, vga_g_mode_count
  6579                              <1> vga_wtty_0:
  6580 00002F8A AC                  <1> 	lodsb
  6581 00002F8B 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  6582 00002F8D 7405                <1> 	je	short vga_wtty_2
  6583 00002F8F 39FE                <1> 	cmp	esi, edi
  6584 00002F91 72F7                <1> 	jb	short vga_wtty_0
  6585                              <1> vga_wtty_1:
  6586 00002F93 C3                  <1> 	retn	; nothing to do
  6587                              <1> vga_wtty_2:
  6588 00002F94 80FF07              <1> 	cmp	bh, 07h ; bell (beep)
  6589 00002F97 74D2                <1> 	je	short vga_beeper  ; u11
  6590 00002F99 80FF08              <1> 	cmp	bh, 08h ; backspace
  6591 00002F9C 7508                <1> 	jne	short vga_wtty_3
  6592                              <1> 	; if(xcurs>0)xcurs--;
  6593 00002F9E 08D2                <1> 	or	dl, dl ; xcurs (column)
  6594 00002FA0 74F1                <1> 	jz	short vga_wtty_1
  6595 00002FA2 FECA                <1> 	dec	dl ; xcurs--;
  6596 00002FA4 EB55                <1>         jmp     short vga_wtty_12 
  6597                              <1> vga_wtty_3:			
  6598 00002FA6 80FF0D              <1> 	cmp	bh, 0Dh ; carriage return (\r)
  6599 00002FA9 7504                <1> 	jne	short vga_wtty_4
  6600                              <1> 	; xcurs=0;
  6601 00002FAB 28D2                <1> 	sub	dl, dl ; 0
  6602 00002FAD EB4C                <1>         jmp     short vga_wtty_12 
  6603                              <1> vga_wtty_4:	
  6604 00002FAF 80FF0A              <1> 	cmp	bh, 0Ah ; new line (\n)
  6605 00002FB2 7504                <1> 	jne	short vga_wtty_5
  6606                              <1> 	; ycurs++;
  6607 00002FB4 FEC6                <1> 	inc	dh ; next row
  6608 00002FB6 EB5E                <1>         jmp     short vga_wtty_11
  6609                              <1> vga_wtty_5:
  6610 00002FB8 80FF09              <1> 	cmp 	bh, 09h ; tab stop
  6611 00002FBB 7523                <1> 	jne	short vga_wtty_8
  6612 00002FBD 88D0                <1> 	mov	al, dl
  6613                              <1> 	;cbw
  6614 00002FBF 30E4                <1> 	xor	ah, ah ; 09/12/2017
  6615 00002FC1 B108                <1> 	mov	cl, 8
  6616 00002FC3 F6F1                <1> 	div	cl
  6617 00002FC5 28E1                <1> 	sub	cl, ah
  6618                              <1> 	;
  6619 00002FC7 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 00002FC9 51                  <1> 	push	ecx
  6625 00002FCA 53                  <1> 	push	ebx
  6626 00002FCB E810000000          <1> 	call	vga_wtty_8
  6627                              <1> 	;pop	bx  ; bh = character, bl = color
  6628                              <1> 	;pop	cx
  6629                              <1> 	; 12/04/2021
  6630 00002FD0 5B                  <1> 	pop	ebx  ; bh = character, bl = color
  6631 00002FD1 59                  <1> 	pop	ecx
  6632 00002FD2 FEC9                <1> 	dec	cl
  6633 00002FD4 7409                <1> 	jz	short vga_wtty_7
  6634 00002FD6 668B15[0E7D0100]    <1> 	mov	dx, [CURSOR_POSN] ; new cursor position (pg 0)
  6635 00002FDD EBEA                <1> 	jmp	short vga_wtty_6
  6636                              <1> vga_wtty_7:
  6637 00002FDF C3                  <1> 	retn
  6638                              <1> 	;
  6639                              <1> vga_wtty_8:
  6640 00002FE0 83C64F              <1> 	add	esi, vga_g_memmodel - (vga_g_modes + 1)  
  6641                              <1> 	; [ESI] = VGA memory model number (LINEAR8, PLANAR4, PLANAR1)
  6642 00002FE3 BF00000A00          <1> 	mov	edi, 0A0000h
  6643                              <1> 	;
  6644 00002FE8 88F8                <1> 	mov	al, bh ; character
  6645                              <1> 	;
  6646 00002FEA 803E04              <1> 	cmp	byte [esi], PLANAR4
  6647 00002FED 7414                <1> 	je	short vga_wtty_planar
  6648 00002FEF 803E03              <1> 	cmp	byte [esi], PLANAR1
  6649 00002FF2 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 00002FF4 E8F1FCFFFF          <1> 	call	write_gfx_char_lin
  6655 00002FF9 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 00002FFB 668915[0E7D0100]    <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 00003002 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 00003003 E883FDFFFF          <1> 	call	write_gfx_char_pl4
  6678                              <1> vga_wtty_9:
  6679 00003008 FEC2                <1> 	inc	dl ; xcurs++;
  6680                              <1> vga_wtty_10:
  6681                              <1> 	; Do we need to wrap ?
  6682                              <1> 	; if(xcurs==nbcols)
  6683 0000300A 3A15[E0670000]      <1> 	cmp	dl, [CRT_COLS] ; [VGA_COLS]
  6684 00003010 7204                <1> 	jb	short vga_wtty_11 ; no
  6685 00003012 28D2                <1> 	sub	dl, dl ; xcurs=0;
  6686 00003014 FEC6                <1> 	inc	dh ;  ycurs++;
  6687                              <1> vga_wtty_11:
  6688                              <1> 	; Do we need to scroll ?
  6689                              <1> 	; if(ycurs==nbrows)
  6690 00003016 3A35[E6670000]      <1> 	cmp	dh, [VGA_ROWS]
  6691 0000301C 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 0000301E B001                <1> 	mov	al, 1
  6699 00003020 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 00003022 29C9                <1> 	sub	ecx, ecx
  6703                              <1> 
  6704                              <1> 	; 06/08/2016
  6705 00003024 8A35[E6670000]      <1> 	mov	dh, [VGA_ROWS]
  6706 0000302A FECE                <1> 	dec	dh ; nbrows -1
  6707                              <1> 
  6708                              <1> 	;push	dx ; 04/08/2016
  6709                              <1> 	; 12/04/2021
  6710 0000302C 52                  <1> 	push	edx
  6711 0000302D 8A15[E0670000]      <1> 	mov	dl, [CRT_COLS]
  6712 00003033 FECA                <1> 	dec	dl ; nbcols -1
  6713                              <1> 	
  6714 00003035 8A25[DE670000]      <1> 	mov	ah, [CRT_MODE]
  6715                              <1> 	
  6716                              <1> 	; biosfn_scroll(0x01,0x00,0,0,nbrows-1,nbcols-1,page,SCROLL_UP);
  6717 0000303B E843F5FFFF          <1> 	call	vga_graphics_up
  6718                              <1> 	; 04/08/2016
  6719                              <1> 	;pop	dx
  6720                              <1> 	; 12/04/2021
  6721 00003040 5A                  <1> 	pop	edx
  6722                              <1> 
  6723                              <1> 	;dec	dh ; ycurs-=1
  6724 00003041 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 00003043 08C0                <1> 	or	al, al ; 0
  6756 00003045 7404                <1> 	jz	short font_setup_0
  6757 00003047 3C10                <1> 	cmp	al, 10h
  6758 00003049 7511                <1> 	jne	short font_setup_1	
  6759                              <1> font_setup_0:
  6760 0000304B E8CE000000          <1> 	call	transfer_user_fonts
  6761 00003050 721C                <1> 	jc	short font_setup_error
  6762 00003052 E8AD010000          <1> 	call	load_text_user_pat
  6763 00003057 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 0000305C 3C01                <1> 	cmp	al, 1
  6771 0000305E 7404                <1> 	je	short font_setup_2
  6772 00003060 3C11                <1> 	cmp	al, 11h
  6773 00003062 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 00003064 E8C9020000          <1> 	call	load_text_8_14_pat
  6778 00003069 E9C4EAFFFF          <1>         jmp     VIDEO_RETURN
  6779                              <1> font_setup_error:
  6780 0000306E 29C0                <1> 	sub	eax, eax ; 0 -> fonts could not be loaded
  6781 00003070 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 00003075 3C02                <1> 	cmp	al, 2
  6789 00003077 7404                <1> 	je	short font_setup_4
  6790 00003079 3C12                <1> 	cmp	al, 12h
  6791 0000307B 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 0000307D E8E1020000          <1> 	call	load_text_8_8_pat
  6796 00003082 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 00003087 3C04                <1> 	cmp	al, 4
  6804 00003089 7404                <1> 	je	short font_setup_6
  6805 0000308B 3C14                <1> 	cmp	al, 14h
  6806 0000308D 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 0000308F E819030000          <1> 	call	load_text_8_16_pat
  6811 00003094 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 00003099 3C21                <1> 	cmp	al, 21h
  6835 0000309B 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 0000309D 51                  <1> 	push	ecx
  6845 0000309E 52                  <1> 	push	edx
  6846 0000309F 30D2                <1> 	xor	dl, dl
  6847 000030A1 88CF                <1> 	mov	bh, cl ; character height
  6848                              <1> 	;mov	cx, 100h ; 256
  6849                              <1> 	; 03/08/2022
  6850 000030A3 31C9                <1> 	xor 	ecx, ecx
  6851 000030A5 FEC5                <1> 	inc	ch
  6852                              <1> 	; ecx = 100h
  6853 000030A7 08F6                <1> 	or	dh, dh ; 0
  6854 000030A9 7410                <1> 	jz	short  font_setup_8
  6855 000030AB FECD                <1> 	dec	ch ; cx = 0
  6856 000030AD 80FEFF              <1> 	cmp	dh, 0FFh
  6857 000030B0 7409                <1> 	je	short font_setup_8 ; 1st 128 chars
  6858                              <1> 	; 2nd 128 chars
  6859 000030B2 80FE80              <1> 	cmp	dh, 80h
  6860 000030B5 75B7                <1> 	jne	short font_setup_error ; invalid !
  6861 000030B7 88F1                <1> 	mov	cl, dh
  6862 000030B9 86D6                <1> 	xchg	dl, dh
  6863                              <1> 	; number of chars, cx = 80h 
  6864                              <1> 	; start char, dl = 80h
  6865                              <1> font_setup_8:	
  6866 000030BB E85E000000          <1> 	call	transfer_user_fonts
  6867 000030C0 5A                  <1> 	pop	edx
  6868 000030C1 59                  <1> 	pop	ecx
  6869                              <1> 	;pop	ebx
  6870 000030C2 72AA                <1> 	jc	short font_setup_error
  6871                              <1> 	; ebp = user's font data address in system's memory space
  6872 000030C4 E82F030000          <1> 	call	load_gfx_user_chars
  6873 000030C9 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 000030CE 3C22                <1> 	cmp	al, 22h
  6879 000030D0 750A                <1> 	jne	short font_setup_10
  6880 000030D2 E85D030000          <1> 	call	load_gfx_8_14_chars	
  6881 000030D7 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 000030DC 3C23                <1> 	cmp	al, 23h
  6887 000030DE 750A                <1> 	jne	short font_setup_11
  6888 000030E0 E890030000          <1> 	call	load_gfx_8_8_chars	
  6889 000030E5 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 000030EA 3C24                <1> 	cmp	al, 24h
  6895 000030EC 750A                <1> 	jne	short font_setup_12
  6896 000030EE E8C3030000          <1> 	call	load_gfx_8_16_chars	
  6897 000030F3 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 000030F8 3C30                <1> 	cmp	al, 30h
  6903 000030FA 750A                <1> 	jne	short font_setup_13			
  6904 000030FC 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 00003101 E931EAFFFF          <1>         jmp     _video_return
  6908                              <1> font_setup_13:
  6909 00003106 3C03                <1> 	cmp	al, 03h ; AX = 1103h	
  6910 00003108 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 0000310A 66BAC403            <1> 	mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  6916                              <1> 	;mov	ah, bl
  6917 0000310E 28E4                <1> 	sub	ah, ah ; 0
  6918                              <1> 	;mov	al, 03h
  6919 00003110 66EF                <1> 	out	dx, ax
  6920 00003112 E91BEAFFFF          <1> 	jmp     VIDEO_RETURN 
  6921                              <1> 	
  6922                              <1> font_setup_14:
  6923 00003117 29C0                <1> 	sub	eax, eax ; 0 = invalid function
  6924 00003119 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 0000311E 81E2FFFF0000        <1> 	and	edx, 0FFFFh
  6944 00003124 81E1FFFF0000        <1> 	and	ecx, 0FFFFh
  6945 0000312A 7537                <1> 	jnz	short transfer_user_fonts_5
  6946                              <1> 
  6947 0000312C 09D2                <1> 	or	edx, edx
  6948 0000312E 7531                <1> 	jnz	short transfer_user_fonts_4
  6949 00003130 09ED                <1> 	or	ebp, ebp
  6950 00003132 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 00003134 B140                <1> 	mov	cl, 64 ; 64 dwords
  6956                              <1> 	
  6957 00003136 80FF10              <1> 	cmp	bh, 16
  6958 00003139 7417                <1> 	je	short transfer_user_fonts_2
  6959 0000313B 80FF08              <1> 	cmp	bh, 8
  6960 0000313E 7406                <1> 	je	short transfer_user_fonts_1
  6961                              <1> 
  6962 00003140 BD[845B0100]        <1> 	mov	ebp, vgafont14
  6963 00003145 C3                  <1> 	retn 
  6964                              <1> 
  6965                              <1> transfer_user_fonts_1:
  6966 00003146 BF00500900          <1> 	mov	edi, VGAFONT8USER
  6967 0000314B BE[84530100]        <1> 	mov	esi, vgafont8
  6968 00003150 EB0A                <1> 	jmp	short transfer_user_fonts_3
  6969                              <1> 
  6970                              <1> transfer_user_fonts_2:
  6971 00003152 BF00400900          <1> 	mov	edi, VGAFONT16USER
  6972 00003157 BE[84690100]        <1> 	mov	esi, vgafont16
  6973                              <1> transfer_user_fonts_3:
  6974 0000315C 89FD                <1> 	mov	ebp, edi
  6975 0000315E F3A5                <1> 	rep	movsd
  6976 00003160 C3                  <1> 	retn
  6977                              <1> 
  6978                              <1> transfer_user_fonts_4:
  6979 00003161 F9                  <1> 	stc	
  6980 00003162 C3                  <1> 	retn
  6981                              <1> 	
  6982                              <1> transfer_user_fonts_5:
  6983 00003163 09ED                <1> 	or	ebp, ebp
  6984 00003165 74FA                <1> 	jz	short transfer_user_fonts_4 ; invalid address !
  6985                              <1> 
  6986 00003167 6681F90001          <1> 	cmp	cx, 256
  6987 0000316C 77F3                <1> 	ja	short transfer_user_fonts_4
  6988 0000316E 29D1                <1> 	sub	ecx, edx
  6989 00003170 76EF                <1> 	jna	short transfer_user_fonts_4
  6990                              <1> 
  6991 00003172 80FF0E              <1> 	cmp	bh, 14 ; 8x14 font
  6992                              <1> 		       ; (there is not an alternative buffer)
  6993 00003175 7524                <1> 	jne	short transfer_user_fonts_6
  6994                              <1> 	
  6995                              <1> 	; use system's 8x14 font space if permission flag is 1
  6996 00003177 F605[C6A30100]80    <1> 	test	byte [ufont], 80h
  6997 0000317E 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 00003180 87D1                <1> 	xchg	edx, ecx
  7010                              <1> 	;xor	ah, ah
  7011                              <1> 	; 02/08/2022
  7012 00003182 31C0                <1> 	xor	eax, eax
  7013 00003184 88F8                <1> 	mov	al, bh ; mov al, 14 
  7014                              <1> 	;mul	cx 
  7015                              <1> 	; 02/08/2022
  7016 00003186 F7E2                <1> 	mul	edx  ; char count * 14	
  7017                              <1> 	; 02/08/2022
  7018 00003188 89CA                <1> 	mov	edx, ecx ; ascii code
  7019 0000318A 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 0000318C 30E4                <1> 	xor	ah, ah
  7025 0000318E 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 00003190 F7E2                <1> 	mul	edx
  7030 00003192 89C2                <1> 	mov	edx, eax ; char offset
  7031 00003194 BF[845B0100]        <1> 	mov	edi, vgafont14
  7032 00003199 EB48                <1> 	jmp	short transfer_user_fonts_8			
  7033                              <1> transfer_user_fonts_6:
  7034 0000319B 80FF08              <1> 	cmp	bh, 8 ; 8x8 font
  7035 0000319E 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 000031A0 C1E203              <1> 	shl	edx, 3 ; byte offset
  7040 000031A3 C1E103              <1> 	shl	ecx, 3 ; byte count
  7041                              <1> 	; 09/01/2021
  7042 000031A6 BF00500900          <1> 	mov	edi, VGAFONT8USER
  7043 000031AB F605[C6A30100]08    <1> 	test	byte [ufont], 8  ; already loaded ?	
  7044 000031B2 752F                <1> 	jnz	short transfer_user_fonts_8 ; yes
  7045 000031B4 BE[84530100]        <1> 	mov	esi, vgafont8
  7046 000031B9 E839000000          <1> 	call	transfer_user_fonts_10
  7047 000031BE EB23                <1> 	jmp	short transfer_user_fonts_8
  7048                              <1> transfer_user_fonts_7:
  7049 000031C0 80FF10              <1> 	cmp	bh, 16 ; 8x16 font
  7050 000031C3 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 000031C5 C1E204              <1> 	shl	edx, 4 ; byte offset
  7055 000031C8 C1E104              <1> 	shl	ecx, 4 ; byte count
  7056 000031CB BF00400900          <1>  	mov	edi, VGAFONT16USER
  7057 000031D0 F605[C6A30100]10    <1> 	test	byte [ufont], 16  ; already loaded ?	
  7058 000031D7 750A                <1> 	jnz	short transfer_user_fonts_8 ; yes
  7059 000031D9 BE[84690100]        <1> 	mov	esi, vgafont16
  7060 000031DE E814000000          <1> 	call	transfer_user_fonts_10
  7061                              <1> transfer_user_fonts_8:
  7062 000031E3 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 000031E5 89EE                <1> 	mov	esi, ebp ; user's font buffer
  7068                              <1> 	; 09/01/2021
  7069 000031E7 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 000031E9 E80CDE0000          <1> 	call	transfer_from_user_buffer
  7073                              <1> 	;pop	ecx
  7074                              <1> 	; ecx = transfer (byte) count = character count
  7075 000031EE 7206                <1> 	jc	short transfer_user_fonts_9
  7076                              <1> 	; 05/01/2021
  7077                              <1> 	;mov	ebp, Cluster_Buffer
  7078                              <1> 	
  7079 000031F0 083D[C6A30100]      <1> 	or	byte [ufont], bh 
  7080                              <1> 			; 8x8 or 8x16 user font ready 
  7081                              <1> transfer_user_fonts_9:
  7082 000031F6 C3                  <1> 	retn
  7083                              <1> 
  7084                              <1> transfer_user_fonts_10:
  7085                              <1> 	; 02/08/2022
  7086                              <1> 	; 09/01/2021
  7087 000031F7 56                  <1> 	push	esi
  7088 000031F8 57                  <1> 	push	edi
  7089 000031F9 51                  <1> 	push	ecx
  7090                              <1> 	;mov	cx, 64
  7091                              <1> 	; 02/08/2022
  7092 000031FA 31C9                <1> 	xor	ecx, ecx
  7093 000031FC B140                <1> 	mov	cl, 64
  7094 000031FE F3A5                <1> 	rep	movsd
  7095 00003200 59                  <1> 	pop	ecx
  7096 00003201 5F                  <1> 	pop	edi
  7097 00003202 5E                  <1> 	pop	esi
  7098 00003203 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 00003204 50                  <1> 	push	eax
  7128 00003205 E839000000          <1> 	call	get_font_access
  7129 0000320A 28DB                <1> 	sub	bl, bl ; i = 0
  7130                              <1> 	; 02/08/2022
  7131                              <1> 	; ecx <= 256
  7132 0000320C 30ED                <1> 	xor	ch, ch
  7133                              <1> ltup_1:
  7134 0000320E 88D8                <1> 	mov	al, bl
  7135 00003210 F6E7                <1> 	mul	bh	
  7136                              <1> 	;movzx	esi, ax
  7137                              <1> 	; 02/08/2022
  7138 00003212 89C6                <1> 	mov	esi, eax
  7139 00003214 01EE                <1> 	add	esi, ebp
  7140 00003216 88D8                <1> 	mov	al, bl
  7141 00003218 28E4                <1> 	sub	ah, ah
  7142                              <1> 	;add	ax, dx ; (DX + i)
  7143                              <1> 	;shl	ax, 5  ; * 32
  7144                              <1> 	; 02/08/2022
  7145 0000321A 01D0                <1> 	add	eax, edx
  7146 0000321C C1E005              <1> 	shl	eax, 5
  7147                              <1> 	;movzx	edi, ax
  7148                              <1> 	; 02/08/2022
  7149 0000321F 89C7                <1> 	mov	edi, eax
  7150 00003221 81C700000A00        <1> 	add	edi, 0A0000h
  7151 00003227 51                  <1> 	push	ecx
  7152                              <1> 	;movzx	ecx, bh
  7153                              <1> 	; 02/08/2022
  7154 00003228 88F9                <1> 	mov	cl, bh
  7155 0000322A F3A4                <1> 	rep	movsb
  7156 0000322C 59                  <1> 	pop	ecx
  7157 0000322D FEC3                <1> 	inc	bl
  7158 0000322F 38CB                <1> 	cmp	bl, cl
  7159 00003231 75DB                <1> 	jne	short ltup_1
  7160                              <1> 	;
  7161 00003233 E83E000000          <1> 	call	release_font_access
  7162                              <1> 	;
  7163 00003238 58                  <1> 	pop	eax
  7164                              <1> 	; if(AL>=0x10)
  7165 00003239 3C10                <1> 	cmp	al, 10h
  7166 0000323B 7205                <1> 	jb	short ltup_2
  7167                              <1>    	; set_scan_lines(BH);
  7168 0000323D E86F000000          <1> 	call	set_scan_lines
  7169                              <1> ltup_2:
  7170 00003242 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 00003243 52                  <1> 	push	edx
  7183 00003244 66BAC403            <1> 	mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  7184                              <1> 	; 02/08/2022
  7185 00003248 31C0                <1>  	xor	eax, eax
  7186                              <1> 	;mov	ax, 0100h
  7187 0000324A B401                <1> 	mov	ah, 1
  7188                              <1> 	; ax = 0100h
  7189 0000324C 66EF                <1> 	out	dx, ax
  7190 0000324E 66B80204            <1> 	mov	ax, 0402h
  7191 00003252 66EF                <1> 	out	dx, ax
  7192 00003254 66B80407            <1> 	mov	ax, 0704h
  7193 00003258 66EF                <1> 	out	dx, ax
  7194 0000325A 66B80003            <1> 	mov	ax, 0300h
  7195 0000325E 66EF                <1> 	out	dx, ax
  7196                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  7197                              <1> 	; 02/08/2022
  7198 00003260 B2CE                <1> 	mov	dl, 0CEh
  7199 00003262 66B80402            <1> 	mov	ax, 0204h
  7200 00003266 66EF                <1> 	out	dx, ax
  7201 00003268 66B80500            <1> 	mov	ax, 0005h
  7202 0000326C 66EF                <1> 	out	dx, ax
  7203 0000326E 66B80604            <1> 	mov	ax, 0406h
  7204 00003272 66EF                <1> 	out	dx, ax
  7205 00003274 5A                  <1> 	pop	edx
  7206 00003275 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 00003276 66BAC403            <1> 	mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  7219                              <1> 	;mov	ax, 0100h
  7220                              <1> 	; 02/08/2022
  7221 0000327A 29C0                <1> 	sub	eax, eax
  7222 0000327C B401                <1> 	mov	ah, 1
  7223                              <1> 	; ax = 0100h
  7224 0000327E 66EF                <1> 	out	dx, ax
  7225 00003280 66B80203            <1> 	mov	ax, 0302h
  7226 00003284 66EF                <1> 	out	dx, ax
  7227 00003286 66B80403            <1> 	mov	ax, 0304h
  7228 0000328A 66EF                <1> 	out	dx, ax
  7229 0000328C 66B80003            <1> 	mov	ax, 0300h
  7230 00003290 66EF                <1> 	out	dx, ax
  7231                              <1> 	;mov	dx, 3CCh ; VGAREG_READ_MISC_OUTPUT
  7232                              <1>  	; 02/08/2022
  7233 00003292 B2CC                <1> 	mov	dl, 0CCh
  7234 00003294 EC                  <1> 	in	al, dx
  7235 00003295 2401                <1> 	and	al, 01h
  7236 00003297 C0E002              <1> 	shl	al, 2
  7237 0000329A 0C0A                <1> 	or	al, 0Ah
  7238 0000329C 88C4                <1> 	mov	ah, al
  7239 0000329E B006                <1> 	mov	al, 06h
  7240                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  7241                              <1> 	; 02/08/2022
  7242 000032A0 B2CE                <1> 	mov	dl, 0CEh
  7243 000032A2 66EF                <1> 	out	dx, ax
  7244 000032A4 66B80400            <1> 	mov	ax, 0004h
  7245 000032A8 66EF                <1> 	out	dx, ax
  7246 000032AA 66B80510            <1> 	mov	ax, 1005h
  7247 000032AE 66EF                <1> 	out	dx, ax
  7248 000032B0 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 000032B1 66BAD403            <1> 	mov	dx, 3D4h ; CRTC_ADDRESS = 3D4h (always)
  7264 000032B5 B009                <1> 	mov	al, 09h
  7265 000032B7 EE                  <1> 	out	dx, al
  7266                              <1> 	; crtc_r9 = inb(crtc_addr+1);
  7267                              <1> 	;inc	dx ; 3D5h
  7268                              <1> 	; 02/08/2022
  7269 000032B8 FEC2                <1> 	inc	dl
  7270 000032BA EC                  <1> 	in	al, dx
  7271                              <1> 	; crtc_r9 = (crtc_r9 & 0xe0) | (lines - 1);
  7272 000032BB 24E0                <1> 	and	al, 0E0h
  7273 000032BD FECF                <1> 	dec	bh ; lines - 1
  7274 000032BF 08F8                <1> 	or	al, bh
  7275                              <1> 	; outb(crtc_addr+1, crtc_r9);
  7276 000032C1 EE                  <1> 	out	dx, al
  7277                              <1> 	;inc	bh 
  7278                              <1> 	; if(lines==8)
  7279                              <1> 	;cmp	bh, 8
  7280 000032C2 80FF07              <1> 	cmp	bh, 7
  7281 000032C5 7506                <1> 	jne	short ssl_1
  7282                              <1> 	; biosfn_set_cursor_shape(0x06,0x07);
  7283 000032C7 66B90706            <1> 	mov	cx, 0607h
  7284 000032CB EB06                <1> 	jmp	short ssl_2
  7285                              <1> ssl_1:
  7286                              <1> 	; biosfn_set_cursor_shape(lines-4,lines-3);
  7287 000032CD 88F9                <1> 	mov	cl, bh ; lines - 1
  7288 000032CF 88CD                <1> 	mov	ch, cl ; lines - 1 (16 -> 15)
  7289 000032D1 FECD                <1> 	dec	ch  ; lines - 2 (16 -> 14)
  7290                              <1> ssl_2:
  7291                              <1> 	; CH = start line, CL = stop line
  7292 000032D3 B40A                <1> 	mov	ah, 10	; 6845 register for cursor set
  7293 000032D5 66890D[F7670000]    <1> 	mov	[CURSOR_MODE], cx ; save in data area
  7294 000032DC E877F0FFFF          <1> 	call	m16	; output cx register
  7295                              <1> 	; write_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT, lines);
  7296 000032E1 FEC7                <1> 	inc	bh ; lines
  7297 000032E3 883D[E2670000]      <1> 	mov	[CHAR_HEIGHT], bh
  7298                              <1> 	;  outb(crtc_addr, 0x12);
  7299 000032E9 66BAD403            <1> 	mov	dx, 3D4h ; CRTC_ADDRESS
  7300 000032ED B012                <1> 	mov	al, 12h
  7301 000032EF EE                  <1> 	out	dx, al
  7302                              <1> 	; vde = inb(crtc_addr+1);
  7303                              <1> 	;inc	dx
  7304                              <1> 	; 02/08/2022
  7305 000032F0 FEC2                <1> 	inc	dl
  7306 000032F2 EC                  <1> 	in	al, dx
  7307 000032F3 88C4                <1> 	mov	ah, al
  7308                              <1> 	; outb(crtc_addr, 0x07);
  7309                              <1> 	;dec	dx
  7310                              <1> 	; 02/08/2022
  7311 000032F5 FECA                <1> 	dec	dl
  7312 000032F7 B007                <1> 	mov	al, 07h
  7313 000032F9 EE                  <1> 	out	dx, al
  7314                              <1> 	; ovl = inb(crtc_addr+1);
  7315                              <1> 	;inc	dx
  7316                              <1> 	; 02/08/2022
  7317 000032FA FEC2                <1> 	inc	dl
  7318 000032FC EC                  <1> 	in	al, dx
  7319                              <1> 	; vde += (((ovl & 0x02) << 7) + ((ovl & 0x40) << 3) + 1);
  7320 000032FD 88E2                <1> 	mov	dl, ah ; vde
  7321 000032FF 88C6                <1> 	mov	dh, al ; ovl
  7322                              <1> 	;and	ax, 02h
  7323                              <1> 	;shl	ax, 7
  7324                              <1> 	; 02/08/2022
  7325 00003301 31C0                <1> 	xor	eax, eax
  7326 00003303 88F0                <1> 	mov	al, dh
  7327 00003305 2402                <1> 	and	al, 2
  7328 00003307 C1E007              <1> 	shl	eax, 7
  7329                              <1> 	;mov	cx, ax ; (ovl & 0x02) << 7)	
  7330                              <1> 	; 02/08/2022
  7331 0000330A 89C1                <1> 	mov	ecx, eax
  7332 0000330C 28E4                <1> 	sub	ah, ah
  7333 0000330E 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 00003310 2440                <1> 	and	al, 40h
  7340 00003312 C1E003              <1> 	shl	eax, 3
  7341 00003315 40                  <1> 	inc	eax
  7342 00003316 01C8                <1> 	add	eax, ecx
  7343 00003318 30F6                <1> 	xor	dh, dh
  7344                              <1> 	;add	ax, dx ; + vde
  7345                              <1> 	; 02/08/2022
  7346 0000331A 01D0                <1> 	add	eax, edx
  7347                              <1> 	; rows = vde / lines;
  7348 0000331C F6F7                <1> 	div	bh
  7349                              <1> 	;dec	al ; rows -1
  7350                              <1> 	; write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, rows-1);
  7351 0000331E A2[E6670000]        <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 00003323 F625[E0670000]      <1> 	mul	byte [CRT_COLS]
  7357                              <1> 	;shl	ax, 1
  7358                              <1> 	; 02/08/2022
  7359 00003329 D1E0                <1> 	shl	eax, 1
  7360 0000332B 66A3[90890100]      <1> 	mov 	[CRT_LEN], ax	
  7361 00003331 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 00003332 50                  <1> 	push	eax
  7393 00003333 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 00003338 28DB                <1> 	sub	bl, bl ; i = 0
  7408 0000333A B70E                <1> 	mov	bh, 14
  7409 0000333C BE[845B0100]        <1> 	mov	esi, vgafont14
  7410 00003341 BF00000A00          <1> 	mov	edi, 0A0000h
  7411                              <1> 	; 02/08/2022
  7412 00003346 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 00003348 88F9                <1> 	mov	cl, bh
  7427 0000334A F3A4                <1> 	rep	movsb
  7428 0000334C 83C712              <1> 	add	edi, 18 ; 32 - 14
  7429 0000334F FEC3                <1> 	inc	bl
  7430 00003351 75F5                <1> 	jnz	short lt8_14_1	
  7431                              <1> 	;
  7432 00003353 E81EFFFFFF          <1> 	call	release_font_access
  7433                              <1> 	;
  7434 00003358 58                  <1> 	pop	eax
  7435                              <1> 	; if(AL>=0x10)
  7436 00003359 3C10                <1> 	cmp	al, 10h
  7437 0000335B 7205                <1> 	jb	short lt8_14_4
  7438                              <1> 	; BH = 14
  7439                              <1>    	; set_scan_lines(14);
  7440 0000335D E84FFFFFFF          <1> 	call	set_scan_lines
  7441                              <1> lt8_14_4:
  7442 00003362 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 00003363 50                  <1> 	push	eax
  7475 00003364 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 00003369 28DB                <1> 	sub	bl, bl ; i = 0
  7490 0000336B B708                <1> 	mov	bh, 8
  7491                              <1> 	;mov	esi, vgafont8
  7492 0000336D BF00000A00          <1> 	mov	edi, 0A0000h
  7493                              <1> 
  7494                              <1> 	; 02/08/2022
  7495 00003372 29C9                <1> 	sub	ecx, ecx
  7496                              <1> 
  7497                              <1> 	; 05/01/2021
  7498 00003374 F605[C6A30100]80    <1> 	test	byte [ufont], 80h
  7499 0000337B 7410                <1> 	jz	short lt8_8_0
  7500                              <1> 		; user font permission (after set mode)
  7501 0000337D F605[C6A30100]08    <1>  	test	byte [ufont], 8
  7502 00003384 7407                <1> 	jz	short lt8_8_0
  7503 00003386 BE00500900          <1> 	mov	esi, VGAFONT8USER
  7504 0000338B EB05                <1> 	jmp	short lt8_8_1
  7505                              <1> lt8_8_0:
  7506 0000338D BE[84530100]        <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 00003392 88F9                <1> 	mov	cl, bh
  7521 00003394 F3A4                <1> 	rep	movsb
  7522 00003396 83C718              <1> 	add	edi, 24 ; 32 - 8
  7523 00003399 FEC3                <1> 	inc	bl
  7524 0000339B 75F5                <1> 	jnz	short lt8_8_1
  7525                              <1> 	;
  7526 0000339D E8D4FEFFFF          <1> 	call	release_font_access
  7527                              <1> 	;
  7528 000033A2 58                  <1> 	pop	eax
  7529                              <1> 	; if(AL>=0x10)
  7530 000033A3 3C10                <1> 	cmp	al, 10h
  7531 000033A5 7205                <1> 	jb	short lt8_8_2
  7532                              <1> 	; BH = 8
  7533                              <1>    	; set_scan_lines(8);
  7534 000033A7 E805FFFFFF          <1> 	call	set_scan_lines
  7535                              <1> lt8_8_2:
  7536 000033AC 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 000033AD 50                  <1> 	push	eax
  7569 000033AE 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 000033B3 28DB                <1> 	sub	bl, bl ; i = 0
  7584 000033B5 B710                <1> 	mov	bh, 16
  7585                              <1> 	;mov	esi, vgafont16
  7586 000033B7 BF00000A00          <1> 	mov	edi, 0A0000h
  7587                              <1> 	;movzx	eax, bh
  7588                              <1> 	; 02/08/2022
  7589 000033BC 29C0                <1> 	sub	eax, eax
  7590 000033BE 88F8                <1> 	mov	al, bh
  7591                              <1> 
  7592                              <1> 	; 05/01/2021
  7593 000033C0 F605[C6A30100]80    <1> 	test	byte [ufont], 80h
  7594 000033C7 7410                <1> 	jz	short lt8_16_0
  7595                              <1> 		; user font permission (after set mode)
  7596 000033C9 F605[C6A30100]10    <1>  	test	byte [ufont], 16
  7597 000033D0 7407                <1> 	jz	short lt8_16_0
  7598 000033D2 BE00400900          <1> 	mov	esi, VGAFONT16USER
  7599 000033D7 EB05                <1> 	jmp	short lt8_16_1
  7600                              <1> lt8_16_0:
  7601 000033D9 BE[84690100]        <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 000033DE 89C1                <1> 	mov	ecx, eax ; 16	
  7615 000033E0 F3A4                <1> 	rep	movsb
  7616 000033E2 01C7                <1> 	add	edi, eax ; add edi, 16
  7617 000033E4 FEC3                <1> 	inc	bl
  7618 000033E6 75F6                <1> 	jnz	short lt8_16_1
  7619                              <1> 	;
  7620 000033E8 E889FEFFFF          <1> 	call	release_font_access
  7621                              <1> 	;
  7622 000033ED 58                  <1> 	pop	eax
  7623                              <1> 	; if(AL>=0x10)
  7624 000033EE 3C10                <1> 	cmp	al, 10h
  7625 000033F0 7205                <1> 	jb	short lt8_16_2
  7626                              <1> 	; BH = 16
  7627                              <1>    	; set_scan_lines(16);
  7628 000033F2 E8BAFEFFFF          <1> 	call	set_scan_lines
  7629                              <1> lt8_16_2:
  7630 000033F7 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 000033F8 892D[A2890100]      <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 000033FE 20DB                <1> 	and	bl, bl
  7673 00003400 7508                <1> 	jnz	short l_gfx_uc_1
  7674 00003402 8815[E6670000]      <1> 	mov	[VGA_ROWS], dl  ; not DL-1 !
  7675 00003408 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 0000340A FECB                <1> 	dec	bl
  7681 0000340C 7509                <1> 	jnz	short l_gfx_uc_2
  7682                              <1> 	; bl = 1
  7683 0000340E C605[E6670000]0E    <1> 	mov	byte [VGA_ROWS], 14  ; not 13 !
  7684 00003415 EB16                <1> 	jmp	short l_gfx_uc_4
  7685                              <1> l_gfx_uc_2:
  7686 00003417 FECB                <1> 	dec	bl
  7687 00003419 740B                <1> 	jz	short l_gfx_uc_3 ; bl = 2
  7688 0000341B FECB                <1> 	dec	bl
  7689 0000341D 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 0000341F C605[E6670000]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 00003426 C605[E6670000]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 0000342D 880D[E2670000]      <1> 	mov	[CHAR_HEIGHT], cl
  7706                              <1> 	; }
  7707 00003433 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 00003434 C705[A2890100]-     <1> 	mov	dword [VGA_INT43H], vgafont14
  7723 0000343A [845B0100]          <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 0000343E 20DB                <1> 	and	bl, bl
  7736 00003440 7508                <1> 	jnz	short l_gfx_8_14c_1
  7737 00003442 8815[E6670000]      <1> 	mov	[VGA_ROWS], dl  ; not DL-1 !
  7738 00003448 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 0000344A FECB                <1> 	dec	bl
  7744 0000344C 7509                <1> 	jnz	short l_gfx_8_14c_2
  7745                              <1> 	; bl = 1
  7746 0000344E C605[E6670000]0E    <1> 	mov	byte [VGA_ROWS], 14  ; not 13 !
  7747 00003455 EB16                <1> 	jmp	short l_gfx_8_14c_4
  7748                              <1> l_gfx_8_14c_2:
  7749 00003457 FECB                <1> 	dec	bl
  7750 00003459 740B                <1> 	jz	short l_gfx_8_14c_3 ; bl = 2
  7751 0000345B FECB                <1> 	dec	bl
  7752 0000345D 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 0000345F C605[E6670000]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 00003466 C605[E6670000]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 0000346D C605[E2670000]0E    <1>         mov     byte [CHAR_HEIGHT], 14
  7769                              <1> 	; }
  7770 00003474 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 00003475 C705[A2890100]-     <1> 	mov	dword [VGA_INT43H], vgafont8
  7786 0000347B [84530100]          <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 0000347F 20DB                <1> 	and	bl, bl
  7799 00003481 7508                <1> 	jnz	short l_gfx_8_8c_1
  7800 00003483 8815[E6670000]      <1> 	mov	[VGA_ROWS], dl  ; not DL-1 !
  7801 00003489 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 0000348B FECB                <1> 	dec	bl
  7807 0000348D 7509                <1> 	jnz	short l_gfx_8_8c_2
  7808                              <1> 	; bl = 1
  7809 0000348F C605[E6670000]0E    <1> 	mov	byte [VGA_ROWS], 14  ; not 13 !
  7810 00003496 EB16                <1> 	jmp	short l_gfx_8_8c_4 	
  7811                              <1> l_gfx_8_8c_2:
  7812 00003498 FECB                <1> 	dec	bl
  7813 0000349A 740B                <1> 	jz	short l_gfx_8_8c_3 ; bl = 2
  7814 0000349C FECB                <1> 	dec	bl
  7815 0000349E 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 000034A0 C605[E6670000]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 000034A7 C605[E6670000]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 000034AE C605[E2670000]08    <1>         mov     byte [CHAR_HEIGHT], 8
  7832                              <1> 	; }
  7833 000034B5 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 000034B6 C705[A2890100]-     <1> 	mov	dword [VGA_INT43H], vgafont16
  7849 000034BC [84690100]          <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 000034C0 20DB                <1> 	and	bl, bl
  7862 000034C2 7508                <1> 	jnz	short l_gfx_8_16c_1
  7863 000034C4 8815[E6670000]      <1> 	mov	[VGA_ROWS], dl  ; not DL-1 !
  7864 000034CA 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 000034CC FECB                <1> 	dec	bl
  7870 000034CE 7509                <1> 	jnz	short l_gfx_8_16c_2
  7871                              <1> 	; bl = 1
  7872 000034D0 C605[E6670000]0E    <1> 	mov	byte [VGA_ROWS], 14  ; not 13 !
  7873 000034D7 EB16                <1> 	jmp	short l_gfx_8_16c_4
  7874                              <1> l_gfx_8_16c_2:
  7875 000034D9 FECB                <1> 	dec	bl
  7876 000034DB 740B                <1> 	jz	short l_gfx_8_16c_3 ; bl = 2
  7877 000034DD FECB                <1> 	dec	bl
  7878 000034DF 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 000034E1 C605[E6670000]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 000034E8 C605[E6670000]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 000034EF C605[E2670000]10    <1>         mov     byte [CHAR_HEIGHT], 16
  7895                              <1> 	; }
  7896 000034F6 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 000034F7 20DB                <1> 	and	bl, bl
  7946 000034F9 740F                <1> 	jz	short gfi_1
  7947                              <1> 	; invalid function (input)
  7948                              <1> 	; 08/01/2021
  7949 000034FB 80FB04              <1> 	cmp	bl, 4
  7950 000034FE 7263                <1> 	jb	short gfi_5
  7951 00003500 7441                <1> 	je	short gfi_3	
  7952 00003502 80FB06              <1> 	cmp	bl, 6
  7953 00003505 744C                <1> 	je	short gfi_4
  7954                              <1> 	; bh = 5 or bh > 6
  7955                              <1> gfi_0:
  7956 00003507 31C0                <1> 	xor	eax, eax ; 0
  7957 00003509 C3                  <1> 	retn
  7958                              <1> gfi_1:
  7959 0000350A A0[E2670000]        <1> 	mov	al, [CHAR_HEIGHT]
  7960 0000350F 8A25[E6670000]      <1> 	mov	ah, [VGA_ROWS]
  7961 00003515 C1E010              <1> 	shl	eax, 16
  7962 00003518 A0[E0670000]        <1> 	mov	al, [CRT_COLS]
  7963 0000351D 8B0D[A2890100]      <1> 	mov	ecx, [VGA_INT43H]
  7964 00003523 21C9                <1> 	and	ecx, ecx
  7965 00003525 7418                <1> 	jz	short gfi_2 ; 0 = default font
  7966                              <1> 	; 08/01/2021
  7967 00003527 FECC                <1> 	dec	ah ; 0FFh
  7968 00003529 81F900400900        <1> 	cmp	ecx, VGAFONT16USER
  7969 0000352F 740E                <1> 	je	short gfi_2
  7970 00003531 81F900500900        <1> 	cmp	ecx, VGAFONT8USER
  7971 00003537 7406                <1> 	je	short gfi_2	
  7972 00003539 8A25[E2670000]      <1> 	mov	ah, [CHAR_HEIGHT] ; font size = height
  7973                              <1> gfi_2:
  7974 0000353F C1C010              <1> 	rol	eax, 16
  7975 00003542 C3                  <1> 	retn
  7976                              <1> gfi_3:
  7977                              <1> 	; 08/01/2021
  7978 00003543 F605[C6A30100]08    <1> 	test	byte [ufont], 08h ; 8x8 user font
  7979 0000354A 74BB                <1> 	jz	short gfi_0 ; not loaded !
  7980 0000354C BE00500900          <1> 	mov	esi, VGAFONT8USER ; *
  7981                              <1> 	;mov	bl, 8
  7982                              <1> 	;jmp	short gfi_8
  7983 00003551 EB4A                <1> 	jmp	short gfi_10
  7984                              <1> gfi_4:
  7985                              <1> 	; 08/01/2021
  7986 00003553 F605[C6A30100]10    <1> 	test	byte [ufont], 10h ; 8x16 user font
  7987 0000355A 74AB                <1> 	jz	short gfi_0 ; not loaded !
  7988 0000355C BE00400900          <1> 	mov	esi, VGAFONT16USER ; *
  7989 00003561 EB15                <1> 	jmp	short gfi_7
  7990                              <1> gfi_5:
  7991 00003563 80FB02              <1> 	cmp	bl, 2
  7992 00003566 7230                <1> 	jb	short gfi_9
  7993 00003568 7709                <1> 	ja	short gfi_6
  7994                              <1> 	; BL = 2 -> vgafont14
  7995 0000356A BE[845B0100]        <1> 	mov	esi, vgafont14 ; *
  7996 0000356F B30E                <1> 	mov	bl, 14
  7997 00003571 EB07                <1> 	jmp	short gfi_8 
  7998                              <1> gfi_6:
  7999                              <1> 	; BL = 3 -> vgafont16
  8000 00003573 BE[84690100]        <1> 	mov	esi, vgafont16 ; *
  8001                              <1> gfi_7:
  8002 00003578 B310                <1> 	mov	bl, 16
  8003                              <1> gfi_8:
  8004 0000357A 89D7                <1> 	mov	edi, edx ; **
  8005 0000357C 09C9                <1> 	or	ecx, ecx
  8006 0000357E 7421                <1> 	jz	short gfi_11 ; all chars from the 00h
  8007                              <1> 	;mov	al, bh ; character index
  8008                              <1> 	; 03/08/2022
  8009 00003580 0FB6C7              <1> 	movzx	eax, bh
  8010 00003583 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 00003585 01C6                <1> 	add	esi, eax
  8015 00003587 31D2                <1> 	xor	edx, edx
  8016 00003589 FECA                <1> 	dec	dl 
  8017                              <1> 	; edx = 0FFh = 255
  8018                              <1> 	;mov	dx, 255
  8019 0000358B 28FA                <1> 	sub	dl, bh
  8020                              <1> 	;inc	dx	
  8021                              <1> 	; 03/08/2022
  8022 0000358D 42                  <1> 	inc	edx
  8023 0000358E 39D1                <1> 	cmp	ecx, edx
  8024 00003590 770F                <1> 	ja	short gfi_11
  8025 00003592 7411                <1> 	je	short gfi_12
  8026 00003594 89D1                <1> 	mov	ecx, edx
  8027 00003596 EB0D                <1> 	jmp	short gfi_12
  8028                              <1> gfi_9:
  8029                              <1> 	;BL = 1 -> vgafont8
  8030 00003598 BE[84530100]        <1> 	mov	esi, vgafont8 ; *
  8031                              <1> gfi_10:
  8032 0000359D B308                <1> 	mov	bl, 8
  8033 0000359F EBD9                <1> 	jmp	short gfi_8
  8034                              <1> gfi_11:
  8035                              <1> 	;mov	ecx, 256
  8036                              <1> 	; 03/08/2022
  8037 000035A1 29C9                <1> 	sub	ecx, ecx
  8038 000035A3 FEC5                <1> 	inc	ch
  8039                              <1> 	; ecx = 100h 
  8040                              <1> gfi_12:
  8041                              <1> 	; 08/01/2021
  8042 000035A5 89C8                <1> 	mov	eax, ecx ; character count
  8043 000035A7 30FF                <1> 	xor	bh, bh
  8044 000035A9 66F7E3              <1> 	mul	bx ; char count * char height/size
  8045 000035AC 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 000035AE E8FDD90000          <1> 	call	transfer_to_user_buffer
  8051 000035B3 89C8                <1> 	mov	eax, ecx ; actual transfer count
  8052 000035B5 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 000035B6 89D6                <1> 	mov	esi, edx ; user buffer
  8063                              <1> 	;mov	ecx, 17
  8064                              <1> 	; 03/08/2022
  8065 000035B8 29C9                <1> 	sub	ecx, ecx
  8066 000035BA B111                <1> 	mov	cl, 17
  8067 000035BC 89E7                <1> 	mov	edi, esp
  8068 000035BE 83EC14              <1> 	sub	esp, 20	 	 
  8069 000035C1 E834DA0000          <1> 	call	transfer_from_user_buffer
  8070                              <1> 	;jc	VIDEO_RETURN
  8071                              <1> 
  8072 000035C6 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8073 000035CA EC                  <1> 	in	al, dx
  8074                              <1> 	;mov	cl, 0
  8075                              <1> 	; 03/08/2022
  8076 000035CB 28C9                <1> 	sub	cl, cl
  8077                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8078                              <1> 	; 03/08/2022
  8079 000035CD B2C0                <1> 	mov	dl, 0C0h
  8080                              <1> set_palette_loop:
  8081 000035CF 88C8                <1> 	mov	al, cl
  8082 000035D1 EE                  <1> 	out	dx, al
  8083 000035D2 8A07                <1> 	mov	al, [edi]
  8084 000035D4 EE                  <1> 	out	dx, al
  8085 000035D5 47                  <1> 	inc	edi
  8086 000035D6 FEC1                <1> 	inc	cl
  8087 000035D8 80F910              <1> 	cmp	cl, 10h
  8088 000035DB 75F2                <1> 	jne	short set_palette_loop
  8089 000035DD B011                <1> 	mov	al, 11h
  8090 000035DF EE                  <1> 	out	dx, al
  8091 000035E0 8A07                <1> 	mov	al, [edi]
  8092 000035E2 EE                  <1> 	out	dx, al
  8093 000035E3 B020                <1> 	mov	al, 20h
  8094 000035E5 EE                  <1> 	out	dx, al
  8095                              <1> 	; ifdef VBOX
  8096                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8097                              <1> 	; 03/08/2022
  8098 000035E6 B2DA                <1> 	mov	dl, 0DAh
  8099 000035E8 EC                  <1> 	in	al, dx
  8100                              <1> 	; endif ; VBOX
  8101 000035E9 83C414              <1> 	add	esp, 20
  8102 000035EC 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 000035F1 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8115 000035F5 EC                  <1> 	in	al, dx
  8116                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8117                              <1> 	; 03/08/2022
  8118 000035F6 B2C0                <1> 	mov	dl, 0C0h
  8119 000035F8 B010                <1> 	mov	al, 10h
  8120 000035FA EE                  <1> 	out	dx, al
  8121                              <1> 	;mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  8122                              <1> 	; 03/08/2022
  8123 000035FB FEC2                <1> 	inc	dl ; dx = 3C1h
  8124 000035FD EC                  <1> 	in	al, dx
  8125 000035FE 24F7                <1> 	and	al, 0F7h
  8126 00003600 80E301              <1> 	and	bl, 01h
  8127 00003603 C0E303              <1> 	shl	bl, 3
  8128 00003606 08D8                <1> 	or	al, bl
  8129                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8130                              <1> 	; 03/08/2022
  8131 00003608 FECA                <1> 	dec	dl ; dx = 3C0h
  8132 0000360A EE                  <1> 	out	dx, al
  8133 0000360B B020                <1> 	mov	al, 20h
  8134 0000360D EE                  <1> 	out	dx, al
  8135                              <1> 	; ifdef VBOX
  8136                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8137                              <1> 	; 03/08/2022
  8138 0000360E B2DA                <1> 	mov	dl, 0DAh
  8139 00003610 EC                  <1> 	in	al, dx
  8140                              <1> 	; endif ; VBOX
  8141 00003611 E91CE5FFFF          <1> 	jmp	VIDEO_RETURN
  8142                              <1> 
  8143                              <1> 	; 07/08/2022
  8144                              <1> vga_palf_unknown:
  8145 00003616 29C0                <1> 	sub	eax, eax ; 0 = invalid function
  8146 00003618 E91AE5FFFF          <1>         jmp     _video_return
  8147                              <1> 
  8148                              <1> 	; 07/08/2022
  8149                              <1> vga_palf_101B:
  8150 0000361D 3C1B                <1> 	cmp	al, 1Bh
  8151                              <1> 	;jne	short vga_palf_unknown
  8152 0000361F 77F5                <1> 	ja	short vga_palf_unknown
  8153                              <1>  
  8154 00003621 E810F6FFFF          <1> 	call	gray_scale_summing
  8155 00003626 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 0000362B 3C00                <1> 	cmp	al, 0
  8168 0000362D 7467                <1>         je      short set_single_palette_reg
  8169                              <1> vga_palf_1002:
  8170 0000362F 3C02                <1> 	cmp	al, 2
  8171 00003631 7483                <1>         je      short set_all_palette_reg
  8172                              <1> 	; 07/08/2022
  8173 00003633 7702                <1> 	ja	short vga_palf_1003
  8174 00003635 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 00003637 3C03                <1> 	cmp	al, 3
  8181 00003639 74B6                <1> 	je	short toggle_intensity
  8182                              <1> vga_palf_1007:
  8183 0000363B 3C07                <1> 	cmp	al, 7
  8184 0000363D 747F                <1>         je      short get_single_palette_reg
  8185 0000363F 72D5                <1> 	jb	short vga_palf_unknown
  8186                              <1> vga_palf_1008:
  8187 00003641 3C08                <1> 	cmp	al, 8
  8188 00003643 7477                <1>         je      short read_overscan_border_color
  8189                              <1> vga_palf_1009:
  8190 00003645 3C09                <1> 	cmp	al, 9
  8191                              <1> 	;je	short get_all_palette_reg
  8192                              <1> 	; 07/08/2022
  8193 00003647 7505                <1> 	jne	short vga_palf_1010
  8194 00003649 E966010000          <1> 	jmp	get_all_palette_reg
  8195                              <1> vga_palf_1010:
  8196 0000364E 3C10                <1> 	cmp	al, 10h
  8197                              <1> 	;je 	short set_single_dac_reg
  8198                              <1> 	; 07/08/2022
  8199 00003650 7707                <1> 	ja	short vga_palf_1012
  8200 00003652 72C2                <1> 	jb	short vga_palf_unknown
  8201 00003654 E908010000          <1> 	jmp	set_single_dac_reg
  8202                              <1> vga_palf_1012:
  8203 00003659 3C12                <1> 	cmp	al, 12h
  8204                              <1> 	;je	short set_all_dac_reg
  8205                              <1> 	; 07/08/2022
  8206 0000365B 7707                <1> 	ja	short vga_palf_1013
  8207 0000365D 72B7                <1> 	jb	short vga_palf_unknown
  8208 0000365F E916010000          <1> 	jmp	set_all_dac_reg	
  8209                              <1> vga_palf_1013:
  8210 00003664 3C13                <1> 	cmp	al, 13h
  8211                              <1> 	;je	short select_video_dac_color_page
  8212                              <1> 	; 07/08/2022
  8213 00003666 7505                <1> 	jne	short vga_palf_1015
  8214 00003668 E992010000          <1> 	jmp	select_video_dac_color_page
  8215                              <1> vga_palf_1015:
  8216 0000366D 3C15                <1> 	cmp	al, 15h
  8217                              <1> 	;je	short read_single_dac_reg
  8218                              <1> 	; 07/08/2022
  8219 0000366F 7707                <1> 	ja	short vga_palf_1017
  8220 00003671 72A3                <1> 	jb	short vga_palf_unknown
  8221 00003673 E98D000000          <1> 	jmp	read_single_dac_reg
  8222                              <1> vga_palf_1017:
  8223 00003678 3C17                <1> 	cmp	al, 17h
  8224                              <1> 	;je	short read_all_dac_reg
  8225                              <1> 	; 07/08/2022
  8226 0000367A 7707                <1> 	ja	short vga_palf_1018
  8227 0000367C 7298                <1> 	jb	short vga_palf_unknown
  8228 0000367E E9A0000000          <1> 	jmp	read_all_dac_reg
  8229                              <1> vga_palf_1018:
  8230 00003683 3C18                <1> 	cmp	al, 18h
  8231 00003685 7464                <1>         je	short set_pel_mask
  8232                              <1> vga_palf_1019:
  8233 00003687 3C19                <1> 	cmp	al, 19h
  8234 00003689 746C                <1>         je	short read_pel_mask
  8235                              <1> vga_palf_101A:
  8236 0000368B 3C1A                <1> 	cmp	al, 1Ah
  8237                              <1>         ;je	short read_video_dac_state
  8238                              <1> 	; 07/08/2022
  8239 0000368D 758E                <1> 	jne	short vga_palf_101B
  8240 0000368F 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 00003694 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 00003696 80FB14              <1> 	cmp	bl, 14h
  8264                              <1> 	;;ja	short no_actl_reg1
  8265                              <1> 	;ja	VIDEO_RETURN
  8266                              <1> 	; 03/08/2022
  8267 00003699 7605                <1> 	jna	short sspr_1
  8268 0000369B E992E4FFFF          <1> 	jmp	VIDEO_RETURN
  8269                              <1> sspr_1:
  8270                              <1> 	;push	ax
  8271                              <1> 	;push	dx
  8272                              <1> 	; 12/04/2021
  8273 000036A0 50                  <1> 	push	eax
  8274 000036A1 52                  <1> 	push	edx
  8275 000036A2 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8276 000036A6 EC                  <1> 	in	al, dx
  8277                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8278                              <1> 	; 03/08/2022
  8279 000036A7 B2C0                <1> 	mov	dl, 0C0h
  8280 000036A9 88D8                <1> 	mov	al, bl
  8281 000036AB EE                  <1> 	out	dx, al
  8282 000036AC 88F8                <1> 	mov	al, bh
  8283 000036AE EE                  <1> 	out	dx, al
  8284 000036AF B020                <1> 	mov	al, 20h
  8285 000036B1 EE                  <1> 	out	dx, al
  8286                              <1> 	; ifdef VBOX
  8287                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8288                              <1> 	; 03/08/2022
  8289 000036B2 B2DA                <1> 	mov	dl, 0DAh
  8290 000036B4 EC                  <1> 	in	al, dx
  8291                              <1> 	; endif ; VBOX
  8292                              <1> 	;pop	dx
  8293                              <1> 	;pop	ax
  8294                              <1> 	; 12/04/2021
  8295 000036B5 5A                  <1> 	pop	edx
  8296 000036B6 58                  <1> 	pop	eax
  8297                              <1> ;no_actl_reg1:
  8298 000036B7 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 000036BC 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 000036BE 80FB14              <1> 	cmp	bl, 14h
  8323                              <1> 	;;ja	short no_actl_reg2
  8324                              <1> 	;ja	VIDEO_RETURN
  8325                              <1> 	; 03/08/2022
  8326 000036C1 7605                <1> 	jna	short gspr_1
  8327 000036C3 E96AE4FFFF          <1> 	jmp	VIDEO_RETURN
  8328                              <1> gspr_1:
  8329 000036C8 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8330                              <1> 	; 03/08/2022
  8331 000036CC B2DA                <1> 	mov	dl, 0DAh
  8332 000036CE EC                  <1> 	in	al, dx
  8333                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8334                              <1> 	; 03/08/2022
  8335 000036CF B2C0                <1> 	mov	dl, 0C0h
  8336 000036D1 88D8                <1> 	mov	al, bl
  8337 000036D3 EE                  <1> 	out	dx, al
  8338                              <1> 	;mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  8339                              <1> 	; 03/08/2022
  8340 000036D4 FEC2                <1> 	inc	dl ; dx = 3C1h
  8341 000036D6 EC                  <1> 	in	al, dx
  8342 000036D7 8844240D            <1> 	mov	[esp+13], al ; bh
  8343                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8344                              <1> 	; 03/08/2022
  8345 000036DB B2DA                <1> 	mov	dl, 0DAh
  8346 000036DD EC                  <1> 	in	al, dx
  8347                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8348                              <1> 	; 03/08/2022
  8349 000036DE B2C0                <1> 	mov	dl, 0C0h
  8350 000036E0 B020                <1> 	mov	al, 20h
  8351 000036E2 EE                  <1> 	out	dx, al
  8352                              <1> 	; ifdef VBOX
  8353                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8354                              <1> 	; 03/08/2022
  8355 000036E3 B2DA                <1> 	mov	dl, 0DAh
  8356 000036E5 EC                  <1> 	in	al, dx
  8357                              <1> 	; endif ; VBOX
  8358 000036E6 E947E4FFFF          <1> 	jmp	VIDEO_RETURN
  8359                              <1> 
  8360                              <1> set_pel_mask:
  8361                              <1> 	; 10/08/2016
  8362                              <1> 	; BL = mask value
  8363 000036EB 66BAC603            <1> 	mov	dx, 3C6h ; VGAREG_PEL_MASK
  8364 000036EF 88D8                <1> 	mov	al, bl
  8365 000036F1 EE                  <1> 	out	dx, al
  8366 000036F2 E93BE4FFFF          <1> 	jmp	VIDEO_RETURN
  8367                              <1> 
  8368                              <1> read_pel_mask:
  8369                              <1> 	; 10/08/2016
  8370                              <1> 	; Output: BL = mask value 
  8371 000036F7 66BAC603            <1> 	mov	dx, 3C6h ; VGAREG_PEL_MASK
  8372 000036FB EC                  <1> 	in	al, dx
  8373 000036FC 8844240C            <1> 	mov	[esp+12], al ; bl
  8374 00003700 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 00003705 66BAC703            <1> 	mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
  8388 00003709 88D8                <1> 	mov	al, bl
  8389 0000370B EE                  <1> 	out	dx, al
  8390                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
  8391                              <1> 	; 02/08/2022
  8392 0000370C B2C9                <1> 	mov	dl, 0C9h
  8393 0000370E EC                  <1> 	in	al, dx
  8394 0000370F 88442415            <1> 	mov	[esp+21], al ; dh
  8395 00003713 EC                  <1> 	in	al, dx
  8396 00003714 88C5                <1> 	mov	ch, al
  8397 00003716 EC                  <1> 	in	al, dx
  8398 00003717 88C1                <1> 	mov	cl, al
  8399 00003719 66894C2410          <1> 	mov	[esp+16], cx ; cx
  8400 0000371E 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 00003723 89D7                <1> 	mov	edi, edx ; user buffer
  8414 00003725 89CA                <1> 	mov	edx, ecx
  8415                              <1> 	;shl	dx, 1 ; *2
  8416                              <1> 	; 02/08/2022
  8417 00003727 D1E2                <1> 	shl	edx, 1
  8418 00003729 01CA                <1> 	add	edx, ecx ; edx = 3*ecx
  8419 0000372B 89E5                <1> 	mov	ebp, esp
  8420 0000372D 89EE                <1> 	mov	esi, ebp
  8421 0000372F 29D6                <1> 	sub	esi, edx
  8422 00003731 6683E6FC            <1> 	and	si, 0FFFCh ; (dword alignment)
  8423 00003735 89F4                <1> 	mov	esp, esi
  8424 00003737 52                  <1> 	push	edx ; 3*ecx
  8425 00003738 66BAC703            <1> 	mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
  8426 0000373C 88D8                <1> 	mov	al, bl
  8427 0000373E EE                  <1> 	out	dx, al
  8428 0000373F 66BAC903            <1> 	mov	dx, 3C9h ; VGAREG_DAC_DATA
  8429 00003743 89F3                <1> 	mov	ebx, esi
  8430                              <1> read_dac_loop:
  8431 00003745 EC                  <1> 	in	al, dx
  8432 00003746 8803                <1> 	mov	[ebx], al
  8433 00003748 43                  <1> 	inc	ebx
  8434 00003749 EC                  <1> 	in	al, dx
  8435 0000374A 8803                <1> 	mov	[ebx], al
  8436 0000374C 43                  <1> 	inc	ebx
  8437 0000374D EC                  <1> 	in	al, dx
  8438 0000374E 8803                <1> 	mov	[ebx], al
  8439 00003750 43                  <1> 	inc	ebx
  8440                              <1> 	;dec	cx
  8441                              <1> 	; 02/08/2022
  8442 00003751 49                  <1> 	dec	ecx
  8443 00003752 75F1                <1> 	jnz	short read_dac_loop
  8444 00003754 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 00003755 E856D80000          <1> 	call	transfer_to_user_buffer
  8449 0000375A 89EC                <1> 	mov	esp, ebp
  8450 0000375C 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 00003761 52                  <1> 	push	edx
  8465 00003762 66BAC803            <1> 	mov	dx, 3C8h ; VGAREG_DAC_WRITE_ADDRESS
  8466 00003766 88D8                <1> 	mov	al, bl
  8467 00003768 EE                  <1> 	out	dx, al
  8468                              <1> 	;;mov	dx, 3C9h ; VGAREG_DAC_DATA
  8469                              <1> 	;inc	dx
  8470                              <1> 	; 03/08/2022
  8471 00003769 FEC2                <1> 	inc	dl
  8472                              <1> 	;pop	ax
  8473                              <1> 	; 12/04/2021
  8474 0000376B 58                  <1> 	pop	eax
  8475 0000376C 88E0                <1> 	mov	al, ah
  8476 0000376E EE                  <1> 	out	dx, al
  8477 0000376F 88E8                <1> 	mov	al, ch
  8478 00003771 EE                  <1> 	out	dx, al
  8479 00003772 88C8                <1> 	mov	al, cl
  8480 00003774 EE                  <1> 	out	dx, al
  8481 00003775 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 0000377A 89D6                <1> 	mov	esi, edx ; user buffer
  8495 0000377C 89CA                <1> 	mov	edx, ecx
  8496                              <1> 	;shl	cx, 1 ; *2
  8497                              <1> 	; 02/08/2022
  8498 0000377E D1E1                <1> 	shl	ecx, 1
  8499 00003780 01D1                <1> 	add	ecx, edx ; ecx = 3*ecx
  8500 00003782 89E5                <1> 	mov	ebp, esp
  8501 00003784 89EF                <1> 	mov	edi, ebp
  8502 00003786 29CF                <1> 	sub	edi, ecx
  8503 00003788 6683E7FC            <1> 	and	di, 0FFFCh ; (dword alignment)
  8504 0000378C 89FC                <1> 	mov	esp, edi
  8505 0000378E E867D80000          <1> 	call	transfer_from_user_buffer
  8506                              <1> 	;jc	VIDEO_RETURN
  8507                              <1> 
  8508 00003793 89D1                <1> 	mov	ecx, edx
  8509 00003795 66BAC803            <1> 	mov	dx, 3C8h ; VGAREG_DAC_WRITE_ADDRESS
  8510 00003799 88D8                <1> 	mov	al, bl
  8511 0000379B EE                  <1> 	out	dx, al
  8512                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
  8513                              <1> 	; 02/08/2022
  8514 0000379C FEC2                <1> 	inc	dl
  8515                              <1> set_dac_loop:
  8516 0000379E 8A07                <1> 	mov	al, [edi]
  8517 000037A0 EE                  <1> 	out	dx, al
  8518 000037A1 47                  <1> 	inc	edi
  8519 000037A2 8A07                <1> 	mov	al, [edi]
  8520 000037A4 EE                  <1> 	out	dx, al
  8521 000037A5 47                  <1> 	inc	edi
  8522 000037A6 8A07                <1> 	mov	al, [edi]
  8523 000037A8 EE                  <1> 	out	dx, al
  8524 000037A9 47                  <1> 	inc	edi
  8525                              <1> 	;dec	cx
  8526                              <1> 	; 02/08/2022
  8527 000037AA 49                  <1> 	dec	ecx
  8528 000037AB 75F1                <1> 	jnz	short set_dac_loop
  8529 000037AD 89EC                <1> 	mov	esp, ebp
  8530 000037AF 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 000037B4 89D7                <1> 	mov	edi, edx
  8540 000037B6 89E3                <1> 	mov	ebx, esp
  8541 000037B8 89DE                <1> 	mov	esi, ebx
  8542 000037BA 83EC14              <1> 	sub	esp, 20	 
  8543                              <1> 
  8544 000037BD B100                <1> 	mov	cl, 0
  8545                              <1> get_palette_loop:
  8546 000037BF 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8547 000037C3 EC                  <1> 	in	al, dx
  8548                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8549                              <1> 	; 03/08/2022
  8550 000037C4 B2C0                <1> 	mov	dl, 0C0h
  8551 000037C6 88C8                <1> 	mov	al, cl
  8552 000037C8 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 000037C9 FEC2                <1> 	inc	dl
  8557 000037CB EC                  <1> 	in	al, dx
  8558 000037CC 8803                <1> 	mov	[ebx], al
  8559 000037CE 43                  <1> 	inc	ebx
  8560 000037CF FEC1                <1> 	inc	cl
  8561 000037D1 80F910              <1> 	cmp	cl, 10h
  8562 000037D4 75E9                <1> 	jne	short get_palette_loop
  8563                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8564                              <1> 	; 03/08/2022
  8565 000037D6 B2DA                <1> 	mov	dl, 0DAh
  8566 000037D8 EC                  <1> 	in	al, dx
  8567                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8568                              <1> 	; 03/08/2022
  8569 000037D9 B2C0                <1> 	mov	dl, 0C0h
  8570 000037DB B011                <1> 	mov	al, 11h
  8571 000037DD EE                  <1> 	out	dx, al
  8572                              <1> 	;mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  8573                              <1> 	; 03/08/2022
  8574 000037DE FEC2                <1> 	inc	dl ; dx = 3C1h
  8575 000037E0 EC                  <1> 	in	al, dx
  8576 000037E1 8803                <1> 	mov	[ebx], al
  8577                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8578                              <1> 	; 03/08/2022
  8579 000037E3 B2DA                <1> 	mov	dl, 0DAh
  8580 000037E5 EC                  <1> 	in	al, dx
  8581                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8582                              <1> 	; 03/08/2022
  8583 000037E6 B2C0                <1> 	mov	dl, 0C0h
  8584 000037E8 B020                <1> 	mov	al, 20h
  8585 000037EA EE                  <1> 	out	dx, al
  8586                              <1> 	; ifdef VBOX
  8587                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8588                              <1> 	; 03/08/2022
  8589 000037EB B2DA                <1> 	mov	dl, 0DAh
  8590 000037ED 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 000037EE 29C9                <1> 	sub	ecx, ecx
  8596 000037F0 B111                <1> 	mov	cl, 17	
  8597                              <1> 
  8598                              <1> 	; ESI = source address in system space
  8599                              <1> 	; EDI = user's buffer address
  8600 000037F2 E8B9D70000          <1> 	call	transfer_to_user_buffer
  8601                              <1> 
  8602 000037F7 83C414              <1> 	add	esp, 20
  8603 000037FA 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 000037FF 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8620 00003803 EC                  <1> 	in	al, dx
  8621                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8622                              <1> 	; 02/08/2022
  8623 00003804 B240                <1> 	mov	dl, 40h
  8624 00003806 B010                <1> 	mov	al, 10h
  8625 00003808 EE                  <1> 	out	dx, al
  8626                              <1> 	;mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  8627                              <1> 	; 02/08/2022
  8628 00003809 FEC2                <1> 	inc	dl ; mov dl, 0C1h
  8629 0000380B EC                  <1> 	in	al, dx
  8630 0000380C 80E301              <1> 	and	bl, 01h
  8631 0000380F 750C                <1> 	jnz	short set_dac_page
  8632 00003811 247F                <1> 	and	al, 07Fh
  8633 00003813 C0E707              <1> 	shl	bh, 7
  8634 00003816 08F8                <1> 	or	al, bh
  8635                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8636                              <1> 	; 02/08/2022
  8637 00003818 FECA                <1> 	dec	dl ; mov dl, 0C0h
  8638 0000381A EE                  <1> 	out	dx, al
  8639 0000381B EB19                <1> 	jmp	short set_actl_normal
  8640                              <1> set_dac_page:
  8641                              <1> 	;push	ax
  8642                              <1> 	; 12/04/2021
  8643 0000381D 50                  <1> 	push	eax
  8644 0000381E 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8645 00003822 EC                  <1> 	in	al, dx
  8646                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8647                              <1> 	; 02/08/2022
  8648 00003823 B2C0                <1> 	mov	dl, 0C0h
  8649 00003825 B014                <1> 	mov	al, 14h
  8650 00003827 EE                  <1> 	out	dx, al
  8651                              <1> 	;pop	ax
  8652                              <1> 	; 12/04/2021
  8653 00003828 58                  <1> 	pop	eax
  8654 00003829 2480                <1> 	and	al, 80h
  8655 0000382B 7503                <1> 	jnz	short set_dac_16_page
  8656 0000382D C0E702              <1> 	shl	bh, 2
  8657                              <1> set_dac_16_page:
  8658 00003830 80E70F              <1> 	and	bh, 0Fh
  8659 00003833 88F8                <1> 	mov	al, bh
  8660 00003835 EE                  <1> 	out	dx, al
  8661                              <1> set_actl_normal:
  8662 00003836 B020                <1> 	mov	al, 20h
  8663 00003838 EE                  <1> 	out	dx, al
  8664                              <1> 	; ifdef VBOX
  8665                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8666                              <1> 	; 02/08/2022
  8667 00003839 B2DA                <1> 	mov	dl, 0DAh
  8668 0000383B EC                  <1> 	in	al, dx
  8669                              <1> 	; endif ; VBOX
  8670 0000383C 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 00003841 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8680 00003845 EC                  <1> 	in	al, dx
  8681 00003846 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8682 0000384A B010                <1> 	mov	al, 10h
  8683 0000384C EE                  <1> 	out	dx, al
  8684 0000384D 66BAC103            <1> 	mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  8685 00003851 EC                  <1> 	in	al, dx
  8686 00003852 88C3                <1> 	mov	bl, al
  8687 00003854 C0EB07              <1> 	shr	bl, 7
  8688 00003857 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8689 0000385B EC                  <1> 	in	al, dx
  8690 0000385C 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8691 00003860 B014                <1> 	mov	al, 14h
  8692 00003862 EE                  <1> 	out	dx, al
  8693 00003863 66BAC103            <1> 	mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  8694 00003867 EC                  <1> 	in	al, dx
  8695 00003868 88C7                <1> 	mov	bh, al
  8696 0000386A 80E70F              <1> 	and	bh, 0Fh
  8697 0000386D F6C301              <1> 	test	bl, 01
  8698 00003870 7503                <1> 	jnz	short get_dac_16_page
  8699 00003872 C0EF02              <1> 	shr	bh, 2
  8700                              <1> get_dac_16_page:
  8701 00003875 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8702 00003879 EC                  <1> 	in	al, dx
  8703 0000387A 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8704 0000387E B020                <1> 	mov	al, 20h
  8705 00003880 EE                  <1> 	out	dx, al
  8706                              <1> 	; ifdef VBOX
  8707 00003881 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8708 00003885 EC                  <1> 	in	al, dx
  8709                              <1> 	; endif ; VBOX 
  8710 00003886 66895C240C          <1> 	mov	[esp+12], bx ; bx
  8711 0000388B 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 00003890 55                  <1> 	push	ebp ; ***
  8846 00003891 56                  <1> 	push	esi ; **** 
  8847                              <1> 	
  8848 00003892 31FF                <1> 	xor	edi, edi  ; mov edi, 0
  8849                              <1> 
  8850 00003894 803D[86090000]03    <1> 	cmp	byte [vbe3], 3
  8851 0000389B 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 0000389D 66B8014F            <1> 	mov	ax, 4F01h
  8859                              <1> 
  8860 000038A1 E826E0FFFF          <1> 	call	_vbe3_pmfn_return_mode_info
  8861                              <1> 
  8862 000038A6 6683F84F            <1> 	cmp	ax, 004Fh
  8863 000038AA 7533                <1> 	jne	short _vbe_rmi_2 ; fail
  8864                              <1> 
  8865                              <1> 	; 15/12/2020
  8866                              <1> 	; cx = vbe video mode
  8867 000038AC 80E501              <1> 	and	ch, 01h ; clear LFB flag
  8868 000038AF BEFE7B0900          <1> 	mov	esi, VBE3MODEINFOBLOCK - 2
  8869 000038B4 66890E              <1> 	mov	[esi], cx ; MODEINFO.mode
  8870 000038B7 E8A5000000          <1> 	call	set_lfbinfo_table
  8871 000038BC EB22                <1> 	jmp	short _vbe_rmi_3  ; cf = 0 
  8872                              <1> _vbe_rmi_1:
  8873 000038BE 803D[86090000]02    <1> 	cmp	byte [vbe3], 2
  8874 000038C5 7219                <1> 	jb	short _vbe_rmi_3 ; cf = 1
  8875 000038C7 A0[87090000]        <1> 	mov	al, [vbe2bios] ; 0C0h-0C5h for emu (*)
  8876 000038CC 3CC0                <1> 	cmp	al, 0C0h ; BOCHS/QEMU/VIRTUALBOX (*) ? 
  8877 000038CE 7210                <1> 	jb	short _vbe_rmi_3  ; cf = 1
  8878 000038D0 3CC5                <1> 	cmp	al, 0C5h ; (*)
  8879 000038D2 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 000038D4 E80A000000          <1> 	call	vbe_biosfn_return_mode_info
  8889 000038D9 6683F84F            <1> 	cmp	ax, 004Fh ; successful ?
  8890 000038DD 7401                <1> 	je	short _vbe_rmi_3  ; cf = 0
  8891                              <1> _vbe_rmi_2:
  8892 000038DF F9                  <1> 	stc
  8893                              <1> 	; cf = 1	
  8894                              <1> _vbe_rmi_3:
  8895 000038E0 5E                  <1> 	pop	esi ; ****
  8896 000038E1 5D                  <1> 	pop	ebp ; ***
  8897                              <1> 	
  8898                              <1> 	;pop	es  ; **
  8899                              <1> 	;pop	ss  ; *
  8900                              <1> 	
  8901 000038E2 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 000038E3 F6C501              <1> 	test	ch, 1
  8942 000038E6 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 000038E8 29C0                <1> 	sub	eax, eax
  8948                              <1> vbe_rmi_0:	
  8949                              <1> 	;mov	ax, 0100h  ; Function is not supported
  8950 000038EA B401                <1> 	mov	ah, 1
  8951 000038EC C3                  <1> 	retn
  8952                              <1> vbe_rmi_1:
  8953 000038ED 52                  <1> 	push	edx ; *****
  8954 000038EE 51                  <1> 	push	ecx ; ******
  8955 000038EF 53                  <1> 	push	ebx ; *******	
  8956 000038F0 57                  <1> 	push	edi ; ********
  8957                              <1> 	
  8958                              <1> 	; 14/12/2020
  8959 000038F1 89CB                <1> 	mov	ebx, ecx
  8960                              <1>  			
  8961                              <1> 	;xor	eax, eax
  8962 000038F3 80E7C1              <1> 	and	bh, 0C1h ; use bit 15, 14, 8 only (for bh)
  8963 000038F6 883D[65A30100]      <1> 	mov	[vbe_mode_x], bh
  8964                              <1> 	;and	bx, 1FFh
  8965 000038FC 80E701              <1> 	and	bh, 1
  8966                              <1> 	;mov	bh, 1
  8967                              <1> 
  8968                              <1> 	; Alternative 2 (instead of 'Mode_info_find_mode')
  8969 000038FF 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 00003904 09F6                <1> 	or	esi, esi
  8979                              <1> 	; 14/12/2020
  8980 00003906 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 00003908 F605[65A30100]40    <1> 	test	byte [vbe_mode_x], 40h ; LFB model ?
  8990 0000390F 7404                <1> 	jz	short vbe_rmi_2
  8991                              <1> 	
  8992 00003911 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 00003915 E835070000          <1> 	call	pci_get_lfb_addr
  9000                              <1> 	;or	eax, eax
  9001 0000391A 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 0000391C 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 00003920 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 00003925 8B3C24              <1> 	mov	edi, [esp]  ; user's buffer address
  9026                              <1> 	; 12/12/2020
  9027 00003928 09FF                <1> 	or	edi, edi ; 0 = kernel call 
  9028                              <1> 			 ; (call from '_vbe_biosfn_return_mode_info')
  9029 0000392A 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 0000392C 57                  <1> 	push	edi
  9035 0000392D BE[84A30100]        <1> 	mov	esi, MODE_INFO_LIST + 2	; MODEINFO.ModeAttributes
  9036 00003932 BF007C0900          <1> 	mov	edi, VBE3MODEINFOBLOCK
  9037                              <1> 	;mov	ecx, 66/4  ; 66 bytes
  9038                              <1> 	; 03/08/2022
  9039 00003937 29C9                <1> 	sub	ecx, ecx
  9040 00003939 B110                <1> 	mov	cl, 66/4
  9041 0000393B F3A5                <1> 	rep	movsd
  9042 0000393D 31C0                <1> 	xor	eax, eax
  9043 0000393F B12F                <1> 	mov	cl, (256-68)/4 ; 188 bytes
  9044 00003941 F3AB                <1> 	rep	stosd
  9045 00003943 66AB                <1> 	stosw	; 2 bytes
  9046 00003945 5F                  <1> 	pop	edi
  9047 00003946 BE007C0900          <1> 	mov	esi, VBE3MODEINFOBLOCK
  9048                              <1> 	;mov	cx, 256 
  9049 0000394B FEC5                <1> 	inc	ch ; cx = 256
  9050 0000394D E85ED60000          <1> 	call	transfer_to_user_buffer
  9051 00003952 7309                <1> 	jnc	short vbe_rmi_5
  9052                              <1> vbe_rmi_4:
  9053                              <1> 	;mov	eax, 014Fh ; fail/error
  9054 00003954 31C0                <1> 	xor	eax, eax
  9055 00003956 B401                <1> 	mov	ah, 01h
  9056                              <1> 	;jmp	short vbe_rmi_6
  9057 00003958 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 0000395D 31C0                <1> 	xor	eax, eax
  9063                              <1> ;vbe_rmi_6:
  9064 0000395F 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 00003961 BF[72A30100]        <1> 	mov	edi, LFB_Info
  9092 00003966 8B462A              <1> 	mov	eax, [esi+MODEINFO.PhysBasePtr]
  9093 00003969 894702              <1> 	mov	[edi+LFBINFO.LFB_addr], eax ; LFB address
  9094                              <1> 	;mov	ax, [esi+MODEINFO.mode]
  9095 0000396C 668B06              <1> 	mov	ax, [esi]
  9096 0000396F 668907              <1> 	mov	[edi+LFBINFO.mode],ax
  9097 00003972 8A461B              <1> 	mov	al, [esi+MODEINFO.BitsPerPixel]
  9098 00003975 88470E              <1> 	mov	[edi+LFBINFO.bpp], al
  9099 00003978 29C0                <1> 	sub	eax, eax
  9100 0000397A 668B4614            <1> 	mov	ax, [esi+MODEINFO.XResolution]
  9101 0000397E 6689470A            <1> 	mov	[edi+LFBINFO.X_res], ax
  9102 00003982 89C2                <1> 	mov	edx, eax ; 19/12/2020
  9103 00003984 668B4616            <1> 	mov	ax, [esi+MODEINFO.YResolution]
  9104 00003988 6689470C            <1> 	mov	[edi+LFBINFO.Y_res], ax
  9105                              <1> 	; eax = Y_res ; screen height
  9106                              <1> 	; 19/12/2020	
  9107 0000398C F7E2                <1> 	mul	edx ; X_res*Y_res
  9108                              <1> 	; edx = 0
  9109 0000398E 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 00003991 C0EA03              <1> 	shr	dl, 3 ; convert bits to byte
  9114 00003994 F7E2                <1> 	mul	edx
  9115                              <1> 	; eax = screen/page/buffer size in bytes
  9116 00003996 894706              <1> 	mov	[edi+LFBINFO.LFB_size], eax
  9117                              <1> 	; edx = 0
  9118                              <1> 	; clear reserved byte in LFBINFO structure/table
  9119 00003999 88570F              <1> 	mov	[edi+LFBINFO.reserved], dl ; not necessary
  9120 0000399C 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 0000399D 52                  <1> 	push	edx ; *****
  9162 0000399E 51                  <1> 	push	ecx ; ******
  9163 0000399F 53                  <1> 	push	ebx ; *******	
  9164 000039A0 57                  <1> 	push	edi ; ********
  9165                              <1> 
  9166                              <1> 	;xor	eax, eax
  9167 000039A1 80E7C1              <1> 	and	bh, 0C1h ; use bit 15, 14, 8 only (for bh)
  9168 000039A4 883D[65A30100]      <1> 	mov	[vbe_mode_x], bh
  9169 000039AA 80E701              <1> 	and	bh, 1
  9170 000039AD 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 000039AF 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 000039B1 8405[65A30100]      <1> 	test	[vbe_mode_x], al ; 80h
  9185 000039B7 7402                <1> 	jz	short vbe_sm_1 ; clear display memory
  9186                              <1> 	; no_clear
  9187 000039B9 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 000039BB 31C0                <1> 	xor	eax, eax ; 0 
  9230 000039BD E89C040000          <1> 	call	dispi_set_enable
  9231                              <1> 	
  9232 000039C2 88D8                <1> 	mov	al, bl
  9233                              <1> 	;jmp	_set_mode ; (in 'biosfn_set_video_mode' sub)
  9234 000039C4 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 000039C9 721A                <1> 	jc	short vbe_sm_2 ; 25/11/2020
  9238                              <1> 
  9239                              <1> 	; 26/11/2020
  9240 000039CB 31C0                <1> 	xor	eax, eax 
  9241 000039CD A0[DE670000]        <1> 	mov	al, [CRT_MODE]
  9242                              <1> 	; 27/11/2020
  9243 000039D2 8A25[8F890100]      <1> 	mov	ah, [noclearmem] ; 80h or 0
  9244                              <1> 	;and	ah 80h
  9245 000039D8 66A3[66A30100]      <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 000039DE B04F                <1> 	mov	al, 4Fh ; Function call successful
  9252                              <1> 	; eax = 004Fh
  9253                              <1> vbe_sm_ret2:
  9254                              <1> 	; 11/12/2020
  9255 000039E0 5F                  <1> 	pop	edi ; ********
  9256 000039E1 5B                  <1> 	pop	ebx ; *******
  9257 000039E2 59                  <1> 	pop	ecx ; ******
  9258 000039E3 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 000039E4 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 000039E5 31C0                <1> 	xor	eax, eax
  9271 000039E7 B401                <1> 	mov	ah, 01h
  9272                              <1> 	; eax = 0100h
  9273                              <1> 	;retn
  9274 000039E9 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 000039EB 803D[DE670000]03    <1> 	cmp	byte [CRT_MODE], 03h
  9281                              <1> 	;jne	short vbe_sm_0
  9282 000039F2 7505                <1> 	jne	short vbe_sm_4 ; 07/03/2021
  9283 000039F4 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 000039F9 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 000039FE 09F6                <1> 	or	esi, esi
  9303 00003A00 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 00003A02 668B1E              <1> 	mov	bx, [esi] ; mode
  9308                              <1> 
  9309                              <1> 	; 27/11/2020
  9310 00003A05 0A3D[65A30100]      <1> 	or	bh, [vbe_mode_x]
  9311                              <1> 
  9312                              <1> 	; save VESA VBE mode
  9313 00003A0B 66891D[66A30100]    <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 00003A12 29C0                <1> 	sub	eax, eax ; 0
  9327                              <1> 
  9328 00003A14 E845040000          <1> 	call	dispi_set_enable
  9329                              <1> 
  9330                              <1> 	; 11/12/2020
  9331 00003A19 8A461B              <1> 	mov	al, [esi+MODEINFO.BitsPerPixel]
  9332                              <1> 	; ah = 0
  9333                              <1> 
  9334                              <1> 	;cmp	byte [esi+MODEINFO.BitsPerPixel], 8
  9335 00003A1C 3C08                <1> 	cmp	al, 8
  9336 00003A1E 750B                <1> 	jne	short vbe_sm_5
  9337                              <1> 
  9338                              <1> 	; 11/12/2020
  9339                              <1> 	;push	edi
  9340 00003A20 50                  <1> 	push	eax
  9341                              <1> 	; 'load_dac_palette(3);'
  9342 00003A21 56                  <1> 	push	esi
  9343 00003A22 B403                <1> 	mov	ah, 3  ; palette3, 256 colors
  9344 00003A24 E8BBF1FFFF          <1> 	call	load_dac_palette
  9345 00003A29 5E                  <1> 	pop	esi
  9346                              <1> 	; 11/12/2020
  9347 00003A2A 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 00003A2B E841040000          <1> 	call	dispi_set_bpp
  9355                              <1>         ;'dispi_set_xres(cur_info->info.XResolution);'
  9356 00003A30 668B4614            <1> 	mov	ax, [esi+MODEINFO.XResolution]
  9357 00003A34 E83E040000          <1> 	call	dispi_set_xres
  9358                              <1>         ;'dispi_set_yres(cur_info->info.YResolution);'
  9359 00003A39 668B4616            <1> 	mov	ax, [esi+MODEINFO.YResolution]
  9360 00003A3D E83B040000          <1> 	call	dispi_set_yres
  9361                              <1> 
  9362                              <1> 	;'dispi_set_bank(0);'
  9363                              <1> 	;xor	ax, ax
  9364 00003A42 31C0                <1> 	xor	eax, eax ; 0
  9365 00003A44 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 00003A49 A0[65A30100]        <1> 	mov	al, [vbe_mode_x] ; restore VBE mode bit 14 & 15
  9370 00003A4E 0C01                <1> 	or	al, 1 ; VBE_DISPI_ENABLED
  9371 00003A50 E809040000          <1> 	call	dispi_set_enable
  9372                              <1> 
  9373                              <1>         ; 'vga_compat_setup();'
  9374 00003A55 E83E040000          <1> 	call	vga_compat_setup
  9375                              <1> 
  9376                              <1> 	; 11/12/2020
  9377 00003A5A E802FFFFFF          <1> 	call	set_lfbinfo_table
  9378                              <1> 
  9379                              <1> 	; 26/11/2020
  9380 00003A5F 31C0                <1> 	xor	eax, eax
  9381 00003A61 FEC8                <1> 	dec	al 
  9382 00003A63 A2[DE670000]        <1> 	mov	[CRT_MODE], al ; 0FFh = VESA VBE mode sign
  9383                              <1> 
  9384                              <1> 	; 27/11/2020
  9385 00003A68 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 00003A6D A0[DE670000]        <1> 	mov	al, [CRT_MODE] ; current cga/vga mode
  9435 00003A72 3CFF                <1> 	cmp	al, 0FFh ; VBE extension signature
  9436 00003A74 720E                <1> 	jb	short vbe_gm_1 ; get CGA/VGA mode
  9437                              <1> 
  9438                              <1> 	; get VBE mode
  9439                              <1> vbe_gm_0:
  9440 00003A76 66A1[66A30100]      <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 00003A7C 0FB7D8              <1> 	movzx	ebx, ax
  9454                              <1> ;vbe_srs_retn:
  9455 00003A7F 31C0                <1> 	xor	eax, eax ; 0
  9456 00003A81 B04F                <1> 	mov	al, 4Fh ; ax = 004Fh (successful)
  9457 00003A83 C3                  <1> 	retn	
  9458                              <1> 
  9459                              <1> vbe_gm_1:
  9460                              <1> 	; legacy (old, standard) CGA/VGA bios video mode
  9461 00003A84 8A25[8F890100]      <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 00003A8A 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 00003A8C 09DB                <1> 	or	ebx, ebx ; user's buffer address
  9516 00003A8E 750A                <1> 	jnz	short _vbe_biosfn_save_restore_state
  9517                              <1> 
  9518 00003A90 20D2                <1> 	and	dl, dl
  9519 00003A92 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 00003A94 B84F010000          <1> 	mov	eax, 014Fh
  9527 00003A99 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 00003A9A 57                  <1> 	push	edi
  9536 00003A9B 52                  <1> 	push	edx
  9537 00003A9C 51                  <1> 	push	ecx
  9538                              <1> 
  9539                              <1> 	; 23/01/2021
  9540                              <1> 	; 12/01/2021
  9541 00003A9D 80FA02              <1> 	cmp	dl, 2
  9542 00003AA0 7757                <1> 	ja	short vbe_srs_7 ; 23/01/2021
  9543                              <1> 			; invalid sub function
  9544 00003AA2 83F90F              <1> 	cmp	ecx, 0Fh
  9545 00003AA5 7752                <1> 	ja	short vbe_srs_7 ; invalid !
  9546                              <1> 	
  9547 00003AA7 20D2                <1> 	and	dl, dl
  9548 00003AA9 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 00003AAB 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 00003AB0 6683C33F            <1> 	add	bx, 63
  9584 00003AB4 66C1EB06            <1> 	shr	bx, 6 ; / 64
  9585                              <1> 
  9586                              <1> vbe_srs_retn:
  9587 00003AB8 31C0                <1> 	xor	eax, eax ; 0
  9588                              <1> vbe_srs_0:  ; 16/01/2021
  9589 00003ABA B04F                <1> 	mov	al, 4Fh ; ax = 004Fh (successful)
  9590                              <1> ;vbe_srs_0:
  9591                              <1> 	; 13/01/2021
  9592 00003ABC 59                  <1> 	pop	ecx
  9593 00003ABD 5A                  <1> 	pop	edx
  9594 00003ABE 5F                  <1> 	pop	edi	
  9595                              <1> 
  9596 00003ABF 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 00003AC0 80E10F              <1> 	and	cl, 0Fh ; 8, 4, 2, 1
  9609 00003AC3 7434                <1> 	jz	short vbe_srs_7 ; cx = 0 -> invalid !
  9610                              <1> 
  9611 00003AC5 BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK
  9612                              <1> 
  9613 00003ACA 80FA01              <1> 	cmp	dl, 1
  9614 00003ACD 7730                <1> 	ja	short vbe_srs_8
  9615                              <1> 
  9616                              <1> 	; save video state
  9617                              <1> 
  9618 00003ACF F6C107              <1> 	test	cl, 07h ; 4, 2, 1
  9619 00003AD2 740A                <1> 	jz	short vbe_srs_5  ; vbe dispi regs state
  9620                              <1> 
  9621 00003AD4 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 00003AD9 F6C108              <1> 	test	cl, 8
  9627 00003ADC 7405                <1> 	jz	short vbe_srs_6
  9628                              <1> vbe_srs_5:
  9629 00003ADE 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 00003AE3 21DB                <1> 	and	ebx, ebx 
  9637 00003AE5 74D1                <1> 	jz	short vbe_srs_retn ; the caller is kernel
  9638                              <1> 	
  9639 00003AE7 BE00760900          <1> 	mov	esi, VBE3SAVERESTOREBLOCK
  9640 00003AEC 29F7                <1> 	sub	edi, esi
  9641 00003AEE 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 00003AF0 89DF                <1> 	mov	edi, ebx ; user's buffer address
  9648 00003AF2 E8B9D40000          <1> 	call	transfer_to_user_buffer
  9649 00003AF7 73BF                <1> 	jnc	short vbe_srs_retn
  9650                              <1> vbe_srs_7:
  9651                              <1> 	; // function failed
  9652                              <1> 	;mov	eax, 0100h
  9653 00003AF9 31C0                <1> 	xor	eax, eax
  9654 00003AFB FEC4                <1> 	inc	ah  ; eax = 0100h
  9655                              <1> 	; 16/01/2021
  9656                              <1> 	; ax = 0014Fh
  9657                              <1> 	;retn
  9658                              <1> 	; 13/01/2021
  9659 00003AFD 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 00003AFF 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 00003B01 7414                <1> 	jz	short vbe_srs_12 ; 'sysvideo' call
  9673                              <1> vbe_srs_11:
  9674 00003B03 89DE                <1> 	mov	esi, ebx ; user's buffer address
  9675                              <1> 	; 23/01/2021
  9676                              <1> 	;push	ebx
  9677                              <1> 	
  9678 00003B05 E827000000          <1> 	call	vbe_srs_gbs
  9679                              <1> 	
  9680                              <1> 	; restore video state
  9681                              <1> 
  9682                              <1> 	;mov	edi, VBE3SAVERESTOREBLOCK
  9683 00003B0A 51                  <1> 	push	ecx
  9684 00003B0B 89D9                <1> 	mov	ecx, ebx ; transfer count in bytes
  9685 00003B0D E8E8D40000          <1> 	call	transfer_from_user_buffer
  9686 00003B12 59                  <1> 	pop	ecx
  9687                              <1> 	; 23/01/2021
  9688                              <1> 	;pop	ebx
  9689 00003B13 89F3                <1> 	mov	ebx, esi
  9690 00003B15 72E2                <1> 	jc	short vbe_srs_7
  9691                              <1> 
  9692                              <1> vbe_srs_12:
  9693                              <1> 	;mov	esi, VBE3SAVERESTOREBLOCK
  9694 00003B17 89FE                <1> 	mov	esi, edi
  9695                              <1> 
  9696 00003B19 F6C107              <1> 	test	cl, 07h ; 4, 2, 1
  9697 00003B1C 740C                <1> 	jz	short vbe_srs_9	; vbe dispi regs state
  9698                              <1> 
  9699 00003B1E E8A2010000          <1> 	call	biosfn_restore_video_state
  9700 00003B23 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 00003B25 F6C108              <1> 	test	cl, 8
  9706                              <1> 	;jz	short vbe_srs_10
  9707                              <1> 	; 23/01/2020
  9708 00003B28 EB8E                <1> 	jmp	short vbe_srs_retn
  9709                              <1> vbe_srs_9:
  9710 00003B2A E8F1020000          <1> 	call	vbe_biosfn_restore_video_state
  9711                              <1> 
  9712                              <1> 	; modified regs: esi, eax, edx, ch
  9713                              <1> 
  9714 00003B2F 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 00003B31 89CB                <1> 	mov	ebx, ecx ; options/flags
  9725 00003B33 D0E3                <1> 	shl	bl, 1
  9726 00003B35 668B9B[3D3B0000]    <1> 	mov	bx, [ebx+vbestatebufsize]
  9727 00003B3C C3                  <1> 	retn
  9728                              <1> 
  9729                              <1> vbestatebufsize:
  9730                              <1> 	; ----------------------------------------
  9731                              <1> 	; CL =	0  1   2    3    4    5    6    7
  9732                              <1> 	; ----------------------------------------
  9733 00003B3D 0000460028006E0004- <1> 	dw	0, 70, 40, 110, 772, 842, 812, 882
  9733 00003B46 034A032C037203      <1>
  9734                              <1> 	; ----------------------------------------
  9735                              <1> 	; CL =	8   9   10  11   12   13   14   15
  9736                              <1> 	; ----------------------------------------
  9737 00003B4D 120058003A00800016- <1> 	dw	18, 88, 58, 128, 790, 860, 830, 900
  9737 00003B56 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 00003B5D F6C101              <1> 	test	cl, 1
  9789 00003B60 0F8485000000        <1> 	jz	bfn_svs_4
  9790                              <1> 
  9791 00003B66 66BAC403            <1> 	mov	dx, VGAREG_SEQU_ADDRESS ; 3C7h
  9792 00003B6A EC                  <1> 	in	al, dx
  9793 00003B6B AA                  <1> 	stosb
  9794                              <1> 	;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
  9795 00003B6C B2D4                <1> 	mov	dl, 0D4h
  9796 00003B6E EC                  <1> 	in	al, dx
  9797 00003B6F AA                  <1> 	stosb
  9798                              <1>   	;mov	dx, VGAREG_GRDC_ADDRESS ; 3CEh 
  9799 00003B70 B2CE                <1>         mov	dl, 0CEh
  9800 00003B72 EC                  <1> 	in	al, dx
  9801 00003B73 AA                  <1> 	stosb
  9802                              <1> 	;mov	dx, VGAREG_ACTL_RESET ; 3DAh
  9803 00003B74 B2DA                <1> 	mov	dl, 0DAh
  9804 00003B76 EC                  <1> 	in	al, dx
  9805                              <1> 	;mov	dx, VGAREG_ACTL_ADDRESS ; 3C0h
  9806 00003B77 B2C0                <1> 	mov	dl, 0C0h
  9807 00003B79 EC                  <1> 	in	al, dx
  9808 00003B7A AA                  <1> 	stosb
  9809 00003B7B 88C4                <1> 	mov	ah, al ; ar_index
  9810                              <1> 	;mov	dx, VGAREG_READ_FEATURE_CTL ; 3CAh
  9811 00003B7D B2CA                <1> 	mov	dl, 0CAh
  9812 00003B7F EC                  <1> 	in	al, dx
  9813 00003B80 AA                  <1> 	stosb
  9814                              <1> 	; (5 bytes are writen above)
  9815                              <1> 
  9816                              <1> 	; for(i=1;i<=4;i++){
  9817 00003B81 B001                <1> 	mov	al, 1
  9818                              <1> 	;;mov	dx, VGAREG_SEQU_ADDRESS ; 3C4h
  9819                              <1> 	;mov	dl, 0C4h
  9820 00003B83 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 00003B85 B2C4                <1> 	mov	dl, 0C4h
  9825 00003B87 EE                  <1> 	out	dx, al
  9826                              <1> 	;mov	dx, VGAREG_SEQU_DATA  ; 3C5h
  9827 00003B88 FEC2                <1> 	inc	dl  ; dx = 3C5h
  9828                              <1> 	; inb(VGAREG_SEQU_DATA)
  9829 00003B8A 50                  <1> 	push	eax
  9830 00003B8B EC                  <1> 	in	al, dx
  9831 00003B8C AA                  <1> 	stosb	; (4 bytes in loop)
  9832 00003B8D 58                  <1> 	pop	eax
  9833                              <1> 	;mov	dx, VGAREG_SEQU_ADDRESS ; 3C4h
  9834                              <1> 	;dec	dl	
  9835 00003B8E FEC0                <1> 	inc	al  ; i++
  9836 00003B90 FECD                <1> 	dec	ch
  9837 00003B92 75F1                <1> 	jnz	short bfn_svs_0
  9838                              <1> 
  9839                              <1> 	; outb(VGAREG_SEQU_ADDRESS, 0);
  9840 00003B94 28C0                <1> 	sub	al, al ; 0
  9841 00003B96 EE                  <1> 	out	dx, al
  9842                              <1> 	; inb(VGAREG_SEQU_DATA)
  9843                              <1> 	;mov	dx, VGAREG_SEQU_DATA ; 3C5h
  9844 00003B97 FEC2                <1> 	inc	dl  ; dx = 3C5h
  9845 00003B99 EC                  <1> 	in	al, dx
  9846 00003B9A AA                  <1> 	stosb	; (+1 byte)
  9847                              <1> 
  9848                              <1>         ; for(i=0;i<=0x18;i++) {
  9849 00003B9B 28C0                <1> 	sub	al, al ; 0
  9850                              <1> 	;;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
  9851                              <1> 	;mov	dl, 0D4h
  9852 00003B9D 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 00003B9F B2D4                <1> 	mov	dl, 0D4h
  9857 00003BA1 EE                  <1> 	out	dx, al
  9858                              <1> 	;mov	dx, VGAREG_VGA_CRTC_DATA ; 3D5h
  9859 00003BA2 FEC2                <1> 	inc	dl  ; dx = 3D5h
  9860                              <1> 	; inb(crtc_addr+1)
  9861 00003BA4 50                  <1> 	push	eax
  9862 00003BA5 EC                  <1> 	in	al, dx
  9863 00003BA6 AA                  <1> 	stosb	; (25 bytes in loop)
  9864 00003BA7 58                  <1> 	pop	eax
  9865                              <1> 	;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
  9866                              <1> 	;dec	dl	
  9867 00003BA8 FEC0                <1> 	inc	al  ; i++
  9868 00003BAA FECD                <1> 	dec	ch
  9869 00003BAC 75F1                <1> 	jnz	short bfn_svs_1
  9870                              <1> 
  9871 00003BAE 80E420              <1> 	and	ah, 20h  ; (ar_index & 0x20)
  9872                              <1>         ; for(i=0;i<=0x13;i++) {
  9873 00003BB1 28C0                <1> 	sub	al, al ; 0
  9874 00003BB3 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 00003BB5 B2DA                <1> 	mov	dl, 0DAh
  9879 00003BB7 50                  <1> 	push	eax
  9880 00003BB8 EC                  <1> 	in	al, dx
  9881 00003BB9 8A0424              <1> 	mov	al, [esp]
  9882                              <1>  	; outb(VGAREG_ACTL_ADDRESS, i | (ar_index & 0x20));
  9883 00003BBC 08E0                <1> 	or	al, ah
  9884                              <1> 	;mov	dx, VGAREG_ACTL_ADDRESS ; 3C0h
  9885 00003BBE B2C0                <1> 	mov	dl, 0C0h
  9886 00003BC0 EE                  <1> 	out	dx, al
  9887                              <1> 	;mov	dx, VGAREG_ACTL_READ_DATA ; 3C1h
  9888                              <1> 	;mov	dl, 0C1h
  9889 00003BC1 FEC2                <1> 	inc	dl
  9890 00003BC3 EC                  <1> 	in	al, dx
  9891 00003BC4 AA                  <1> 	stosb	; (20 bytes in loop)
  9892 00003BC5 58                  <1> 	pop	eax
  9893 00003BC6 FEC0                <1> 	inc	al  ; i++
  9894 00003BC8 FECD                <1> 	dec	ch
  9895 00003BCA 75E9                <1> 	jnz	short bfn_svs_2
  9896                              <1> 
  9897                              <1> 	; inb(VGAREG_ACTL_RESET);
  9898                              <1> 	;mov	dx, VGAREG_ACTL_RESET ; 3DAh
  9899 00003BCC B2DA                <1> 	mov	dl, 0DAh
  9900 00003BCE EC                  <1> 	in	al, dx
  9901                              <1> 
  9902                              <1>         ; for(i=0;i<=8;i++) {
  9903 00003BCF 28C0                <1> 	sub	al, al ; 0
  9904                              <1> 	;;mov	dx, VGAREG_GRDC_ADDRESS ; 3CEh
  9905                              <1> 	;mov	dl, 0CEh
  9906 00003BD1 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 00003BD3 B2CE                <1> 	mov	dl, 0CEh
  9911 00003BD5 EE                  <1> 	out	dx, al
  9912                              <1> 	; inb(VGAREG_ACTL_READ_DATA)
  9913 00003BD6 50                  <1> 	push	eax
  9914                              <1> 	;mov	dx, VGAREG_GRDC_DATA ; 3CFh
  9915                              <1> 	;mov	dl, 0CFh
  9916 00003BD7 FEC2                <1> 	inc	dl
  9917 00003BD9 EC                  <1> 	in	al, dx
  9918 00003BDA AA                  <1> 	stosb	; (9 bytes in loop)
  9919 00003BDB 58                  <1> 	pop	eax
  9920                              <1> 	;dec	dl
  9921 00003BDC FEC0                <1> 	inc	al  ; i++
  9922 00003BDE FECD                <1> 	dec	ch
  9923 00003BE0 75F1                <1> 	jnz	short bfn_svs_3
  9924                              <1> 
  9925                              <1> 	; write_word(ES, BX, crtc_addr); BX+= 2;
  9926                              <1> 	; (offset 64)
  9927 00003BE2 66B8D403            <1> 	mov	ax, 3D4h ; VGAREG_VGA_CRTC_ADDRESS
  9928 00003BE6 66AB                <1> 	stosw	; (2 bytes (1 word))
  9929                              <1> 
  9930                              <1>         ; /* XXX: read plane latches */
  9931 00003BE8 31C0                <1> 	xor	eax, eax  ; 0
  9932 00003BEA 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 00003BEB F6C102              <1> 	test	cl, 2
  9939 00003BEE 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 00003BF0 66B8D403            <1> 	mov	ax, 3D4h ; CRTC_ADDR, always 3D4h (color VGA) for TRDOS 386 v2
  9972 00003BF4 66AB                <1> 	stosw
  9973 00003BF6 A0[DE670000]        <1> 	mov	al, [CRT_MODE] ; Current video mode (0FFh for VESA VBE modes) 
  9974 00003BFB AA                  <1> 	stosb
  9975 00003BFC A0[DF670000]        <1> 	mov	al, [CRT_MODE_SET] ; 29h for mode 03h ; TRDOS 386 feature only !
  9976 00003C01 AA                  <1> 	stosb	
  9977 00003C02 66A1[66A30100]      <1>  	mov	ax, [video_mode] ; Current VESA VBE (SVGA, extended VGA) mode 
  9978 00003C08 66AB                <1> 	stosw			 ; (valid if [CRT_MODE] = 0FFh)	
  9979 00003C0A 66A1[90890100]      <1> 	mov	ax, [CRT_LEN] ; page size (in bytes)
  9980 00003C10 66AB                <1> 	stosw
  9981 00003C12 66A1[0C7D0100]      <1> 	mov	ax, [CRT_START] ; video page start offset
  9982 00003C18 66AB                <1>  	stosw
  9983 00003C1A A0[E0670000]        <1> 	mov	al, [CRT_COLS] ; nbcols, characters per row	
  9984 00003C1F AA                  <1> 	stosb
  9985 00003C20 A0[E6670000]        <1> 	mov	al, [VGA_ROWS] ; nbrows, (character) rows per page (not rows-1)
  9986 00003C25 AA                  <1> 	stosb
  9987 00003C26 A0[E2670000]        <1> 	mov	al, [CHAR_HEIGHT] ; character font height (8 or 16 or 14)
  9988 00003C2B AA                  <1> 	stosb
  9989 00003C2C A0[E3670000]        <1> 	mov	al, [VGA_VIDEO_CTL] ; ROM BIOS DATA AREA Offset 87h
  9990 00003C31 AA                  <1> 	stosb
  9991 00003C32 A0[E4670000]        <1> 	mov	al, [VGA_SWITCHES] ; feature bit switches
  9992 00003C37 AA                  <1> 	stosb
  9993 00003C38 A0[E5670000]        <1> 	mov	al, [VGA_MODESET_CTL] ; basic mode set options
  9994 00003C3D 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 00003C3E A0[E1670000]        <1> 	mov	al, [CRT_PALETTE] ; current color palette ; TRDOS 386 feature only !
  9998 00003C43 AA                  <1> 	stosb
  9999 00003C44 A0[1E7D0100]        <1> 	mov	al, [ACTIVE_PAGE] ; current video page 
 10000 00003C49 AA                  <1> 	stosb
 10001 00003C4A 66A1[F7670000]      <1> 	mov	ax, [CURSOR_MODE] ; cursor type
 10002 00003C50 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 00003C52 56                  <1> 	push	esi
 10012 00003C53 B504                <1> 	mov	ch, 4
 10013 00003C55 BE[0E7D0100]        <1> 	mov	esi, CURSOR_POSN
 10014                              <1> bfn_svs_5:
 10015 00003C5A A5                  <1> 	movsd
 10016 00003C5B FECD                <1> 	dec	ch
 10017 00003C5D 75FB                <1> 	jnz	short bfn_svs_5
 10018 00003C5F 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 00003C60 A1[A2890100]        <1> 	mov	eax, [VGA_INT43H] ; VGA current (default) font address
 10022 00003C65 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 00003C66 F6C104              <1> 	test	cl, 4
 10029 00003C69 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 00003C6B 66BAC703            <1>     	mov	dx, 3C7h ; VGAREG_DAC_STATE
 10046 00003C6F EC                  <1> 	in	al, dx
 10047 00003C70 AA                  <1> 	stosb
 10048                              <1> 	; /* pix address */
 10049                              <1>     	;mov	dx, VGAREG_DAC_WRITE_ADDRESS ; 3C8h
 10050                              <1> 	;mov	dl, 0C8h
 10051 00003C71 FEC2                <1> 	inc	dl
 10052 00003C73 EC                  <1> 	in	al, dx
 10053 00003C74 AA                  <1> 	stosb
 10054                              <1>     	;mov	dx, VGAREG_PEL_MASK  ; 3C6h
 10055 00003C75 B2C6                <1> 	mov	dl, 0C6h
 10056 00003C77 EC                  <1> 	in	al, dx
 10057 00003C78 AA                  <1> 	stosb
 10058                              <1> 	;// Set the whole dac always, from 0
 10059 00003C79 30C0                <1> 	xor	al, al ; 0
 10060                              <1> 	;mov	dx, VGAREG_DAC_WRITE_ADDRESS ; 3C8h
 10061 00003C7B B2C8                <1> 	mov	dl, 0C8h
 10062 00003C7D EE                  <1> 	out	dx, al
 10063                              <1> 
 10064 00003C7E 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 00003C7F 29C9                <1> 	sub	ecx, ecx
 10069 00003C81 B503                <1> 	mov	ch, 3
 10070                              <1> 	; ecx = 300h = 768
 10071                              <1> 	;mov	dx, VGAREG_DAC_DATA ; 3C9h
 10072                              <1> 	;mov	dl, 0C9h
 10073 00003C83 FEC2                <1> 	inc	dl ; dx = 3C9h
 10074                              <1> bfn_svs_7:
 10075 00003C85 EC                  <1> 	in	al, dx
 10076 00003C86 AA                  <1> 	stosb
 10077 00003C87 E2FC                <1> 	loop	bfn_svs_7
 10078 00003C89 59                  <1> 	pop	ecx ; 22/01/2021
 10079                              <1> 
 10080                              <1> 	; /* color select register */
 10081 00003C8A 28C0                <1> 	sub	al, al ; 0
 10082 00003C8C AA                  <1> 	stosb
 10083                              <1> 
 10084                              <1> 	; (total 772 bytes are written above as DAC state)
 10085                              <1> bfn_svs_8:
 10086 00003C8D 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 00003C8E 66BACE01            <1> 	mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10117                              <1> 	;mov	eax, 04h  ; VBE_DISPI_INDEX_ENABLE
 10118                              <1> 	 ;03/08/2022
 10119 00003C92 66EF                <1> 	out	dx, ax
 10120                              <1> 	;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA	
 10121 00003C94 FEC2                <1> 	inc	dl
 10122 00003C96 66ED                <1> 	in	ax, dx ; enable (status)
 10123 00003C98 66AB                <1> 	stosw 
 10124 00003C9A 6683E001            <1> 	and	ax, 1 ; VBE_DISPI_ENABLED
 10125 00003C9E 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 00003CA0 AB                  <1> 	stosd	; 2
 10133 00003CA1 AB                  <1> 	stosd	; 2
 10134 00003CA2 AB                  <1> 	stosd	; 2
 10135 00003CA3 AB                  <1> 	stosd	; 2
 10136 00003CA4 C3                  <1> 	retn
 10137                              <1> vbe_bfn_svs_0:
 10138                              <1> 	; VBE_DISPI_ENABLED
 10139                              <1> 
 10140                              <1> 	;sub	eax, eax
 10141 00003CA5 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 00003CA7 B503                <1>  	mov	ch, 3
 10147                              <1> 	; al = 0 ; VBE_DISPI_INDEX_XRES - 1
 10148                              <1> 
 10149 00003CA9 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 00003CAE FEC0                <1> 	inc	al 
 10155                              <1> 	; al = 4 ; VBE_DISPI_INDEX_BANK - 1
 10156                              <1> 
 10157 00003CB0 B505                <1> 	mov	ch, 5
 10158                              <1> vbe_bfn_svs_1:
 10159 00003CB2 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 00003CB4 FECA                <1> 	dec	dl ; 1CEh
 10163 00003CB6 66EF                <1> 	out	dx, ax
 10164 00003CB8 50                  <1> 	push	eax
 10165                              <1> 	;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10166 00003CB9 FEC2                <1> 	inc	dl ; 1CFh
 10167 00003CBB 66ED                <1> 	in	ax, dx
 10168 00003CBD 66AB                <1> 	stosw
 10169 00003CBF 58                  <1> 	pop	eax
 10170 00003CC0 FECD                <1> 	dec	ch
 10171 00003CC2 75EE                <1> 	jnz	short vbe_bfn_svs_1		
 10172 00003CC4 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 00003CC5 F6C101              <1> 	test	cl, 1
 10187 00003CC8 0F84A9000000        <1> 	jz	bfn_rvs_6
 10188                              <1> 
 10189 00003CCE 66817E40D403        <1> 	cmp	word [esi+64], 3D4h ; must be 3D4h
 10190 00003CD4 7402                <1> 	je	short bfn_rvs_0  
 10191                              <1> 			; it is seen as valid buffer
 10192 00003CD6 F9                  <1> 	stc
 10193 00003CD7 C3                  <1> 	retn
 10194                              <1> 
 10195                              <1> bfn_rvs_0:
 10196 00003CD8 89F7                <1> 	mov	edi, esi ; addr1
 10197 00003CDA 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 00003CDD 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
 10202 00003CE1 EC                  <1> 	in	al, dx
 10203                              <1> 
 10204                              <1> 	; for(i=1;i<=4;i++){
 10205 00003CE2 B001                <1> 	mov	al, 1
 10206                              <1> 	;;mov	dx, VGAREG_SEQU_ADDRESS ; 3C4h
 10207                              <1> 	;mov	dl, 0C4h
 10208 00003CE4 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 00003CE6 B2C4                <1> 	mov	dl, 0C4h
 10213 00003CE8 EE                  <1> 	out	dx, al
 10214                              <1> 	;mov	dx, VGAREG_SEQU_DATA  ; 3C5h
 10215 00003CE9 FEC2                <1> 	inc	dl  ; dx = 3C5h
 10216                              <1> 	; outb(VGAREG_SEQU_DATA)
 10217 00003CEB 50                  <1> 	push	eax
 10218 00003CEC AC                  <1> 	lodsb	; (4 bytes in loop)
 10219 00003CED EE                  <1> 	out	dx, al
 10220 00003CEE 58                  <1> 	pop	eax
 10221                              <1> 	;mov	dx, VGAREG_SEQU_ADDRESS ; 3C4h
 10222                              <1> 	;dec	dl	
 10223 00003CEF FEC0                <1> 	inc	al  ; i++
 10224 00003CF1 FECD                <1> 	dec	ch
 10225 00003CF3 75F1                <1> 	jnz	short bfn_rvs_1
 10226                              <1> 
 10227                              <1> 	; outb(VGAREG_SEQU_ADDRESS, 0);
 10228 00003CF5 28C0                <1> 	sub	al, al ; 0
 10229 00003CF7 EE                  <1> 	out	dx, al
 10230                              <1> 	; outb(VGAREG_SEQU_DATA)
 10231                              <1> 	;mov	dx, VGAREG_SEQU_DATA ; 3C5h
 10232 00003CF8 FEC2                <1> 	inc	dl  ; dx = 3C5h
 10233 00003CFA AC                  <1> 	lodsb	; (+1 byte)
 10234 00003CFB 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 00003CFC B2D4                <1> 	mov	dl, 0D4h
 10240 00003CFE 66B81100            <1> 	mov	ax, 11h
 10241 00003D02 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 00003D04 28C0                <1> 	sub	al, al ; 0
 10248                              <1> 	;;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
 10249                              <1> 	;mov	dl, 0D4h
 10250 00003D06 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 00003D08 B2D4                <1> 	mov	dl, 0D4h
 10255 00003D0A EE                  <1> 	out	dx, al
 10256                              <1> 	;mov	dx, VGAREG_VGA_CRTC_DATA ; 3D5h
 10257 00003D0B FEC2                <1> 	inc	dl  ; dx = 3D5h
 10258                              <1> 	; inb(crtc_addr+1)
 10259 00003D0D 50                  <1> 	push	eax
 10260 00003D0E AC                  <1> 	lodsb	; (25 bytes in loop)
 10261 00003D0F EE                  <1> 	out	dx, al
 10262 00003D10 58                  <1> 	pop	eax
 10263                              <1> 	;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
 10264                              <1> 	;dec	dl
 10265 00003D11 FEC0                <1> 	inc	al  ; i++
 10266 00003D13 3C11                <1> 	cmp	al, 17 ; 11h
 10267 00003D15 7505                <1> 	jne	short bfn_rvs_3
 10268 00003D17 AC                  <1> 	lodsb
 10269 00003D18 88C4                <1> 	mov	ah, al ; *
 10270 00003D1A B012                <1> 	mov	al, 18 
 10271                              <1> bfn_rvs_3:
 10272 00003D1C FECD                <1> 	dec	ch
 10273 00003D1E 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 00003D20 B2D4                <1> 	mov	dl, 0D4h
 10295 00003D22 B011                <1> 	mov	al, 11h
 10296 00003D24 EE                  <1> 	out	dx, al
 10297 00003D25 88E0                <1> 	mov	al, ah ; *
 10298 00003D27 FEC2                <1> 	inc	dl ; dx = 3D5h
 10299 00003D29 EE                  <1> 	out	dx, al
 10300                              <1> 
 10301                              <1> 	; // Set Attribute Ctl
 10302 00003D2A 8A6703              <1> 	mov	ah, [edi+3] ; addr1+3, ah = ar_index
 10303 00003D2D 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 00003D30 B2DA                <1> 	mov	dl, 0DAh
 10308 00003D32 EC                  <1> 	in	al, dx
 10309                              <1> 
 10310                              <1>         ; for(i=0;i<=0x13;i++) {
 10311 00003D33 28C0                <1> 	sub	al, al ; 0
 10312 00003D35 B514                <1> 	mov	ch, 20
 10313                              <1> bfn_rvs_4:
 10314                              <1>  	; outb(VGAREG_ACTL_ADDRESS, i | (ar_index & 0x20));
 10315 00003D37 50                  <1> 	push	eax
 10316 00003D38 08E0                <1> 	or	al, ah
 10317                              <1> 	;mov	dx, VGAREG_ACTL_ADDRESS ; 3C0h
 10318 00003D3A B2C0                <1> 	mov	dl, 0C0h
 10319 00003D3C EE                  <1> 	out	dx, al
 10320                              <1> 	;mov	dx, VGAREG_ACTL_WRITE_DATA ; 3C0h
 10321                              <1> 	;mov	dl, 0C0h
 10322 00003D3D AC                  <1> 	lodsb	; (20 bytes in loop)
 10323 00003D3E EE                  <1> 	out	dx, al
 10324 00003D3F 58                  <1> 	pop	eax
 10325 00003D40 FEC0                <1> 	inc	al  ; i++
 10326 00003D42 FECD                <1> 	dec	ch
 10327 00003D44 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 00003D46 88E0                <1> 	mov	al, ah ; ar_index
 10333 00003D48 EE                  <1> 	out	dx, al
 10334                              <1> 
 10335                              <1> 	; inb(VGAREG_ACTL_RESET);
 10336                              <1> 	;mov	dx, VGAREG_ACTL_RESET ; 3DAh
 10337 00003D49 B2DA                <1> 	mov	dl, 0DAh
 10338 00003D4B EC                  <1> 	in	al, dx
 10339                              <1> 
 10340                              <1>         ; for(i=0;i<=8;i++) {
 10341 00003D4C 28C0                <1> 	sub	al, al ; 0
 10342                              <1> 	;;mov	dx, VGAREG_GRDC_ADDRESS ; 3CEh
 10343                              <1> 	;mov	dl, 0CEh
 10344 00003D4E 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 00003D50 B2CE                <1> 	mov	dl, 0CEh
 10349 00003D52 EE                  <1> 	out	dx, al
 10350                              <1> 	; outb(VGAREG_ACTL_READ_DATA)
 10351 00003D53 50                  <1> 	push	eax
 10352                              <1> 	;mov	dx, VGAREG_GRDC_DATA ; 3CFh
 10353                              <1> 	;mov	dl, 0CFh
 10354 00003D54 FEC2                <1> 	inc	dl
 10355 00003D56 AC                  <1> 	lodsb	; (9 bytes in loop)
 10356 00003D57 EE                  <1> 	out	dx, al
 10357 00003D58 58                  <1> 	pop	eax
 10358                              <1> 	;dec	dl
 10359 00003D59 FEC0                <1> 	inc	al  ; i++
 10360 00003D5B FECD                <1> 	dec	ch
 10361 00003D5D 75F1                <1> 	jnz	short bfn_rvs_5
 10362                              <1> 
 10363                              <1> 	; BX += 2; /* crtc_addr */     ; 3D4h
 10364                              <1>         ; BX += 4; /* plane latches */ ; 0
 10365 00003D5F 83C606              <1> 	add	esi, 6	      
 10366 00003D62 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 00003D63 89FE                <1> 	mov	esi, edi ; start of state buffer
 10375                              <1> 
 10376                              <1> 	;mov	dx, VGAREG_SEQU_ADDRESS ; 3C7h
 10377 00003D65 B2C7                <1> 	mov	dl, 0C7h 
 10378 00003D67 AC                  <1> 	lodsb
 10379 00003D68 EE                  <1> 	out	dx, al
 10380                              <1> 	;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
 10381 00003D69 B2D4                <1> 	mov	dl, 0D4h
 10382 00003D6B AC                  <1> 	lodsb
 10383 00003D6C EE                  <1> 	out	dx, al
 10384                              <1> 	;mov	dx, VGAREG_GRDC_ADDRESS ; 3CEh 
 10385 00003D6D B2CE                <1>         mov	dl, 0CEh
 10386 00003D6F AC                  <1> 	lodsb
 10387 00003D70 EE                  <1> 	out	dx, al
 10388 00003D71 AC                  <1> 	lodsb	; addr1++
 10389                              <1> 	;mov	dx, VGAREG_VGA_WRITE_FEATURE_CTL ; 3DAh
 10390 00003D72 B2DA                <1> 	mov	dl, 0DAh
 10391 00003D74 AC                  <1> 	lodsb
 10392 00003D75 EE                  <1> 	out	dx, al
 10393                              <1> 
 10394 00003D76 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 00003D77 F6C102              <1> 	test	cl, 2
 10401 00003D7A 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 00003D7C 66AD                <1> 	lodsw	 ; CRTC_ADDR, always 3D4h (color VGA) for TRDOS 386 v2
 10434                              <1> 	; skip 3D4h check if it is already checked
 10435 00003D7E F6C101              <1> 	test	cl, 1
 10436 00003D81 7508                <1> 	jnz	short bfn_rvs_7
 10437 00003D83 663DD403            <1> 	cmp	ax, 3D4h
 10438 00003D87 7402                <1> 	je	short bfn_rvs_7
 10439 00003D89 F9                  <1> 	stc
 10440 00003D8A C3                  <1> 	retn
 10441                              <1> bfn_rvs_7:
 10442 00003D8B AC                  <1> 	lodsb
 10443 00003D8C A2[DE670000]        <1> 	mov	[CRT_MODE], al ; Current video mode (0FFh for VESA VBE modes) 
 10444 00003D91 AC                  <1> 	lodsb
 10445 00003D92 A2[DF670000]        <1> 	mov	[CRT_MODE_SET], al ; 29h for mode 03h ; TRDOS 386 feature only !
 10446 00003D97 66AD                <1> 	lodsw	
 10447 00003D99 66A3[66A30100]      <1>  	mov	[video_mode], ax ; Current VESA VBE (SVGA, extended VGA) mode 
 10448 00003D9F 66AD                <1> 	lodsw		 ; (valid if [CRT_MODE] = 0FFh)	
 10449 00003DA1 66A3[90890100]      <1> 	mov	[CRT_LEN], ax ; page size (in bytes)
 10450 00003DA7 66AD                <1> 	lodsw
 10451 00003DA9 66A3[0C7D0100]      <1> 	mov	[CRT_START], ax ; video page start offset
 10452 00003DAF AC                  <1>  	lodsb
 10453 00003DB0 A2[E0670000]        <1> 	mov	[CRT_COLS], al ; nbcols, characters per row
 10454 00003DB5 AC                  <1> 	lodsb
 10455 00003DB6 A2[E6670000]        <1> 	mov	[VGA_ROWS], al ; nbrows, (character) rows per page (not rows-1)
 10456 00003DBB AC                  <1> 	lodsb
 10457 00003DBC A2[E2670000]        <1> 	mov	[CHAR_HEIGHT], al ; character font height (8 or 16 or 14)
 10458 00003DC1 AC                  <1> 	lodsb
 10459 00003DC2 A2[E3670000]        <1> 	mov	[VGA_VIDEO_CTL], al ; ROM BIOS DATA AREA Offset 87h
 10460 00003DC7 AC                  <1> 	lodsb
 10461 00003DC8 A2[E4670000]        <1> 	mov	[VGA_SWITCHES], al ; feature bit switches
 10462 00003DCD AC                  <1> 	lodsb
 10463 00003DCE A2[E5670000]        <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 00003DD3 AC                  <1> 	lodsb
 10467 00003DD4 A2[E1670000]        <1> 	mov	[CRT_PALETTE], al ; current color palette ; TRDOS 386 feature only !
 10468 00003DD9 AC                  <1> 	lodsb
 10469 00003DDA A2[1E7D0100]        <1> 	mov	[ACTIVE_PAGE], al ; current video page 
 10470 00003DDF 66AD                <1> 	lodsw
 10471 00003DE1 66A3[F7670000]      <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 00003DE7 B504                <1> 	mov	ch, 4
 10481 00003DE9 BF[0E7D0100]        <1> 	mov	edi, CURSOR_POSN
 10482                              <1> bfn_rvs_8:
 10483 00003DEE A5                  <1> 	movsd
 10484 00003DEF FECD                <1> 	dec	ch
 10485 00003DF1 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 00003DF3 AD                  <1> 	lodsd
 10489 00003DF4 A3[A2890100]        <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 00003DF9 F6C104              <1> 	test	cl, 4
 10495 00003DFC 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 00003DFE AC                  <1> 	lodsb	; skip ; VGAREG_DAC_STATE
 10510 00003DFF AC                  <1> 	lodsb
 10511 00003E00 88C4                <1> 	mov	ah, al ; * ; v
 10512 00003E02 AC                  <1> 	lodsb
 10513 00003E03 66BAC603            <1> 	mov	dx, VGAREG_PEL_MASK  ; 3C6h
 10514 00003E07 EE                  <1> 	out	dx, al
 10515                              <1> 	;// Set the whole dac always, from 0
 10516 00003E08 30C0                <1> 	xor	al, al ; 0
 10517                              <1> 	;mov	dx, VGAREG_DAC_WRITE_ADDRESS ; 3C8h
 10518 00003E0A B2C8                <1> 	mov	dl, 0C8h
 10519 00003E0C EE                  <1> 	out	dx, al
 10520                              <1> 
 10521 00003E0D 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 00003E0E 29C9                <1> 	sub	ecx, ecx
 10526 00003E10 B503                <1> 	mov	ch, 3
 10527                              <1> 	; ecx = 300h = 768
 10528                              <1> 	;mov	dx, VGAREG_DAC_DATA ; 3C9h
 10529                              <1> 	;mov	dl, 0C9h
 10530 00003E12 FEC2                <1> 	inc	dl ; dx = 3C9h
 10531                              <1> bfn_rvs_10:
 10532 00003E14 AC                  <1> 	lodsb
 10533 00003E15 EE                  <1> 	out	dx, al
 10534 00003E16 E2FC                <1> 	loop	bfn_rvs_10
 10535 00003E18 59                  <1> 	pop	ecx ; 22/01/2021
 10536                              <1> 
 10537                              <1> 	; /* color select register */
 10538 00003E19 AC                  <1> 	lodsb	 ; skip 
 10539                              <1> 	
 10540 00003E1A 88E0                <1> 	mov	al, ah ; * ; v
 10541                              <1> 
 10542                              <1> 	;mov	dx, VGAREG_DAC_WRITE_ADDRESS ; 3C8h
 10543                              <1> 	;mov	dl, 0C8h
 10544 00003E1C FECA                <1> 	dec	dl ; dx  = 3C8h
 10545 00003E1E 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 00003E1F 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 00003E20 66AD                <1> 	lodsw	; enable (status, enabled=1, disabled=0)
 10591 00003E22 66BACE01            <1> 	mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10592                              <1> 	; 23/01/2021
 10593 00003E26 6683E001            <1> 	and	ax, 1 ; VBE_DISPI_ENABLED
 10594 00003E2A 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 00003E2C 50                  <1> 	push	eax
 10602 00003E2D B004                <1> 	mov	al, 04h	; VBE_DISPI_INDEX_ENABLE
 10603 00003E2F 66EF                <1> 	out	dx, ax
 10604                              <1> 	;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10605 00003E31 FEC2                <1> 	inc	dl
 10606 00003E33 58                  <1> 	pop	eax
 10607 00003E34 66EF                <1> 	out	dx, ax ; enable (or disable)
 10608 00003E36 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 00003E37 B503                <1>  	mov	ch, 3
 10616 00003E39 28C0                <1> 	sub	al, al ; 0 ; VBE_DISPI_INDEX_XRES - 1
 10617                              <1> 	; ax = 0
 10618                              <1> 
 10619 00003E3B 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 00003E40 B001                <1> 	mov	al, 1 ; VBE_DISPI_ENABLED
 10626                              <1> 	; ax = 1
 10627 00003E42 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 00003E47 B505                <1> 	mov	ch, 5
 10633                              <1> 	; 23/01/2021
 10634 00003E49 B004                <1> 	mov	al, 4  ; VBE_DISPI_INDEX_BANK - 1
 10635                              <1> 	; ax = 4
 10636                              <1> vbe_bfn_rvs_2:
 10637 00003E4B 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 00003E4D 66EF                <1> 	out	dx, ax
 10642 00003E4F 50                  <1> 	push	eax
 10643                              <1> 	;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10644 00003E50 FEC2                <1> 	inc	dl ; 1CFh
 10645 00003E52 66AD                <1> 	lodsw
 10646 00003E54 66EF                <1> 	out	dx, ax
 10647 00003E56 58                  <1> 	pop	eax
 10648 00003E57 FECA                <1> 	dec	dl ; 1CEh
 10649 00003E59 FECD                <1> 	dec	ch
 10650 00003E5B 75EE                <1> 	jnz	short vbe_bfn_rvs_2		
 10651 00003E5D 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 00003E5E 28F6                <1> 	sub	dh, dh
 10683 00003E60 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 00003E62 50                  <1> 	push	eax
 10700                              <1> 	;mov	ax, dx
 10701                              <1> 	; 03/08/2022
 10702 00003E63 89D0                <1> 	mov	eax, edx
 10703 00003E65 66BACE01            <1> 	mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10704 00003E69 66EF                <1> 	out	dx, ax
 10705 00003E6B 58                  <1> 	pop	eax
 10706                              <1> 	;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10707                              <1> 	;mov	dl, 0CFh
 10708 00003E6C FEC2                <1> 	inc	dl
 10709 00003E6E 66EF                <1> 	out	dx, ax
 10710 00003E70 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 00003E71 28F6                <1> 	sub	dh, dh
 10740 00003E73 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 00003E75 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 00003E77 28F6                <1> 	sub	dh, dh
 10775 00003E79 B201                <1> 	mov	dl, 01h ; VBE_DISPI_INDEX_XRES
 10776                              <1> 	;;call	dispi_set_parms
 10777                              <1> 	;;pop	edx
 10778                              <1> 	;;retn
 10779 00003E7B 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 00003E7D 28F6                <1> 	sub	dh, dh
 10809 00003E7F B202                <1> 	mov	dl, 02h ; VBE_DISPI_INDEX_YRES
 10810                              <1> 	;;call	dispi_set_parms
 10811                              <1> 	;;pop	edx
 10812                              <1> 	;;retn
 10813 00003E81 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 00003E83 28F6                <1> 	sub	dh, dh
 10842 00003E85 B205                <1> 	mov	dl, 05h	; VBE_DISPI_INDEX_BANK
 10843                              <1> 	;;call	dispi_set_parms
 10844                              <1> 	;;pop	edx
 10845                              <1> 	;;retn
 10846 00003E87 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 00003E89 28E4                <1> 	sub	ah, ah
 10875 00003E8B 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 00003E8D 66BACE01            <1> 	mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10892 00003E91 66EF                <1> 	out	dx, ax
 10893                              <1> 	;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10894                              <1> 	;mov	dl, 0CFh
 10895 00003E93 FEC2                <1> 	inc	dl
 10896 00003E95 66ED                <1> 	in	ax, dx
 10897 00003E97 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 00003E98 66BACE01            <1>   	mov	dx, 1CEh ; VBE_DISPI_IOPORT_INDEX
 10917                              <1>   	;mov	ax, 01h  ; VBE_DISPI_INDEX_XRES
 10918                              <1>   	; 03/08/2022
 10919 00003E9C 31C0                <1> 	xor	eax, eax
 10920 00003E9E FEC0                <1> 	inc	al
 10921                              <1> 	; eax = 1
 10922 00003EA0 66EF                <1> 	out	dx, ax
 10923                              <1>   	;mov	dx, 1CFh ; VBE_DISPI_IOPORT_DATA
 10924 00003EA2 FEC2                <1>   	inc	dl
 10925 00003EA4 66ED                <1> 	in	ax, dx
 10926 00003EA6 50                  <1> 	push	eax
 10927 00003EA7 66BAD403            <1> 	mov	dx, 3D4h ; VGAREG_VGA_CRTC_ADDRESS
 10928 00003EAB 66B81100            <1> 	mov	ax, 0011h ; Vertical retrace end register
 10929 00003EAF 66EF                <1>   	out	dx, ax
 10930                              <1>   	;pop	eax
 10931                              <1>   	;push	eax
 10932 00003EB1 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 00003EB4 C1E803              <1> 	shr	eax, 3
 10937 00003EB7 48                  <1>   	dec	eax
 10938 00003EB8 88C4                <1> 	mov	ah, al
 10939 00003EBA B001                <1>   	mov	al, 01h ; Horizontal display end register
 10940 00003EBC 66EF                <1>   	out	dx, ax
 10941 00003EBE 58                  <1>   	pop	eax
 10942                              <1> 
 10943 00003EBF E89C000000          <1> 	call	vga_set_virt_width
 10944                              <1> 
 10945                              <1>   	; set CRT Y resolution
 10946                              <1> 	; 03/08/2022
 10947 00003EC4 66BACE01            <1>   	mov	dx, 1CEh ; VBE_DISPI_IOPORT_INDEX
 10948 00003EC8 66B80200            <1>   	mov	ax, 02h  ; VBE_DISPI_INDEX_YRES
 10949 00003ECC 66EF                <1>   	out	dx, ax
 10950                              <1>   	;mov	dx, 1CFh ; VBE_DISPI_IOPORT_DATA
 10951                              <1> 	; 03/08/2022
 10952 00003ECE FEC2                <1>   	inc	dl
 10953 00003ED0 66ED                <1> 	in	ax, dx
 10954 00003ED2 50                  <1> 	push	eax
 10955 00003ED3 66BAD403            <1> 	mov	dx, 3D4h ; VGAREG_VGA_CRTC_ADDRESS
 10956 00003ED7 88C4                <1>   	mov	ah, al
 10957 00003ED9 B012                <1> 	mov	al, 12h ; Vertical display end register
 10958 00003EDB 66EF                <1>   	out	dx, ax
 10959 00003EDD 58                  <1>   	pop	eax
 10960 00003EDE B007                <1>   	mov	al, 07h	; Overflow register
 10961 00003EE0 EE                  <1>   	out	dx, al
 10962                              <1>   	;inc	dx
 10963                              <1>   	; 03/08/2022
 10964 00003EE1 FEC2                <1> 	inc	dl
 10965 00003EE3 EC                  <1> 	in	al, dx ; read overflow register
 10966 00003EE4 24BD                <1>   	and	al, 0BDh ; clear VDE 9th and 10th bits	
 10967 00003EE6 F6C401              <1>   	test	ah, 01h
 10968 00003EE9 7402                <1>   	jz	short bit8_clear
 10969 00003EEB 0C02                <1>   	or	al, 02h ; VDE 9th bit (bit 8) in bit 1
 10970                              <1> bit8_clear:
 10971 00003EED F6C402              <1>   	test	ah, 02h
 10972 00003EF0 7402                <1>   	jz	short bit9_clear
 10973 00003EF2 0C40                <1>   	or	al, 40h ; VDE 10th bit (bit 9) in bit 6
 10974                              <1> bit9_clear:
 10975 00003EF4 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 00003EF5 B2D4                <1> 	mov	dl, 0D4h
 10981 00003EF7 66B80900            <1> 	mov	ax, 0009h ; Maximum scan line register
 10982 00003EFB 66EF                <1>   	out	dx, ax	; Reset
 10983 00003EFD B017                <1>   	mov	al, 17h ; Mode control register		
 10984 00003EFF EE                  <1>   	out	dx, al
 10985                              <1>  	;mov	dx, 3D5h ; VGAREG_VGA_CRTC_DATA
 10986 00003F00 FEC2                <1>   	inc	dl
 10987 00003F02 EC                  <1> 	in	al, dx	; Read mode control register
 10988 00003F03 0C03                <1>   	or	al, 03h ; Set SRS and CMS bits
 10989 00003F05 EE                  <1>   	out	dx, al 
 10990                              <1>   	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
 10991                              <1>   	; 03/08/2022
 10992 00003F06 B2DA                <1> 	mov	dl, 0DAh
 10993 00003F08 EC                  <1> 	in	al, dx	 ; clear flip-flop
 10994                              <1>   	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
 10995                              <1>   	; 03/08/2022
 10996 00003F09 B2C0                <1> 	mov	dl, 0C0h
 10997 00003F0B B010                <1> 	mov	al, 10h	; Mode control register
 10998 00003F0D EE                  <1>   	out	dx, al
 10999                              <1> 	;mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
 11000 00003F0E FEC2                <1> 	inc	dl
 11001 00003F10 EC                  <1> 	in	al, dx
 11002 00003F11 0C01                <1> 	or	al, 01h ; select graphics mode
 11003                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
 11004 00003F13 FECA                <1> 	dec	dl
 11005 00003F15 EE                  <1> 	out	dx, al ; Write to mode control register
 11006 00003F16 B020                <1> 	mov	al, 20h ; Palette RAM <-> display memory
 11007 00003F18 EE                  <1> 	out	dx, al ; Write to attribute addr register
 11008                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
 11009                              <1> 	; 03/08/2022
 11010 00003F19 B2CE                <1> 	mov	dl, 0CEh 
 11011 00003F1B 66B80605            <1> 	mov	ax, 0506h ; Misc. register, graph, mm 1
 11012 00003F1F 66EF                <1> 	out	dx, ax
 11013                              <1> 	;mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
 11014                              <1> 	; 03/08/2022
 11015 00003F21 B2C4                <1> 	mov	dl, 0C4h 
 11016 00003F23 66B8020F            <1> 	mov	ax, 0F02h ; Map mask register, all planes
 11017 00003F27 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 00003F29 B2D4                <1> 	mov	dl, 0D4h
 11033 00003F2B B014                <1> 	mov	al, 14h  ; Underline location register
 11034 00003F2D EE                  <1> 	out	dx, al
 11035                              <1> 	;mov	dx, 3D5h ; VGAREG_VGA_CRTC_DATA
 11036 00003F2E FEC2                <1> 	inc	dl
 11037 00003F30 EC                  <1> 	in	al, dx	
 11038 00003F31 0C40                <1> 	or	al, 40h	 ; enable double word mode
 11039 00003F33 EE                  <1> 	out	dx, al
 11040                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
 11041                              <1> 	; 03/08/2022
 11042 00003F34 B2DA                <1> 	mov	dl, 0DAh
 11043 00003F36 EC                  <1> 	in	al, dx	 ; clear flip-flop
 11044                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
 11045                              <1> 	; 03/08/2022
 11046 00003F37 B2C0                <1> 	mov	dl, 0C0h
 11047 00003F39 B010                <1> 	mov	al, 10h	 ; Mode control register
 11048 00003F3B EE                  <1> 	out	dx, al
 11049                              <1> 	;mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
 11050 00003F3C FEC2                <1> 	inc	dl
 11051 00003F3E EC                  <1> 	in	al, dx
 11052 00003F3F 0C40                <1> 	or	al, 40h  ; Pixel clock select is 1
 11053                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
 11054 00003F41 FECA                <1> 	dec	dl
 11055 00003F43 EE                  <1> 	out	dx, al	 ; update mode control reggister
 11056 00003F44 B020                <1> 	mov	al, 20h	 ; select display memory as PAS	
 11057 00003F46 EE                  <1> 	out	dx, al
 11058                              <1> 	;mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
 11059                              <1> 	; 03/08/2022
 11060 00003F47 B2C4                <1> 	mov	dl, 0C4h
 11061 00003F49 B004                <1> 	mov	al, 04h	; Memory mode register
 11062 00003F4B EE                  <1> 	out	dx, al
 11063                              <1> 	;mov	dx, 3C5h ; VGAREG_SEQU_DATA
 11064 00003F4C FEC2                <1> 	inc	dl
 11065 00003F4E EC                  <1> 	in	al, dx
 11066 00003F4F 0C08                <1> 	or	al, 08h	; enable chain four
 11067 00003F51 EE                  <1> 	out	dx, al
 11068                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
 11069                              <1> 	; 03/08/2022
 11070 00003F52 B2CE                <1> 	mov	dl, 0CEh
 11071 00003F54 B005                <1> 	mov	al, 05h	 ; Mode register	
 11072 00003F56 EE                  <1> 	out	dx, al
 11073                              <1> 	;mov	dx, 3CFh ; VGAREG_GRDC_DATA
 11074 00003F57 FEC2                <1> 	inc	dl
 11075 00003F59 EC                  <1> 	in	al, dx	
 11076 00003F5A 249F                <1> 	and	al, 9Fh	 ; clear shift register 
 11077 00003F5C 0C40                <1> 	or	al, 40h  ; set shift register to 2
 11078 00003F5E EE                  <1> 	out	dx, al
 11079                              <1> 
 11080                              <1> vga_compat_end:
 11081                              <1>   	;pop	edx
 11082                              <1>   	;pop	eax
 11083 00003F5F 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 00003F60 C1E803              <1> 	shr	eax, 3
 11110 00003F63 66BAD403            <1> 	mov	dx, 3D4h ; VGAREG_VGA_CRTC_ADDRESS
 11111                              <1> 	;mov	ah, bl	; 
 11112 00003F67 88C4                <1> 	mov	ah, al	; width in bytes
 11113 00003F69 B013                <1> 	mov	al, 13h	; offset register
 11114 00003F6B 66EF                <1> 	out	dx, ax	; index (3D4h) and data (3D5h)
 11115                              <1> 	;pop	eax
 11116                              <1> 	;pop  	edx
 11117                              <1> 	;;pop	ebx
 11118 00003F6D 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 00003F6E BE[6A6B0000]        <1> 	mov	esi, b_vbe_modes ; bochs mode info base table
 11208 00003F73 BF[82A30100]        <1> 	mov	edi, MODE_INFO_LIST ; mode info list (4F01h)
 11209                              <1> sml_0:
 11210 00003F78 66AD                <1> 	lodsw	
 11211 00003F7A 6639D8              <1> 	cmp	ax, bx ; is mode number same ?
 11212 00003F7D 7410                <1> 	je	short sml_1 ; yes
 11213 00003F7F AD                  <1> 	lodsd
 11214 00003F80 66AD                <1> 	lodsw	
 11215 00003F82 81FE[2A6C0000]      <1> 	cmp	esi, end_of_b_vbe_modes
 11216 00003F88 72EE                <1> 	jb	short sml_0
 11217                              <1> 	; not found
 11218 00003F8A 31C0                <1> 	xor	eax, eax ; 0
 11219                              <1> 	; 11/12/2020
 11220 00003F8C 31F6                <1> 	xor	esi, esi
 11221 00003F8E C3                  <1> 	retn
 11222                              <1> sml_1:
 11223 00003F8F 66AB                <1> 	stosw	; mode
 11224 00003F91 AD                  <1> 	lodsd	; width, height
 11225                              <1> 	; 14/12/2020
 11226 00003F92 89C1                <1> 	mov	ecx, eax
 11227 00003F94 50                  <1> 	push	eax ; ***
 11228 00003F95 29C0                <1> 	sub	eax, eax ; clear high word of eax
 11229 00003F97 66AD                <1> 	lodsw	; depth
 11230 00003F99 50                  <1> 	push	eax ; **
 11231                              <1> 
 11232                              <1> 	;add	al, 7 ; only for 15 bit colors (not used here)
 11233 00003F9A C0E803              <1> 	shr	al, 3 ; / 8
 11234                              <1> 	; 14/12/2020
 11235 00003F9D 66F7E1              <1> 	mul	cx  ; pitch = width * ((depth+7)/8)
 11236                              <1> 		; ax = pitch
 11237 00003FA0 50                  <1> 	push	eax ; * ; high word of eax = 0
 11238 00003FA1 C1E910              <1> 	shr	ecx, 16
 11239                              <1> 	;mul	cx
 11240                              <1> 	;mov	cx, ax
 11241 00003FA4 31D2                <1> 	xor	edx, edx  ; clear high word of edx
 11242 00003FA6 F7E1                <1> 	mul	ecx ; height * pitch
 11243 00003FA8 89C1                <1> 	mov	ecx, eax
 11244 00003FAA B800000001          <1> 	mov	eax, VBE_DISPI_TOTAL_VIDEO_MEMORY_MB * 1024 * 1024
 11245 00003FAF F7F1                <1> 	div	ecx
 11246                              <1> 		; eax = pages = vram_size / (height*pitch)
 11247                              <1> 	
 11248                              <1> 	;mov	cx, ax
 11249 00003FB1 89C1                <1> 	mov	ecx, eax ; pages 
 11250                              <1> 		
 11251 00003FB3 66B89B00            <1> 	mov	ax, MODE_ATTRIBUTES
 11252 00003FB7 66AB                <1> 	stosw	; ModeAttributes
 11253 00003FB9 B007                <1> 	mov	al, WINA_ATTRIBUTES
 11254 00003FBB AA                  <1> 	stosb	; WinAAttributes
 11255 00003FBC 30C0                <1> 	xor	al, al ; WinBAttributes = 0
 11256 00003FBE AA                  <1> 	stosb
 11257 00003FBF 66B84000            <1> 	mov	ax, VBE_DISPI_BANK_SIZE_KB
 11258 00003FC3 66AB                <1> 	stosw	; WinGranularity
 11259 00003FC5 66AB                <1> 	stosw	; WinSize
 11260 00003FC7 66B800A0            <1> 	mov	ax, VGAMEM_GRAPH
 11261 00003FCB 66AB                <1> 	stosw	; WinASegment
 11262 00003FCD 29C0                <1> 	sub	eax, eax
 11263 00003FCF 66AB                <1> 	stosw	; WinBSegment = 0
 11264 00003FD1 AB                  <1> 	stosd	; WinFuncPtr = 0
 11265                              <1> 
 11266 00003FD2 58                  <1> 	pop	eax ; * ; pitch
 11267 00003FD3 89C3                <1> 	mov	ebx, eax  ; high word of ebx = 0 ; 14/12/2020
 11268 00003FD5 66AB                <1> 	stosw	; BytesPerScanLine
 11269                              <1> 
 11270 00003FD7 5A                  <1> 	pop	edx ; ** ; depth (bits per pixel)
 11271 00003FD8 58                  <1> 	pop	eax ; *** width, height
 11272                              <1> 
 11273                              <1>  	; // Mandatory information for VBE 1.2 and above
 11274                              <1> 
 11275 00003FD9 66AB                <1> 	stosw	; XResolution (width)
 11276 00003FDB C1E810              <1> 	shr	eax, 16
 11277 00003FDE 50                  <1> 	push	eax ; **** height
 11278 00003FDF 66AB                <1> 	stosw	; YResolution (height)
 11279 00003FE1 B008                <1> 	mov	al, 8
 11280 00003FE3 AA                  <1>  	stosb	; XCharSize  ; char width
 11281 00003FE4 B010                <1> 	mov	al, 16
 11282 00003FE6 AA                  <1> 	stosb	; YCharSize  ; char height
 11283 00003FE7 B001                <1> 	mov	al, 1
 11284 00003FE9 AA                  <1> 	stosb	; NumberOfPlanes
 11285                              <1> 	;movzx	eax, dl
 11286 00003FEA 88D0                <1> 	mov	al, dl ; eax <= 32
 11287 00003FEC AA                  <1> 	stosb	; BitsPerPixel
 11288                              <1> 	; Number of banks = (height * pitch + 65535) / 65536
 11289 00003FED 58                  <1> 	pop	eax ; **** ; height
 11290                              <1> 	; 14/12/2020
 11291 00003FEE 52                  <1> 	push	edx ; ***** ; depth ; edx <= 32
 11292 00003FEF F7E3                <1> 	mul	ebx  ; pitch (ebx) * height (eax)
 11293                              <1> 	;mov	edx, [esp] ; *****
 11294                              <1> 	;mov	dl, [esp] ; *****
 11295 00003FF1 05FFFF0000          <1> 	add	eax, 65535
 11296 00003FF6 C1E810              <1> 	shr	eax, 16 ; / 65536 ; <= 127 ; 14/12/2020
 11297 00003FF9 AA                  <1> 	stosb	; NumberOfBanks
 11298                              <1> 	; 14/12/2020
 11299                              <1> 	;cmp	dl, 8 ; 8 bits per pixel
 11300 00003FFA 803C2408            <1> 	cmp	byte [esp], 8
 11301 00003FFE 7704                <1> 	ja	short sml_2
 11302 00004000 B004                <1> 	mov	al, VBE_MEMORYMODEL_PACKED_PIXEL
 11303 00004002 EB02                <1> 	jmp	short sml_3
 11304                              <1> sml_2:
 11305                              <1> 	; 16, 24, 32 bits per pixel
 11306 00004004 B006                <1> 	mov	al, VBE_MEMORYMODEL_DIRECT_COLOR
 11307                              <1> sml_3:
 11308 00004006 AA                  <1> 	stosb
 11309 00004007 30C0                <1> 	xor	al, al ; 0
 11310 00004009 AA                  <1> 	stosb	; BankSize = 0
 11311 0000400A 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 0000400B FEC8                <1> 	dec	al ; 255
 11317 0000400D 39C1                <1> 	cmp	ecx, eax ; ecx <= 261, eax = 255 
 11318                              <1> 	;cmp	cx, ax
 11319 0000400F 7302                <1> 	jnb	short sml_4
 11320 00004011 88C8                <1> 	mov	al, cl	 
 11321                              <1> sml_4:
 11322 00004013 AA                  <1> 	stosb	; NumberOfImagePages (1 byte)
 11323 00004014 28C0                <1> 	sub	al, al
 11324 00004016 AA                  <1> 	stosb	; Reserved_page = 0
 11325 00004017 58                  <1> 	pop	eax ; ***** ; depth
 11326 00004018 88C1                <1> 	mov	cl, al
 11327                              <1> 	; eax < = 32
 11328 0000401A 2C08                <1> 	sub	al, 8 ; 8->0, 16->8, 24->16, 32->24
 11329 0000401C BE[2A6C0000]        <1> 	mov	esi, direct_color_fields
 11330 00004021 01C6                <1> 	add	esi, eax
 11331 00004023 56                  <1> 	push	esi ; ******
 11332 00004024 AD                  <1> 	lodsd	; RedMaskSize (AL), RedFieldPosition (AH)
 11333                              <1> 	     	; GreenMaskSize (16), GreenFieldPosition (24)
 11334 00004025 AB                  <1> 	stosd
 11335 00004026 AD                  <1> 	lodsd	; BlueMaskSize (AL), BlueFieldPosition (AH)
 11336                              <1> 	     	; RsvdMaskSize (16), RsvdFieldPosition (24)
 11337 00004027 AB                  <1> 	stosd
 11338 00004028 5E                  <1> 	pop	esi ; ******
 11339                              <1> 
 11340 00004029 30C0                <1> 	xor	al, al ; 0
 11341 0000402B 80F920              <1> 	cmp	cl, 32
 11342 0000402E 7202                <1> 	jb	short sml_5
 11343 00004030 B002                <1> 	mov	al, VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE
 11344                              <1> sml_5: 
 11345 00004032 AA                  <1> 	stosb	; DirectColorModeInfo
 11346                              <1> 
 11347                              <1> 	; // Mandatory information for VBE 2.0 and above
 11348                              <1> 
 11349 00004033 B8000000E0          <1> 	mov	eax, VBE_DISPI_LFB_PHYSICAL_ADDRESS
 11350 00004038 AB                  <1> 	stosd	; PhysBasePtr
 11351 00004039 29C0                <1> 	sub	eax, eax
 11352 0000403B AB                  <1> 	stosd	; OffScreenMemOffset = 0
 11353 0000403C 66AB                <1> 	stosw	; OffScreenMemSize = 0
 11354                              <1> 
 11355                              <1> 	;// Mandatory information for VBE 3.0 and above
 11356                              <1> 
 11357                              <1> 	; ebx = pitch
 11358 0000403E 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 00004041 AB                  <1> 	stosd	; pitch (word), 0 (byte), 0 (byte)  
 11366                              <1> 
 11367 00004042 AD                  <1> 	lodsd	; LinRedMaskSize (AL), LinRedFieldPosition (AH)
 11368                              <1> 	     	; LinGreenMaskSize (16), LinGreenFieldPosition (24)
 11369 00004043 AB                  <1> 	stosd
 11370 00004044 AD                  <1> 	lodsd	; LinBlueMaskSize (AL), LinBlueFieldPosition (AH)
 11371                              <1> 	     	; LinRsvdMaskSize (16), LinRsvdFieldPosition (24)
 11372 00004045 AB                  <1> 	stosd
 11373                              <1> 
 11374 00004046 29C0                <1> 	sub	eax, eax
 11375 00004048 AB                  <1> 	stosd	; MaxPixelClock = 0
 11376                              <1> 
 11377                              <1> 	;mov	eax, MODE_INFO_LIST
 11378                              <1> 	; 11/12/2020
 11379 00004049 BE[82A30100]        <1> 	mov	esi, MODE_INFO_LIST
 11380                              <1> 	
 11381 0000404E 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 0000404F 53                  <1> 	push	ebx
 11399 00004050 51                  <1> 	push	ecx
 11400 00004051 52                  <1> 	push	edx
 11401                              <1> 	;
 11402 00004052 89C3                <1> 	mov	ebx, eax
 11403 00004054 31C9                <1> 	xor	ecx, ecx
 11404 00004056 28D2                <1> 	sub	dl, dl	; mov dl, 0
 11405 00004058 E842000000          <1> 	call	pci_read_reg
 11406 0000405D 6683F8FF            <1> 	cmp	ax, 0FFFFh
 11407 00004061 7417                <1> 	je	short pci_get_lfb_addr_fail
 11408                              <1> pci_get_lfb_addr_next_dev:
 11409 00004063 28D2                <1> 	sub	dl, dl ; mov dl, 0
 11410 00004065 E835000000          <1> 	call	pci_read_reg
 11411 0000406A 6639D8              <1> 	cmp	ax, bx	; check vendor
 11412 0000406D 740F                <1> 	je	short pci_get_lfb_addr_found
 11413 0000406F 6683C108            <1> 	add	cx, 08h
 11414 00004073 6681F90002          <1> 	cmp	cx, 200h ; search bus 0 and 1
 11415 00004078 72E9                <1> 	jb	short pci_get_lfb_addr_next_dev
 11416                              <1> pci_get_lfb_addr_fail:
 11417 0000407A 31C0                <1> 	xor	eax, eax ; no LFB
 11418                              <1> 	; zf = 1
 11419 0000407C EB1D                <1> 	jmp	short pci_get_lfb_addr_return
 11420                              <1> pci_get_lfb_addr_found:
 11421 0000407E B210                <1> 	mov	dl, 10h	; I/O space 0
 11422 00004080 E81A000000          <1> 	call	pci_read_reg
 11423 00004085 66A9F1FF            <1> 	test	ax, 0FFF1h
 11424 00004089 740D                <1> 	jz	short pci_get_lfb_addr_success
 11425 0000408B B214                <1> 	mov	dl, 14h ; I/O space 1
 11426 0000408D E80D000000          <1> 	call	pci_read_reg
 11427 00004092 66A9F1FF            <1> 	test	ax, 0FFF1h
 11428 00004096 75E2                <1> 	jnz	short pci_get_lfb_addr_fail
 11429                              <1> pci_get_lfb_addr_success:
 11430 00004098 C1E810              <1> 	shr	eax, 16 ; LFB address (hw)
 11431                              <1> 	; zf = 0
 11432                              <1> pci_get_lfb_addr_return:
 11433 0000409B 5A                  <1> 	pop	edx
 11434 0000409C 59                  <1> 	pop	ecx
 11435 0000409D 5B                  <1> 	pop	ebx
 11436 0000409E 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 0000409F B800008000          <1> 	mov	eax, 00800000h 
 11452 000040A4 6689C8              <1> 	mov	ax, cx
 11453 000040A7 C1E008              <1> 	shl	eax, 8
 11454 000040AA 88D0                <1> 	mov	al, dl
 11455 000040AC 66BAF80C            <1> 	mov	dx, 0CF8h
 11456 000040B0 EF                  <1>  	out	dx, eax
 11457 000040B1 80C204              <1> 	add	dl, 4 ; mov dx, 0CFCh
 11458 000040B4 ED                  <1> 	in	eax, dx
 11459 000040B5 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 ///
  2989                                  
  2990                                  setup_rtc_int:
  2991                                  ; source: http://wiki.osdev.org/RTC
  2992 000040B6 FA                      	cli		; disable interrupts
  2993                                  	; default int frequency is 1024 Hz (Lower 4 bits of register A is 0110b or 6)
  2994                                  	; in order to change this ...
  2995                                  	; frequency  = 32768 >> (rate-1) --> 32768 >> 5 = 1024
  2996                                  	; (rate must be above 2 and not over 15)
  2997                                  	; new rate = 15 --> 32768 >> (15-1) = 2 Hz
  2998 000040B7 B08A                    	mov	al, 8Ah 
  2999 000040B9 E670                    	out	70h, al ; set index to register A, disable NMI
  3000 000040BB 90                      	nop
  3001 000040BC E471                    	in	al, 71h ; get initial value of register A
  3002 000040BE 88C4                    	mov 	ah, al
  3003 000040C0 80E4F0                  	and	ah, 0F0h
  3004 000040C3 B08A                    	mov	al, 8Ah 
  3005 000040C5 E670                    	out	70h, al ; reset index to register A
  3006 000040C7 88E0                    	mov	al, ah
  3007 000040C9 0C0F                    	or	al, 0Fh	; new rate (0Fh -> 15)
  3008 000040CB E671                    	out	71h, al ; write only our rate to A. Note, rate is the bottom 4 bits. 
  3009                                  	; enable RTC interrupt
  3010 000040CD B08B                    	mov	al, 8Bh ;
  3011 000040CF E670                    	out	70h, al ; select register B and disable NMI
  3012 000040D1 90                      	nop
  3013 000040D2 E471                    	in	al, 71h ; read the current value of register B
  3014 000040D4 88C4                    	mov	ah, al  ;
  3015 000040D6 B08B                    	mov 	al, 8Bh ;
  3016 000040D8 E670                    	out	70h, al ; set the index again (a read will reset the index to register B)	
  3017 000040DA 88E0                    	mov	al, ah  ;
  3018 000040DC 0C40                    	or	al, 40h ;
  3019 000040DE E671                    	out	71h, al ; write the previous value ORed with 0x40. This turns on bit 6 of register B
  3020 000040E0 FB                      	sti
  3021 000040E1 C3                      	retn
  3022                                  
  3023                                  ; Write memory information
  3024                                  ; 29/01/2016
  3025                                  ; 06/11/2014
  3026                                  ; 14/08/2015 
  3027                                  memory_info:	
  3028 000040E2 A1[F47C0100]            	mov	eax, [memory_size] ; in pages
  3029 000040E7 50                      	push	eax
  3030 000040E8 C1E00C                  	shl	eax, 12		   ; in bytes
  3031 000040EB BB0A000000              	mov	ebx, 10
  3032 000040F0 89D9                    	mov	ecx, ebx	   ; 10
  3033 000040F2 BE[B53E0100]            	mov	esi, mem_total_b_str	
  3034 000040F7 E8D8000000              	call	bintdstr
  3035 000040FC 58                      	pop	eax
  3036 000040FD B107                    	mov	cl, 7
  3037 000040FF BE[D93E0100]            	mov	esi, mem_total_p_str
  3038 00004104 E8CB000000              	call	bintdstr	
  3039                                  	; 14/08/2015
  3040 00004109 E8E3000000              	call	calc_free_mem
  3041                                  	; edx = calculated free pages
  3042                                  	; ecx = 0
  3043 0000410E A1[F87C0100]            	mov 	eax, [free_pages]
  3044 00004113 39D0                    	cmp	eax, edx ; calculated free mem value 
  3045                                  		; and initial free mem value are same or not?
  3046 00004115 751D                    	jne 	short pmim ; print mem info with '?' if not
  3047 00004117 52                      	push 	edx ; free memory in pages	
  3048                                  	;mov 	eax, edx
  3049 00004118 C1E00C                  	shl	eax, 12 ; convert page count
  3050                                  			; to byte count
  3051 0000411B B10A                    	mov	cl, 10
  3052 0000411D BE[F93E0100]            	mov	esi, free_mem_b_str
  3053 00004122 E8AD000000              	call	bintdstr
  3054 00004127 58                      	pop	eax
  3055 00004128 B107                    	mov	cl, 7
  3056 0000412A BE[1D3F0100]            	mov	esi, free_mem_p_str
  3057 0000412F E8A0000000              	call	bintdstr
  3058                                  pmim:
  3059 00004134 BE[A33E0100]            	mov	esi, msg_memory_info
  3060                                  	;
  3061 00004139 B407                    	mov	ah, 07h ; Black background, 
  3062                                  			; light gray forecolor
  3063                                  print_kmsg: ; 29/01/2016
  3064 0000413B 8825[1F7D0100]          	mov	[ccolor], ah
  3065                                  pkmsg_loop:
  3066 00004141 AC                      	lodsb
  3067 00004142 08C0                    	or	al, al
  3068 00004144 7410                    	jz	short pkmsg_ok
  3069 00004146 56                      	push	esi
  3070                                  	; 13/05/2016
  3071 00004147 0FB61D[1F7D0100]        	movzx	ebx, byte [ccolor]
  3072                                  			; Video page 0 (bh=0)
  3073 0000414E E842E1FFFF              	call	_write_tty
  3074 00004153 5E                      	pop	esi
  3075 00004154 EBEB                    	jmp	short pkmsg_loop
  3076                                  pkmsg_ok:
  3077 00004156 C3                      	retn
  3078                                  
  3079                                  ; 19/12/2020
  3080                                  ; temporary
  3081                                  ; Write default liner frame buffer address
  3082                                  ;
  3083                                  default_lfb_info:	
  3084 00004157 66A1[1A0F0000]          	mov	ax, [def_LFB_addr] ; high word
  3085                                  	; 24/11/2023 - temporary
  3086 0000415D 6609C0                  	or	ax, ax
  3087 00004160 74F4                    	jz	short pkmsg_ok
  3088 00004162 E829000000              	call	wordtohex
  3089 00004167 A3[753F0100]            	mov	dword [lfb_addr_str], eax
  3090 0000416C BE[5E3F0100]            	mov	esi, msg_lfb_addr
  3091 00004171 B40F                    	mov	ah, 0Fh ; Black background, 
  3092                                  			; white forecolor
  3093 00004173 EBC6                    	jmp	short print_kmsg
  3094                                  
  3095                                  ; Convert binary number to hexadecimal string
  3096                                  ; 10/05/2015  
  3097                                  ; dsectpm.s (28/02/2015)
  3098                                  ; Retro UNIX 386 v1 - Kernel v0.2.0.6  
  3099                                  ; 01/12/2014
  3100                                  ; 25/11/2014
  3101                                  ;
  3102                                  bytetohex:
  3103                                  	; INPUT ->
  3104                                  	; 	AL = byte (binary number)
  3105                                  	; OUTPUT ->
  3106                                  	;	AX = hexadecimal string
  3107                                  	;
  3108 00004175 53                      	push	ebx
  3109 00004176 31DB                    	xor	ebx, ebx
  3110 00004178 88C3                    	mov	bl, al
  3111 0000417A C0EB04                  	shr	bl, 4
  3112 0000417D 8A9B[C3410000]          	mov	bl, [ebx+hexchrs] 	 	
  3113 00004183 86D8                    	xchg	bl, al
  3114 00004185 80E30F                  	and	bl, 0Fh
  3115 00004188 8AA3[C3410000]          	mov	ah, [ebx+hexchrs] 
  3116 0000418E 5B                      	pop	ebx	
  3117 0000418F C3                      	retn
  3118                                  
  3119                                  wordtohex:
  3120                                  	; INPUT ->
  3121                                  	; 	AX = word (binary number)
  3122                                  	; OUTPUT ->
  3123                                  	;	EAX = hexadecimal string
  3124                                  	;
  3125 00004190 53                      	push	ebx
  3126 00004191 31DB                    	xor	ebx, ebx
  3127 00004193 86E0                    	xchg	ah, al
  3128 00004195 6650                    	push	ax ; * save ax
  3129 00004197 88E3                    	mov	bl, ah
  3130 00004199 C0EB04                  	shr	bl, 4
  3131 0000419C 8A83[C3410000]          	mov	al, [ebx+hexchrs]
  3132 000041A2 88E3                    	mov	bl, ah
  3133 000041A4 80E30F                  	and	bl, 0Fh
  3134 000041A7 8AA3[C3410000]          	mov	ah, [ebx+hexchrs]
  3135 000041AD C1E010                  	shl	eax, 16 ; ax -> hw of eax
  3136 000041B0 6658                    	pop	ax ; * restore ax 
  3137 000041B2 5B                      	pop	ebx
  3138 000041B3 EBC0                    	jmp	short bytetohex
  3139                                  	;mov	bl, al
  3140                                  	;shr	bl, 4
  3141                                  	;mov	bl, [ebx+hexchrs]
  3142                                  	;xchg	bl, al	 	
  3143                                  	;and	bl, 0Fh
  3144                                  	;mov	ah, [ebx+hexchrs] 
  3145                                  	;pop	ebx	
  3146                                  	;retn
  3147                                  
  3148                                  dwordtohex:
  3149                                  	; INPUT ->
  3150                                  	; 	EAX = dword (binary number)
  3151                                  	; OUTPUT ->
  3152                                  	;	EDX:EAX = hexadecimal string
  3153                                  	;
  3154 000041B5 50                      	push	eax
  3155 000041B6 C1E810                  	shr	eax, 16
  3156 000041B9 E8D2FFFFFF              	call	wordtohex
  3157 000041BE 89C2                    	mov	edx, eax
  3158 000041C0 58                      	pop	eax
  3159                                  	;call	wordtohex
  3160                                  	;retn
  3161                                  	; 18/04/2021
  3162 000041C1 EBCD                    	jmp	short wordtohex
  3163                                  
  3164                                  ; 10/05/2015
  3165                                  hex_digits:
  3166                                  hexchrs:
  3167 000041C3 303132333435363738-     	db '0123456789ABCDEF'
  3167 000041CC 39414243444546     
  3168                                  ; 19/01/2021 - VESA EDID ready flag (4Fh)
  3169 000041D3 00                      edid:	db 0
  3170                                  
  3171                                  ; Convert binary number to decimal/numeric string
  3172                                  ; 06/11/2014
  3173                                  ; Temporary Code
  3174                                  ;
  3175                                  
  3176                                  bintdstr:
  3177                                  	; EAX = binary number
  3178                                  	; ESI = decimal/numeric string address
  3179                                  	; EBX = divisor (10)
  3180                                  	; ECX = string length (<=10)
  3181 000041D4 01CE                    	add	esi, ecx
  3182                                  btdstr0:
  3183 000041D6 4E                      	dec	esi
  3184 000041D7 31D2                    	xor	edx, edx
  3185 000041D9 F7F3                    	div	ebx
  3186 000041DB 80C230                  	add	dl, 30h
  3187 000041DE 8816                    	mov	[esi], dl
  3188 000041E0 FEC9                    	dec	cl
  3189 000041E2 740C                    	jz	short btdstr2 ; 08/09/2016
  3190 000041E4 09C0                    	or	eax, eax
  3191 000041E6 75EE                    	jnz	short btdstr0
  3192                                  btdstr1:
  3193 000041E8 4E                      	dec	esi
  3194 000041E9 C60620                          mov     byte [esi], 20h ; blank space
  3195 000041EC FEC9                    	dec	cl
  3196 000041EE 75F8                    	jnz	short btdstr1
  3197                                  btdstr2:
  3198 000041F0 C3                      	retn
  3199                                  
  3200                                  ; Calculate free memory pages on M.A.T.
  3201                                  ; 06/11/2014
  3202                                  ; Temporary Code
  3203                                  ;
  3204                                  
  3205                                  calc_free_mem:
  3206 000041F1 31D2                    	xor	edx, edx
  3207                                  	;xor	ecx, ecx
  3208 000041F3 668B0D[087D0100]        	mov	cx, [mat_size] ; in pages
  3209 000041FA C1E10A                  	shl	ecx, 10	; 1024 dwords per page
  3210 000041FD BE00001000              	mov	esi, MEM_ALLOC_TBL
  3211                                  cfm0:
  3212 00004202 AD                      	lodsd
  3213 00004203 51                      	push	ecx
  3214 00004204 B920000000              	mov	ecx, 32
  3215                                  cfm1:
  3216 00004209 D1E8                    	shr	eax, 1
  3217 0000420B 7301                    	jnc	short cfm2
  3218 0000420D 42                      	inc	edx
  3219                                  cfm2:
  3220 0000420E E2F9                    	loop	cfm1
  3221 00004210 59                      	pop	ecx
  3222 00004211 E2EF                    	loop	cfm0
  3223 00004213 C3                      	retn
  3224                                  
  3225                                  %include 'diskio.s'  ; 07/03/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.8 - diskio.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 23/06/2024 (Previous: 02/12/2023 - Kernel v2.0.7)
     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 00004214 55                  <1> 	push	ebp
   524 00004215 89DD                <1> 	mov	ebp, ebx
   525                              <1> 
   526                              <1> 	;cmp	ah, (FNC_TAE-FNC_TAB)/2	; CHECK FOR > LARGEST FUNCTION
   527 00004217 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 0000421A 730F                <1> 	jnb	short INV_FUNC
   532                              <1> OK_FUNC:
   533 0000421C 80FC01              <1> 	cmp	ah, 1			; RESET OR STATUS ?
   534 0000421F 760C                <1> 	jbe	short OK_DRV		; IF RESET OR STATUS DRIVE ALWAYS OK
   535 00004221 80FC08              <1> 	cmp	ah, 8			; READ DRIVE PARMS ?
   536 00004224 7407                <1> 	je	short OK_DRV		; IF SO DRIVE CHECKED LATER
   537 00004226 80FA01              <1> 	cmp	dl, 1			; DRIVES 0 AND 1 OK
   538 00004229 7602                <1> 	jbe	short OK_DRV		; IF 0 OR 1 THEN JUMP
   539                              <1> INV_FUNC:
   540 0000422B 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 0000422D 29DB                <1> 	sub	ebx, ebx
   555 0000422F 88E3                <1> 	mov	bl, ah			; BL = FUNCTION	
   556 00004231 C0E302              <1> 	shl	bl, 2 ; * 4
   557 00004234 81C3[53420000]      <1> 	add	ebx, FNC_TAB		; [EBX] = FUNCTION ADDRESS
   558                              <1> 	
   559 0000423A 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 0000423C 0FB7F0              <1> 	movzx	esi, ax			; ESI = HEAD #,# OF SECTORS OR DASD TYPE
   565 0000423F 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 00004242 8A25[787D0100]      <1> 	mov	ah, [DSKETTE_STATUS]	; LOAD STATUS TO AH FOR STATUS FUNCTION
   577 00004248 C605[787D0100]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 0000424F 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 00004251 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 00004252 C3                  <1> 	retn	; return to the caller of 'DISK_IO' 
   642                              <1> 
   643                              <1> ;-------------------------------------------------------------------------------
   644                              <1> ; DW --> dd (06/02/2015)
   645 00004253 [B7420000]          <1> FNC_TAB	dd	DSK_RESET		; AH = 00H; RESET
   646 00004257 [22430000]          <1> 	dd	DSK_STATUS		; AH = 01H; STATUS
   647 0000425B [32430000]          <1> 	dd	DSK_READ		; AH = 02H; READ
   648 0000425F [3F430000]          <1> 	dd	DSK_WRITE		; AH = 03H; WRITE
   649 00004263 [53440000]          <1> 	dd	DSK_VERF		; AH = 04H; VERIFY
   650 00004267 [63440000]          <1> 	dd	DSK_FORMAT		; AH = 05H; FORMAT
   651 0000426B [E1440000]          <1> 	dd	FNC_ERR			; AH = 06H; INVALID
   652 0000426F [E1440000]          <1> 	dd	FNC_ERR			; AH = 07H; INVALID
   653 00004273 [ED440000]          <1> 	dd	DSK_PARMS		; AH = 08H; READ DRIVE PARAMETERS
   654 00004277 [E1440000]          <1> 	dd	FNC_ERR			; AH = 09H; INVALID
   655 0000427B [E1440000]          <1> 	dd	FNC_ERR			; AH = 0AH; INVALID
   656 0000427F [E1440000]          <1> 	dd	FNC_ERR			; AH = 0BH; INVALID
   657 00004283 [E1440000]          <1> 	dd	FNC_ERR			; AH = 0CH; INVALID
   658 00004287 [E1440000]          <1> 	dd	FNC_ERR			; AH = 0DH; INVALID
   659 0000428B [E1440000]          <1> 	dd	FNC_ERR			; AH = 0EH; INVALID
   660 0000428F [E1440000]          <1> 	dd	FNC_ERR			; AH = 0FH; INVALID
   661 00004293 [E1440000]          <1> 	dd	FNC_ERR			; AH = 10H; INVALID
   662 00004297 [E1440000]          <1> 	dd	FNC_ERR			; AH = 11H; INVALID
   663 0000429B [E1440000]          <1> 	dd	FNC_ERR			; AH = 12H; INVALID
   664 0000429F [E1440000]          <1> 	dd	FNC_ERR			; AH = 13H; INVALID
   665 000042A3 [E1440000]          <1> 	dd	FNC_ERR			; AH = 14H; INVALID
   666 000042A7 [AA450000]          <1> 	dd	DSK_TYPE		; AH = 15H; READ DASD TYPE
   667 000042AB [CA450000]          <1> 	dd	DSK_CHANGE		; AH = 16H; CHANGE STATUS
   668 000042AF [F9450000]          <1> 	dd	FORMAT_SET		; AH = 17H; SET DASD TYPE
   669 000042B3 [6E460000]          <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 000042B7 66BAF203            <1> 	mov	dx, 03F2h		; ADAPTER CONTROL PORT
   682 000042BB FA                  <1> 	cli				; NO INTERRUPTS
   683 000042BC A0[767D0100]        <1> 	mov	al, [MOTOR_STATUS]	; GET DIGITAL OUTPUT REGISTER REFLECTION
   684 000042C1 243F                <1> 	and	al, 00111111b		; KEEP SELECTED AND MOTOR ON BITS
   685 000042C3 C0C004              <1> 	rol	al, 4			; MOTOR VALUE TO HIGH NIBBLE
   686                              <1> 					; DRIVE SELECT TO LOW NIBBLE
   687 000042C6 0C08                <1> 	or	al, 00001000b		; TURN ON INTERRUPT ENABLE
   688 000042C8 EE                  <1> 	out	dx, al			; RESET THE ADAPTER
   689 000042C9 C605[757D0100]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 000042D0 E6EB                <2>  out 0EBh, al
   695                              <1> 
   696                              <1> 	; 17/12/2014 
   697                              <1> 	; AWARD BIOS 1999 - RESETDRIVES (ADISK.ASM)
   698 000042D2 B915000000          <1> 	mov	ecx, WAITCPU_RESET_ON	; cx = 21 -- Min. 14 micro seconds !?
   699                              <1> wdw1:
   700                              <1> 	NEWIODELAY   ; 27/02/2015
    83 000042D7 E6EB                <2>  out 0EBh, al
   701 000042D9 E2FC                <1> 	loop	wdw1
   702                              <1> 	;
   703 000042DB 0C04                <1> 	or	al, 00000100b		; TURN OFF RESET BIT
   704 000042DD EE                  <1> 	out	dx, al			; RESET THE ADAPTER
   705                              <1> 	; 16/12/2014
   706                              <1> 	IODELAY
    78 000042DE EB00                <2>  jmp short $+2
    79 000042E0 EB00                <2>  jmp short $+2
   707                              <1> 	;
   708                              <1> 	;sti				; ENABLE THE INTERRUPTS
   709 000042E2 E8DD0A0000          <1> 	call	WAIT_INT		; WAIT FOR THE INTERRUPT
   710 000042E7 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 000042E9 B1C0                <1> 	mov	cl, 11000000b
   715                              <1> NXT_DRV:
   716                              <1> 	;push	cx			; SAVE FOR CALL
   717                              <1> 	; 11/04/2021
   718 000042EB 51                  <1> 	push	ecx
   719 000042EC B8[18430000]        <1> 	mov	eax, DR_POP_ERR 	; LOAD NEC_OUTPUT ERROR ADDRESS
   720 000042F1 50                  <1> 	push	eax			; "
   721 000042F2 B408                <1> 	mov	ah, 08h			; SENSE INTERRUPT STATUS COMMAND
   722 000042F4 E8C3090000          <1> 	call	NEC_OUTPUT
   723 000042F9 58                  <1> 	pop	eax			; THROW AWAY ERROR RETURN
   724 000042FA E8F40A0000          <1> 	call	RESULTS			; READ IN THE RESULTS
   725                              <1> 	;pop	cx			; RESTORE AFTER CALL
   726                              <1> 	; 11/04/2021
   727 000042FF 59                  <1> 	pop	ecx
   728 00004300 7217                <1> 	jc	short DR_ERR		; ERROR RETURN
   729 00004302 3A0D[797D0100]      <1> 	cmp	cl, [NEC_STATUS]	; TEST FOR DRIVE READY TRANSITION
   730 00004308 750F                <1> 	jnz	short DR_ERR		; EVERYTHING OK
   731 0000430A FEC1                <1> 	inc	cl			; NEXT EXPECTED @NEC_STATUS
   732 0000430C 80F9C3              <1> 	cmp	cl, 11000011b		; ALL POSSIBLE DRIVES CLEARED
   733 0000430F 76DA                <1> 	jbe	short NXT_DRV		; FALL THRU IF 11000100B OR >
   734                              <1> 	;
   735 00004311 E800040000          <1> 	call	SEND_SPEC		; SEND SPECIFY COMMAND TO NEC
   736                              <1> RESBAC:
   737                              <1> 	; 06/08/2022
   738 00004316 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 00004318 59                  <1> 	pop	ecx
   750                              <1> DR_ERR:
   751 00004319 800D[787D0100]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 00004320 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 00004322 8825[787D0100]      <1> 	mov	[DSKETTE_STATUS], ah	; PUT BACK FOR SETUP END
   766                              <1> SETUP_END_X:	; 06/08/2022
   767 00004328 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 0000432D 89F3                <1> 	mov	ebx, esi
   772 0000432F 88D8                <1> 	mov	al, bl
   773 00004331 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 00004332 8025[767D0100]7F    <1> 	and	byte [MOTOR_STATUS], 01111111b ; INDICATE A READ OPERATION
   794 00004339 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 0000433D 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 0000433F 66B84AC5            <1> 	mov	ax, 0C54Ah		; AX = NEC COMMAND, DMA COMMAND
   819 00004343 800D[767D0100]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 0000434A 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 0000434B A0[717D0100]        <1> 	mov	al, [TIMER_LOW+1]
   850 00004350 D0E8                <1> 	shr	al, 1
   851 00004352 A2[D6840100]        <1> 	mov	[P_TIMER], al
   852                              <1> 
   853 00004357 E803040000          <1> 	call	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
   854 0000435C E86A040000          <1> 	call	SETUP_STATE		; INITIALIZE START AND END RATE
   855 00004361 58                  <1> 	pop	eax			; RESTORE READ/WRITE/VERIFY
   856                              <1> DO_AGAIN:
   857 00004362 50                  <1> 	push	eax			; SAVE READ/WRITE/VERIFY PARAMETER
   858 00004363 E8F8040000          <1> 	call	MED_CHANGE		; MEDIA CHANGE AND RESET IF CHANGED
   859 00004368 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 00004369 7305                <1> 	jnc	short RWV
   863 0000436B E9BC000000          <1> 	jmp	RWV_END
   864                              <1> RWV:
   865 00004370 50                  <1> 	push	eax			; SAVE READ/WRITE/VERIFY PARAMETER
   866 00004371 8AB7[837D0100]      <1> 	mov	dh, [DSK_STATE+edi]	; GET RATE STATE OF THIS DRIVE
   867 00004377 80E6C0              <1> 	and	dh, RATE_MSK		; KEEP ONLY RATE
   868 0000437A 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 0000437F 7447                <1> 	jz	short RWV_ASSUME ; 20/02/2015
   872 00004381 3C01                <1> 	cmp	al, 1			; 40 TRACK DRIVE?
   873 00004383 750D                <1> 	jne	short RWV_1		; NO, BYPASS CMOS VALIDITY CHECK
   874 00004385 F687[837D0100]01    <1> 	test	byte [DSK_STATE+edi], TRK_CAPA ; CHECK FOR 40 TRACK DRIVE
   875 0000438C 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 0000438E FEC0                <1> 	inc	al ; al = 2
   879 00004390 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 00004392 F687[837D0100]01    <1> 	test    byte [DSK_STATE+edi], TRK_CAPA ; IS IT REALLY 40 TRACK?
   884 00004399 7504                <1> 	jnz	short RWV_2		; NO, 80 TRACK
   885 0000439B B001                <1> 	mov	al, 1			; IT IS 40 TRACK, FIX CMOS VALUE
   886 0000439D 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 0000439F E855030000          <1> 	call	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL.
   893 000043A4 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 000043A6 57                  <1> 	push	edi			; SAVE DRIVE #
   898                              <1> 	; 09/08/2022
   899                              <1> 	;xor	ebx, ebx		; EBX = INDEX TO DR_TYPE TABLE
   900 000043A7 BB[B8650000]        <1> 	mov	ebx, DR_TYPE
   901                              <1> 	;mov	ecx, DR_CNT		; ECX = LOOP COUNT
   902 000043AC B106                <1> 	mov	cl, DR_CNT
   903                              <1> RWV_DR_SEARCH:
   904                              <1> 	;mov	ah, [DR_TYPE+ebx]	; GET DRIVE TYPE
   905 000043AE 8A23                <1> 	mov	ah, [ebx]
   906 000043B0 80E47F              <1> 	and	ah, BIT7OFF		; MASK OUT MSB
   907 000043B3 38E0                <1> 	cmp	al, ah			; DRIVE TYPE MATCH?
   908                              <1> 	; 09/08/2022
   909                              <1> 	;cmp	dl, ah
   910 000043B5 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 000043B7 43                  <1> 	inc	ebx
   914 000043B8 8B3B                <1> 	mov	edi, [ebx]
   915 000043BA 4B                  <1> 	dec	ebx
   916                              <1> RWV_MD_SEARH:
   917 000043BB 3A770C              <1>         cmp	dh, [edi+MD.RATE]       ; MATCH?
   918 000043BE 741D                <1> 	je	short RWV_MD_FND	; YES, GO GET 1ST SPECIFY BYTE
   919                              <1> RWV_NXT_MD:
   920 000043C0 83C305              <1> 	add	ebx, 5			; CHECK NEXT DRIVE TYPE
   921                              <1> 	;loop	RWV_DR_SEARCH
   922 000043C3 FEC9                <1> 	dec	cl
   923 000043C5 75E7                <1> 	jnz	short RWV_DR_SEARCH 
   924 000043C7 5F                  <1> 	pop	edi			; RESTORE DRIVE #
   925                              <1> 
   926                              <1> ;-----	ASSUME PRIMARY DRIVE IS INSTALLED AS SHIPPED
   927                              <1> 
   928                              <1> RWV_ASSUME:
   929 000043C8 BB[D6650000]        <1> 	mov	ebx, MD_TBL1		; POINT TO 40 TRACK 250 KBS
   930 000043CD F687[837D0100]01    <1> 	test 	byte [DSK_STATE+edi], TRK_CAPA ; TEST FOR 80 TRACK
   931 000043D4 740A                <1> 	jz	short RWV_MD_FND1	; MUST BE 40 TRACK
   932 000043D6 BB[F0650000]        <1> 	mov	ebx, MD_TBL3		; POINT TO 80 TRACK 500 KBS
   933 000043DB 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 000043DD 89FB                <1> 	mov	ebx, edi		; BX = MEDIA/DRIVE PARAMETER TABLE
   939 000043DF 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 000043E0 E85A030000          <1> 	call	SEND_SPEC_MD
   945 000043E5 E8E3040000          <1> 	call	CHK_LASTRATE		; ZF=1 ATTEMP RATE IS SAME AS LAST RATE
   946 000043EA 7405                <1> 	jz	short RWV_DBL		; YES,SKIP SEND RATE COMMAND
   947 000043EC E8BC040000          <1> 	call	SEND_RATE		; SEND DATA RATE TO NEC
   948                              <1> RWV_DBL:
   949 000043F1 53                  <1> 	push	ebx			; SAVE MEDIA/DRIVE PARAM TBL ADDRESS
   950 000043F2 E825070000          <1> 	call	SETUP_DBL		; CHECK FOR DOUBLE STEP
   951 000043F7 5B                  <1> 	pop	ebx			; RESTORE ADDRESS
   952 000043F8 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 000043FA 8B0424              <1> 	mov	eax, [esp]
   957                              <1> 	;push	ebx			; SAVE MEDIA/DRIVE PARAM TBL ADDRESS
   958 000043FD E8E0040000          <1> 	call	DMA_SETUP		; SET UP THE DMA
   959                              <1> 	;pop	ebx
   960 00004402 58                  <1> 	pop	eax			; RESTORE NEC COMMAND
   961 00004403 7231                <1> 	jc	short RWV_BAC		; CHECK FOR DMA BOUNDARY ERROR
   962 00004405 50                  <1> 	push	eax			; SAVE NEC COMMAND
   963 00004406 53                  <1> 	push	ebx			; SAVE MEDIA/DRIVE PARAM TBL ADDRESS
   964                              <1> 	; 11/08/2022
   965 00004407 8B5C2420            <1> 	mov	ebx, [esp+32] ; ECX
   966 0000440B E866050000          <1> 	call	NEC_INIT		; INITIALIZE NEC
   967 00004410 5B                  <1> 	pop	ebx			; RESTORE ADDRESS
   968 00004411 720C                <1> 	jc	short CHK_RET		; ERROR - EXIT
   969 00004413 E88C050000          <1> 	call	RWV_COM			; OP CODE COMMON TO READ/WRITE
   970 00004418 7205                <1> 	jc	short CHK_RET		; ERROR - EXIT
   971 0000441A E8D2050000          <1> 	call	NEC_TERM		; TERMINATE, GET STATUS, ETC.
   972                              <1> CHK_RET:
   973 0000441F E871060000          <1> 	call	RETRY			; CHECK FOR, SETUP RETRY
   974 00004424 58                  <1> 	pop	eax			; RESTORE READ/WRITE PARAMETER
   975 00004425 7305                <1> 	jnc	short RWV_END		; CY = 0 NO RETRY
   976 00004427 E936FFFFFF          <1>         jmp	DO_AGAIN                ; CY = 1 MEANS RETRY
   977                              <1> RWV_END:
   978 0000442C E81C060000          <1> 	call	DSTATE			; ESTABLISH STATE IF SUCCESSFUL
   979 00004431 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 00004436 50                  <1> 	push	eax
  1002                              <1> 	; 06/08/2022
  1003 00004437 B002                <1> 	mov	al, 2			; GET THE MOTOR WAIT PARAMETER		
  1004 00004439 E888070000          <1> 	call	GET_PARM
  1005 0000443E 8825[777D0100]      <1> 	mov	[MOTOR_COUNT], ah	; STORE UPON RETURN
  1006                              <1> 	;pop	ax			; RESTORE NUMBER TRANSFERRED
  1007                              <1> 	; 11/04/2021
  1008 00004444 58                  <1> 	pop	eax
  1009 00004445 8A25[787D0100]      <1> 	mov	ah, [DSKETTE_STATUS]	; GET STATUS OF OPERATION
  1010 0000444B 08E4                <1> 	or	ah, ah			; CHECK FOR ERROR
  1011 0000444D 7403                <1> 	jz	short NUN_ERR		; NO ERROR
  1012 0000444F 30C0                <1> 	xor	al, al			; CLEAR NUMBER RETURNED
  1013                              <1> 	; 06/08/2022
  1014 00004451 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 00004452 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 00004453 8025[767D0100]7F    <1> 	and	byte [MOTOR_STATUS], 01111111b ; INDICATE A READ OPERATION
  1036 0000445A 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 0000445E 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 00004463 E8F7020000          <1> 	call	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
  1061 00004468 E89F030000          <1> 	call	FMT_INIT		; ESTABLISH STATE IF UNESTABLISHED
  1062 0000446D 800D[767D0100]80    <1> 	or	byte [MOTOR_STATUS], 10000000b ; INDICATE WRITE OPERATION
  1063 00004474 E8E7030000          <1> 	call	MED_CHANGE		; CHECK MEDIA CHANGE AND RESET IF SO
  1064 00004479 7261                <1>         jc      short FM_DON            ; MEDIA CHANGED, SKIP
  1065 0000447B E896020000          <1> 	call	SEND_SPEC		; SEND SPECIFY COMMAND TO NEC
  1066 00004480 E848040000          <1> 	call	CHK_LASTRATE		; ZF=1 ATTEMPT RATE IS SAME AS LAST RATE
  1067 00004485 7405                <1>         jz      short FM_WR             ; YES, SKIP SPECIFY COMMAND
  1068 00004487 E821040000          <1> 	call	SEND_RATE		; SEND DATA RATE TO CONTROLLER
  1069                              <1> FM_WR:
  1070 0000448C E8C8040000          <1> 	call	FMTDMA_SET		; SET UP THE DMA FOR FORMAT
  1071 00004491 7249                <1>         jc      short FM_DON            ; RETURN WITH ERROR
  1072 00004493 B44D                <1> 	mov	ah, 04Dh		; ESTABLISH THE FORMAT COMMAND
  1073                              <1> 	; 11/08/2022
  1074 00004495 8B5C2418            <1> 	mov	ebx, [esp+24] ; ECX
  1075 00004499 E8D8040000          <1> 	call	NEC_INIT		; INITIALIZE THE NEC
  1076 0000449E 723C                <1> 	jc	short FM_DON            ; ERROR - EXIT
  1077 000044A0 B8[DC440000]        <1>         mov     eax, FM_DON             ; LOAD ERROR ADDRESS
  1078 000044A5 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 000044A6 B003                <1> 	mov	al, 3
  1082 000044A8 E819070000          <1> 	call	GET_PARM
  1083 000044AD E80A080000          <1> 	call	NEC_OUTPUT
  1084                              <1> 	;mov	dl, 4			; SECTORS/TRACK VALUE TO NEC
  1085                              <1> 	; 06/08/2022
  1086 000044B2 B004                <1> 	mov	al, 4
  1087 000044B4 E80D070000          <1> 	call	GET_PARM
  1088 000044B9 E8FE070000          <1> 	call	NEC_OUTPUT
  1089                              <1> 	;mov	dl, 7			; GAP LENGTH VALUE TO NEC
  1090                              <1> 	; 06/08/2022
  1091 000044BE B007                <1> 	mov	al, 7
  1092 000044C0 E801070000          <1> 	call	GET_PARM
  1093 000044C5 E8F2070000          <1> 	call	NEC_OUTPUT
  1094                              <1> 	;mov	dl, 8			; FILLER BYTE TO NEC
  1095                              <1> 	; 06/08/2022
  1096 000044CA B008                <1> 	mov	al, 8
  1097 000044CC E8F5060000          <1> 	call	GET_PARM
  1098 000044D1 E8E6070000          <1> 	call	NEC_OUTPUT
  1099 000044D6 58                  <1> 	pop	eax			; THROW AWAY ERROR
  1100 000044D7 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 000044DC 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 000044E1 89F0                <1> 	mov	eax, esi		; RESTORE AL
  1123 000044E3 B401                <1> 	mov	ah, BAD_CMD		; SET BAD COMMAND ERROR
  1124 000044E5 8825[787D0100]      <1> 	mov	[DSKETTE_STATUS], ah	; STORE IN DATA AREA
  1125 000044EB F9                  <1> 	stc				; SET CARRY INDICATING ERROR
  1126 000044EC 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 000044ED 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 000044F2 29D2                <1> 	sub	edx, edx
  1199 000044F4 66A1[3C660000]      <1> 	mov     ax, [fd0_type]
  1200 000044FA 6621C0              <1> 	and     ax, ax
  1201 000044FD 747C                <1>         jz      short NON_DRV
  1202 000044FF FEC2                <1> 	inc     dl
  1203 00004501 20E4                <1> 	and     ah, ah
  1204 00004503 7402                <1> 	jz      short STO_DL
  1205 00004505 FEC2                <1> 	inc     dl
  1206                              <1> STO_DL:
  1207                              <1> 	; 30/08/2020
  1208                              <1> 	;cmp	dx, di
  1209                              <1> 	; 06/08/2022
  1210 00004507 39FA                <1> 	cmp	edx, edi
  1211 00004509 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 0000450B FEC6                <1> 	inc	dh ; number of heads - 1 
  1218                              <1> 	; dh = 1
  1219                              <1> 	; dl = number of floppy/diskette drives (DL)
  1220 0000450D 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 00004511 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 00004516 740F                <1> 	jz	short CHK_EST		; JUMP IF SO
  1236 00004518 E8DC010000          <1> 	call	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL
  1237 0000451D 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 0000451F 8A4B04              <1> 	mov	cl, [ebx+MD.SEC_TRK]	; GET SECTOR/TRACK
  1241 00004522 8A6B0B              <1>         mov	ch, [ebx+MD.MAX_TRK]	; GET MAX. TRACK NUMBER
  1242 00004525 EB36                <1> 	jmp	short STO_CX		; CMOS GOOD, USE CMOS
  1243                              <1> CHK_EST:
  1244 00004527 8AA7[837D0100]      <1> 	mov	ah, [DSK_STATE+edi]	; LOAD STATE FOR THIS DRIVE
  1245 0000452D F6C410              <1> 	test	ah, MED_DET		; CHECK FOR ESTABLISHED STATE
  1246 00004530 744D                <1> 	jz	short NON_DRV1		; CMOS BAD/INVALID OR UNESTABLISHED
  1247                              <1> USE_EST:
  1248 00004532 80E4C0              <1> 	and	ah, RATE_MSK		; ISOLATE STATE
  1249 00004535 80FC80              <1> 	cmp	ah, RATE_250		; RATE 250 ?
  1250 00004538 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 0000453A B001                <1> 	mov	al, 1			; DRIVE TYPE 1 (360KB)
  1255 0000453C E8B8010000          <1> 	call	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL
  1256 00004541 8A4B04              <1>         mov	cl, [ebx+MD.SEC_TRK]	; GET SECTOR/TRACK
  1257 00004544 8A6B0B              <1>         mov	ch, [ebx+MD.MAX_TRK]	; GET MAX. TRACK NUMBER
  1258 00004547 F687[837D0100]01    <1> 	test	byte [DSK_STATE+edi], TRK_CAPA ; 80 TRACK ?
  1259 0000454E 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 00004550 B004                <1> 	mov	al, 4			; DRIVE TYPE 4 (1.44MB)
  1265 00004552 E8A2010000          <1> 	call	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL
  1266 00004557 8A4B04              <1> 	mov	cl, [ebx+MD.SEC_TRK]	; GET SECTOR/TRACK
  1267 0000455A 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 0000455D 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 00004561 29C9                <1> 	sub	ecx, ecx
  1286 00004563 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 00004565 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 00004569 09ED                <1> 	or	ebp, ebp ; [esp+28] = ebx ; user's buffer address if > 0
  1305 0000456B 740B                <1> 	jz	short DP_OUT
  1306                              <1> 	; 06/08/2022
  1307                              <1> 	;push	edi
  1308 0000456D 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 0000456F 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 00004571 B110                <1> 	mov	cl, 16
  1323 00004573 E838CA0000          <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 00004578 31C0                <1> 	xor	eax, eax
  1333                              <1> 	;clc
  1334 0000457A 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 0000457B 89542414            <1> 	mov	[esp+20], edx ; 0 ; number of floppy drives and heads are 0
  1343                              <1> NON_DRV1:
  1344 0000457F 6681FF8000          <1> 	cmp	di, 80h			; CHECK FOR FIXED MEDIA TYPE REQUEST
  1345 00004584 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 00004586 89F0                <1> 	mov	eax, esi
  1354 00004588 B401                <1> 	mov	ah, BAD_CMD		; SET BAD COMMAND ERROR
  1355 0000458A F9                  <1> 	stc
  1356 0000458B C3                  <1> 	retn
  1357                              <1> 
  1358                              <1> NON_DRV2:
  1359                              <1> 	;xor	ax, ax			; CLEAR PARMS IF NO DRIVES OR CMOS BAD
  1360 0000458C 31C0                <1> 	xor	eax, eax	
  1361                              <1> 	;mov	[ebp], ax		; TRACKS, SECTORS/TRACK = 0
  1362                              <1> 	; 06/08/2022
  1363 0000458E 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 00004592 B407                <1> 	mov	ah, INIT_FAIL ; DRIVE PARAMETER ACTIVITY FAILED 
  1383 00004594 F9                  <1> 	stc	; cf -> 1, ah = 'drive not ready' error code
  1384 00004595 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 00004596 B002                <1> 	mov	al, 2			; DRIVE TYPE 2 (1.2MB)
  1390 00004598 E85C010000          <1> 	call	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL
  1391 0000459D 8A4B04              <1>         mov     cl, [ebx+MD.SEC_TRK]    ; GET SECTOR/TRACK
  1392 000045A0 8A6B0B              <1>         mov     ch, [ebx+MD.MAX_TRK]    ; GET MAX. TRACK NUMBER
  1393 000045A3 80FC40              <1> 	cmp	ah, RATE_300		; RATE 300 ?
  1394 000045A6 74B5                <1> 	jz	short STO_CX		; MUST BE 1.2MB DRIVE
  1395 000045A8 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 000045AA E8B0010000          <1> 	call	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
  1410 000045AF 8A87[837D0100]      <1> 	mov	al, [DSK_STATE+edi]	; GET PRESENT STATE INFORMATION
  1411 000045B5 08C0                <1> 	or	al, al			; CHECK FOR NO DRIVE
  1412 000045B7 740D                <1> 	jz	short NO_DRV
  1413 000045B9 B401                <1> 	mov	ah, NOCHGLN		; NO CHANGE LINE FOR 40 TRACK DRIVE
  1414 000045BB A801                <1> 	test	al, TRK_CAPA		; IS THIS DRIVE AN 80 TRACK DRIVE?
  1415 000045BD 7402                <1> 	jz	short DT_BACK		; IF NO JUMP
  1416 000045BF 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 000045C1 89F3                <1> 	mov	ebx, esi
  1430 000045C3 88D8                <1> 	mov	al, bl			; PUT BACK FOR RETURN
  1431 000045C5 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 000045C6 29C0                <1> 	sub	eax, eax
  1440 000045C8 F9                  <1> 	stc	; cf = 1 -> drive not ready, ah = 0 (disk type = 0)
  1441 000045C9 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 000045CA E890010000          <1> 	call	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
  1456 000045CF 8A87[837D0100]      <1> 	mov	al, [DSK_STATE+edi]	; GET MEDIA STATE INFORMATION
  1457 000045D5 08C0                <1> 	or	al, al			; DRIVE PRESENT ?
  1458 000045D7 7417                <1> 	jz	short DC_NON		; JUMP IF NO DRIVE
  1459 000045D9 A801                <1> 	test	al, TRK_CAPA		; 80 TRACK DRIVE ?
  1460 000045DB 7407                <1> 	jz	short SETIT		; IF SO , CHECK CHANGE LINE
  1461                              <1> DC0:
  1462 000045DD E86B080000          <1>         call    READ_DSKCHNG            ; GO CHECK STATE OF DISK CHANGE LINE
  1463 000045E2 7407                <1> 	jz	short FINIS		; CHANGE LINE NOT ACTIVE
  1464                              <1> SETIT:	
  1465 000045E4 C605[787D0100]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 000045EB 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 000045F0 800D[787D0100]80    <1> 	or	byte [DSKETTE_STATUS], TIME_OUT ; SET TIMEOUT, NO DRIVE
  1478 000045F7 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 000045F9 E861010000          <1> 	call	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
  1494                              <1> 	;push	si			; SAVE DASD TYPE
  1495                              <1> 	; 11/04/2021
  1496 000045FE 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 000045FF 89F0                <1> 	mov	eax, esi
  1502 00004601 0FB6F0              <1> 	movzx	esi, al	
  1503 00004604 80A7[837D0100]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 0000460B 4E                  <1> 	dec	esi
  1507 0000460C 7509                <1> 	jnz	short NOT_320		; BYPASS IF NOT
  1508 0000460E 808F[837D0100]90    <1> 	or	byte [DSK_STATE+edi], MED_DET+RATE_250 ; SET TO 320/360
  1509 00004615 EB45                <1> 	jmp	short S0
  1510                              <1> 
  1511                              <1> NOT_320:
  1512 00004617 E844020000          <1> 	call	MED_CHANGE		; CHECK FOR TIME_OUT
  1513 0000461C 803D[787D0100]80    <1> 	cmp	byte [DSKETTE_STATUS], TIME_OUT
  1514 00004623 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 00004625 4E                  <1> 	dec	esi
  1519 00004626 7509                <1> 	jnz	short NOT_320_12	; BYPASS IF NOT
  1520 00004628 808F[837D0100]70    <1> 	OR	byte [DSK_STATE+edi], MED_DET+DBL_STEP+RATE_300 ; SET STATE
  1521 0000462F 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 00004631 4E                  <1> 	dec	esi
  1527 00004632 7509                <1> 	jnz	short NOT_12		; BYPASS IF NOT
  1528 00004634 808F[837D0100]10    <1> 	or	byte [DSK_STATE+edi], MED_DET+RATE_500 ; SET STATE VARIABLE
  1529 0000463B 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 0000463D 4E                  <1> 	dec	esi
  1535 0000463E 7525                <1> 	jnz	short FS_ERR		; BAD COMMAND EXIT IF NOT VALID TYPE
  1536                              <1> 
  1537 00004640 F687[837D0100]04    <1> 	test	byte [DSK_STATE+edi], DRV_DET ; DRIVE DETERMINED ?
  1538 00004647 740B                <1> 	jz	short ASSUME		; IF STILL NOT DETERMINED ASSUME
  1539 00004649 B050                <1> 	mov	al, MED_DET+RATE_300
  1540 0000464B F687[837D0100]02    <1>         test    byte [DSK_STATE+edi], FMT_CAPA ; MULTIPLE FORMAT CAPABILITY ?
  1541 00004652 7502                <1> 	jnz	short OR_IT_IN		; IF 1.2 M THEN DATA RATE 300
  1542                              <1> 
  1543                              <1> ASSUME:
  1544 00004654 B090                <1> 	mov	al, MED_DET+RATE_250	; SET UP
  1545                              <1> 
  1546                              <1> OR_IT_IN:
  1547 00004656 0887[837D0100]      <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 0000465C E8D5FDFFFF          <1> 	call	SETUP_END		; VARIOUS CLEANUPS
  1552                              <1> 	;pop	BX			; GET SAVED AL TO BL
  1553                              <1> 	; 11/04/2021
  1554 00004661 5B                  <1> 	pop	ebx
  1555 00004662 88D8                <1> 	mov	al, bl			; PUT BACK FOR RETURN
  1556 00004664 C3                  <1> 	retn
  1557                              <1> 
  1558                              <1> FS_ERR:
  1559 00004665 C605[787D0100]01    <1> 	mov	byte [DSKETTE_STATUS], BAD_CMD ; UNKNOWN STATE,BAD COMMAND
  1560 0000466C 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 0000466E E8EC000000          <1> 	call	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
  1586 00004673 F687[837D0100]01    <1>         test    byte [DSK_STATE+edi], TRK_CAPA ; CHECK FOR CHANGE LINE AVAILABLE
  1587 0000467A 7415                <1> 	jz	short SM_CMOS		; JUMP IF 40 TRACK DRIVE
  1588 0000467C E8DF010000          <1> 	call	MED_CHANGE		; RESET CHANGE LINE
  1589 00004681 803D[787D0100]80    <1> 	cmp	byte [DSKETTE_STATUS], TIME_OUT ; IF TIME OUT TELL CALLER
  1590 00004688 746A                <1> 	je	short SM_RTN
  1591 0000468A C605[787D0100]00    <1> 	mov	byte [DSKETTE_STATUS], 0 ; CLEAR STATUS
  1592                              <1> SM_CMOS:
  1593 00004691 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 00004696 745C                <1> 	jz	short SM_RTN		; RETURN IF SO
  1598 00004698 E85C000000          <1> 	call	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL
  1599 0000469D 7233                <1> 	jc	short MD_NOT_FND	; TYPE NOT IN TABLE (BAD CMOS)
  1600 0000469F 57                  <1> 	push	edi			; SAVE REG.
  1601 000046A0 31DB                <1> 	xor	ebx, ebx		; BX = INDEX TO DR. TYPE TABLE
  1602 000046A2 B906000000          <1> 	mov	ecx, DR_CNT		; CX = LOOP COUNT
  1603                              <1> DR_SEARCH:
  1604 000046A7 8AA3[B8650000]      <1> 	mov	ah, [DR_TYPE+ebx]	; GET DRIVE TYPE
  1605 000046AD 80E47F              <1> 	and	ah, BIT7OFF		; MASK OUT MSB
  1606 000046B0 38E0                <1> 	cmp	al, ah			; DRIVE TYPE MATCH ?
  1607 000046B2 7518                <1> 	jne	short NXT_MD		; NO, CHECK NEXT DRIVE TYPE
  1608                              <1> DR_FND:
  1609 000046B4 8BBB[B9650000]      <1> 	mov	edi, [DR_TYPE+ebx+1] 	; DI = MEDIA/DRIVE PARAM TABLE
  1610                              <1> MD_SEARCH:
  1611 000046BA 8A6704              <1>         mov	ah, [edi+MD.SEC_TRK]    ; GET SECTOR/TRACK
  1612                              <1> 	;cmp	[ebp], ah		; MATCH?
  1613                              <1> 	; 06/08/2022
  1614 000046BD 38642418            <1> 	cmp	[esp+24], ah  ; CL ; spt	
  1615 000046C1 7509                <1> 	jne	short NXT_MD		; NO, CHECK NEXT MEDIA
  1616 000046C3 8A670B              <1>         mov     ah, [edi+MD.MAX_TRK]    ; GET MAX. TRACK #
  1617                              <1> 	;cmp 	[ebp+1], ah		; MATCH?
  1618                              <1> 	; 06/08/2022
  1619 000046C6 38642419            <1> 	cmp	[esp+25], ah  ; CH ; heads - 1
  1620 000046CA 740F                <1> 	je	short MD_FND		; YES, GO GET RATE
  1621                              <1> NXT_MD:
  1622                              <1> 	;add	bx, 3			; CHECK NEXT DRIVE TYPE
  1623 000046CC 83C305              <1>         add	ebx, 5 ; 18/02/2015
  1624 000046CF E2D6                <1> 	loop	DR_SEARCH
  1625 000046D1 5F                  <1> 	pop	edi			; RESTORE REG.
  1626                              <1> MD_NOT_FND:
  1627 000046D2 C605[787D0100]0C    <1> 	mov	byte [DSKETTE_STATUS], MED_NOT_FND ; ERROR, MEDIA TYPE NOT FOUND
  1628 000046D9 EB19                <1> 	jmp	short SM_RTN		; RETURN
  1629                              <1> MD_FND:
  1630 000046DB 8A470C              <1>         mov	al, [edi+MD.RATE]       ; GET RATE
  1631 000046DE 3C40                <1> 	cmp	al, RATE_300		; DOUBLE STEP REQUIRED FOR RATE 300
  1632 000046E0 7502                <1> 	jne	short MD_SET
  1633 000046E2 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 000046E4 0C10                <1> 	or	al, MED_DET		; SET MEDIA ESTABLISHED
  1640 000046E6 5F                  <1> 	pop	edi
  1641 000046E7 80A7[837D0100]0F    <1> 	and	byte [DSK_STATE+edi], ~(MED_DET+DBL_STEP+RATE_MSK) ; CLEAR STATE
  1642 000046EE 0887[837D0100]      <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 000046F4 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 000046F9 BB[B8650000]        <1> 	mov	ebx, DR_TYPE
  1675                              <1> 	;;mov	ecx, DR_CNT		; ECX = LOOP COUNT
  1676                              <1> 	;mov	cl, DR_CNT
  1677 000046FE 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 00004700 3A03                <1> 	cmp	al, [ebx] ; 11/07/2022
  1683 00004702 740E                <1> 	je	short DR_TYPE_VALID	; YES, RETURN WITH CARRY RESET
  1684                              <1> 	; 16/02/2015 (32 bit address modification)
  1685 00004704 83C305              <1> 	add	ebx, 5			; CHECK NEXT DRIVE TYPE
  1686                              <1> 	;loop	TYPE_CHK
  1687                              <1> 	;dec	cl
  1688 00004707 FECC                <1> 	dec	ah ; 11/07/2022
  1689 00004709 75F5                <1> 	jnz	short TYPE_CHK
  1690                              <1> 	;
  1691 0000470B BB[17660000]        <1> 	mov	ebx, MD_TBL6		; 1.44MB fd parameter table
  1692                              <1> 					; Default for GET_PARM (11/12/2014)
  1693                              <1> 	;
  1694 00004710 F9                  <1> 	stc				; DRIVE TYPE NOT FOUND IN TABLE
  1695                              <1> 	;jmp	short TYPE_RTN
  1696                              <1> 	; 12/07/2022
  1697 00004711 C3                  <1> 	retn
  1698                              <1> DR_TYPE_VALID:
  1699                              <1> 	;mov	ebx, [DR_TYPE+ebx+1] 	; EBX = MEDIA TABLE
  1700 00004712 43                  <1> 	inc	ebx
  1701 00004713 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 00004715 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 00004716 50                  <1> 	push	eax			; SAVE AX
  1719 00004717 B8[3D470000]        <1> 	mov	eax, SPECBAC		; LOAD ERROR ADDRESS
  1720 0000471C 50                  <1> 	push	eax			; PUSH NEC_OUT ERROR RETURN
  1721 0000471D B403                <1> 	mov	ah, 03h			; SPECIFY COMMAND
  1722 0000471F E898050000          <1> 	call	NEC_OUTPUT		; OUTPUT THE COMMAND
  1723                              <1> 	;sub	dl, dl			; FIRST SPECIFY BYTE
  1724                              <1> 	; 06/08/2022
  1725 00004724 28C0                <1> 	sub	al, al ; 0 
  1726 00004726 E89B040000          <1> 	call	GET_PARM		; GET PARAMETER TO AH
  1727 0000472B E88C050000          <1> 	call	NEC_OUTPUT		; OUTPUT THE COMMAND
  1728                              <1> 	;mov	dl, 1			; SECOND SPECIFY BYTE
  1729                              <1> 	; 06/08/2022
  1730 00004730 B001                <1> 	mov	al, 1
  1731 00004732 E88F040000          <1> 	call	GET_PARM		; GET PARAMETER TO AH
  1732 00004737 E880050000          <1> 	call	NEC_OUTPUT		; OUTPUT THE COMMAND
  1733 0000473C 58                  <1> 	pop	eax			; POP ERROR RETURN
  1734                              <1> SPECBAC:
  1735 0000473D 58                  <1> 	pop	eax			; RESTORE ORIGINAL AX VALUE
  1736 0000473E 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 0000473F 50                  <1> 	push	eax			; SAVE RATE DATA
  1748 00004740 B8[5D470000]        <1> 	mov	eax, SPEC_ESBAC		; LOAD ERROR ADDRESS
  1749 00004745 50                  <1> 	push	eax			; PUSH NEC_OUT ERROR RETURN
  1750 00004746 B403                <1> 	mov	ah, 03h			; SPECIFY COMMAND
  1751 00004748 E86F050000          <1> 	call	NEC_OUTPUT		; OUTPUT THE COMMAND
  1752 0000474D 8A23                <1>         mov     ah, [ebx+MD.SPEC1]      ; GET 1ST SPECIFY BYTE
  1753 0000474F E868050000          <1> 	call	NEC_OUTPUT		; OUTPUT THE COMMAND
  1754 00004754 8A6301              <1>         mov     ah, [ebx+MD.SPEC2]      ; GET SECOND SPECIFY BYTE
  1755 00004757 E860050000          <1> 	call	NEC_OUTPUT		; OUTPUT THE COMMAND
  1756 0000475C 58                  <1> 	pop	eax			; POP ERROR RETURN
  1757                              <1> SPEC_ESBAC:
  1758 0000475D 58                  <1> 	pop	eax			; RESTORE ORIGINAL AX VALUE
  1759 0000475E 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 0000475F 83FF01              <1> 	cmp	edi, 1			; VALID DRIVE
  1772 00004762 7709                <1> 	ja	short XN_OUT		; IF INVALID BACK
  1773 00004764 80BF[837D0100]00    <1> 	cmp	byte [DSK_STATE+edi], 0	; NO DRIVE ?
  1774 0000476B 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 0000476D 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 0000476E E88E040000          <1> 	call	MOTOR_ON		; TURN ON MOTOR IF NOT ALREADY ON
  1805 00004773 E8FA050000          <1> 	call	RECAL			; RECALIBRATE DRIVE
  1806 00004778 724E                <1> 	jc	short DD_BAC		; ASSUME NO DRIVE PRESENT
  1807 0000477A B530                <1> 	mov	ch, TRK_SLAP		; SEEK TO TRACK 48
  1808 0000477C E872050000          <1> 	call	SEEK
  1809 00004781 7245                <1> 	jc	short DD_BAC		; ERROR NO DRIVE
  1810 00004783 B50B                <1> 	mov	ch, QUIET_SEEK+1	; SEEK TO TRACK 10
  1811                              <1> SK_GIN:
  1812 00004785 FECD                <1> 	dec	ch			; DECREMENT TO NEXT TRACK
  1813                              <1> 	;push	cx			; SAVE TRACK
  1814                              <1> 	; 11/04/2021
  1815 00004787 51                  <1> 	push	ecx
  1816 00004788 E866050000          <1> 	call	SEEK
  1817 0000478D 723A                <1> 	jc	short POP_BAC		; POP AND RETURN
  1818 0000478F B8[C9470000]        <1> 	mov	eax, POP_BAC		; LOAD NEC OUTPUT ERROR ADDRESS
  1819 00004794 50                  <1> 	push	eax
  1820 00004795 B404                <1> 	mov	ah, SENSE_DRV_ST	; SENSE DRIVE STATUS COMMAND BYTE
  1821 00004797 E820050000          <1> 	call	NEC_OUTPUT		; OUTPUT TO NEC
  1822                              <1> 	;mov	ax, di			; AL = DRIVE
  1823                              <1> 	; 06/08/2022
  1824 0000479C 89F8                <1> 	mov	eax, edi
  1825 0000479E 88C4                <1> 	mov	ah, al			; AH = DRIVE
  1826 000047A0 E817050000          <1> 	call	NEC_OUTPUT		; OUTPUT TO NEC
  1827 000047A5 E849060000          <1> 	call	RESULTS			; GO GET STATUS
  1828 000047AA 58                  <1> 	pop	eax			; THROW AWAY ERROR ADDRESS
  1829                              <1> 	;pop	cx			; RESTORE TRACK
  1830                              <1> 	; 11/04/2021
  1831 000047AB 59                  <1> 	pop	ecx
  1832 000047AC F605[797D0100]10    <1> 	test	byte [NEC_STATUS], HOME	; TRACK 0 ?
  1833 000047B3 74D0                <1> 	jz	short SK_GIN		; GO TILL TRACK 0
  1834 000047B5 08ED                <1> 	or	ch, ch			; IS HOME AT TRACK 0
  1835 000047B7 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 000047B9 808F[837D0100]94    <1> 	or	byte [DSK_STATE+edi], DRV_DET+MED_DET+RATE_250
  1841 000047C0 C3                  <1> 	retn				; ALL INFORMATION SET
  1842                              <1> IS_80:
  1843 000047C1 808F[837D0100]01    <1> 	or	byte [DSK_STATE+edi], TRK_CAPA ; SETUP 80 TRACK CAPABILITY
  1844                              <1> DD_BAC:
  1845 000047C8 C3                  <1> 	retn
  1846                              <1> POP_BAC:
  1847                              <1> 	;pop	cx			; THROW AWAY
  1848                              <1> 	; 11/04/2021
  1849 000047C9 59                  <1> 	pop	ecx
  1850 000047CA 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 000047CB F687[837D0100]10    <1> 	test	byte [DSK_STATE+edi], MED_DET ; MEDIA DETERMINED ?
  1943 000047D2 7537                <1> 	jnz	short J1C		; NO STATES IF DETERMINED
  1944 000047D4 66B84000            <1>         mov     ax, (RATE_500*256)+RATE_300 ; AH = START RATE, AL = END RATE
  1945 000047D8 F687[837D0100]04    <1> 	test	byte [DSK_STATE+edi], DRV_DET ; DRIVE ?
  1946 000047DF 740D                <1> 	jz	short AX_SET		; DO NOT KNOW DRIVE
  1947 000047E1 F687[837D0100]02    <1> 	test	byte [DSK_STATE+edi], FMT_CAPA ; MULTI-RATE?
  1948 000047E8 7504                <1> 	jnz	short AX_SET		; JUMP IF YES
  1949 000047EA 66B88080            <1>         mov     ax, RATE_250*257	; START A END RATE 250 FOR 360 DRIVE
  1950                              <1> AX_SET:	
  1951 000047EE 80A7[837D0100]1F    <1> 	and	byte [DSK_STATE+edi], ~(RATE_MSK+DBL_STEP) ; TURN OFF THE RATE
  1952 000047F5 08A7[837D0100]      <1> 	or	[DSK_STATE+edi], ah	; RATE FIRST TO TRY
  1953 000047FB 8025[807D0100]F3    <1> 	and	byte [LASTRATE], ~STRT_MSK ; ERASE LAST TO TRY RATE BITS
  1954 00004802 C0C804              <1> 	ror	al, 4			; TO OPERATION LAST RATE LOCATION
  1955 00004805 0805[807D0100]      <1> 	or	[LASTRATE], al		; LAST RATE
  1956                              <1> J1C:	
  1957 0000480B 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 0000480C F687[837D0100]10    <1> 	test	byte [DSK_STATE+edi], MED_DET ; IS MEDIA ESTABLISHED
  1964 00004813 7546                <1> 	jnz	short F1_OUT		; IF SO RETURN
  1965 00004815 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 0000481A 7440                <1> 	jz	short CL_DRV ;; 20/02/2015
  1969 0000481C FEC8                <1> 	dec	al			; MAKE ZERO ORIGIN
  1970                              <1> 	;;JS	short CL_DRV		; NO DRIVE IF AL 0
  1971 0000481E 8AA7[837D0100]      <1> 	mov	ah, [DSK_STATE+edi]	; AH = CURRENT STATE
  1972 00004824 80E40F              <1> 	and	ah, ~(MED_DET+DBL_STEP+RATE_MSK) ; CLEAR
  1973 00004827 08C0                <1> 	or	al, al			; CHECK FOR 360
  1974 00004829 7505                <1> 	jnz	short N_360		; IF 360 WILL BE 0
  1975 0000482B 80CC90              <1> 	or	ah, MED_DET+RATE_250	; ESTABLISH MEDIA
  1976 0000482E EB25                <1> 	jmp	short SKP_STATE		; SKIP OTHER STATE PROCESSING
  1977                              <1> N_360:	
  1978 00004830 FEC8                <1> 	dec	al			; 1.2 M DRIVE
  1979 00004832 7505                <1> 	jnz	short N_12		; JUMP IF NOT
  1980                              <1> F1_RATE:
  1981 00004834 80CC10              <1> 	or	ah, MED_DET+RATE_500	; SET FORMAT RATE
  1982 00004837 EB1C                <1> 	jmp	short SKP_STATE		; SKIP OTHER STATE PROCESSING
  1983                              <1> N_12:	
  1984 00004839 FEC8                <1> 	dec	al			; CHECK FOR TYPE 3
  1985 0000483B 750F                <1> 	jnz	short N_720		; JUMP IF NOT
  1986 0000483D F6C404              <1> 	test	ah, DRV_DET		; IS DRIVE DETERMINED
  1987 00004840 7410                <1> 	jz	short ISNT_12		; TREAT AS NON 1.2 DRIVE
  1988 00004842 F6C402              <1> 	test	ah, FMT_CAPA		; IS 1.2M
  1989 00004845 740B                <1> 	jz	short ISNT_12		; JUMP IF NOT
  1990 00004847 80CC50              <1> 	or	ah, MED_DET+RATE_300	; RATE 300
  1991 0000484A EB09                <1> 	jmp	short SKP_STATE		; CONTINUE
  1992                              <1> N_720:
  1993 0000484C FEC8                <1> 	dec	al			; CHECK FOR TYPE 4
  1994 0000484E 750C                <1> 	jnz	short CL_DRV		; NO DRIVE, CMOS BAD
  1995 00004850 EBE2                <1> 	jmp	SHORT F1_RATE
  1996                              <1> ISNT_12: 
  1997 00004852 80CC90              <1> 	or	ah, MED_DET+RATE_250	; MUST BE RATE 250
  1998                              <1> SKP_STATE:
  1999 00004855 88A7[837D0100]      <1> 	mov	[DSK_STATE+edi], ah	; STORE AWAY
  2000                              <1> F1_OUT:
  2001 0000485B C3                  <1> 	retn
  2002                              <1> CL_DRV:	
  2003 0000485C 30E4                <1> 	xor	ah, ah			; CLEAR STATE
  2004 0000485E 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 00004860 E8E8050000          <1> 	call	READ_DSKCHNG		; READ DISK CHANCE LINE STATE
  2017 00004865 7445                <1> 	jz	short MC_OUT		; BYPASS HANDLING DISK CHANGE LINE
  2018 00004867 80A7[837D0100]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 0000486E 89F9                <1> 	mov	ecx, edi
  2027 00004870 B001                <1> 	mov	al, 1			; MOTOR ON BIT MASK
  2028 00004872 D2E0                <1> 	shl	al, cl			; TO APPROPRIATE POSITION
  2029 00004874 F6D0                <1> 	not	al			; KEEP ALL BUT MOTOR ON
  2030 00004876 FA                  <1> 	cli				; NO INTERRUPTS
  2031 00004877 2005[767D0100]      <1> 	and	[MOTOR_STATUS], al	; TURN MOTOR OFF INDICATOR
  2032 0000487D FB                  <1> 	sti				; INTERRUPTS ENABLED
  2033 0000487E 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 00004883 E82FFAFFFF          <1> 	call	DSK_RESET		; RESET NEC
  2038 00004888 B501                <1> 	mov	ch, 1			; MOVE TO CYLINDER 1
  2039 0000488A E864040000          <1> 	call	SEEK			; ISSUE SEEK
  2040 0000488F 30ED                <1> 	xor	ch, ch			; MOVE TO CYLINDER 0
  2041 00004891 E85D040000          <1> 	call	SEEK			; ISSUE SEEK
  2042 00004896 C605[787D0100]06    <1> 	mov	byte [DSKETTE_STATUS], MEDIA_CHANGE ; STORE IN STATUS
  2043                              <1> OK1:
  2044 0000489D E8AB050000          <1> 	call	READ_DSKCHNG		; CHECK MEDIA CHANGED AGAIN
  2045 000048A2 7407                <1> 	jz	short OK2		; IF ACTIVE, NO DISKETTE, TIMEOUT
  2046                              <1> OK4:
  2047 000048A4 C605[787D0100]80    <1> 	mov	byte [DSKETTE_STATUS], TIME_OUT ; TIMEOUT IF DRIVE EMPTY
  2048                              <1> OK2:		
  2049 000048AB F9                  <1> 	stc				; MEDIA CHANGED, SET CY
  2050                              <1> MC_OUT:	; 06/08/2022 (cf = 0)
  2051 000048AC 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 000048AD 50                  <1> 	push	eax
  2067 000048AE 8025[807D0100]3F    <1> 	and	byte [LASTRATE], ~SEND_MSK ; ELSE CLEAR LAST RATE ATTEMPTED
  2068 000048B5 8A87[837D0100]      <1> 	mov	al, [DSK_STATE+edi]	; GET RATE STATE OF THIS DRIVE
  2069 000048BB 24C0                <1> 	and	al, SEND_MSK		; KEEP ONLY RATE BITS
  2070 000048BD 0805[807D0100]      <1> 	or	[LASTRATE], al		; SAVE NEW RATE FOR NEXT CHECK
  2071 000048C3 C0C002              <1> 	rol	al, 2			; MOVE TO BIT OUTPUT POSITIONS
  2072 000048C6 66BAF703            <1> 	mov	dx, 03F7h		; OUTPUT NEW DATA RATE
  2073 000048CA EE                  <1> 	out	dx, al
  2074                              <1> 	;pop	ax			; RESTORE REG.
  2075                              <1> 	; 11/04/2021
  2076 000048CB 58                  <1> 	pop	eax
  2077 000048CC 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 000048CD 50                  <1> 	push	eax
  2094                              <1> 	; 13/07/2022 (BugFix)
  2095 000048CE 8A25[807D0100]      <1> 	mov	ah, [LASTRATE] 		; GET LAST DATA RATE SELECTED
  2096 000048D4 8A87[837D0100]      <1> 	mov	al, [DSK_STATE+edi]	; GET RATE STATE OF THIS DRIVE
  2097 000048DA 6625C0C0            <1>         and	ax, SEND_MSK*257        ; KEEP ONLY RATE BITS OF BOTH
  2098 000048DE 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 000048E0 58                  <1> 	pop	eax
  2103 000048E1 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 000048E2 F7C5000000FF        <1> 	test	ebp, 0FF000000h
  2138 000048E8 7566                <1> 	jnz	short dma_bnd_err_stc
  2139                              <1> 	; 09/08/2022
  2140 000048EA 89EA                <1> 	mov	edx, ebp
  2141                              <1> 	;
  2142                              <1> 	;;push	ax			; DMA command
  2143                              <1> 	; 11/04/2021
  2144 000048EC 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 000048ED B003                <1> 	mov	al, 3			; GET BYTES/SECTOR PARAMETER
  2150 000048EF E8D2020000          <1> 	call	GET_PARM		; 
  2151 000048F4 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 000048F6 89F0                <1> 	mov	eax, esi
  2155 000048F8 88C4                <1> 	mov	ah, al			; AH = # OF SECTORS
  2156 000048FA 28C0                <1> 	sub	al, al			; AL = 0, AX = # SECTORS * 256
  2157                              <1> 	;shr	ax, 1			; AX = # SECTORS * 128
  2158                              <1> 	; 06/08/2022
  2159 000048FC 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 000048FE D3E0                <1> 	shl	eax, cl
  2164 00004900 48                  <1> 	dec	eax
  2165 00004901 89C1                <1> 	mov	ecx, eax
  2166                              <1> 	; 06/08/2022
  2167                              <1> 	;pop	edx			; *
  2168                              <1> 	;;pop	ax
  2169                              <1> 	; 11/04/2021
  2170 00004903 58                  <1> 	pop	eax
  2171 00004904 3C42                <1> 	cmp	al, 42h
  2172 00004906 7507                <1>         jne     short NOT_VERF
  2173                              <1> 	; 09/08/2022
  2174 00004908 BA0000FF00          <1> 	mov	edx, 0FF0000h
  2175                              <1> 	; 06/08/2022
  2176                              <1> 	;mov	ebp, 0FF0000h
  2177 0000490D EB08                <1> 	jmp	short J33
  2178                              <1> NOT_VERF:
  2179 0000490F 6601CA              <1> 	add	dx, cx			; check for overflow
  2180 00004912 723D                <1> 	jc	short dma_bnd_err
  2181                              <1> 	;
  2182 00004914 6629CA              <1> 	sub	dx, cx			; Restore start address
  2183                              <1> J33:
  2184 00004917 FA                  <1> 	cli				; DISABLE INTERRUPTS DURING DMA SET-UP
  2185 00004918 E60C                <1> 	out	DMA+12, al		; SET THE FIRST/LA5T F/F
  2186                              <1> 	IODELAY				; WAIT FOR I/O
    78 0000491A EB00                <2>  jmp short $+2
    79 0000491C EB00                <2>  jmp short $+2
  2187 0000491E 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 00004920 89D0                <1> 	mov	eax, edx
  2193 00004922 E604                <1> 	out	DMA+4, al		; OUTPUT LOW ADDRESS
  2194                              <1> 	IODELAY				; WAIT FOR I/O
    78 00004924 EB00                <2>  jmp short $+2
    79 00004926 EB00                <2>  jmp short $+2
  2195 00004928 88E0                <1> 	mov	al, ah
  2196 0000492A E604                <1> 	out	DMA+4, al		; OUTPUT HIGH ADDRESS
  2197 0000492C C1E810              <1> 	shr	eax, 16
  2198                              <1> 	IODELAY				; I/O WAIT STATE
    78 0000492F EB00                <2>  jmp short $+2
    79 00004931 EB00                <2>  jmp short $+2
  2199 00004933 E681                <1> 	out	081h, al		; OUTPUT HIGHEST BITS TO PAGE REGISTER
  2200                              <1> 	IODELAY
    78 00004935 EB00                <2>  jmp short $+2
    79 00004937 EB00                <2>  jmp short $+2
  2201                              <1> 	;mov	ax, cx			; Byte count - 1
  2202                              <1> 	; 06/08/2022
  2203 00004939 89C8                <1> 	mov	eax, ecx
  2204 0000493B E605                <1> 	out	DMA+5, al		; LOW BYTE OF COUNT
  2205                              <1> 	IODELAY				; WAIT FOR I/O
    78 0000493D EB00                <2>  jmp short $+2
    79 0000493F EB00                <2>  jmp short $+2
  2206 00004941 88E0                <1> 	mov	al, ah
  2207 00004943 E605                <1> 	out	DMA+5, al		; HIGH BYTE OF COUNT
  2208                              <1> 	IODELAY
    78 00004945 EB00                <2>  jmp short $+2
    79 00004947 EB00                <2>  jmp short $+2
  2209 00004949 FB                  <1> 	sti				; RE-ENABLE INTERRUPTS
  2210 0000494A B002                <1> 	mov	al, 2			; MODE FOR 8237
  2211 0000494C E60A                <1> 	out	DMA+10, al		; INITIALIZE THE DISKETTE CHANNEL
  2212                              <1> 
  2213 0000494E F8                  <1> 	clc	; 04/02/2016
  2214 0000494F C3                  <1> 	retn
  2215                              <1> 
  2216                              <1> dma_bnd_err_stc:
  2217 00004950 F9                  <1> 	stc
  2218                              <1> dma_bnd_err:
  2219 00004951 C605[787D0100]09    <1> 	mov	byte [DSKETTE_STATUS], DMA_BOUNDARY ; SET ERROR
  2220 00004958 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 00004959 F7C5000000FF        <1> 	test	ebp, 0FF000000h
  2313 0000495F 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 00004961 B004                <1> 	mov	al, 4			; SECTORS/TRACK VALUE IN PARM TABLE				
  2322 00004963 E85E020000          <1> 	call	GET_PARM		; "
  2323 00004968 88E0                <1> 	mov	al, ah			; AL = SECTORS/TRACK VALUE
  2324 0000496A 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 0000496C C1E002              <1> 	shl	eax, 2
  2328                              <1> 	;dec	ax			; -1 FOR DMA VALUE
  2329 0000496F 48                  <1> 	dec	eax
  2330                              <1> 	;mov	cx, ax
  2331 00004970 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 00004972 B04A                <1> 	mov	al, 04Ah
  2338                              <1> 	;
  2339 00004974 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 00004976 50                  <1> 	push	eax
  2456 00004977 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 0000497C 88FD                <1> 	mov	ch, bh ; CH = TRACK #
  2463 0000497E E870030000          <1> 	call	SEEK			; MOVE TO CORRECT TRACK
  2464                              <1> 	;pop	ax			; RECOVER COMMAND
  2465                              <1> 	; 11/04/2021
  2466 00004983 58                  <1> 	pop	eax
  2467 00004984 721D                <1> 	jc	short ER_1		; ERROR ON SEEK
  2468 00004986 BB[A3490000]        <1> 	mov	ebx, ER_1		; LOAD ERROR ADDRESS
  2469 0000498B 53                  <1> 	push	ebx			; PUSH NEC_OUT ERROR RETURN
  2470                              <1> 
  2471                              <1> ;-----	SEND OUT THE PARAMETERS TO THE CONTROLLER
  2472                              <1> 
  2473 0000498C E82B030000          <1> 	call	NEC_OUTPUT		; OUTPUT THE OPERATION COMMAND
  2474                              <1> 	;mov	ax, si			; AH = HEAD #
  2475                              <1> 	; 06/08/2022
  2476 00004991 89F0                <1> 	mov	eax, esi
  2477 00004993 89FB                <1> 	mov	ebx, edi		; BL = DRIVE #
  2478 00004995 C0E402              <1> 	sal	ah, 2			; MOVE IT TO BIT 2
  2479 00004998 80E404              <1> 	and	ah, 00000100b		; ISOLATE THAT BIT
  2480 0000499B 08DC                <1> 	or	ah, bl			; OR IN THE DRIVE NUMBER
  2481 0000499D E81A030000          <1> 	call	NEC_OUTPUT		; FALL THRU CY SET IF ERROR
  2482 000049A2 5B                  <1> 	pop	ebx			; THROW AWAY ERROR RETURN
  2483                              <1> ER_1:
  2484 000049A3 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 000049A4 B8[F0490000]        <1> 	mov	eax, ER_2		; LOAD ERROR ADDRESS
  2499 000049A9 50                  <1> 	push	eax			; PUSH NEC_OUT ERROR RETURN
  2500                              <1> 	;mov	ah, [ebp+1]		; OUTPUT TRACK #
  2501                              <1> 	; 11/08/2022
  2502 000049AA 8A642425            <1> 	mov	ah, [esp+37] ; CH = OUTPUT TRACK #
  2503 000049AE E809030000          <1> 	call	NEC_OUTPUT
  2504                              <1> 	;mov	ax, si			; OUTPUT HEAD #
  2505                              <1> 	; 06/08/2022
  2506 000049B3 89F0                <1> 	mov	eax, esi
  2507 000049B5 E802030000          <1> 	call	NEC_OUTPUT
  2508                              <1> 	;mov	ah, [ebp]		; OUTPUT SECTOR #
  2509                              <1> 	; 11/08/2022
  2510 000049BA 8A642424            <1> 	mov	ah, [esp+36] ; CL = OUTPUT SECTOR #
  2511 000049BE E8F9020000          <1> 	call	NEC_OUTPUT
  2512                              <1> 	;mov	dl, 3			; BYTES/SECTOR PARAMETER FROM BLOCK
  2513                              <1> 	; 06/08/2022
  2514 000049C3 B003                <1> 	mov	al, 3
  2515 000049C5 E8FC010000          <1> 	call	GET_PARM 		; ... TO THE NEC
  2516 000049CA E8ED020000          <1> 	call	NEC_OUTPUT		; OUTPUT TO CONTROLLER
  2517                              <1> 	;mov	dl, 4			; EOT PARAMETER FROM BLOCK
  2518                              <1> 	; 06/08/2022
  2519 000049CF B004                <1> 	mov	al, 4
  2520 000049D1 E8F0010000          <1> 	call	GET_PARM 		; ... TO THE NEC
  2521 000049D6 E8E1020000          <1> 	call	NEC_OUTPUT		; OUTPUT TO CONTROLLER
  2522 000049DB 8A6305              <1> 	mov	ah, [ebx+MD.GAP]        ; GET GAP LENGTH
  2523                              <1> _R15:
  2524 000049DE E8D9020000          <1> 	call	NEC_OUTPUT
  2525                              <1> 	;mov	dl, 6			; DTL PARAMETER PROM BLOCK
  2526                              <1> 	; 06/08/2022
  2527 000049E3 B006                <1> 	mov	al, 6
  2528 000049E5 E8DC010000          <1> 	call	GET_PARM		; ... TO THE NEC
  2529 000049EA E8CD020000          <1> 	call	NEC_OUTPUT		; OUTPUT TO CONTROLLER
  2530 000049EF 58                  <1> 	pop	eax			; THROW AWAY ERROR EXIT
  2531                              <1> ER_2:
  2532 000049F0 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 000049F1 56                  <1> 	push	esi			; SAVE HEAD #, # OF SECTORS
  2546 000049F2 E8CD030000          <1> 	call	WAIT_INT		; WAIT FOR THE INTERRUPT
  2547 000049F7 9C                  <1> 	pushf
  2548 000049F8 E8F6030000          <1> 	call	RESULTS			; GET THE NEC STATUS
  2549 000049FD 724B                <1> 	jc	short SET_END_POP
  2550 000049FF 9D                  <1> 	popf
  2551 00004A00 723E                <1> 	jc	short SET_END		; LOOK FOR ERROR
  2552                              <1> 
  2553                              <1> ;-----	CHECK THE RESULTS RETURNED BY THE CONTROLLER
  2554                              <1> 
  2555 00004A02 FC                  <1> 	cld				; SET THE CORRECT DIRECTION
  2556 00004A03 BE[797D0100]        <1> 	mov	esi, NEC_STATUS		; POINT TO STATUS FIELD
  2557 00004A08 AC                  <1> 	lodsb				; GET ST0
  2558 00004A09 24C0                <1> 	and	AL, 11000000B		; TEST FOR NORMAL TERMINATION
  2559 00004A0B 7433                <1> 	jz	short SET_END
  2560 00004A0D 3C40                <1> 	cmp	AL,01000000B		; TEST FOR ABNORMAL TERMINATION
  2561 00004A0F 7527                <1> 	jnz	short J18		; NOT ABNORMAL, BAD NEC
  2562                              <1> 
  2563                              <1> ;-----	ABNORMAL TERMINATION, FIND OUT WHY
  2564                              <1> 
  2565 00004A11 AC                  <1> 	lodsb				; GET ST1
  2566 00004A12 D0E0                <1> 	sal	al, 1			; TEST FOR EDT FOUND
  2567 00004A14 B404                <1> 	mov	ah, RECORD_NOT_FND
  2568 00004A16 7222                <1> 	jc	short J19
  2569 00004A18 C0E002              <1> 	sal	al, 2
  2570 00004A1B B410                <1> 	mov	ah, BAD_CRC
  2571 00004A1D 721B                <1> 	jc	short J19
  2572 00004A1F D0E0                <1> 	sal	al, 1			; TEST FOR DMA OVERRUN
  2573 00004A21 B408                <1> 	mov	ah, BAD_DMA
  2574 00004A23 7215                <1> 	jc	short J19
  2575 00004A25 C0E002              <1> 	sal	al, 2			; TEST FOR RECORD NOT FOUND
  2576 00004A28 B404                <1> 	mov	ah, RECORD_NOT_FND
  2577 00004A2A 720E                <1> 	jc	short J19
  2578 00004A2C D0E0                <1> 	sal	al, 1
  2579 00004A2E B403                <1> 	mov	ah, WRITE_PROTECT	; TEST FOR WRITE_PROTECT
  2580 00004A30 7208                <1> 	jc	short J19
  2581 00004A32 D0E0                <1> 	sal	al, 1			; TEST MISSING ADDRESS MARK
  2582 00004A34 B402                <1> 	mov	ah, BAD_ADDR_MARK
  2583 00004A36 7202                <1> 	jc	short J19
  2584                              <1> 
  2585                              <1> ;----- 	NEC MUST HAVE FAILED
  2586                              <1> J18:
  2587 00004A38 B420                <1> 	mov	ah, BAD_NEC
  2588                              <1> J19:
  2589 00004A3A 0825[787D0100]      <1> 	or	[DSKETTE_STATUS], ah
  2590                              <1> SET_END:
  2591 00004A40 803D[787D0100]01    <1> 	cmp	byte [DSKETTE_STATUS], 1 ; SET ERROR CONDITION
  2592 00004A47 F5                  <1> 	cmc
  2593 00004A48 5E                  <1> 	pop	esi
  2594 00004A49 C3                  <1> 	retn				; RESTORE HEAD #, # OF SECTORS
  2595                              <1> 
  2596                              <1> SET_END_POP:
  2597 00004A4A 9D                  <1> 	popf
  2598 00004A4B EBF3                <1> 	jmp	short SET_END
  2599                              <1> 
  2600                              <1> ;-------------------------------------------------------------------------------
  2601                              <1> ; DSTATE:	ESTABLISH STATE UPON SUCCESSFUL OPERATION.
  2602                              <1> ;-------------------------------------------------------------------------------
  2603                              <1> DSTATE:
  2604 00004A4D 803D[787D0100]00    <1> 	cmp	byte [DSKETTE_STATUS], 0 ; CHECK FOR ERROR
  2605 00004A54 753E                <1> 	jnz	short SETBAC		; IF ERROR JUMP
  2606 00004A56 808F[837D0100]10    <1> 	or	byte [DSK_STATE+edi], MED_DET
  2607                              <1> 					; NO ERROR, MARK MEDIA AS DETERMINED
  2608 00004A5D F687[837D0100]04    <1> 	test	byte [DSK_STATE+edi], DRV_DET ; DRIVE DETERMINED ?
  2609 00004A64 752E                <1> 	jnz	short SETBAC		; IF DETERMINED NO TRY TO DETERMINE
  2610 00004A66 8A87[837D0100]      <1> 	mov	al, [DSK_STATE+edi]	; LOAD STATE
  2611 00004A6C 24C0                <1> 	and	al, RATE_MSK		; KEEP ONLY RATE
  2612 00004A6E 3C80                <1> 	cmp	al, RATE_250		; RATE 250 ?
  2613 00004A70 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 00004A72 E846010000          <1> 	call	CMOS_TYPE		; RETURN DRIVE TYPE IN (AL)
  2618                              <1> 	;;20/02/2015
  2619                              <1> 	;;jc	short M_12		; CMOS BAD
  2620 00004A77 7414                <1> 	jz	short M_12 ;; 20/02/2015
  2621 00004A79 3C04                <1> 	cmp	al, 4			; 1.44MB DRIVE ?
  2622 00004A7B 7410                <1> 	je	short M_12		; YES
  2623                              <1> M_720:
  2624 00004A7D 80A7[837D0100]FD    <1> 	and	byte [DSK_STATE+edi], ~FMT_CAPA ; TURN OFF FORMAT CAPABILITY
  2625 00004A84 808F[837D0100]04    <1> 	or	byte [DSK_STATE+edi], DRV_DET ; MARK DRIVE DETERMINED
  2626 00004A8B EB07                <1> 	jmp	short SETBAC		; BACK
  2627                              <1> M_12:	
  2628 00004A8D 808F[837D0100]06    <1> 	or	byte [DSK_STATE+edi], DRV_DET+FMT_CAPA 
  2629                              <1> 					; TURN ON DETERMINED & FMT CAPA
  2630                              <1> SETBAC:
  2631 00004A94 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 00004A95 803D[787D0100]00    <1> 	cmp	byte [DSKETTE_STATUS], 0 ; GET STATUS OF OPERATION
  2643 00004A9C 7445                <1> 	jz	short NO_RETRY		; SUCCESSFUL OPERATION
  2644 00004A9E 803D[787D0100]80    <1> 	cmp	byte [DSKETTE_STATUS], TIME_OUT ; IF TIME OUT NO RETRY
  2645 00004AA5 743C                <1> 	jz	short NO_RETRY
  2646 00004AA7 8AA7[837D0100]      <1> 	mov	ah, [DSK_STATE+edi]	; GET MEDIA STATE OF DRIVE
  2647 00004AAD F6C410              <1> 	test	ah, MED_DET		; ESTABLISHED/DETERMINED ?
  2648 00004AB0 7531                <1> 	jnz	short NO_RETRY		; IF ESTABLISHED STATE THEN TRUE ERROR
  2649 00004AB2 80E4C0              <1> 	and	ah, RATE_MSK		; ISOLATE RATE
  2650 00004AB5 8A2D[807D0100]      <1> 	mov	ch, [LASTRATE]		; GET START OPERATION STATE
  2651 00004ABB C0C504              <1> 	rol	ch, 4			; TO CORRESPONDING BITS
  2652 00004ABE 80E5C0              <1> 	and	ch, RATE_MSK		; ISOLATE RATE BITS
  2653 00004AC1 38E5                <1> 	cmp	ch, ah			; ALL RATES TRIED
  2654 00004AC3 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 00004AC5 80FC01              <1> 	cmp	ah, RATE_500+1		; SET CY FOR RATE 500
  2662 00004AC8 D0DC                <1> 	rcr	ah, 1			; TO NEXT STATE
  2663 00004ACA 80E4C0              <1> 	and	ah, RATE_MSK		; KEEP ONLY RATE BITS
  2664 00004ACD 80A7[837D0100]1F    <1> 	and	byte [DSK_STATE+edi], ~(RATE_MSK+DBL_STEP)
  2665                              <1> 					; RATE, DBL STEP OFF
  2666 00004AD4 08A7[837D0100]      <1> 	or	[DSK_STATE+edi], ah	; TURN ON NEW RATE
  2667 00004ADA C605[787D0100]00    <1> 	mov	byte [DSKETTE_STATUS], 0  ; RESET STATUS FOR RETRY
  2668 00004AE1 F9                  <1> 	stc				; SET CARRY FOR RETRY
  2669 00004AE2 C3                  <1> 	retn				; RETRY RETURN
  2670                              <1> 
  2671                              <1> NO_RETRY:
  2672                              <1> 	; 06/08/2022
  2673                              <1> 	;clc				; CLEAR CARRY NO RETRY
  2674 00004AE3 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 00004AE4 30C0                <1> 	xor	al, al			; CLEAR FOR ERROR
  2691                              <1> 	;cmp	byte [DSKETTE_STATUS], 0
  2692 00004AE6 3805[787D0100]      <1> 	cmp	[DSKETTE_STATUS], al ; 0 ; CHECK FOR ERROR
  2693 00004AEC 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 00004AEE B004                <1> 	mov	al, 4
  2697 00004AF0 E8D1000000          <1> 	call	GET_PARM		; AH = SECTORS/TRACK
  2698 00004AF5 8A1D[7E7D0100]      <1> 	mov	bl, [NEC_STATUS+5]	; GET ENDING SECTOR
  2699                              <1> 	;mov	cx, si			; CH = HEAD # STARTED
  2700                              <1> 	; 06/08/2022
  2701 00004AFB 89F1                <1> 	mov	ecx, esi
  2702 00004AFD 3A2D[7D7D0100]      <1> 	cmp	ch, [NEC_STATUS+4]	; GET HEAD ENDED UP ON
  2703 00004B03 750E                <1> 	jnz	short DIF_HD		; IF ON SAME HEAD, THEN NO ADJUST
  2704 00004B05 8A2D[7C7D0100]      <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 00004B0B 3A6C241D            <1> 	cmp	ch, [esp+29] ; CH = TRACK #
  2708 00004B0F 7404                <1> 	jz	short SAME_TRK		; IF SAME TRACK NO INCREASE
  2709 00004B11 00E3                <1> 	add	bl, ah			; ADD SECTORS/TRACK
  2710                              <1> DIF_HD:
  2711 00004B13 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 00004B15 2A5C241C            <1> 	sub	bl, [esp+28] ; CL = SECTOR #	
  2716 00004B19 88D8                <1> 	mov	al, bl			; TO AL
  2717                              <1> NT_OUT:
  2718 00004B1B 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 00004B1C 8AA7[837D0100]      <1> 	mov	ah, [DSK_STATE+edi]	; ACCESS STATE
  2731 00004B22 F6C410              <1> 	test	ah, MED_DET		; ESTABLISHED STATE ?
  2732 00004B25 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 00004B27 C605[757D0100]00    <1> 	mov	byte [SEEK_STATUS], 0	; SET RECALIBRATE REQUIRED ON ALL DRIVES
  2737 00004B2E E8CE000000          <1> 	call	MOTOR_ON		; ENSURE MOTOR STAY ON
  2738 00004B33 B500                <1> 	mov	ch, 0			; LOAD TRACK 0
  2739 00004B35 E8B9010000          <1> 	call	SEEK			; SEEK TO TRACK 0
  2740 00004B3A E861000000          <1> 	call	READ_ID			; READ ID FUNCTION
  2741 00004B3F 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 00004B41 66B95004            <1> 	mov	cx, 0450h 		; START, MAX TRACKS
  2746 00004B45 F687[837D0100]01    <1> 	test	byte [DSK_STATE+edi], TRK_CAPA ; TEST FOR 80 TRACK CAPABILITY
  2747 00004B4C 7402                <1> 	jz	short CNT_OK		; IF NOT COUNT IS SETUP
  2748 00004B4E 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 00004B50 C605[777D0100]FF    <1>         mov     byte [MOTOR_COUNT], 0FFh ; ENSURE MOTOR STAYS ON FOR OPERATION
  2757 00004B57 51                  <1> 	push	ecx			; SAVE TRACK, COUNT
  2758 00004B58 C605[787D0100]00    <1> 	mov	byte [DSKETTE_STATUS], 0 ; CLEAR STATUS, EXPECT ERRORS
  2759                              <1> 	;xor	ax, ax			; CLEAR AX
  2760                              <1> 	; 06/08/2022
  2761 00004B5F 31C0                <1> 	xor	eax, eax
  2762 00004B61 D0ED                <1> 	shr	ch, 1			; HALVE TRACK, CY = HEAD
  2763 00004B63 C0D003              <1> 	rcl	al, 3			; AX = HEAD IN CORRECT BIT
  2764 00004B66 50                  <1> 	push	eax			; SAVE HEAD
  2765 00004B67 E887010000          <1> 	call	SEEK			; SEEK TO TRACK
  2766 00004B6C 58                  <1> 	pop	eax			; RESTORE HEAD
  2767                              <1> 	;or	di, ax			; DI = HEAD OR'ED DRIVE
  2768                              <1> 	; 06/08/2022
  2769 00004B6D 09C7                <1> 	or	edi, eax
  2770 00004B6F E82C000000          <1> 	call	READ_ID			; READ ID HEAD 0
  2771 00004B74 9C                  <1> 	pushf				; SAVE RETURN FROM READ_ID
  2772 00004B75 6681E7FB00          <1> 	and	di, 11111011b		; TURN OFF HEAD 1 BIT
  2773 00004B7A 9D                  <1> 	popf				; RESTORE ERROR RETURN
  2774 00004B7B 59                  <1> 	pop	ecx			; RESTORE COUNT
  2775 00004B7C 7308                <1> 	jnc	short DO_CHK		; IF OK, ASKED = RETURNED TRACK ?
  2776 00004B7E FEC5                <1> 	inc	ch			; INC FOR NEXT TRACK
  2777 00004B80 38CD                <1> 	cmp	ch, cl			; REACHED MAXIMUM YET
  2778 00004B82 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 00004B84 F9                  <1> 	stc				; SET CARRY FOR ERROR
  2784 00004B85 C3                  <1> 	retn				; SETUP_DBL ERROR EXIT
  2785                              <1> 
  2786                              <1> DO_CHK:
  2787 00004B86 8A0D[7C7D0100]      <1> 	mov	cl, [NEC_STATUS+3]	; LOAD RETURNED TRACK
  2788 00004B8C 888F[857D0100]      <1> 	mov	[DSK_TRK+edi], cl	; STORE TRACK NUMBER
  2789 00004B92 D0ED                <1> 	shr	ch, 1			; HALVE TRACK
  2790 00004B94 38CD                <1> 	cmp	ch, cl			; IS IT THE SAME AS ASKED FOR TRACK
  2791 00004B96 7407                <1> 	jz	short NO_DBL		; IF SAME THEN NO DOUBLE STEP
  2792 00004B98 808F[837D0100]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 00004B9F 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 00004BA0 B8[BC4B0000]        <1> 	mov	eax, ER_3		; MOVE NEC OUTPUT ERROR ADDRESS
  2810 00004BA5 50                  <1> 	push	eax
  2811 00004BA6 B44A                <1> 	mov	ah, 4Ah			; READ ID COMMAND
  2812 00004BA8 E80F010000          <1> 	call	NEC_OUTPUT		; TO CONTROLLER
  2813                              <1> 	;mov	ax, di			; DRIVE # TO AH, HEAD 0
  2814                              <1> 	; 06/08/2022
  2815 00004BAD 89F8                <1> 	mov	eax, edi
  2816 00004BAF 88C4                <1> 	mov	ah, al
  2817 00004BB1 E806010000          <1> 	call	NEC_OUTPUT		; TO CONTROLLER
  2818 00004BB6 E836FEFFFF          <1> 	call	NEC_TERM		; WAIT FOR OPERATION, GET STATUS
  2819 00004BBB 58                  <1> 	pop	eax			; THROW AWAY ERROR ADDRESS
  2820                              <1> ER_3:
  2821 00004BBC 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 00004BBD 8A87[3C660000]      <1> 	mov	al, [edi+fd0_type]
  2834 00004BC3 20C0                <1> 	and 	al, al ; 18/12/2014
  2835 00004BC5 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 00004BC6 53                  <1> 	push	ebx			; SAVE EBX	
  2880                              <1> 	;movzx	ebx, dl			; EBX = INDEX
  2881 00004BC7 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 00004BCA 89F8                <1> 	mov	eax, edi		; EDI = DRIVE #
  2890                              <1> 	;cmp	al, ah
  2891 00004BCC 3A05[2D660000]      <1> 	cmp	al, [pfd]	
  2892 00004BD2 7423                <1> 	je	short gpndc
  2893 00004BD4 A2[2D660000]        <1> 	mov	[pfd], al		; current drive -> previous drive
  2894 00004BD9 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 00004BDA 8A87[3C660000]      <1> 	mov	al, [edi+fd0_type]	; Drive type (0,1,2,3,4)
  2900                              <1> 	; 18/12/2014
  2901 00004BE0 20C0                <1> 	and	al, al
  2902 00004BE2 7507                <1> 	jnz	short gpdtc
  2903 00004BE4 BB[17660000]        <1> 	mov	ebx, MD_TBL6		; 1.44 MB param. tbl. (default)
  2904 00004BE9 EB05                <1>         jmp     short gpdpu
  2905                              <1> gpdtc:	
  2906 00004BEB E809FBFFFF          <1> 	call	DR_TYPE_CHECK
  2907                              <1> 	; cf = 1 -> ebx points to 1.44MB fd parameter table (default)
  2908                              <1> gpdpu:
  2909 00004BF0 891D[B4650000]      <1> 	mov	[DISK_POINTER], ebx
  2910 00004BF6 5B                  <1> 	pop	ebx
  2911                              <1> gpndc:
  2912                              <1> 	;mov	esi, [DISK_POINTER] ; 08/02/2015, si -> esi
  2913                              <1> 	; 06/08/2022
  2914 00004BF7 031D[B4650000]      <1> 	add	ebx, [DISK_POINTER]
  2915                              <1> 	;mov	ah, [esi+ebx]		; GET THE WORD
  2916 00004BFD 8A23                <1> 	mov	ah, [ebx]
  2917                              <1> 	;xchg	edx, ebx		; RESTORE BX
  2918                              <1> 	; 06/08/2022
  2919 00004BFF 5B                  <1> 	pop	ebx			; RESTORE EBX
  2920                              <1> 	;pop	esi
  2921                              <1> 	;;pop	ds
  2922 00004C00 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 00004C01 53                  <1> 	push	ebx			; SAVE REG.
  2946 00004C02 E825000000          <1> 	call	TURN_ON			; TURN ON MOTOR
  2947 00004C07 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 00004C09 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 00004C0E B00A                <1> 	mov	al, 10
  2957 00004C10 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 00004C15 80FC08              <1> 	cmp	ah, 8
  2962                              <1> 	;jae	short GP2		; IF YES, CONTINUE
  2963 00004C18 7702                <1> 	ja	short J13
  2964                              <1> 	;mov	al, 8			; ONE SECOND WAIT FOR MOTOR START UP
  2965 00004C1A 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 00004C1C B947100000          <1> 	mov	ecx, 4167 ; count of 30 micro seconds * (1/8) 
  2974 00004C21 E8B5D7FFFF          <1> 	call	WAITF			; GO TO FIXED WAIT ROUTINE
  2975                              <1> 	;dec	al			; DECREMENT TIME VALUE
  2976 00004C26 FECC                <1> 	dec	ah
  2977 00004C28 75F2                <1> 	jnz	short J13		; ARE WE DONE YET
  2978                              <1> MOT_IS_ON:
  2979 00004C2A 5B                  <1> 	pop	ebx			; RESTORE REG.
  2980 00004C2B 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 00004C2C 89FB                <1> 	mov	ebx, edi		; BX = DRIVE #
  2994 00004C2E 88D9                <1> 	mov	cl, bl			; CL = DRIVE #
  2995 00004C30 C0C304              <1> 	rol	bl, 4			; BL = DRIVE SELECT
  2996 00004C33 FA                  <1> 	cli				; NO INTERRUPTS WHILE DETERMINING STATUS
  2997 00004C34 C605[777D0100]FF    <1> 	mov	byte [MOTOR_COUNT], 0FFh ; ENSURE MOTOR STAYS ON FOR OPERATION
  2998 00004C3B A0[767D0100]        <1> 	mov	al, [MOTOR_STATUS]	; GET DIGITAL OUTPUT REGISTER REFLECTION
  2999 00004C40 2430                <1> 	and	al, 00110000b		; KEEP ONLY DRIVE SELECT BITS
  3000 00004C42 B401                <1> 	mov	ah, 1			; MASK FOR DETERMINING MOTOR BIT
  3001 00004C44 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 00004C46 38D8                <1> 	cmp	al, bl			; REQUESTED DRIVE ALREADY SELECTED ?
  3008 00004C48 7508                <1> 	jnz	short TURN_IT_ON	; IF NOT SELECTED JUMP
  3009 00004C4A 8425[767D0100]      <1> 	test	ah, [MOTOR_STATUS]	; TEST MOTOR ON BIT
  3010 00004C50 7535                <1> 	jnz	short NO_MOT_WAIT	; JUMP IF MOTOR ON AND SELECTED
  3011                              <1> 
  3012                              <1> TURN_IT_ON:
  3013 00004C52 08DC                <1> 	or	ah, bl			; AH = DRIVE SELECT AND MOTOR ON
  3014 00004C54 8A3D[767D0100]      <1> 	mov	bh, [MOTOR_STATUS]	; SAVE COPY OF @MOTOR_STATUS BEFORE
  3015 00004C5A 80E70F              <1> 	and	bh, 00001111b		; KEEP ONLY MOTOR BITS
  3016 00004C5D 8025[767D0100]CF    <1> 	and	byte [MOTOR_STATUS], 11001111b ; CLEAR OUT DRIVE SELECT
  3017 00004C64 0825[767D0100]      <1> 	or	[MOTOR_STATUS], ah	; OR IN DRIVE SELECTED AND MOTOR ON
  3018 00004C6A A0[767D0100]        <1> 	mov	al, [MOTOR_STATUS]	; GET DIGITAL OUTPUT REGISTER REFLECTION
  3019 00004C6F 88C3                <1> 	mov	bl, al			; BL=@MOTOR_STATUS AFTER, BH=BEFORE
  3020 00004C71 80E30F              <1> 	and	bl, 00001111b		; KEEP ONLY MOTOR BITS
  3021 00004C74 FB                  <1> 	sti				; ENABLE INTERRUPTS AGAIN
  3022 00004C75 243F                <1> 	and	al, 00111111b		; STRIP AWAY UNWANTED BITS
  3023 00004C77 C0C004              <1> 	rol	al, 4			; PUT BITS IN DESIRED POSITIONS
  3024 00004C7A 0C0C                <1> 	or	al, 00001100b		; NO RESET, ENABLE DMA/INTERRUPT
  3025 00004C7C 66BAF203            <1> 	mov	dx, 03F2h		; SELECT DRIVE AND TURN ON MOTOR
  3026 00004C80 EE                  <1> 	out	dx, al
  3027 00004C81 38FB                <1> 	cmp	bl, bh			; NEW MOTOR TURNED ON ?
  3028                              <1> 	;jz	short NO_MOT_WAIT	; NO WAIT REQUIRED IF JUST SELECT
  3029 00004C83 7403                <1> 	je	short no_mot_w1 ; 27/02/2015 
  3030 00004C85 F8                  <1> 	clc				; (re)SET CARRY MEANING WAIT
  3031 00004C86 C3                  <1> 	retn
  3032                              <1> 
  3033                              <1> NO_MOT_WAIT:
  3034 00004C87 FB                  <1> 	sti
  3035                              <1> no_mot_w1: ; 27/02/2015
  3036 00004C88 F9                  <1> 	stc				; SET NO WAIT REQUIRED
  3037                              <1> 	;sti				; INTERRUPTS BACK ON
  3038 00004C89 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 00004C8A B009                <1> 	mov	al, 9
  3053 00004C8C E835FFFFFF          <1> 	call	GET_PARM
  3054 00004C91 08E4                <1> 	or	ah, ah	; 17/12/2014
  3055 00004C93 7519                <1> 	jnz	short DO_WAT
  3056 00004C95 F605[767D0100]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 00004C9C 741D                <1> 	jz	short HW_DONE
  3061 00004C9E B40F                <1> 	mov	ah, HD12_SETTLE		; LOAD 1.2M HEAD SETTLE MINIMUM
  3062 00004CA0 8A87[837D0100]      <1> 	mov	al, [DSK_STATE+edi]	; LOAD STATE
  3063 00004CA6 24C0                <1> 	and	al, RATE_MSK		; KEEP ONLY RATE
  3064 00004CA8 3C80                <1> 	cmp	al, RATE_250		; 1.2 M DRIVE ?
  3065 00004CAA 7502                <1> 	jnz	short DO_WAT		; DEFAULT HEAD SETTLE LOADED
  3066                              <1> ;GP3:
  3067 00004CAC 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 00004CAE 29C9                <1> 	sub	ecx, ecx
  3085 00004CB0 B121                <1> 	mov	cl, WAIT_FDU_HEAD_SETTLE ; 33
  3086 00004CB2 E824D7FFFF          <1> 	call	WAITF			; DELAY FOR 1 MILLISECOND
  3087                              <1> 	;dec	al			; DECREMENT THE COUNT
  3088 00004CB7 FECC                <1> 	dec	ah
  3089 00004CB9 75F3                <1> 	jnz	short J29		; DO AL MILLISECOND # OF TIMES
  3090                              <1> HW_DONE:
  3091 00004CBB 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 00004CBC 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 00004CC0 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 00004CC5 EC                  <1> 	in	al, dx			; GET STATUS
  3167 00004CC6 24C0                <1> 	and	al, 11000000b		; KEEP STATUS AND DIRECTION
  3168 00004CC8 3C80                <1> 	cmp	al, 10000000b		; STATUS 1 AND DIRECTION 0 ?
  3169 00004CCA 7418                <1> 	jz	short J27		; STATUS AND DIRECTION OK
  3170                              <1> WFPS_HI:
  3171 00004CCC E461                <1> 	in	al, PORT_B  ; 061h	; SYS1	; wait for hi to lo
  3172 00004CCE A810                <1> 	test	al, 010h		; transition on memory
  3173 00004CD0 75FA                <1> 	jnz	short WFPS_HI		; refresh.
  3174                              <1> WFPS_LO:
  3175 00004CD2 E461                <1> 	in	al, PORT_B		; SYS1
  3176 00004CD4 A810                <1> 	test	al, 010h
  3177 00004CD6 74FA                <1> 	jz	short WFPS_LO
  3178                              <1> 	;loop	short WFPS_CHECK_PORT
  3179 00004CD8 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 00004CDA 800D[787D0100]80    <1> 	or	byte [DSKETTE_STATUS], TIME_OUT
  3203                              <1> 	;pop	bx			; RESTORE REG.
  3204 00004CE1 58                  <1> 	pop	eax ; 08/02/2015	; DISCARD THE RETURN ADDRESS
  3205 00004CE2 F9                  <1> 	stc				; INDICATE ERROR TO CALLER
  3206 00004CE3 C3                  <1> 	retn
  3207                              <1> 
  3208                              <1> ;-----	DIRECTION AND STATUS OK; OUTPUT BYTE
  3209                              <1> 
  3210                              <1> J27:	
  3211 00004CE4 88E0                <1> 	mov	al, ah			; GET BYTE TO OUTPUT
  3212                              <1> 	;inc	dx			; DATA PORT = STATUS PORT + 1
  3213                              <1> 	; 06/08/2022
  3214 00004CE6 FEC2                <1> 	inc	dl
  3215 00004CE8 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 00004CE9 29C9                <1> 	sub	ecx, ecx
  3226 00004CEB B102                <1> 	mov	cl, 2
  3227 00004CED 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 00004CF2 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 00004CF3 89FB                <1> 	mov	ebx, edi		; BX = DRIVE #
  3248 00004CF5 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 00004CF7 84C3                <1> 	test	bl, al ; test bl, 1
  3255 00004CF9 7402                <1> 	jz	short seek_0
  3256 00004CFB FEC0                <1> 	inc	al ; shl al, 1
  3257                              <1> seek_0:
  3258 00004CFD 8405[757D0100]      <1> 	test	al, [SEEK_STATUS]	; TEST FOR RECALIBRATE REQUIRED
  3259 00004D03 7526                <1> 	jnz	short J28A		; JUMP IF RECALIBRATE NOT REQUIRED
  3260                              <1> 
  3261 00004D05 0805[757D0100]      <1> 	or	[SEEK_STATUS], al	; TURN ON THE NO RECALIBRATE BIT IN FLAG
  3262 00004D0B E862000000          <1> 	call	RECAL			; RECALIBRATE DRIVE
  3263 00004D10 730E                <1> 	jnc	short AFT_RECAL		; RECALIBRATE DONE
  3264                              <1> 
  3265                              <1> ;-----	ISSUE RECALIBRATE FOR 80 TRACK DISKETTES
  3266                              <1> 
  3267 00004D12 C605[787D0100]00    <1> 	mov	byte [DSKETTE_STATUS], 0 ; CLEAR OUT INVALID STATUS
  3268 00004D19 E854000000          <1> 	call	RECAL			; RECALIBRATE DRIVE
  3269 00004D1E 7251                <1> 	jc	short RB		; IF RECALIBRATE FAILS TWICE THEN ERROR
  3270                              <1> 
  3271                              <1> AFT_RECAL:
  3272 00004D20 C687[857D0100]00    <1>         mov     byte [DSK_TRK+edi], 0	; SAVE NEW CYLINDER AS PRESENT POSITION
  3273 00004D27 08ED                <1> 	or	ch, ch			; CHECK FOR SEEK TO TRACK 0
  3274 00004D29 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 00004D2B F687[837D0100]20    <1> J28A:	test	byte [DSK_STATE+edi], DBL_STEP ; CHECK FOR DOUBLE STEP REQUIRED
  3279 00004D32 7402                <1> 	jz	short _R7		; SINGLE STEP REQUIRED BYPASS DOUBLE
  3280 00004D34 D0E5                <1> 	shl	ch, 1			; DOUBLE NUMBER OF STEP TO TAKE
  3281                              <1> 
  3282 00004D36 3AAF[857D0100]      <1> _R7:	cmp	ch, [DSK_TRK+edi]	; SEE IF ALREADY AT THE DESIRED TRACK
  3283 00004D3C 7433                <1> 	je	short RB		; IF YES, DO NOT NEED TO SEEK
  3284                              <1> 
  3285 00004D3E BA[714D0000]        <1> 	mov	edx, NEC_ERR		; LOAD RETURN ADDRESS
  3286 00004D43 52                  <1> 	push	edx ; (*)		; ON STACK FOR NEC OUTPUT ERROR
  3287 00004D44 88AF[857D0100]      <1> 	mov	[DSK_TRK+edi], ch	; SAVE NEW CYLINDER AS PRESENT POSITION
  3288 00004D4A B40F                <1> 	mov	ah, 0Fh			; SEEK COMMAND TO NEC
  3289 00004D4C E86BFFFFFF          <1> 	call	NEC_OUTPUT
  3290 00004D51 89FB                <1> 	mov	ebx, edi		; BX = DRIVE #
  3291 00004D53 88DC                <1> 	mov	ah, bl			; OUTPUT DRIVE NUMBER
  3292 00004D55 E862FFFFFF          <1> 	call	NEC_OUTPUT
  3293 00004D5A 8AA7[857D0100]      <1> 	mov	ah, [DSK_TRK+edi]	; GET CYLINDER NUMBER
  3294 00004D60 E857FFFFFF          <1> 	call	NEC_OUTPUT
  3295 00004D65 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 00004D6A 9C                  <1> 	pushf				; SAVE STATUS
  3301 00004D6B E81AFFFFFF          <1> 	call	HD_WAIT			; WAIT FOR HEAD SETTLE TIME
  3302 00004D70 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 00004D71 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 00004D72 51                  <1> 	push	ecx
  3321 00004D73 B8[8F4D0000]        <1> 	mov	eax, RC_BACK		; LOAD NEC_OUTPUT ERROR
  3322 00004D78 50                  <1> 	push	eax
  3323 00004D79 B407                <1> 	mov	ah, 07h			; RECALIBRATE COMMAND
  3324 00004D7B E83CFFFFFF          <1> 	call	NEC_OUTPUT
  3325 00004D80 89FB                <1> 	mov	ebx, edi		; BX = DRIVE #
  3326 00004D82 88DC                <1> 	mov	ah, bl
  3327 00004D84 E833FFFFFF          <1> 	call	NEC_OUTPUT		; OUTPUT THE DRIVE NUMBER
  3328 00004D89 E803000000          <1> 	call	CHK_STAT_2		; GET THE INTERRUPT AND SENSE INT STATUS
  3329 00004D8E 58                  <1> 	pop	eax			; THROW AWAY ERROR
  3330                              <1> RC_BACK:
  3331                              <1> 	;pop	cx
  3332                              <1> 	; 11/04/2021
  3333 00004D8F 59                  <1> 	pop	ecx
  3334 00004D90 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 00004D91 B8[B94D0000]        <1>         mov     eax, CS_BACK            ; LOAD NEC_OUTPUT ERROR ADDRESS
  3346 00004D96 50                  <1> 	push	eax
  3347 00004D97 E828000000          <1> 	call	WAIT_INT		; WAIT FOR THE INTERRUPT
  3348 00004D9C 721A                <1> 	jc	short J34		; IF ERROR, RETURN IT
  3349 00004D9E B408                <1> 	mov	ah, 08h			; SENSE INTERRUPT STATUS COMMAND
  3350 00004DA0 E817FFFFFF          <1> 	call	NEC_OUTPUT
  3351 00004DA5 E849000000          <1> 	call	RESULTS			; READ IN THE RESULTS
  3352 00004DAA 720C                <1> 	jc	short J34
  3353 00004DAC A0[797D0100]        <1> 	mov	al, [NEC_STATUS]	; GET THE FIRST STATUS BYTE
  3354 00004DB1 2460                <1> 	and	al, 01100000B		; ISOLATE THE BITS
  3355 00004DB3 3C60                <1> 	cmp	al, 01100000B		; TEST FOR CORRECT VALUE
  3356 00004DB5 7403                <1> 	jz	short J35		; IF ERROR, GO MARK IT
  3357 00004DB7 F8                  <1> 	clc				; GOOD RETURN
  3358                              <1> J34:
  3359 00004DB8 58                  <1> 	pop	eax			; THROW AWAY ERROR RETURN
  3360                              <1> CS_BACK:
  3361 00004DB9 C3                  <1> 	retn
  3362                              <1> J35:
  3363 00004DBA 800D[787D0100]40    <1> 	or	byte [DSKETTE_STATUS], BAD_SEEK
  3364 00004DC1 F9                  <1> 	stc				; ERROR RETURN CODE
  3365 00004DC2 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 00004DC4 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 00004DC5 B986450100          <1> 	mov 	ecx, WAIT_FDU_INT_LH	; 83334 (2.5 seconds)		
  3407                              <1> WFMS_CHECK_MEM:
  3408 00004DCA F605[757D0100]80    <1> 	test	byte [SEEK_STATUS], INT_FLAG
  3409                              <1> 					; TEST FOR INTERRUPT OCCURRING
  3410 00004DD1 7516                <1>         jnz     short J37
  3411                              <1> WFMS_HI:
  3412 00004DD3 E461                <1> 	in	al, PORT_B  ; 061h	; SYS1, wait for lo to hi
  3413 00004DD5 A810                <1> 	test	al, 010h		; transition on memory
  3414 00004DD7 75FA                <1> 	jnz	short WFMS_HI		; refresh.
  3415                              <1> WFMS_LO:
  3416 00004DD9 E461                <1> 	in	al, PORT_B		; SYS1
  3417 00004DDB A810                <1> 	test	al, 010h
  3418 00004DDD 74FA                <1> 	jz	short WFMS_LO
  3419 00004DDF 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 00004DE1 800D[787D0100]80    <1> 	or	byte [DSKETTE_STATUS], TIME_OUT ; NOTHING HAPPENED
  3446 00004DE8 F9                  <1> 	stc				; ERROR RETURN
  3447                              <1> J37:
  3448 00004DE9 9C                  <1> 	pushf				; SAVE CURRENT CARRY
  3449 00004DEA 8025[757D0100]7F    <1> 	and	byte [SEEK_STATUS], ~INT_FLAG ; TURN OFF INTERRUPT FLAG
  3450 00004DF1 9D                  <1> 	popf				; RECOVER CARRY
  3451 00004DF2 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 00004DF3 57                  <1> 	push	edi
  3464 00004DF4 BF[797D0100]        <1> 	mov	edi, NEC_STATUS		; POINTER TO DATA AREA
  3465 00004DF9 B307                <1> 	mov	bl, 7			; MAX STATUS BYTES
  3466 00004DFB 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 00004DFF 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 00004E04 EC                  <1> 	in	al, dx			; GET STATUS
  3488 00004E05 24C0                <1> 	and	al, 11000000b		; KEEP ONLY STATUS AND DIRECTION
  3489 00004E07 3CC0                <1> 	cmp	al, 11000000b		; STATUS 1 AND DIRECTION 1 ?
  3490 00004E09 7418                <1> 	jz	short J42		; STATUS AND DIRECTION OK
  3491                              <1> WFPSR_HI:
  3492 00004E0B E461                <1> 	in	al, PORT_B	; 061h	; SYS1	; wait for hi to lo
  3493 00004E0D A810                <1> 	test	al, 010h		; transition on memory
  3494 00004E0F 75FA                <1> 	jnz	short WFPSR_HI		; refresh.
  3495                              <1> WFPSR_LO:
  3496 00004E11 E461                <1> 	in	al, PORT_B		; SYS1
  3497 00004E13 A810                <1> 	test	al, 010h
  3498 00004E15 74FA                <1> 	jz	SHORT WFPSR_LO
  3499 00004E17 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 00004E19 800D[787D0100]80    <1> 	or	byte [DSKETTE_STATUS], TIME_OUT
  3521 00004E20 F9                  <1> 	stc				; SET ERROR RETURN
  3522 00004E21 EB28                <1> 	jmp	short POPRES		; POP REGISTERS AND RETURN
  3523                              <1> 
  3524                              <1> ;-----	READ IN THE STATUS
  3525                              <1> 
  3526                              <1> J42:
  3527 00004E23 EB00                <1> 	jmp	$+2			; I/O DELAY
  3528                              <1> 	;inc	dx			; POINT AT DATA PORT
  3529                              <1> 	; 06/08/2022
  3530 00004E25 FEC2                <1> 	inc	dl
  3531 00004E27 EC                  <1> 	in	al, dx			; GET THE DATA
  3532                              <1> 	; 16/12/2014
  3533                              <1> 	NEWIODELAY
    83 00004E28 E6EB                <2>  out 0EBh, al
  3534 00004E2A 8807                <1>         mov     [edi], al		; STORE THE BYTE
  3535 00004E2C 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 00004E2D 29C9                <1> 	sub	ecx, ecx
  3550 00004E2F B102                <1> 	mov	cl, 2
  3551 00004E31 E8A5D5FFFF          <1> 	call	WAITF			; WAIT 30 TO 45 MICROSECONDS
  3552                              <1> 	;dec	dx			; POINT AT STATUS PORT
  3553                              <1> 	; 06/08/2022
  3554 00004E36 FECA                <1> 	dec	dl
  3555 00004E38 EC                  <1> 	in	al, dx			; GET STATUS
  3556                              <1> 	; 16/12/2014
  3557                              <1> 	NEWIODELAY
    83 00004E39 E6EB                <2>  out 0EBh, al
  3558                              <1> 	;
  3559 00004E3B A810                <1> 	test	al, 00010000b		; TEST FOR NEC STILL BUSY
  3560 00004E3D 740C                <1> 	jz	short POPRES		; RESULTS DONE ?
  3561                              <1> 
  3562 00004E3F FECB                <1> 	dec	bl			; DECREMENT THE STATUS COUNTER
  3563 00004E41 75BC                <1>         jnz     short _R10              ; GO BACK FOR MORE
  3564 00004E43 800D[787D0100]20    <1> 	or	byte [DSKETTE_STATUS], BAD_NEC ; TOO MANY STATUS BYTES
  3565 00004E4A F9                  <1> 	stc				; SET ERROR FLAG
  3566                              <1> 
  3567                              <1> ;-----	RESULT OPERATION IS DONE
  3568                              <1> POPRES:
  3569 00004E4B 5F                  <1> 	pop	edi
  3570 00004E4C 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 00004E4D E8AFFDFFFF          <1> 	call	MOTOR_ON		; TURN ON THE MOTOR IF OFF
  3585 00004E52 66BAF703            <1> 	mov	dx, 03F7h		; ADDRESS DIGITAL INPUT REGISTER
  3586 00004E56 EC                  <1> 	in	al, dx			; INPUT DIGITAL INPUT REGISTER
  3587 00004E57 A880                <1> 	test	al, DSK_CHG		; CHECK FOR DISK CHANGE LINE ACTIVE
  3588 00004E59 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 00004E5A 50                  <1> 	push	eax
  3605 00004E5B 1E                  <1> 	push	ds
  3606 00004E5C 66B81000            <1> 	mov	ax, KDATA
  3607 00004E60 8ED8                <1> 	mov 	ds, ax
  3608 00004E62 800D[757D0100]80    <1>         or	byte [SEEK_STATUS], INT_FLAG ; TURN ON INTERRUPT OCCURRED
  3609 00004E69 B020                <1> 	mov     al, EOI			; END OF INTERRUPT MARKER
  3610 00004E6B E620                <1> 	out	INTA00, al		; INTERRUPT CONTROL PORT
  3611 00004E6D 1F                  <1> 	pop	ds
  3612                              <1> 	;pop	ax			; RECOVER REGISTER
  3613                              <1> 	; 11/04/2021
  3614 00004E6E 58                  <1> 	pop	eax
  3615 00004E6F 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 00004E70 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 00004E71 31FF                <1> 	xor	edi, edi		; INITIALIZE DRIVE POINTER
  3639                              <1> 	; 09/08/2022
  3640                              <1> 	;mov	esi, eax
  3641 00004E73 31C0                <1> 	xor	eax, eax ; eax = 0
  3642 00004E75 66A3[837D0100]      <1> 	mov	[DSK_STATE], ax		; INITIALIZE STATES
  3643 00004E7B 8025[807D0100]33    <1> 	and	byte [LASTRATE], ~(STRT_MSK+SEND_MSK) ; CLEAR START & SEND
  3644 00004E82 800D[807D0100]C0    <1> 	or	byte [LASTRATE], SEND_MSK ; INITIALIZE SENT TO IMPOSSIBLE
  3645 00004E89 A2[757D0100]        <1> 	mov	[SEEK_STATUS], al	; INDICATE RECALIBRATE NEEDED
  3646 00004E8E A2[777D0100]        <1> 	mov	[MOTOR_COUNT], al	; INITIALIZE MOTOR COUNT
  3647 00004E93 A2[767D0100]        <1> 	mov	[MOTOR_STATUS], al	; INITIALIZE DRIVES TO OFF STATE
  3648 00004E98 A2[787D0100]        <1> 	mov	[DSKETTE_STATUS], al	; NO ERRORS
  3649                              <1> 	;
  3650                              <1> 	; 28/02/2015
  3651                              <1> 	;mov	word [cfd], 100h 
  3652 00004E9D E815F4FFFF          <1> 	call	DSK_RESET
  3653 00004EA2 5A                  <1> 	pop	edx
  3654 00004EA3 F8                  <1> 	clc	; 29/05/2016
  3655 00004EA4 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 00004EA5 90                  <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 00004EA6 C705[8C7D0100]0000- <1> 	mov 	dword [HDPM_TBL_VEC], (DPT_SEGM*16)+HD0_DPT
  4045 00004EAE 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 00004EB0 C705[907D0100]2000- <1> 	mov 	dword [HDPS_TBL_VEC], (DPT_SEGM*16)+HD1_DPT
  4048 00004EB8 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 00004EBA C705[947D0100]4000- <1> 	mov 	dword [HDSM_TBL_VEC], (DPT_SEGM*16)+HD2_DPT
  4051 00004EC2 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 00004EC4 C705[987D0100]6000- <1> 	mov 	dword [HDSS_TBL_VEC], (DPT_SEGM*16)+HD3_DPT
  4054 00004ECC 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 00004ECE BE[3E660000]        <1> 	mov	esi, hd0_type
  4081                              <1> 	;;mov	cx, 4
  4082                              <1> 	;mov	ecx, 4
  4083                              <1> 	; 06/08/2022
  4084 00004ED3 29C9                <1> 	sub	ecx, ecx
  4085 00004ED5 B104                <1> 	mov	cl, 4
  4086                              <1> hde_l:
  4087 00004ED7 AC                  <1> 	lodsb
  4088 00004ED8 3C80                <1> 	cmp	al, 80h			; 8?h = existing
  4089 00004EDA 7206                <1> 	jb	short _L4
  4090 00004EDC FE05[887D0100]      <1> 	inc	byte [HF_NUM]		; + 1 hard (fixed) disk drives
  4091                              <1> _L4: ; 26/02/2015
  4092 00004EE2 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 00004EE4 8A0D[887D0100]      <1> 	mov	cl, [HF_NUM]
  4114 00004EEA 20C9                <1> 	and	cl, cl
  4115 00004EEC 740D                <1> 	jz	short POD_DONE
  4116                              <1> 	;
  4117 00004EEE B27F                <1> 	mov	dl, 7Fh
  4118                              <1> hdc_reset1:
  4119 00004EF0 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 00004EF2 B40D                <1> 	mov	ah, 0Dh ; ALTERNATE RESET
  4140                              <1> 	;int	13h
  4141 00004EF4 E8CC000000          <1> 	call	int13h
  4142 00004EF9 E2F5                <1> 	loop	hdc_reset1
  4143                              <1> 	;clc 	; 29/05/2016
  4144                              <1> POD_DONE:
  4145 00004EFB 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 00004EFC 80642408FE          <1> 	and	byte [esp+8], 11111110b  ; clear carry bit of eflags register
  4280                              <1> 
  4281                              <1> 	; 13/07/2022
  4282 00004F01 06                  <1> 	push	es
  4283                              <1> 	; 16/05/2016
  4284 00004F02 1E                  <1> 	push	ds
  4285 00004F03 53                  <1> 	push	ebx ; user's buffer address (virtual)
  4286                              <1> 	; 13/07/2022
  4287 00004F04 51                  <1> 	push	ecx
  4288 00004F05 52                  <1> 	push	edx
  4289 00004F06 56                  <1> 	push	esi
  4290 00004F07 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 00004F08 66BF1000            <1> 	mov	di, KDATA
  4296 00004F0C 8EDF                <1> 	mov	ds, di
  4297 00004F0E 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 00004F10 891D[84890100]      <1> 	mov	[user_buffer], ebx		
  4308                              <1> 
  4309 00004F16 C605[B6820100]00    <1> 	mov	byte [scount], 0 ; sector count for transfer
  4310 00004F1D 80FC03              <1> 	cmp	ah, 03h ; chs write
  4311 00004F20 773C                <1> 	ja	short int33h_2
  4312 00004F22 7407                <1> 	je	short int33h_0
  4313 00004F24 80FC02              <1> 	cmp	ah, 02h ; chs read
  4314 00004F27 7267                <1> 	jb	short int33h_5
  4315 00004F29 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 00004F2B FEC8                <1> 	dec	al
  4326 00004F2D 781A                <1> 	js	short int33h_8 ; error
  4327 00004F2F FEC0                <1> 	inc	al	
  4328                              <1> 
  4329                              <1> 	; transfer user's buffer content to sector buffer
  4330 00004F31 51                  <1> 	push	ecx
  4331 00004F32 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 00004F35 89DE                <1> 	mov	esi, ebx
  4337                              <1> 	; esi = user's buffer address (virtual, ebx)
  4338                              <1> 	;push	edi
  4339                              <1> 	;push	es
  4340 00004F37 50                  <1> 	push	eax
  4341                              <1> 	;mov	ax, KDATA
  4342                              <1> 	;mov	es, ax
  4343 00004F38 BF00000700          <1> 	mov	edi, Cluster_Buffer
  4344 00004F3D C1E109              <1> 	shl	ecx, 9 ; * 512
  4345 00004F40 E8B5C00000          <1> 	call	transfer_from_user_buffer
  4346                              <1> 		; (ecx and eax will be modified)
  4347 00004F45 58                  <1> 	pop	eax
  4348                              <1> 	; 13/07/2022
  4349                              <1> 	;pop	es
  4350                              <1> 	;pop	edi
  4351                              <1> 	;pop	esi
  4352 00004F46 59                  <1> 	pop	ecx
  4353 00004F47 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 00004F49 B8FF000000          <1> 	mov	eax, 0FFh ; Unknown error !?
  4361                              <1> int33h_9:
  4362 00004F4E 5F                  <1> 	pop	edi
  4363 00004F4F 5E                  <1> 	pop	esi
  4364 00004F50 5A                  <1> 	pop	edx
  4365 00004F51 59                  <1> 	pop	ecx
  4366 00004F52 5B                  <1> 	pop	ebx
  4367 00004F53 1F                  <1> 	pop	ds
  4368 00004F54 07                  <1> 	pop	es
  4369                              <1> 
  4370                              <1> 	; 13/07/2022
  4371 00004F55 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 00004F57 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 00004F5C 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 00004F5D 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 00004F5E 80FC05              <1> 	cmp	ah, 05h ; format track
  4418 00004F61 7709                <1> 	ja	short int33h_3
  4419 00004F63 722B                <1> 	jb	short int33h_5
  4420 00004F65 51                  <1> 	push	ecx
  4421                              <1> 	;mov	ecx, 1
  4422                              <1> 	; 17/07/2022
  4423 00004F66 31C9                <1> 	xor	ecx, ecx
  4424 00004F68 FEC1                <1> 	inc	cl
  4425                              <1> 	; ecx = 1
  4426 00004F6A EBC9                <1> 	jmp	short int33h_1
  4427                              <1> int33h_3:
  4428 00004F6C 80FC1C              <1> 	cmp	ah, 1Ch ; LBA write
  4429 00004F6F 771F                <1> 	ja	short int33h_5
  4430 00004F71 74B8                <1> 	je	short int33h_0
  4431 00004F73 80FC1B              <1> 	cmp	ah, 1Bh ; LBA read
  4432 00004F76 740D                <1> 	je	short int33h_4
  4433 00004F78 80FC08              <1> 	cmp	ah, 08h ; get disk parameters
  4434 00004F7B 7513                <1> 	jne	short int33h_5
  4435                              <1> 	; 01/06/2016
  4436 00004F7D 8B1D[84890100]      <1> 	mov	ebx, [user_buffer] ; user's buffer address
  4437 00004F83 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 00004F85 FEC8                <1> 	dec	al
  4448 00004F87 78C0                <1> 	js	short int33h_8 ; error
  4449 00004F89 FEC0                <1> 	inc	al
  4450                              <1> 
  4451 00004F8B A2[B6820100]        <1> 	mov	byte [scount], al ; <= 128 sectors
  4452                              <1> int33h_5:
  4453 00004F90 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 00004F95 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 00004F9A 72B2                <1> 	jc	short int33h_9
  4467                              <1> 	;
  4468                              <1> 	;cmp	byte [cs:scount], 0
  4469                              <1> 	;jna	short int33h_7	
  4470 00004F9C 803D[B6820100]00    <1> 	cmp	byte [scount], 0 ; 13/07/2022
  4471 00004FA3 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 00004FA5 50                  <1> 	push	eax
  4488 00004FA6 0FB60D[B6820100]    <1> 	movzx	ecx, byte [scount]
  4489 00004FAD C1E109              <1> 	shl	ecx, 9 ; * 512 bytes
  4490                              <1> 	;mov	edi, ebx ; user's buffer address
  4491 00004FB0 8B3D[84890100]      <1> 	mov	edi, [user_buffer] ; 13/07/2022
  4492 00004FB6 BE00000700          <1> 	mov	esi, Cluster_Buffer
  4493 00004FBB E8F0BF0000          <1> 	call	transfer_to_user_buffer 
  4494                              <1> 		; (ecx and eax will be modified)
  4495 00004FC0 58                  <1> 	pop	eax
  4496                              <1> 
  4497                              <1> 	; 13/07/2022
  4498 00004FC1 7286                <1> 	jc	short int33h_8 ; eax = 0FFh
  4499 00004FC3 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 00004FC5 53                  <1> 	push	ebx
  4558 00004FC6 51                  <1> 	push	ecx
  4559 00004FC7 52                  <1> 	push	edx
  4560 00004FC8 56                  <1> 	push	esi
  4561 00004FC9 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 00004FCA E806000000          <1> 	call	DISK_IO
  4571                              <1> 	;
  4572 00004FCF 5F                  <1> 	pop	edi
  4573 00004FD0 5E                  <1> 	pop	esi
  4574 00004FD1 5A                  <1> 	pop	edx
  4575 00004FD2 59                  <1> 	pop	ecx
  4576 00004FD3 5B                  <1> 	pop	ebx	
  4577                              <1> 	;
  4578                              <1> 	;pop	ds
  4579                              <1> 	;pop	es
  4580                              <1> 	;
  4581 00004FD4 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 00004FD5 FB                  <1> 	sti				; ENABLE INTERRUPTS
  4615                              <1> 
  4616 00004FD6 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 00004FD9 7305                <1> 	jnb	short A1
  4626 00004FDB E934F2FFFF          <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 00004FE0 80FA83              <1> 	cmp	dl, (80h + S_MAX_FILE - 1)
  4637                              <1> 	;ja	short RET_2
  4638 00004FE3 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 00004FE5 B4AA                <1> 	mov     ah, 0AAh        ; Hard disk drive not ready !
  4653                              <1> 				; (Programmer's guide to AMIBIOS, 1992)
  4654 00004FE7 8825[877D0100]      <1> 	mov     byte [DISK_STATUS1], ah
  4655                              <1> 	; 13/07/2022
  4656                              <1> 	;pop	ds
  4657                              <1> 	;jmp	short RET_2
  4658 00004FED F9                  <1> 	stc
  4659 00004FEE C3                  <1> 	retn
  4660                              <1> _A0:
  4661                              <1> 	; 18/01/2015
  4662 00004FEF 08E4                <1> 	or	ah, ah
  4663 00004FF1 742C                <1> 	jz	short A4
  4664 00004FF3 80FC0D              <1> 	cmp	ah, 0Dh	; Alternate reset
  4665 00004FF6 7504                <1> 	jne	short A2
  4666 00004FF8 28E4                <1> 	sub	ah, ah	; Reset
  4667 00004FFA EB23                <1> 	jmp	short A4
  4668                              <1> A2:
  4669                              <1> 	; 13/07/2022
  4670 00004FFC 80FC08              <1> 	cmp	ah, 08h			; GET PARAMETERS IS A SPECIAL CASE
  4671 00004FFF 7505                <1> 	jne	short A3
  4672 00005001 E911040000          <1>         jmp	GET_PARM_N
  4673                              <1> A3:	
  4674                              <1> 	; 13/07/2022
  4675 00005006 80FC15              <1> 	cmp	ah, 15h			; READ DASD TYPE IS ALSO
  4676 00005009 7514                <1> 	jne	short A4
  4677 0000500B E9AC030000          <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 00005010 B401                <1> 	mov	ah, BAD_CMD
  4691 00005012 8825[877D0100]      <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 00005018 F9                  <1> 	stc
  4702                              <1> 	; cf = 1, ah = BAD_CMD
  4703 00005019 C3                  <1> 	retn
  4704                              <1> _A4:
  4705                              <1> 	; 13/07/2022
  4706                              <1> 	; 02/02/2015
  4707 0000501A 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 0000501D 73F1                <1> 	jnb	short int33h_bad_cmd	
  4713                              <1> A4:					; SAVE REGISTERS DURING OPERATION
  4714 0000501F 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 00005023 E880000000          <1> 	call	DISK_IO_CONT		; PERFORM THE OPERATION
  4742                              <1> 	;;call	DDS			; ESTABLISH SEGMENT
  4743 00005028 8A25[877D0100]      <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 0000502E 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 0000502F 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 00005032 F5                  <1> 	cmc
  4766                              <1> 	; 13/07/2022
  4767 00005033 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 00005034 [4B520000]          <1> 	dd	DISK_RESET		; 00h
  4774 00005038 [AB520000]          <1> 	dd	RETURN_STATUS		; 01h
  4775 0000503C [BE520000]          <1> 	dd	DISK_READ		; 02h
  4776 00005040 [1A530000]          <1> 	dd	DISK_WRITE		; 03h
  4777 00005044 [A4530000]          <1> 	dd	DISK_VERF		; 04h
  4778 00005048 [8E530000]          <1> 	dd	FMT_TRK 		; 05h
  4779 0000504C [E1510000]          <1> 	dd	BAD_COMMAND		; 06h	FORMAT BAD SECTORS
  4780 00005050 [E1510000]          <1> 	dd	BAD_COMMAND		; 07h	FORMAT DRIVE
  4781 00005054 [E1510000]          <1> 	dd	BAD_COMMAND		; 08h	RETURN PARAMETERS
  4782 00005058 [97540000]          <1> 	dd	INIT_DRV		; 09h
  4783 0000505C [B8520000]          <1> 	dd	RD_LONG 		; 0Ah
  4784 00005060 [14530000]          <1> 	dd	WR_LONG 		; 0Bh
  4785 00005064 [08550000]          <1> 	dd	DISK_SEEK		; 0Ch
  4786 00005068 [4B520000]          <1> 	dd	DISK_RESET		; 0Dh
  4787 0000506C [E1510000]          <1> 	dd	BAD_COMMAND		; 0Eh	READ BUFFER
  4788 00005070 [E1510000]          <1> 	dd	BAD_COMMAND		; 0Fh	WRITE BUFFER
  4789 00005074 [30550000]          <1> 	dd	TST_RDY 		; 10h
  4790 00005078 [64550000]          <1> 	dd	HDISK_RECAL		; 11h
  4791 0000507C [E1510000]          <1> 	dd	BAD_COMMAND		; 12h	MEMORY DIAGNOSTIC
  4792 00005080 [E1510000]          <1> 	dd	BAD_COMMAND		; 13h	DRIVE DIAGNOSTIC
  4793 00005084 [9A550000]          <1> 	dd	CTLR_DIAGNOSTIC 	; 14h	CONTROLLER DIAGNOSTIC
  4794                              <1> 	;; 02/02/2015 (Temporary - Retro UNIX 386 v1 - DISK I/O test)
  4795 00005088 [E1510000]          <1> 	dd	BAD_COMMAND		; 15h
  4796 0000508C [E1510000]          <1> 	dd	BAD_COMMAND		; 16h
  4797 00005090 [E1510000]          <1> 	dd	BAD_COMMAND		; 17h
  4798 00005094 [E1510000]          <1> 	dd	BAD_COMMAND		; 18h
  4799 00005098 [E1510000]          <1> 	dd	BAD_COMMAND		; 19h
  4800 0000509C [E1510000]          <1> 	dd	BAD_COMMAND		; 1Ah
  4801 000050A0 [BE520000]          <1> 	dd	DISK_READ		; 1Bh ; LBA read
  4802 000050A4 [1A530000]          <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 000050A8 80FC01              <1> 	cmp	ah, 01h			; RETURN STATUS
  4813 000050AB 7505                <1> 	jne	short SU0
  4814 000050AD E9F9010000          <1> 	jmp	RETURN_STATUS
  4815                              <1> SU0:
  4816 000050B2 C605[877D0100]00    <1> 	mov	byte [DISK_STATUS1], 0 	; RESET THE STATUS INDICATOR
  4817                              <1> 	; 13/07/2022
  4818 000050B9 89DE                <1> 	mov	esi, ebx ; 21/02/2015	; SAVE DATA ADDRESS
  4819 000050BB 8A1D[887D0100]      <1> 	mov	bl, [HF_NUM]		; GET NUMBER OF DRIVES
  4820 000050C1 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 000050C4 38D3                <1> 	cmp	bl, dl
  4824                              <1> 	;jbe	short BAD_COMMAND	; INVALID DRIVE
  4825                              <1> 	; 07/08/2022
  4826 000050C6 7705                <1> 	ja	short SU0X
  4827 000050C8 E914010000          <1> 	jmp	BAD_COMMAND
  4828                              <1> SU0X:
  4829                              <1> 	;;03/01/2015
  4830 000050CD 29DB                <1> 	sub	ebx, ebx
  4831 000050CF 88D3                <1> 	mov	bl, dl
  4832 000050D1 883D[9C7D0100]      <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 000050D7 50                  <1> 	push	eax ; ***
  4842                              <1> 	;push	es  ; **
  4843 000050D8 52                  <1> 	push	edx ; *
  4844 000050D9 50                  <1> 	push	eax ; ****
  4845 000050DA E8AA060000          <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 000050DF 668B4310            <1> 	mov	ax, [ebx+16]
  4849 000050E3 66A3[2E660000]      <1> 	mov	[HF_PORT], ax
  4850                              <1> 	;mov	dx, [ES:BX+18] ; control port address (3F6h, 376h)
  4851 000050E9 668B5312            <1> 	mov	dx, [ebx+18]
  4852 000050ED 668915[30660000]    <1> 	mov	[HF_REG_PORT], dx
  4853                              <1> 	;mov	al, [ES:BX+20] ; head register upper nibble (A0h,B0h,E0h,F0h)
  4854 000050F4 8A4314              <1> 	mov	al, [ebx+20]
  4855                              <1> 	; 23/02/2015
  4856 000050F7 A840                <1> 	test	al, 40h	 ; LBA bit (bit 6)
  4857 000050F9 7406                <1> 	jz 	short su1
  4858 000050FB FE05[9C7D0100]      <1> 	inc	byte [LBAMode] ; 1 
  4859                              <1> su1: 	 
  4860 00005101 C0E804              <1> 	shr 	al, 4
  4861 00005104 2401                <1> 	and	al, 1			
  4862 00005106 A2[32660000]        <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 0000510B 8A4308              <1> 	mov	al, [ebx+8]
  4867                              <1> 	;mov	dx, [HF_REG_PORT]	; Device Control register
  4868 0000510E 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 0000510F 8A25[897D0100]      <1> 	mov	ah, [CONTROL_BYTE]	; SET EXTRA HEAD OPTION IN
  4879 00005115 80E4C0              <1> 	and	ah, 0C0h 		; CONTROL BYTE
  4880 00005118 08C4                <1> 	or	ah, al
  4881 0000511A 8825[897D0100]      <1> 	mov	[CONTROL_BYTE], ah
  4882                              <1> 	
  4883                              <1> 	; 11/04/2021 (32 bit push/pop)
  4884                              <1> 	; 04/01/2015
  4885 00005120 58                  <1> 	pop	eax ; ****
  4886 00005121 5A                  <1> 	pop	edx ; * ; 14/02/2015
  4887 00005122 20E4                <1> 	and	ah, ah	; Reset function ?
  4888 00005124 7506                <1> 	jnz	short su2
  4889                              <1> 	;pop	es ; **
  4890 00005126 58                  <1> 	pop	eax ; ***
  4891 00005127 E91F010000          <1>         jmp     DISK_RESET
  4892                              <1> su2:
  4893 0000512C 803D[9C7D0100]00    <1> 	cmp	byte [LBAMode], 0
  4894 00005133 765E                <1> 	jna	short su3
  4895                              <1> 	;
  4896                              <1> 	; 02/02/2015 (LBA read/write function calls)
  4897 00005135 80FC1B              <1> 	cmp	ah, 1Bh
  4898 00005138 720A                <1> 	jb	short lbarw1
  4899 0000513A 80FC1C              <1> 	cmp	ah, 1Ch
  4900 0000513D 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 0000513F 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 00005144 52                  <1> 	push	edx ; * ;; 14/02/2015
  4915                              <1> 	;xor	dh, dh
  4916 00005145 31D2                <1> 	xor	edx, edx
  4917                              <1> 	;mov	dl, [ES:BX+14]	; sectors per track (logical)
  4918 00005147 8A530E              <1> 	mov	dl, [ebx+14]
  4919                              <1> 	;xor	ah, ah
  4920 0000514A 31C0                <1> 	xor	eax, eax
  4921                              <1> 	;mov	al, [ES:BX+2]	; heads (logical) 	
  4922 0000514C 8A4302              <1> 	mov	al, [ebx+2]
  4923 0000514F FEC8                <1> 	dec	al
  4924 00005151 6640                <1> 	inc	ax		; 0 = 256
  4925 00005153 66F7E2              <1> 	mul 	dx
  4926                              <1> 		; AX = # of Heads * Sectors/Track
  4927 00005156 6689CA              <1> 	mov	dx, cx
  4928                              <1> 	;and	cx, 3Fh	 ; sector  (1 to 63)
  4929 00005159 83E13F              <1> 	and	ecx, 3Fh
  4930 0000515C 86D6                <1> 	xchg	dl, dh
  4931 0000515E 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 00005161 F7E2                <1> 	mul	edx
  4936 00005163 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 00005165 01C8                <1> 	add	eax, ecx
  4941                              <1> 	; 11/04/2021 (32 bit push/pop)
  4942 00005167 59                  <1> 	pop	ecx ; * ; ch = head, cl = drive number (zero based)
  4943                              <1> 	;push	dx
  4944                              <1> 	;push	ax
  4945 00005168 50                  <1> 	push	eax
  4946                              <1> 	; 13/07/2022
  4947 00005169 29C0                <1> 	sub	eax, eax
  4948                              <1> 	;mov	al, [ES:BX+14]	; sectors per track (logical)	
  4949 0000516B 8A430E              <1> 	mov	al, [ebx+14]
  4950 0000516E 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 00005170 5A                  <1> 	pop	edx
  4956                              <1> 	;add	ax, dx
  4957                              <1> 	;pop	dx
  4958                              <1> 	;adc	dx, 0 ; add carry bit
  4959 00005171 01D0                <1> 	add	eax, edx
  4960                              <1> lbarw2:
  4961 00005173 29D2                <1> 	sub	edx, edx ; 21/02/2015
  4962 00005175 88CA                <1> 	mov	dl, cl ; 21/02/2015
  4963 00005177 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 0000517B 8A0D[32660000]      <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 00005181 80C90E              <1> 	or	cl, 0Eh ; 1110b
  4977                              <1> 	;and	dh, 0Fh		; LBA byte 4 (bits 24 to 27)
  4978 00005184 25FFFFFF0F          <1> 	and	eax, 0FFFFFFFh
  4979 00005189 C1E11C              <1> 	shl	ecx, 28 ; 21/02/2015
  4980                              <1> 	;or	dh, ch
  4981 0000518C 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 0000518E 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 00005191 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 00005193 80FC14              <1> 	cmp 	ah, 14h
  5003 00005196 7603                <1> 	jna 	short chsfnc
  5004                              <1> invldfnc:
  5005                              <1>         ; 14/02/2015  
  5006                              <1> 	;pop	es ; **
  5007                              <1> 	; 11/04/2021
  5008 00005198 58                  <1> 	pop	eax ; *** 
  5009 00005199 EB46                <1>         jmp     short BAD_COMMAND
  5010                              <1> chsfnc:	
  5011                              <1> 	;mov	ax, [ES:BX+5]		; GET WRITE PRE-COMPENSATION CYLINDER
  5012 0000519B 668B4305            <1> 	mov	ax, [ebx+5]
  5013                              <1> 	;shr	ax, 2
  5014                              <1> 	; 07/08/2022
  5015 0000519F C1E802              <1> 	shr	eax, 2
  5016 000051A2 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 000051A5 88C8                <1> 	mov	al, cl			; GET SECTOR NUMBER
  5030 000051A7 243F                <1> 	and	al, 3Fh
  5031 000051A9 8845FA              <1> 	mov	[CMD_BLOCK+2], al
  5032 000051AC 886DFB              <1> 	mov	[CMD_BLOCK+3], ch 	; GET CYLINDER NUMBER
  5033 000051AF 88C8                <1> 	mov	al, cl
  5034 000051B1 C0E806              <1> 	shr	al, 6
  5035 000051B4 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 000051B7 A0[32660000]        <1> 	mov	al, [hf_m_s]
  5040 000051BC C0E004              <1> 	shl	al, 4
  5041 000051BF 80E60F              <1> 	and	dh, 0Fh			; HEAD NUMBER
  5042 000051C2 08F0                <1> 	or	al, dh
  5043                              <1> 	;or	al, 80h or 20h
  5044 000051C4 0CA0                <1> 	or	al, 80h+20h		; ECC AND 512 BYTE SECTORS
  5045 000051C6 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 000051C9 58                  <1> 	pop	eax ; *** 
  5057 000051CA 8845F9              <1>         mov     [CMD_BLOCK+1], al
  5058 000051CD 29DB                <1>         sub	ebx, ebx
  5059                              <1> 	;xor	bh, bh
  5060 000051CF 88E3                <1> 	mov     bl, ah
  5061                              <1>         ;sal	bx, 1
  5062                              <1>         ; 17/07/2022
  5063 000051D1 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 000051D4 83FB74              <1> 	cmp	ebx, D1L		; TEST WITHIN RANGE
  5069 000051D7 7308                <1> 	jnb	short BAD_COMMAND
  5070                              <1>         ;xchg	bx, si
  5071 000051D9 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 000051DB FFA6[34500000]      <1> 	jmp	dword [esi+D1]
  5089                              <1> 
  5090                              <1> 	; 07/08/2022
  5091                              <1> 	; 13/07/2022
  5092                              <1> BAD_COMMAND:
  5093 000051E1 C605[877D0100]01    <1>         mov	byte [DISK_STATUS1], BAD_CMD ; COMMAND ERROR
  5094 000051E8 B000                <1> 	mov	al, 0
  5095 000051EA 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 000051EB 89C8                <1> 	mov	eax, ecx ; LBA address (21/02/2015)
  5103                              <1> 	; 13/07/2022
  5104 000051ED 88D1                <1> 	mov	cl, dl ; 14/02/2015
  5105 000051EF 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 000051F1 81F9FFFFFF0F        <1> 	cmp	ecx, 0FFFFFFFh
  5111 000051F7 731B                <1> 	jnb	short su6
  5112                              <1> 	;movzx	eax, byte [esp] ; ***
  5113 000051F9 31C0                <1> 	xor	eax, eax
  5114 000051FB 8A0424              <1> 	mov	al, [esp] ; *** ; sector count
  5115 000051FE 01C8                <1> 	add	eax, ecx
  5116 00005200 730B                <1> 	jnc	short su5
  5117 00005202 C605[877D0100]17    <1> 	mov	byte [DISK_STATUS1], ERR_INV_PARAMETER
  5118                              <1> 	;jmp	short su7
  5119                              <1> 	; 20/06/2024
  5120 00005209 58                  <1> 	pop	eax ; ***
  5121 0000520A B000                <1> 	mov	al, 0
  5122 0000520C C3                  <1> 	retn
  5123                              <1> su5:	
  5124 0000520D 3DFFFFFF0F          <1> 	cmp	eax, 0FFFFFFFh ; 28 bit limit
  5125 00005212 76D7                <1> 	jna	short su10
  5126                              <1> su6:
  5127                              <1> 
  5128                              <1> ; 20/06/2024 (TRDOS 386 v2.0.8)
  5129                              <1> %if 0
  5130                              <1> 	; 48 bit LBA r/w
  5131                              <1> 	mov	al, [hf_m_s]	; (+!+) ; 02/12/2023
  5132                              <1> 	shl	al, 4
  5133                              <1> 	; 02/12/2023
  5134                              <1> 	;add	al, 0E0h
  5135                              <1> 	add	al, 40h
  5136                              <1> 	;;add	al, 0Eh
  5137                              <1> 	;add	al, 04h
  5138                              <1> 	;shl	al, 4
  5139                              <1> 	mov	dx, [HF_PORT]
  5140                              <1> 	add	dl, 6	; hd base port + 6
  5141                              <1> 	out	dx, al
  5142                              <1> 	; 02/12/2023
  5143                              <1> 	mov	[CMD_BLOCK+6], al
  5144                              <1> 	inc	edx	; hd base port + 7
  5145                              <1> 	in	al, dx
  5146                              <1> 	NEWIODELAY
  5147                              <1> 	;test	al, 128		; READY ?
  5148                              <1> 	and	al, 128
  5149                              <1> 	jz	short su8
  5150                              <1> 	in	al, dx
  5151                              <1> 	;test	al, 128
  5152                              <1> 	and	al, 128
  5153                              <1> 	jz	short su8
  5154                              <1> 	mov	byte [DISK_STATUS1], TIME_OUT
  5155                              <1> su7:
  5156                              <1> 	pop	eax ; ***
  5157                              <1> 	mov	al, 0
  5158                              <1> 	retn
  5159                              <1> su8:
  5160                              <1> 	;mov	dx, [HF_PORT]
  5161                              <1> 	;inc	edx
  5162                              <1> 	;inc	edx	; hd base port + 2
  5163                              <1> 	sub	dl, 5	; hd base port + 2
  5164                              <1> 	;xor	al, al
  5165                              <1> 	out	dx, al	; sector count hb (bits 8 to 15) = 0
  5166                              <1> 	inc	edx	; hd base port + 3
  5167                              <1> 	mov	eax, ecx ; LBA disk sector address
  5168                              <1> 	rol	eax, 8 
  5169                              <1> 	out	dx, al	; LBA byte 4 (bits 24 to 31)
  5170                              <1> 	inc	edx	; hd base port + 4
  5171                              <1> 	xor	al, al
  5172                              <1> 	out	dx, al	; LBA byte 5 (bits 32 to 39) = 0
  5173                              <1> 	inc	edx	; hd base port + 5
  5174                              <1> 	;sub	al, al
  5175                              <1> 	out	dx, al	; LBA byte 6 (bits 40 to 47) = 0
  5176                              <1> 
  5177                              <1> 	mov	al, [esp] ; ***
  5178                              <1> 	; 02/12/2023
  5179                              <1> 	mov	[CMD_BLOCK+1], al
  5180                              <1> 
  5181                              <1> 	sub	dl, 3	; hd base port + 2
  5182                              <1> 	out	dx, al	; sector count lb (bits 0 to 7)
  5183                              <1> 	inc	edx	; hd base port + 3
  5184                              <1> 	mov	eax, ecx ; LBA disk sector address
  5185                              <1> 	out	dx, al	; LBA byte 1 (bits 0 to 7)
  5186                              <1> 	inc	edx	; hd base port + 4
  5187                              <1> 	shr	eax, 8
  5188                              <1> 	out	dx, al	; LBA byte 2 (bits 8 to 15)
  5189                              <1> 	inc	edx	; hd base port + 5
  5190                              <1> 	shr	eax, 8
  5191                              <1> 	out	dx, al	; LBA byte 3 (bits 16 to 23)
  5192                              <1> 
  5193                              <1>  	inc     edx	; hd base port + 6
  5194                              <1> 
  5195                              <1> 	; 02/12/2023 (not necessary) (+!+)
  5196                              <1> 	;mov	al, [hf_m_s]
  5197                              <1> 	;shl	al, 4
  5198                              <1> 	;add	al, 40h
  5199                              <1> 	;out	dx, al
  5200                              <1> 
  5201                              <1> 	pop	eax	; ***
  5202                              <1> 
  5203                              <1> 	inc	edx	; dx = hd base port + 7 
  5204                              <1> 			;      command/status port
  5205                              <1> 	;xchg	esi, ebx
  5206                              <1> 	;mov	edi, ebx
  5207                              <1> 	mov	edi, esi ; sector buffer 
  5208                              <1> 	cmp	ah, 1Ch
  5209                              <1> 	jne	short su9
  5210                              <1> 	mov	al, 34h ; WRITE SECTOR(S) EXT
  5211                              <1> 	out	dx, al
  5212                              <1> 	jmp	CMD_WX
  5213                              <1> su9:
  5214                              <1> 	mov	al, 24h	; READ SECTOR(S) EXT
  5215                              <1> 	out	dx, al
  5216                              <1> 	jmp	CMD_RX
  5217                              <1> %else
  5218                              <1> 	; 20/06/2024
  5219 00005214 58                  <1> 	pop	eax	; ***
  5220 00005215 C645F800            <1> 	mov	byte [CMD_BLOCK], 0
  5221 00005219 8845F9              <1> 	mov	[CMD_BLOCK+1], al ; sector count to r/w
  5222 0000521C 894DFA              <1> 	mov	[CMD_BLOCK+2], ecx ; LBA disk sector address
  5223                              <1> 	
  5224                              <1> 	;;;
  5225                              <1> 	; 23/06/2024
  5226 0000521F C605[9C7D0100]FF    <1> 	mov	byte [LBAMode], 0FFh
  5227                              <1> 	;
  5228 00005226 A0[32660000]        <1> 	mov	al, [hf_m_s]
  5229 0000522B C0E004              <1> 	shl	al, 4
  5230                              <1> 	;add	al, 40h
  5231 0000522E 0C40                <1> 	or	al, 40h	
  5232                              <1> 	; al = 40h (for master), 50h (for slave)
  5233 00005230 A2[32660000]        <1> 	mov	[hf_m_s], al	
  5234                              <1> 	;;;
  5235                              <1> 
  5236 00005235 80FC1C              <1> 	cmp	ah, 1Ch
  5237 00005238 7509                <1> 	jne	short su7
  5238                              <1> 	; AH = 1Ch ; TRDOS 386 v2 - INT 33h - LBA WRITE
  5239                              <1> 	; esi = sector buffer
  5240                              <1> 	; 48 bit LBA write
  5241 0000523A C645FE34            <1> 	mov	byte [CMD_BLOCK+6], 34h ; WRITE SECTOR(S) EXT
  5242 0000523E E9DD000000          <1> 	jmp	CMD_WX
  5243                              <1> su7:
  5244                              <1> 	; AH = 1Bh ; TRDOS 386 v2 - INT 33h - LBA READ
  5245 00005243 89F7                <1> 	mov	edi, esi ; sector buffer
  5246                              <1> 	; 48 bit LBA read
  5247 00005245 C645FE24            <1> 	mov	byte [CMD_BLOCK+6], 24h ; READ SECTOR(S) EXT
  5248 00005249 EB79                <1> 	jmp	CMD_RX
  5249                              <1> 	
  5250                              <1> %endif
  5251                              <1> 
  5252                              <1> ; -----------------------------------------------------
  5253                              <1> 
  5254                              <1> ; 09/08/2022
  5255                              <1> ; 07/08/2022
  5256                              <1> ; 17/07/2022
  5257                              <1> ; 16/07/2022 - TRDOS 386 v2.0.5
  5258                              <1> ; 10/07/2022 - Retro UNIX 386 v1.1 (Kernel v0.2.1.5)
  5259                              <1> 
  5260                              <1> ;----------------------------------------
  5261                              <1> ;	RESET THE DISK SYSTEM  (AH=00H) :
  5262                              <1> ;----------------------------------------
  5263                              <1> 
  5264                              <1> ; 18-1-2015 : one controller reset (not other one)
  5265                              <1> 
  5266                              <1> DISK_RESET:
  5267 0000524B FA                  <1> 	cli
  5268 0000524C E4A1                <1> 	in	al, INTB01		; GET THE MASK REGISTER
  5269                              <1> 	;jmp	$+2
  5270                              <1> 	IODELAY
    78 0000524E EB00                <2>  jmp short $+2
    79 00005250 EB00                <2>  jmp short $+2
  5271                              <1> 	;and	al, 0BFh 		; ENABLE FIXED DISK INTERRUPT
  5272 00005252 243F                <1> 	and	al, 3Fh			; 22/12/2014 (IRQ 14 & IRQ 15)
  5273 00005254 E6A1                <1> 	out	INTB01, al
  5274 00005256 FB                  <1> 	sti				; START INTERRUPTS
  5275                              <1> 	; 14/02/2015
  5276                              <1> 	;mov	di, dx
  5277                              <1> 	; 24/12/2021
  5278 00005257 89D7                <1> 	mov	edi, edx	
  5279                              <1> 	; 04/01/2015
  5280                              <1> 	;xor	di,di
  5281                              <1> drst0:
  5282 00005259 B004                <1> 	mov	al, 04h  ; bit 2 - SRST 
  5283                              <1> 	;mov	dx, HF_REG_PORT
  5284 0000525B 668B15[30660000]    <1> 	mov	dx, [HF_REG_PORT]
  5285 00005262 EE                  <1> 	out	dx, al			; RESET
  5286                              <1> ;	mov	cx, 10			; DELAY COUNT
  5287                              <1> ;DRD:	dec	cx
  5288                              <1> ;	jnz	short DRD		; WAIT 4.8 MICRO-SEC
  5289                              <1> 	;mov	cx, 2			; wait for 30 micro seconds	
  5290                              <1>         ;mov	ecx, 2 ; 21/02/2015
  5291                              <1> 	; 10/07/2022
  5292 00005263 29C9                <1> 	sub	ecx, ecx
  5293 00005265 B102                <1> 	mov	cl, 2
  5294 00005267 E86FD1FFFF          <1> 	call    WAITF                   ; (Award Bios 1999 - WAIT_REFRESH,
  5295                              <1>                                         ; 40 micro seconds)
  5296 0000526C A0[897D0100]        <1> 	mov	al, [CONTROL_BYTE]
  5297 00005271 240F                <1> 	and	al, 0Fh			; SET HEAD OPTION
  5298 00005273 EE                  <1> 	out	dx, al			; TURN RESET OFF
  5299 00005274 E85B040000          <1> 	call	NOT_BUSY
  5300 00005279 7514                <1> 	jnz	short DRERR		; TIME OUT ON RESET
  5301 0000527B 668B15[2E660000]    <1> 	mov	dx, [HF_PORT]
  5302 00005282 FEC2                <1> 	inc	dl  ; HF_PORT+1
  5303                              <1> 	; 02/01/2015 - Award BIOS 1999 - AHDSK.ASM
  5304                              <1>         ;mov	cl, 10
  5305                              <1>         ;mov	ecx, 10 ; 21/02/2015
  5306                              <1> 	; 17/07/2022
  5307                              <1> 	;xor	ecx, ecx
  5308 00005284 B10A                <1> 	mov	cl, 10
  5309                              <1> drst1:
  5310 00005286 EC                  <1> 	in	al, dx			; GET RESET STATUS
  5311 00005287 3C01                <1> 	cmp	al, 1
  5312                              <1> 	; 04/01/2015
  5313 00005289 740C                <1> 	jz	short drst2
  5314                              <1> 	;jnz	short DRERR		; BAD RESET STATUS
  5315                              <1>         	; Drive/Head Register - bit 4
  5316                              <1> 	;loop	drst1
  5317                              <1> 	; 17/07/2022
  5318 0000528B FEC9                <1> 	dec	cl
  5319 0000528D 75F7                <1> 	jnz	short drst1
  5320                              <1> DRERR:	
  5321 0000528F C605[877D0100]05    <1> 	mov	byte [DISK_STATUS1], BAD_RESET ; CARD FAILED
  5322 00005296 C3                  <1> 	retn
  5323                              <1> drst2:
  5324                              <1> 	; 14/02/2015
  5325                              <1> 	;mov	dx, di
  5326                              <1> 	; 07/08/2022
  5327 00005297 89FA                <1> 	mov	edx, edi
  5328                              <1> ;drst3:
  5329                              <1> ;	; 05/01/2015
  5330                              <1> ;	shl 	di, 1
  5331                              <1> ;	; 04/01/2015
  5332                              <1> ;	mov	ax, [di+hd_cports]
  5333                              <1> ;	cmp	ax, [HF_REG_PORT]
  5334                              <1> ;	je	short drst4
  5335                              <1> ;	mov	[HF_REG_PORT], ax
  5336                              <1> ;	; 03/01/2015
  5337                              <1> ;	mov	ax, [di+hd_ports]
  5338                              <1> ;       mov     [HF_PORT], ax
  5339                              <1> ;	; 05/01/2014
  5340                              <1> ;	shr	di, 1
  5341                              <1> ;	; 04/01/2015
  5342                              <1> ;	jmp	short drst0	; reset other controller
  5343                              <1> ;drst4:
  5344                              <1> ;	; 05/01/2015
  5345                              <1> ;	shr	di, 1
  5346                              <1> ;	mov	al, [di+hd_dregs]
  5347                              <1> ;	and	al, 10h ; bit 4 only
  5348                              <1> ;	shr	al, 4 ; bit 4  -> bit 0
  5349                              <1> ;	mov	[hf_m_s], al ; (0 = master, 1 = slave)
  5350                              <1> 	;
  5351                              <1> ; 09/08/2022
  5352                              <1> ; (('INIT_DRV' prodedure sets [CMD_BLOCKS+5] value))
  5353                              <1> ;
  5354                              <1> ;	mov	al, [hf_m_s] ; 18/01/2015
  5355                              <1> ;	test	al, 1
  5356                              <1> ;	;jnz	short drst6
  5357                              <1> ;       jnz     short drst4
  5358                              <1> ;	and	byte [CMD_BLOCK+5], 0EFh ; SET TO DRIVE 0
  5359                              <1> ;drst5:
  5360                              <1> drst3:
  5361 00005299 E8F9010000          <1> 	call	INIT_DRV		; SET MAX HEADS
  5362                              <1> 	;mov	dx, di
  5363 0000529E E8C1020000          <1> 	call	HDISK_RECAL		; RECAL TO RESET SEEK SPEED
  5364                              <1> 	; 04/01/2014
  5365                              <1> ;	inc	di
  5366                              <1> ;	mov	dx, di
  5367                              <1> ;	cmp	dl, [HF_NUM]
  5368                              <1> ;	jb	short drst3
  5369                              <1> ;DRE:
  5370 000052A3 C605[877D0100]00    <1> 	mov	byte [DISK_STATUS1], 0 	; IGNORE ANY SET UP ERRORS
  5371 000052AA C3                  <1> 	retn
  5372                              <1> ;drst6:
  5373                              <1> drst4:		; Drive/Head Register - bit 4
  5374                              <1> ;	or	byte [CMD_BLOCK+5], 010h ; SET TO DRIVE 1
  5375                              <1> ;       ;jmp    short drst5
  5376                              <1> ;       jmp     short drst3
  5377                              <1> 
  5378                              <1> ;----------------------------------------
  5379                              <1> ;	DISK STATUS ROUTINE  (AH = 01H) :
  5380                              <1> ;----------------------------------------
  5381                              <1> 
  5382                              <1> RETURN_STATUS:
  5383 000052AB A0[877D0100]        <1> 	mov	al, [DISK_STATUS1]	; OBTAIN PREVIOUS STATUS
  5384 000052B0 C605[877D0100]00    <1> 	mov	byte [DISK_STATUS1], 0	; RESET STATUS
  5385 000052B7 C3                  <1> 	retn
  5386                              <1> 
  5387                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5388                              <1> 
  5389                              <1> ;----------------------------------------
  5390                              <1> ;	READ LONG	     (AH = 0AH) :
  5391                              <1> ;----------------------------------------
  5392                              <1> 
  5393                              <1> RD_LONG:
  5394                              <1> 	;mov	@CMD_BLOCK+6, READ_CMD OR ECC_MODE
  5395 000052B8 C645FE22            <1> 	mov     byte [CMD_BLOCK+6], READ_CMD + ECC_MODE 
  5396 000052BC EB04                <1> 	jmp	short COMMANDI
  5397                              <1> 
  5398                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5399                              <1> 
  5400                              <1> ;----------------------------------------
  5401                              <1> ;	DISK READ ROUTINE    (AH = 02H) :
  5402                              <1> ;----------------------------------------
  5403                              <1> 
  5404                              <1> DISK_READ:
  5405 000052BE C645FE20            <1> 	mov	byte [CMD_BLOCK+6], READ_CMD
  5406                              <1>         ;jmp	COMMANDI
  5407                              <1> 
  5408                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5409                              <1> 
  5410                              <1> ;----------------------------------------
  5411                              <1> ; COMMANDI				:
  5412                              <1> ;	REPEATEDLY INPUTS DATA TILL	:
  5413                              <1> ;	NSECTOR RETURNS ZERO		:
  5414                              <1> ;----------------------------------------
  5415                              <1> COMMANDI:
  5416                              <1> 	; 16/07/2022 
  5417                              <1> 	;	(check 64K boundary is not needed)
  5418                              <1> 	;call	CHECK_DMA		; CHECK 64K BOUNDARY ERROR
  5419                              <1> 	;jc	short CMD_ABORT
  5420                              <1> 
  5421                              <1> 	;mov	di, bx
  5422 000052C2 89DF                <1> 	mov	edi, ebx ; 21/02/2015
  5423                              <1> CMD_RX:
  5424                              <1> 	; 20/06/2024 (48 bit LBA r/w modification)
  5425 000052C4 E821030000          <1> 	call	COMMAND 		; OUTPUT COMMAND
  5426 000052C9 7548                <1> 	jnz	short CMD_ABORT
  5427                              <1> ;CMD_RX: ; 01/12/2023 (48 bit LBA read)
  5428                              <1> CMD_I1:
  5429 000052CB E8D4030000          <1> 	call	_WAIT			; WAIT FOR DATA REQUEST INTERRUPT
  5430 000052D0 7541                <1> 	jnz	short TM_OUT		; TIME OUT
  5431                              <1> cmd_i1x:
  5432                              <1> 	; 18/02/2016
  5433                              <1> 	;;mov	cx, 256			; SECTOR SIZE IN WORDS
  5434                              <1> 	;mov	ecx, 256 ; 21/02/2015	
  5435                              <1> 	; 16/07/2022
  5436 000052D2 29C9                <1> 	sub	ecx, ecx
  5437 000052D4 FEC5                <1> 	inc	ch  ; ecx = 256
  5438                              <1> 	;mov	dh, HF_PORT
  5439 000052D6 668B15[2E660000]    <1> 	mov	dx, [HF_PORT]
  5440 000052DD FA                  <1> 	cli
  5441 000052DE FC                  <1> 	cld
  5442 000052DF F3666D              <1> 	rep	insw			; GET THE SECTOR
  5443 000052E2 FB                  <1> 	sti
  5444                              <1> 
  5445 000052E3 F645FE02            <1> 	test	byte [CMD_BLOCK+6], ECC_MODE ; CHECK FOR NORMAL INPUT
  5446 000052E7 7418                <1> 	jz	short CMD_I3
  5447 000052E9 E80D040000          <1> 	call	WAIT_DRQ		; WAIT FOR DATA REQUEST
  5448 000052EE 7223                <1> 	jc	short TM_OUT
  5449                              <1> 	;mov	dx, HF_PORT
  5450 000052F0 668B15[2E660000]    <1> 	mov	dx, [HF_PORT]
  5451                              <1> 	;;mov	cx, 4			; GET ECC BYTES
  5452                              <1> 	;mov 	ecx, 4 ; mov cx, 4
  5453                              <1> 	; 16/07/2022
  5454 000052F7 31C9                <1>  	xor	ecx, ecx
  5455 000052F9 B104                <1> 	mov	cl, 4
  5456                              <1> CMD_I2:
  5457 000052FB EC                  <1> 	in	al, dx
  5458 000052FC 8807                <1> 	mov 	[edi], al ; 21/02/2015	; GO SLOW FOR BOARD
  5459 000052FE 47                  <1> 	inc	edi
  5460 000052FF E2FA                <1> 	loop	CMD_I2
  5461                              <1> CMD_I3: 
  5462                              <1> 	; wait for 400 ns
  5463 00005301 80C207              <1> 	add 	dl, 7
  5464 00005304 EC                  <1> 	in	al, dx
  5465 00005305 EC                  <1> 	in	al, dx
  5466 00005306 EC                  <1> 	in	al, dx
  5467                              <1> 	;
  5468 00005307 E8E4010000          <1> 	call	CHECK_STATUS
  5469 0000530C 7505                <1> 	jnz	short CMD_ABORT		; ERROR RETURNED
  5470 0000530E FE4DF9              <1> 	dec	byte [CMD_BLOCK+1]	; CHECK FOR MORE
  5471                              <1> 	;jnz	short CMD_I1
  5472 00005311 75BF                <1> 	jnz	short cmd_i1x ; 18/02/2016
  5473                              <1> CMD_ABORT:
  5474                              <1> TM_OUT: 
  5475 00005313 C3                  <1> 	retn
  5476                              <1> 
  5477                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5478                              <1> 
  5479                              <1> ;----------------------------------------
  5480                              <1> ;	WRITE LONG	     (AH = 0BH) :
  5481                              <1> ;----------------------------------------
  5482                              <1> 
  5483                              <1> WR_LONG:
  5484                              <1> 	;mov	@CMD_BLOCK+6, WRITE_CMD OR ECC_MODE
  5485 00005314 C645FE32            <1> 	mov	byte [CMD_BLOCK+6], WRITE_CMD + ECC_MODE
  5486 00005318 EB04                <1> 	jmp	short COMMANDO
  5487                              <1> 
  5488                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5489                              <1> 	
  5490                              <1> ;----------------------------------------
  5491                              <1> ;	DISK WRITE ROUTINE   (AH = 03H) :
  5492                              <1> ;----------------------------------------
  5493                              <1> 
  5494                              <1> DISK_WRITE:
  5495 0000531A C645FE30            <1> 	mov	byte [CMD_BLOCK+6], WRITE_CMD
  5496                              <1> 	;jmp	COMMANDO
  5497                              <1> 
  5498                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5499                              <1> 
  5500                              <1> ;----------------------------------------
  5501                              <1> ; COMMANDO				:
  5502                              <1> ;	REPEATEDLY OUTPUTS DATA TILL	:
  5503                              <1> ;	NSECTOR RETURNS ZERO		:
  5504                              <1> ;----------------------------------------
  5505                              <1> COMMANDO:
  5506                              <1> 	; 16/07/2022 
  5507                              <1> 	;	(check 64K boundary is not needed)
  5508                              <1> 	;call	CHECK_DMA		; CHECK 64K BOUNDARY ERROR
  5509                              <1> 	;jc	short CMD_ABORT
  5510                              <1> CMD_OF: 
  5511 0000531E 89DE                <1> 	mov	esi, ebx ; 21/02/2015
  5512                              <1> CMD_WX:
  5513                              <1> 	; 20/06/2024 (48 bit LBA r/w modification)
  5514 00005320 E8C5020000          <1> 	call	COMMAND 		; OUTPUT COMMAND
  5515 00005325 75EC                <1> 	jnz	short CMD_ABORT
  5516                              <1> ;CMD_WX:	; 01/12/2023 (48 bit LBA write)
  5517 00005327 E8CF030000          <1> 	call	WAIT_DRQ		; WAIT FOR DATA REQUEST
  5518 0000532C 72E5                <1> 	jc	short TM_OUT		; TOO LONG
  5519                              <1> CMD_O1: 
  5520                              <1> 	; 16/07/2022
  5521 0000532E 668B15[2E660000]    <1> 	mov	dx, [HF_PORT]
  5522                              <1> 
  5523                              <1> 	;mov	ecx, 256 ; 21/02/2015
  5524 00005335 31C9                <1> 	xor	ecx, ecx
  5525 00005337 FEC5                <1> 	inc	ch
  5526                              <1> 	; ecx = 256
  5527 00005339 FA                  <1> 	cli
  5528 0000533A FC                  <1> 	cld
  5529                              <1> 	;rep	outsw
  5530                              <1> 	; 01/12/2023 - TRDOS 386 v2.0.7
  5531                              <1> CMD_01_L:	
  5532 0000533B 666F                <1> 	outsw
  5533 0000533D EB00                <1> 	jmp	$+2
  5534 0000533F E2FA                <1> 	loop	CMD_01_L
  5535                              <1> 
  5536 00005341 FB                  <1> 	sti
  5537                              <1> 
  5538 00005342 F645FE02            <1> 	test	byte [CMD_BLOCK+6], ECC_MODE ; CHECK FOR NORMAL OUTPUT
  5539 00005346 7418                <1> 	jz	short CMD_O3
  5540 00005348 E8AE030000          <1> 	call	WAIT_DRQ		; WAIT FOR DATA REQUEST
  5541 0000534D 72C4                <1> 	jc	short TM_OUT
  5542                              <1> 	;mov	dx, HF_PORT
  5543 0000534F 668B15[2E660000]    <1> 	mov	dx, [HF_PORT]
  5544                              <1> 					; OUTPUT THE ECC BYTES
  5545                              <1> 	;mov	ecx, 4  ; mov cx, 4
  5546                              <1> 	; 16/07/2022
  5547 00005356 29C9                <1> 	sub	ecx, ecx
  5548 00005358 B104                <1> 	mov	cl, 4
  5549                              <1> CMD_O2:
  5550 0000535A 8A06                <1> 	mov	al, [esi]
  5551 0000535C EE                  <1> 	out	dx, al
  5552 0000535D 46                  <1> 	inc	esi
  5553 0000535E E2FA                <1> 	loop	CMD_O2
  5554                              <1> CMD_O3:
  5555 00005360 E83F030000          <1> 	call	_WAIT			; WAIT FOR SECTOR COMPLETE INTERRUPT
  5556 00005365 75AC                <1> 	jnz	short TM_OUT		; ERROR RETURNED
  5557 00005367 E884010000          <1> 	call	CHECK_STATUS
  5558 0000536C 75A5                <1> 	jnz	short CMD_ABORT
  5559 0000536E F605[817D0100]08    <1> 	test	byte [HF_STATUS], ST_DRQ ; CHECK FOR MORE
  5560 00005375 75B7                <1> 	jnz	short CMD_O1
  5561                              <1> 	;mov	dx, HF_PORT+2		; CHECK RESIDUAL SECTOR COUNT
  5562 00005377 668B15[2E660000]    <1> 	mov	dx, [HF_PORT]
  5563 0000537E 80C202              <1> 	add	dl, 2
  5564                              <1> 	;inc	dl
  5565                              <1> 	;inc	dl
  5566 00005381 EC                  <1> 	in	al, dx			;
  5567 00005382 A8FF                <1> 	test	al, 0FFh 		;
  5568 00005384 7407                <1> 	jz	short CMD_O4		; COUNT = 0 OK
  5569 00005386 C605[877D0100]BB    <1> 	mov	byte [DISK_STATUS1], UNDEF_ERR 
  5570                              <1> 					; OPERATION ABORTED - PARTIAL TRANSFER
  5571                              <1> CMD_O4:
  5572 0000538D C3                  <1> 	retn
  5573                              <1> 
  5574                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5575                              <1> 
  5576                              <1> ;----------------------------------------
  5577                              <1> ;	FORMATTING	     (AH = 05H) :
  5578                              <1> ;----------------------------------------
  5579                              <1> 
  5580                              <1> FMT_TRK:				; FORMAT TRACK (AH = 005H)
  5581 0000538E C645FE50            <1> 	mov	byte [CMD_BLOCK+6], FMTTRK_CMD
  5582                              <1> 	;push	es
  5583                              <1> 	;push	bx
  5584 00005392 53                  <1> 	push	ebx
  5585 00005393 E8F1030000          <1> 	call	GET_VEC 		; GET DISK PARAMETERS ADDRESS
  5586                              <1> 	;mov	al, [ES:BX+14]		; GET SECTORS/TRACK
  5587 00005398 8A430E              <1> 	mov	al, [ebx+14]
  5588 0000539B 8845F9              <1> 	mov	[CMD_BLOCK+1], al	; SET SECTOR COUNT IN COMMAND
  5589 0000539E 5B                  <1> 	pop	ebx
  5590                              <1> 	;pop	bx
  5591                              <1> 	;pop	es
  5592                              <1> 	;jmp	short CMD_OF		; GO EXECUTE THE COMMAND
  5593                              <1> 	; 01/12/2023
  5594 0000539F E97AFFFFFF          <1> 	jmp	CMD_OF
  5595                              <1> 
  5596                              <1> ;----------------------------------------
  5597                              <1> ;	DISK VERIFY	     (AH = 04H) :
  5598                              <1> ;----------------------------------------
  5599                              <1> 
  5600                              <1> DISK_VERF:
  5601 000053A4 C645FE40            <1> 	mov	byte [CMD_BLOCK+6], VERIFY_CMD
  5602 000053A8 E83D020000          <1> 	call	COMMAND
  5603 000053AD 750C                <1> 	jnz	short VERF_EXIT		; CONTROLLER STILL BUSY
  5604 000053AF E8F0020000          <1> 	call	_WAIT			; (Original: CALL WAIT)	
  5605 000053B4 7505                <1> 	jnz	short VERF_EXIT		; TIME OUT
  5606 000053B6 E835010000          <1> 	call	CHECK_STATUS
  5607                              <1> VERF_EXIT:
  5608 000053BB C3                  <1> 	retn
  5609                              <1> 
  5610                              <1> ;----------------------------------------
  5611                              <1> ;	READ DASD TYPE	     (AH = 15H) :
  5612                              <1> ;----------------------------------------
  5613                              <1> 
  5614                              <1> RETURN_DRIVE_TYPE:
  5615                              <1> 	; 10/08/2022
  5616                              <1> 	; 13/07/2022
  5617                              <1> 	; (Ref: Programmer's Guide to the AMIBIOS -Page 214-, 1992)
  5618                              <1> 	;
  5619                              <1> 	; INPUT:
  5620                              <1> 	;	DL = Disk number (>= 80h)
  5621                              <1> 	;   TRDOS 386 v2.0.5 Feature:
  5622                              <1> 	;	If AL = 0FFh, return disk size in ECX
  5623                              <1> 	;		otherwise in CX:DX
  5624                              <1> 	; OUTPUT:
  5625                              <1> 	;	AH = 00h - No drive present
  5626                              <1> 	;	   = 03h - Hard disk drive
  5627                              <1> 	;	CF = 0 - No error
  5628                              <1> 	;	   = 1 - Error  	 
  5629                              <1> 	;   TRDOS 386 v2.0.5 Feature:
  5630                              <1> 	;	AL = 00h - LBA not ready !	
  5631                              <1> 	;	   = 01h - LBA ready 
  5632                              <1> 	;		(28 bit or 48 bit LBA r/w depending
  5633                              <1> 	;		on disk size in CX:DX)
  5634                              <1> 	;	CX:DX = Number of 512 byte sectors
  5635                              <1> 	;
  5636                              <1> 	; (Note: High words of ECX and EDX will be zero at return)
  5637                              <1> 	; ((If AL input is 0FFh, disk size will be in ECX only))
  5638                              <1> 
  5639                              <1> READ_DASD_TYPE:
  5640                              <1> READ_D_T:				; GET DRIVE PARAMETERS
  5641                              <1> 	;push	ds			; SAVE REGISTERS
  5642                              <1> 	
  5643                              <1> 	;;push	es
  5644                              <1> 	; 18/04/2021
  5645                              <1> 	;push	ebx
  5646                              <1> 	;;call	DDS			; ESTABLISH ADDRESSING
  5647                              <1> 	;;push	cs
  5648                              <1> 	;;pop	ds
  5649                              <1>         
  5650                              <1> 	; 18/04/2021
  5651                              <1> 	;mov	bx, KDATA
  5652                              <1> 	;mov	ds, bx
  5653                              <1> 	;;mov	es, bx
  5654                              <1> 	;mov	byte [DISK_STATUS1], 0
  5655                              <1> 	;mov	bl, [HF_NUM]		; GET NUMBER OF DRIVES
  5656                              <1> 	;and	dl, 7Fh			; GET DRIVE NUMBER
  5657                              <1> 	;cmp	bl, dl
  5658                              <1> 	;jbe	short RDT_NOT_PRESENT 	; RETURN DRIVE NOT PRESENT
  5659                              <1> 	
  5660                              <1> 	;mov	ax, KDATA
  5661                              <1> 	;mov	ds, ax
  5662                              <1> 	
  5663 000053BC C605[877D0100]00    <1> 	mov	byte [DISK_STATUS1], 0
  5664 000053C3 8A0D[887D0100]      <1> 	mov	cl, [HF_NUM]
  5665 000053C9 80E27F              <1> 	and	dl, 7Fh
  5666 000053CC 38D1                <1> 	cmp	cl, dl
  5667 000053CE 7631                <1> 	jbe	short RDT_NOT_PRESENT
  5668                              <1> 
  5669                              <1> 	; 18/04/2021 - TRDOS 386 v2.0.4
  5670                              <1> 	
  5671                              <1> 	;call	GET_VEC 		; GET DISK PARAMETER ADDRESS
  5672                              <1> 	;
  5673                              <1> 	;;mov	al, [ES:BX+2]		; HEADS
  5674                              <1> 	;mov	al, [ebx+2]  ; heads (logical)
  5675                              <1> 	;;;mov	cl, [ES:BX+14]
  5676                              <1> 	;;mov	cl, [ebx+14]
  5677                              <1> 	;; 17/04/2021
  5678                              <1> 	;mov	ah, [ebx+14] ; sectors per track (logical)
  5679                              <1> 	;;imul	cl			; * NUMBER OF SECTORS
  5680                              <1> 	;;mov	cx, [ES:BX]		; MAX NUMBER OF CYLINDERS
  5681                              <1> 	;mov	cx, [ebx]    ; cylinders (logical)
  5682                              <1> 	;; 02/01/2015 
  5683                              <1> 	;; ** leave the last cylinder as reserved for diagnostics **
  5684                              <1> 	;; (Also in Award BIOS - 1999, AHDSK.ASM, FUN15 -> sub ax, 1)
  5685                              <1> 	;dec	cx			; LEAVE ONE FOR DIAGNOSTICS
  5686                              <1> 	;;imul	cx			; NUMBER OF SECTORS	 	
  5687                              <1> 	;; 17/04/2021
  5688                              <1> 	;mul	ah
  5689                              <1> 	;; ax = spt*heads
  5690                              <1> 	;mul	cx	 
  5691                              <1> 	;; dx:ax = number of sectors
  5692                              <1> 	;
  5693                              <1> 	;mov	cx, dx			; HIGH ORDER HALF
  5694                              <1> 	;mov	dx, ax			; LOW ORDER HALF
  5695                              <1> 
  5696                              <1> 	; 18/04/2021
  5697 000053D0 B102                <1> 	mov	cl, 2
  5698 000053D2 00CA                <1> 	add	dl, cl ; hd0 = 2
  5699                              <1> 
  5700                              <1> 	; 13/07/2022
  5701 000053D4 0FB6D2              <1> 	movzx	edx, dl
  5702 000053D7 8A9A[5E660000]      <1> 	mov	bl, [edx+drv.status]
  5703 000053DD 80E301              <1> 	and	bl, 1 ; LBA ready bit (bit 0) 
  5704                              <1> 
  5705 000053E0 D2E2                <1> 	shl	dl, cl ; * 4
  5706                              <1> 	
  5707                              <1> 	;mov	eax, [edx+drv.size]
  5708                              <1> 	;mov	dx, ax
  5709                              <1> 	;shr	eax, 16
  5710                              <1> 	;mov	cx, ax
  5711                              <1> 
  5712 000053E2 8B8A[42660000]      <1> 	mov	ecx, [edx+drv.size]
  5713                              <1> 
  5714                              <1> 	; 13/07/2022
  5715                              <1> 	;cmp	al, 0FFh   ; return disk size in ecx ?
  5716                              <1> 	;je	short RDT1 ; yes
  5717 000053E8 FEC0                <1> 	inc	al  ; 0FFh -> 0
  5718 000053EA 740A                <1> 	jz	short RDT1
  5719                              <1> 
  5720 000053EC 6689CA              <1> 	mov	dx, cx
  5721 000053EF C1E910              <1> 	shr	ecx, 16
  5722                              <1> 
  5723                              <1> 	; 13/07/2022
  5724                              <1> 	; ebx = esp+20
  5725                              <1> 	; ecx = esp+16
  5726                              <1> 	; edx = esp+12
  5727                              <1> 	; esi = esp+8
  5728                              <1> 	; edi = esp+4
  5729                              <1> 
  5730                              <1> 	; return disk size in user's registers
  5731 000053F2 8954240C            <1> 	mov	[esp+12], edx
  5732                              <1> 	; cx:dx = disk size
  5733                              <1> RDT1:
  5734                              <1> 	;mov	[esp+16], ecx
  5735                              <1> 
  5736                              <1> 	;;sub	al, al
  5737 000053F6 29C0                <1> 	sub	eax, eax
  5738 000053F8 B403                <1> 	mov	ah, 03h			; INDICATE FIXED DISK
  5739 000053FA 88D8                <1> 	mov	al, bl
  5740                              <1> 	; al = 1 -> LBA r/w ready/applicable
  5741                              <1> 	;    = 0 -> LBA r/w not ready/applicable	 
  5742                              <1> 	; cf = 0
  5743                              <1> RDT2:
  5744 000053FC 894C2410            <1> 	mov	[esp+16], ecx	
  5745                              <1> ;RDT2:
  5746                              <1> 	; 13/07/2022
  5747                              <1> 	; 18/04/2021
  5748                              <1> 	;pop	ebx			; RESTORE REGISTERS
  5749                              <1> 	;;pop	es
  5750                              <1> 	;pop	ds
  5751                              <1> 	; (*) clc			; CLEAR CARRY
  5752                              <1> 	;retf	2
  5753                              <1> 	; (*) 29/05/2016
  5754                              <1> 	; (*) retf 4
  5755                              <1> 	;and	byte [esp+8], 0FEh ; clear carry bit of eflags register
  5756                              <1> 	;iretd
  5757                              <1> 
  5758                              <1> 	; 13/07/2022
  5759                              <1> 	; [DISK_STATUS1] = 0
  5760                              <1> 	; ah = 3
  5761                              <1> 	; al = 0 or 1 (LBA ready)
  5762                              <1> 	; cf = 0	
  5763                              <1> 	
  5764 00005400 C3                  <1> 	retn
  5765                              <1> 
  5766                              <1> RDT_NOT_PRESENT:
  5767                              <1> 	;;sub	ax, ax			; DRIVE NOT PRESENT RETURN
  5768                              <1> 	;; 18/04/2021
  5769                              <1> 	;sub	eax, eax
  5770                              <1> 	;;mov	cx, ax			; ZERO BLOCK COUNT
  5771                              <1> 	;;mov	dx, ax
  5772                              <1> 	;mov	ecx, eax
  5773                              <1> 	;mov	edx, eax
  5774                              <1> 	;jmp	short RDT2
  5775                              <1> 	; 13/07/2022
  5776 00005401 29C9                <1> 	sub	ecx, ecx
  5777 00005403 88C1                <1> 	mov	cl, al ; if AL = 0FFh, disk size will be in ECX
  5778                              <1> 		       ; if not, disk size will be in CX:DX 
  5779 00005405 29C0                <1> 	sub	eax, eax
  5780 00005407 FEC1                <1> 	inc	cl ; 0FFh -> 0
  5781 00005409 80F901              <1> 	cmp	cl, 1
  5782 0000540C 72EE                <1> 	jb	short RDT2 ; ecx = 0
  5783                              <1> 	; 10/08/2022
  5784 0000540E 28C9                <1> 	sub	cl, cl
  5785                              <1> 	; ecx = 0
  5786 00005410 8944240C            <1> 	mov	[esp+12], eax ; edx = 0
  5787 00005414 F9                  <1> 	stc
  5788 00005415 EBE5                <1> 	jmp	short RDT2 ; cf = 1, eax = 0	
  5789                              <1> 
  5790                              <1> ; 10/08/2022
  5791                              <1> ; 07/08/2022
  5792                              <1> ; 13/07/2022 - TRDOS 386 v2.0.5
  5793                              <1> ; 28/05/2016
  5794                              <1> ; 27/05/2016 - TRDOS 386 (TRDOS v2.0)
  5795                              <1> 
  5796                              <1> ;----------------------------------------
  5797                              <1> ;	GET PARAMETERS	     (AH = 08H) :
  5798                              <1> ;----------------------------------------
  5799                              <1> 
  5800                              <1> GET_PARM_N:
  5801                              <1> 	; ebx = user's buffer address for parameters table
  5802                              <1> 	; 10/08/2022
  5803                              <1> 	; 13/07/2022
  5804                              <1> 	; (if ebx = 0, HDPT will not be returned to user)
  5805                              <1> 	;	
  5806                              <1> ;GET_PARM:				; GET DRIVE PARAMETERS
  5807                              <1> 	;push	ds			; SAVE REGISTERS
  5808                              <1> 	;push	es
  5809                              <1> 	
  5810                              <1> 	;push	ebx
  5811 00005417 89DF                <1> 	mov	edi, ebx ; 13/07/2022 	
  5812                              <1> 
  5813                              <1> 	; 13/07/2022
  5814                              <1> 	; ((IBM PC XT-286 ROM BIOS source code remainders))
  5815                              <1> 	;;mov	ax, ABS0 		; ESTABLISH ADDRESSING
  5816                              <1> 	;;mov	ds, ax
  5817                              <1> 	
  5818                              <1> 	;;test	dl, 1			; CHECK FOR DRIVE 1
  5819                              <1> 	;;jz	short G0
  5820                              <1> 	;;les	bx, @HF1_TBL_VEC
  5821                              <1> 	;;jmp	short G1
  5822                              <1> ;;G0:	
  5823                              <1> 	;les	bx, @HF_TBL_VEC
  5824                              <1> ;;G1:
  5825                              <1> 	;;call	DDS			; ESTABLISH SEGMENT
  5826                              <1> 	
  5827                              <1> 	; 13/07/2022
  5828                              <1> 	; 22/12/2014
  5829                              <1> 	;;push	cs
  5830                              <1> 	;;pop	ds
  5831                              <1> 	;mov	bx, KDATA
  5832                              <1> 	;mov	ds, bx
  5833                              <1> 	;mov	es, bx	; 27/05/2016
  5834                              <1> 	;
  5835                              <1> 	; 18/04/2021
  5836 00005419 29C9                <1> 	sub	ecx, ecx
  5837                              <1> 	;
  5838 0000541B 80EA80              <1> 	sub	dl, 80h
  5839 0000541E 80FA04              <1> 	cmp	dl, MAX_FILE		; TEST WITHIN RANGE
  5840 00005421 7344                <1> 	jae	short G2 ; 13/07/2022
  5841                              <1> 	;
  5842                              <1>  	; 21/02/2015
  5843 00005423 31DB                <1> 	xor	ebx, ebx
  5844                              <1> 	; 18/04/2021
  5845                              <1> 	;sub	ecx, ecx
  5846                              <1> 	; 22/12/2014
  5847 00005425 88D3                <1> 	mov	bl, dl
  5848                              <1> 	;xor	bh, bh  
  5849 00005427 C0E302              <1> 	shl	bl, 2			; convert index to offset
  5850                              <1> 	;add	bx, HF_TBL_VEC
  5851 0000542A 81C3[8C7D0100]      <1> 	add	ebx, HF_TBL_VEC
  5852                              <1> 	;mov	ax, [bx+2]
  5853                              <1> 	;mov	es, ax			; dpt segment
  5854                              <1> 	;mov	bx, [bx]		; dpt offset
  5855 00005430 8B1B                <1> 	mov	ebx, [ebx] ; 32 bit offset	
  5856                              <1> 	; 18/04/2021
  5857 00005432 29D2                <1> 	sub	edx, edx
  5858 00005434 8815[877D0100]      <1>  	mov	[DISK_STATUS1], dl ; 0
  5859                              <1> 
  5860                              <1> 	;mov	byte [DISK_STATUS1], 0
  5861                              <1>         ;mov	ax, [ES:BX]		; MAX NUMBER OF CYLINDERS
  5862 0000543A 668B03              <1> 	mov	ax, [ebx]
  5863                              <1> 	;;sub	ax, 2			; ADJUST FOR 0-N
  5864 0000543D 6648                <1> 	dec	ax			; max. cylinder number
  5865 0000543F 88C5                <1> 	mov	ch, al
  5866 00005441 66250003            <1> 	and	ax, 0300h		; HIGH TWO BITS OF CYLINDER
  5867                              <1> 	;shr	ax, 1
  5868                              <1> 	;shr	ax, 1
  5869                              <1> 	; 13/07/2022
  5870                              <1> 	;shr	ax, 2
  5871                              <1> 	; 07/08/2022
  5872 00005445 C1E802              <1> 	shr	eax, 2
  5873                              <1> 	;or	al, [ES:BX+14]		; SECTORS
  5874 00005448 0A430E              <1> 	or	al, [ebx+14]
  5875 0000544B 88C1                <1> 	mov	cl, al
  5876                              <1> 	;mov	dh, [ES:BX+2]		; HEADS
  5877 0000544D 8A7302              <1> 	mov	dh, [ebx+2]
  5878 00005450 FECE                <1> 	dec	dh			; 0-N RANGE
  5879 00005452 8A15[887D0100]      <1> 	mov	dl, [HF_NUM]		; DRIVE COUNT
  5880                              <1> 	;;sub	ax, ax
  5881                              <1> 	; 18/04/2021
  5882                              <1> 	;sub	eax, eax
  5883                              <1> 
  5884                              <1> 	; 27/12/2014 
  5885                              <1> 	;mov	di, bx			; HDPT offset
  5886                              <1> 
  5887                              <1> 	; 13/07/2022
  5888                              <1> 	; ebx = esp+20
  5889                              <1> 	; ecx = esp+16
  5890                              <1> 	; edx = esp+12
  5891                              <1> 	; esi = esp+8
  5892                              <1> 	; edi = esp+4
  5893                              <1> 
  5894                              <1> 	; 13/07/2022
  5895                              <1> 	; set return register contents/values
  5896 00005458 894C2410            <1> 	mov	[esp+16], ecx
  5897 0000545C 8954240C            <1> 	mov	[esp+12], edx
  5898                              <1> 
  5899                              <1> 	; is hard disk parameters table requested ?
  5900 00005460 09FF                <1> 	or	edi, edi ; (edi = [ebp+24] = ebx)
  5901 00005462 751B                <1> 	jnz	short G3 ; yes
  5902                              <1> 
  5903 00005464 29C0                <1> 	sub	eax, eax	
  5904                              <1> 
  5905                              <1> 	; [DISK_STATUS1] = 0
  5906                              <1> 	; eax = 0
  5907                              <1> 	; cf = 0
  5908                              <1> 
  5909 00005466 C3                  <1> 	retn
  5910                              <1> 
  5911                              <1> G2:
  5912                              <1> 	;mov	ah, INIT_FAIL
  5913                              <1> 	;mov	byte [DISK_STATUS1], ah ; (INIT_FAIL)
  5914                              <1> 	;				; OPERATION FAILED
  5915                              <1> 	;sub	al, al
  5916                              <1> 	;sub	dx, dx
  5917                              <1> 	;sub	cx, cx
  5918                              <1> 	; 18/04/2021
  5919 00005467 29C0                <1> 	sub	eax, eax
  5920 00005469 B407                <1> 	mov	ah, INIT_FAIL
  5921 0000546B 8825[877D0100]      <1> 	mov     [DISK_STATUS1], ah	; OPERATION FAILED
  5922                              <1> 
  5923                              <1> 	; 13/07/2022
  5924                              <1> 	;sub	edx, edx
  5925                              <1> 	;sub	ecx, ecx
  5926                              <1> 	; ecx = 0
  5927 00005471 894C240C            <1> 	mov	[esp+12], ecx ; 0 ; edx (heads-1, drive count)
  5928 00005475 894C2410            <1> 	mov	[esp+16], ecx ; 0 ; ecx (cylinders-1, sectors)
  5929 00005479 894C2414            <1> 	mov	[esp+20], ecx ; 0 ; ebx (HDPT address)
  5930                              <1> 
  5931 0000547D F9                  <1> 	stc
  5932 0000547E C3                  <1> 	retn
  5933                              <1> 
  5934                              <1> 	; 13/07/2022
  5935                              <1> 	; 29/05/2016 (*)
  5936                              <1> 	;;stc				; SET ERROR FLAG
  5937                              <1> 	;;jmp	short G5
  5938                              <1> 	;jmp	short _G6
  5939                              <1> 
  5940                              <1> G3:	
  5941                              <1> 	; 27/05/2016
  5942                              <1> 	; return fixed disk parameters table to user
  5943                              <1> 	; in user's buffer, which is pointed by EBX
  5944                              <1> 	
  5945                              <1> 	;xchg	edi, [esp]		; ebx (input)-> edi, edi -> [esp]
  5946                              <1> 	; 13/07/2022
  5947                              <1> 	;pop	edi
  5948                              <1> 	; edi = user's buffer address
  5949                              <1> 	;push	esi
  5950 0000547F 89DE                <1> 	mov	esi, ebx		; hard disk parameter table (32 bytes)	
  5951                              <1> 	;mov	ebx, edi		; ebx = user's buffer address
  5952 00005481 51                  <1> 	push	ecx
  5953                              <1> 	;push	eax
  5954                              <1> 	;mov	ecx, 32 ; 32 bytes
  5955 00005482 30ED                <1> 	xor	ch, ch
  5956 00005484 B120                <1> 	mov	cl, 32
  5957                              <1> 	; ecx = 32
  5958 00005486 E825BB0000          <1> 	call	transfer_to_user_buffer ; trdosk6.s (16/05/2016)
  5959                              <1> 	;pop	eax
  5960 0000548B 59                  <1> 	pop	ecx
  5961                              <1> 	; 10/08/2022
  5962                              <1> 	;pop	esi
  5963                              <1> 	;pop	edi
  5964 0000548C 7306                <1> 	jnc	short G4
  5965                              <1> 	; 29/05/2016 (*)
  5966 0000548E B8FF000000          <1> 	mov	eax, 0FFh ; unknown error !
  5967                              <1> 	; [DISK_STATUS1] = 0
  5968                              <1> 	; ah = 0, al = 0FFh
  5969                              <1> 	; cf = 1
  5970                              <1> 	
  5971 00005493 C3                  <1> 	retn
  5972                              <1> ;_G6:
  5973                              <1> 	;or	byte [esp+16], 1 ; set carry bit of eflags register
  5974                              <1> ;G5:
  5975                              <1> 	; 27/05/2016
  5976                              <1> 	;pop	ebx			; RESTORE REGISTERS
  5977                              <1> 	;pop	es
  5978                              <1> 	;pop	ds
  5979                              <1> 	;;retf	2
  5980                              <1> 	; (*) 29/05/2016
  5981                              <1> 	; (*) retf 4
  5982                              <1> 	; (*) or byte [esp+8], 1 ; set carry bit of eflags register
  5983                              <1> 	;iretd
  5984                              <1> 
  5985                              <1> G4:
  5986                              <1> 	; 13/07/2022
  5987 00005494 31C0                <1> 	xor	eax, eax
  5988                              <1> 
  5989                              <1> 	; [user_buffer] = [ebp+24] = HDPT
  5990                              <1> 	; [DISK_STATUS1] = 0
  5991                              <1> 	; eax = 0
  5992                              <1> 	; cf = 0
  5993                              <1> 
  5994 00005496 C3                  <1> 	retn
  5995                              <1> 
  5996                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5997                              <1> 	
  5998                              <1> ;----------------------------------------
  5999                              <1> ;	INITIALIZE DRIVE     (AH = 09H) :
  6000                              <1> ;----------------------------------------
  6001                              <1> 	; 03/01/2015
  6002                              <1> 	; According to ATA-ATAPI specification v2.0 to v5.0
  6003                              <1> 	; logical sector per logical track
  6004                              <1> 	; and logical heads - 1 would be set but
  6005                              <1> 	; it is seen as it will be good
  6006                              <1> 	; if physical parameters will be set here
  6007                              <1> 	; because, number of heads <= 16.
  6008                              <1> 	; (logical heads usually more than 16)
  6009                              <1> 	; NOTE: ATA logical parameters (software C, H, S)
  6010                              <1> 	;	== INT 13h physical parameters
  6011                              <1> 
  6012                              <1> ;INIT_DRV:
  6013                              <1> ;	mov	byte [CMD_BLOCK+6], SET_PARM_CMD
  6014                              <1> ;	call	GET_VEC 		; ES:BX -> PARAMETER BLOCK
  6015                              <1> ;	mov	al, [es:bx+2]		; GET NUMBER OF HEADS
  6016                              <1> ;	dec	al			; CONVERT TO 0-INDEX
  6017                              <1> ;	mov	ah, [CMD_BLOCK+5] 	; GET SDH REGISTER
  6018                              <1> ;	and	ah, 0F0h 		; CHANGE HEAD NUMBER
  6019                              <1> ;	or	ah, al			; TO MAX HEAD
  6020                              <1> ;	mov	[CMD_BLOCK+5], ah
  6021                              <1> ;	mov	al, [es:bx+14]		; MAX SECTOR NUMBER
  6022                              <1> ;	mov	[CMD_BLOCK+1], al
  6023                              <1> ;	sub	ax, ax
  6024                              <1> ;	mov	[CMD_BLOCK+3], al 	; ZERO FLAGS
  6025                              <1> ;	call	COMMAND 		; TELL CONTROLLER
  6026                              <1> ;	jnz	short INIT_EXIT		; CONTROLLER BUSY ERROR
  6027                              <1> ;	call	NOT_BUSY		; WAIT FOR IT TO BE DONE
  6028                              <1> ;	jnz	short INIT_EXIT		; TIME OUT
  6029                              <1> ;	call	CHECK_STATUS
  6030                              <1> ;INIT_EXIT:
  6031                              <1> ;	retn
  6032                              <1> 
  6033                              <1> ; 16/07/2022 - TRDOS 386 v2.0.5
  6034                              <1> 
  6035                              <1> ; 04/01/2015
  6036                              <1> ; 02/01/2015 - Derived from from AWARD BIOS 1999
  6037                              <1> ;				 AHDSK.ASM - INIT_DRIVE
  6038                              <1> INIT_DRV:
  6039                              <1> 	;xor	ah,ah
  6040 00005497 31C0                <1> 	xor	eax, eax ; 21/02/2015
  6041 00005499 B00B                <1> 	mov	al, 11 ; Physical heads from translated HDPT
  6042 0000549B 3825[9C7D0100]      <1>         cmp     [LBAMode], ah   ; 0
  6043 000054A1 7702                <1> 	ja	short idrv0
  6044 000054A3 B002                <1> 	mov	al, 2  ; Physical heads from standard HDPT
  6045                              <1> idrv0:
  6046                              <1> 	; DL = drive number (0 based)
  6047 000054A5 E8DF020000          <1> 	call	GET_VEC
  6048                              <1> 	;push	bx
  6049 000054AA 53                  <1> 	push	ebx ; 21/02/2015
  6050                              <1> 	;add	bx, ax
  6051 000054AB 01C3                <1> 	add	ebx, eax
  6052                              <1> 	;; 05/01/2015
  6053 000054AD 8A25[32660000]      <1> 	mov	ah, [hf_m_s] ; drive number (0= master, 1= slave)
  6054                              <1> 	;;and 	ah, 1 
  6055 000054B3 C0E404              <1> 	shl	ah, 4
  6056 000054B6 80CCA0              <1> 	or	ah, 0A0h  ; Drive/Head register - 10100000b (A0h)	
  6057                              <1> 	;mov	al, [es:bx]
  6058 000054B9 8A03                <1> 	mov	al, [ebx] ; 21/02/2015
  6059 000054BB FEC8                <1> 	dec	al	 ; last head number 
  6060                              <1> 	;and	al, 0Fh
  6061 000054BD 08E0                <1> 	or	al, ah	 ; lower 4 bits for head number
  6062                              <1> 	;
  6063 000054BF C645FE91            <1> 	mov	byte [CMD_BLOCK+6], SET_PARM_CMD
  6064 000054C3 8845FD              <1> 	mov	[CMD_BLOCK+5], al
  6065                              <1> 	;pop	bx
  6066 000054C6 5B                  <1> 	pop	ebx
  6067 000054C7 29C0                <1> 	sub	eax, eax ; 21/02/2015
  6068 000054C9 B004                <1> 	mov	al, 4	; Physical sec per track from translated HDPT
  6069 000054CB 803D[9C7D0100]00    <1> 	cmp	byte [LBAMode], 0
  6070 000054D2 7702                <1> 	ja	short idrv1
  6071 000054D4 B00E                <1> 	mov	al, 14	; Physical sec per track from standard HDPT
  6072                              <1> idrv1:
  6073                              <1> 	;xor	ah, ah
  6074                              <1> 	;add	bx, ax
  6075 000054D6 01C3                <1> 	add	ebx, eax ; 21/02/2015
  6076                              <1> 	;mov	al, [es:bx]
  6077                              <1> 			; sector number
  6078 000054D8 8A03                <1> 	mov	al, [ebx]
  6079 000054DA 8845F9              <1> 	mov	[CMD_BLOCK+1], al
  6080 000054DD 28C0                <1> 	sub	al, al
  6081 000054DF 8845FB              <1> 	mov	[CMD_BLOCK+3], al ; ZERO FLAGS
  6082 000054E2 E803010000          <1> 	call	COMMAND 	  ; TELL CONTROLLER
  6083 000054E7 751E                <1> 	jnz	short INIT_EXIT	  ; CONTROLLER BUSY ERROR
  6084 000054E9 E8E6010000          <1> 	call	NOT_BUSY	  ; WAIT FOR IT TO BE DONE
  6085 000054EE 7517                <1> 	jnz	short INIT_EXIT	  ; TIME OUT
  6086                              <1> 	; 16/07/2022
  6087                              <1> 	;call	CHECK_STATUS
  6088                              <1> 	;jmp	short CHECK_STATUS
  6089                              <1> ;INIT_EXIT:
  6090                              <1> 	;retn
  6091                              <1> 
  6092                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6093                              <1> 	; 10/07/2022 - Retro UNIX 386 v1.1 (Kernel v0.2.1.5)
  6094                              <1> 
  6095                              <1> ;----------------------------------------
  6096                              <1> ;	CHECK FIXED DISK STATUS 	:
  6097                              <1> ;----------------------------------------
  6098                              <1> CHECK_STATUS:
  6099 000054F0 E831020000          <1> 	call	CHECK_ST		; CHECK THE STATUS BYTE
  6100                              <1> 	;jnz	short CHECK_S1		; AN ERROR WAS FOUND
  6101                              <1> 	; 10/07/2022
  6102 000054F5 7510                <1> 	jnz	short CHECK_S2
  6103 000054F7 A801                <1> 	test	al, ST_ERROR		; WERE THERE ANY OTHER ERRORS
  6104 000054F9 7405                <1> 	jz	short CHECK_S1		; NO ERROR REPORTED
  6105 000054FB E866020000          <1> 	call	CHECK_ER		; ERROR REPORTED
  6106                              <1> CHECK_S1:
  6107 00005500 803D[877D0100]00    <1> 	cmp	byte [DISK_STATUS1], 0 	; SET STATUS FOR CALLER
  6108                              <1> CHECK_S2:
  6109                              <1> INIT_EXIT:	; 10/07/2022
  6110 00005507 C3                  <1> 	retn
  6111                              <1> 
  6112                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6113                              <1> 
  6114                              <1> ;----------------------------------------
  6115                              <1> ;	SEEK		     (AH = 0CH) :
  6116                              <1> ;----------------------------------------
  6117                              <1> 
  6118                              <1> DISK_SEEK:
  6119 00005508 C645FE70            <1>         mov	byte [CMD_BLOCK+6], SEEK_CMD
  6120 0000550C E8D9000000          <1> 	call	COMMAND
  6121 00005511 751C                <1> 	jnz	short DS_EXIT		; CONTROLLER BUSY ERROR
  6122 00005513 E88C010000          <1> 	call	_WAIT
  6123 00005518 7515                <1>         jnz	short DS_EXIT		; TIME OUT ON SEEK
  6124 0000551A E8D1FFFFFF          <1> 	call	CHECK_STATUS
  6125 0000551F 803D[877D0100]40    <1>         cmp	byte [DISK_STATUS1], BAD_SEEK
  6126 00005526 7507                <1> 	jne	short DS_EXIT
  6127 00005528 C605[877D0100]00    <1>         mov	byte [DISK_STATUS1], 0
  6128                              <1> DS_EXIT:
  6129 0000552F C3                  <1> 	retn
  6130                              <1> 
  6131                              <1> ;----------------------------------------
  6132                              <1> ;	TEST DISK READY      (AH = 10H) :
  6133                              <1> ;----------------------------------------
  6134                              <1> 
  6135                              <1> TST_RDY:				; WAIT FOR CONTROLLER
  6136 00005530 E89F010000          <1> 	call	NOT_BUSY
  6137 00005535 752C                <1> 	jnz	short TR_EX
  6138                              <1> 	;;;
  6139                              <1> 	; 23/06/2024
  6140 00005537 803D[9C7D0100]FF    <1> 	cmp	byte [LBAMode], 0FFh
  6141 0000553E 7507                <1> 	jne	short tst_28bit_rdy
  6142 00005540 A0[32660000]        <1> 	mov	al, [hf_m_s]
  6143 00005545 EB03                <1> 	jmp	short tst_48bit_rdy
  6144                              <1> tst_28bit_rdy:
  6145                              <1> 	;;;
  6146 00005547 8A45FD              <1> 	mov	al, [CMD_BLOCK+5] 	; SELECT DRIVE
  6147                              <1> tst_48bit_rdy:
  6148 0000554A 668B15[2E660000]    <1> 	mov	dx, [HF_PORT]
  6149 00005551 80C206              <1> 	add	dl, 6
  6150 00005554 EE                  <1> 	out	dx, al
  6151 00005555 E8CC010000          <1> 	call	CHECK_ST		; CHECK STATUS ONLY
  6152 0000555A 7507                <1> 	jnz	short TR_EX
  6153 0000555C C605[877D0100]00    <1> 	mov	byte [DISK_STATUS1], 0 	; WIPE OUT DATA CORRECTED ERROR
  6154                              <1> TR_EX:	
  6155 00005563 C3                  <1> 	retn
  6156                              <1> 
  6157                              <1> ;----------------------------------------
  6158                              <1> ;	RECALIBRATE	     (AH = 11H) :
  6159                              <1> ;----------------------------------------
  6160                              <1> 
  6161                              <1> HDISK_RECAL:
  6162 00005564 C645FE10            <1>         mov	byte [CMD_BLOCK+6], RECAL_CMD ; 10h, 16
  6163 00005568 E87D000000          <1> 	call	COMMAND 		; START THE OPERATION
  6164 0000556D 7523                <1> 	jnz	short RECAL_EXIT	; ERROR
  6165 0000556F E830010000          <1> 	call	_WAIT			; WAIT FOR COMPLETION
  6166 00005574 7407                <1> 	jz	short RECAL_X 		; TIME OUT ONE OK ?
  6167 00005576 E829010000          <1> 	call	_WAIT			; WAIT FOR COMPLETION LONGER
  6168 0000557B 7515                <1> 	jnz	short RECAL_EXIT	; TIME OUT TWO TIMES IS ERROR
  6169                              <1> RECAL_X:
  6170 0000557D E86EFFFFFF          <1> 	call	CHECK_STATUS
  6171 00005582 803D[877D0100]40    <1> 	cmp	byte [DISK_STATUS1], BAD_SEEK ; SEEK NOT COMPLETE
  6172 00005589 7507                <1> 	jne	short RECAL_EXIT	; IS OK
  6173 0000558B C605[877D0100]00    <1> 	mov	byte [DISK_STATUS1], 0
  6174                              <1> RECAL_EXIT:
  6175 00005592 803D[877D0100]00    <1>         cmp	byte [DISK_STATUS1], 0
  6176 00005599 C3                  <1> 	retn
  6177                              <1> 
  6178                              <1> ;----------------------------------------
  6179                              <1> ;      CONTROLLER DIAGNOSTIC (AH = 14H) :
  6180                              <1> ;----------------------------------------
  6181                              <1> 
  6182                              <1> CTLR_DIAGNOSTIC:
  6183                              <1> 	; 07/08/2022 - TRDOS 386 v2.0.5
  6184 0000559A FA                  <1> 	cli				; DISABLE INTERRUPTS WHILE CHANGING MASK
  6185 0000559B E4A1                <1> 	in	al, INTB01		; TURN ON SECOND INTERRUPT CHIP
  6186                              <1> 	;and	al, 0BFH
  6187 0000559D 243F                <1> 	and	al, 3Fh			; enable IRQ 14 & IRQ 15
  6188                              <1> 	;jmp	$+2
  6189                              <1> 	IODELAY
    78 0000559F EB00                <2>  jmp short $+2
    79 000055A1 EB00                <2>  jmp short $+2
  6190 000055A3 E6A1                <1> 	out	INTB01, al
  6191                              <1> 	IODELAY
    78 000055A5 EB00                <2>  jmp short $+2
    79 000055A7 EB00                <2>  jmp short $+2
  6192 000055A9 E421                <1> 	in	al, INTA01		; LET INTERRUPTS PASS THRU TO
  6193 000055AB 24FB                <1> 	and	al, 0FBh 		;  SECOND CHIP
  6194                              <1> 	;jmp	$+2
  6195                              <1> 	IODELAY
    78 000055AD EB00                <2>  jmp short $+2
    79 000055AF EB00                <2>  jmp short $+2
  6196 000055B1 E621                <1> 	out	INTA01, al
  6197 000055B3 FB                  <1> 	sti
  6198 000055B4 E81B010000          <1> 	call	NOT_BUSY		; WAIT FOR CARD
  6199 000055B9 7526                <1> 	jnz	short CD_ERR		; BAD CARD
  6200                              <1> 	;mov	dx, PORT+7
  6201 000055BB 668B15[2E660000]    <1> 	mov	dx, [HF_PORT]
  6202 000055C2 80C207              <1> 	add	dl, 7
  6203 000055C5 B090                <1> 	mov	al, DIAG_CMD		; START DIAGNOSE
  6204 000055C7 EE                  <1> 	out	dx, al
  6205 000055C8 E807010000          <1> 	call	NOT_BUSY		; WAIT FOR IT TO COMPLETE
  6206 000055CD B480                <1> 	mov	ah, TIME_OUT
  6207 000055CF 7512                <1> 	jnz	short CD_EXIT 		; TIME OUT ON DIAGNOSTIC
  6208                              <1> 	;mov	dx, HF_PORT+1		; GET ERROR REGISTER
  6209 000055D1 668B15[2E660000]    <1> 	mov	dx, [HF_PORT]
  6210 000055D8 FEC2                <1> 	inc	dl
  6211 000055DA EC                  <1> 	in	al, dx
  6212                              <1> 	; 07/08/2022
  6213                              <1> 	;mov	[HF_ERROR], al		; SAVE IT
  6214 000055DB B400                <1> 	mov	ah, 0
  6215 000055DD 3C01                <1> 	cmp	al, 1			; CHECK FOR ALL OK
  6216 000055DF 7402                <1> 	je	short CD_EXIT
  6217                              <1> CD_ERR:
  6218 000055E1 B420                <1> 	mov	ah, BAD_CNTLR
  6219                              <1> CD_EXIT:
  6220 000055E3 8825[877D0100]      <1> 	mov	[DISK_STATUS1], ah
  6221 000055E9 C3                  <1> 	retn
  6222                              <1> 
  6223                              <1> 	; 20/06/2024 - TRDOS 386 v2.0.8
  6224                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6225                              <1> 	; 10/07/2022 - Retro UNIX 386 v1.1 (Kernel v0.2.1.5)
  6226                              <1> 
  6227                              <1> ;--------------------------------------------------------
  6228                              <1> ; COMMAND						:
  6229                              <1> ;	THIS ROUTINE OUTPUTS THE COMMAND BLOCK		:
  6230                              <1> ; OUTPUT						:
  6231                              <1> ;	BL = STATUS					:
  6232                              <1> ;	BH = ERROR REGISTER				:
  6233                              <1> ;--------------------------------------------------------
  6234                              <1> 
  6235                              <1> COMMAND:
  6236                              <1> 	;push	ebx ; 10/07/2022	; WAIT FOR SEEK COMPLETE AND READY
  6237                              <1> 	;;mov	ecx, DELAY_2		; SET INITIAL DELAY BEFORE TEST
  6238                              <1> COMMAND1:
  6239                              <1> 	;;push	ecx			; SAVE LOOP COUNT
  6240 000055EA E841FFFFFF          <1> 	call	TST_RDY 		; CHECK DRIVE READY
  6241                              <1> 	;;pop	ecx
  6242                              <1> 	;pop	ebx ; 10/07/2022
  6243 000055EF 7418                <1> 	jz	short COMMAND2		; DRIVE IS READY
  6244 000055F1 803D[877D0100]80    <1>         cmp	byte [DISK_STATUS1], TIME_OUT ; TST_RDY TIMED OUT--GIVE UP
  6245                              <1> 	;jz	short CMD_TIMEOUT
  6246                              <1> 	;;loop	COMMAND1		; KEEP TRYING FOR A WHILE
  6247                              <1> 	;jmp	short COMMAND4		; ITS NOT GOING TO GET READY
  6248 000055F8 7507                <1> 	jne	short COMMAND4
  6249                              <1> CMD_TIMEOUT:
  6250 000055FA C605[877D0100]20    <1> 	mov	byte [DISK_STATUS1], BAD_CNTLR
  6251                              <1> COMMAND4:
  6252                              <1> 	;;pop	ebx ; 10/07/2022
  6253 00005601 803D[877D0100]00    <1>         cmp	byte [DISK_STATUS1], 0	; SET CONDITION CODE FOR CALLER
  6254 00005608 C3                  <1> 	retn
  6255                              <1> COMMAND2:
  6256                              <1> 	;;pop	ebx ; 10/07/2022
  6257                              <1> 	;push	edi ; 10/07/2022
  6258 00005609 C605[827D0100]00    <1> 	mov	byte [HF_INT_FLAG], 0	; RESET INTERRUPT FLAG
  6259 00005610 FA                  <1> 	cli				; INHIBIT INTERRUPTS WHILE CHANGING MASK
  6260 00005611 E4A1                <1> 	in	al, INTB01		; TURN ON SECOND INTERRUPT CHIP
  6261                              <1> 	;and	al, 0BFh
  6262 00005613 243F                <1> 	and	al, 3Fh			; Enable IRQ 14 & 15
  6263                              <1> 	;jmp	$+2
  6264                              <1> 	IODELAY
    78 00005615 EB00                <2>  jmp short $+2
    79 00005617 EB00                <2>  jmp short $+2
  6265 00005619 E6A1                <1> 	out	INTB01, al
  6266 0000561B E421                <1> 	in	al, INTA01		; LET INTERRUPTS PASS THRU TO
  6267 0000561D 24FB                <1> 	and	al, 0FBh 		; SECOND CHIP
  6268                              <1> 	;jmp	$+2
  6269                              <1> 	IODELAY
    78 0000561F EB00                <2>  jmp short $+2
    79 00005621 EB00                <2>  jmp short $+2
  6270 00005623 E621                <1> 	out	INTA01, al
  6271 00005625 FB                  <1> 	sti
  6272                              <1> 	;xor	edi, edi		; INDEX THE COMMAND TABLE
  6273                              <1> 	; 10/07/2022
  6274 00005626 31C9                <1> 	xor	ecx, ecx
  6275                              <1> 	
  6276                              <1> 	;mov	dx, HF_PORT+1		; DISK ADDRESS
  6277 00005628 668B15[2E660000]    <1> 	mov	dx, [HF_PORT]
  6278 0000562F FEC2                <1> 	inc	dl	
  6279                              <1> 
  6280                              <1> 	; 20/06/2024
  6281                              <1> 	;mov	al, [CMD_BLOCK+6]
  6282                              <1> 	;cmp	al, 24h ; READ SECTOR(S) EXT
  6283                              <1> 	;je	short COMMAND5
  6284                              <1> 	;cmp	al, 34h ; WRITE SECTOR(S) EXT
  6285                              <1> 	;je	short COMMAND5
  6286                              <1> 	; 23/06/2024
  6287 00005631 803D[9C7D0100]FF    <1> 	cmp	byte [LBAMode], 0FFh
  6288 00005638 7428                <1> 	je	short COMMAND5	; 48 bit LBA read/write
  6289                              <1> 
  6290                              <1> 	; 20/06/2024
  6291                              <1> 	; dx = hd base port + 1 ; 1F1h or 171h
  6292                              <1> 
  6293 0000563A F605[897D0100]C0    <1> 	test	byte [CONTROL_BYTE], 0C0h ; CHECK FOR RETRY SUPPRESSION
  6294 00005641 740E                <1> 	jz	short COMMAND3
  6295                              <1> 	; 20/06/2024
  6296                              <1> 	;mov	al, [CMD_BLOCK+6] 	; YES-GET OPERATION CODE
  6297 00005643 24F0                <1> 	and	al, 0F0h 		; GET RID OF MODIFIERS
  6298 00005645 3C20                <1> 	cmp	al, 20h			; 20H-40H IS READ, WRITE, VERIFY
  6299 00005647 7208                <1> 	jb	short COMMAND3
  6300 00005649 3C40                <1> 	cmp	al, 40h
  6301 0000564B 7704                <1> 	ja	short COMMAND3
  6302 0000564D 804DFE01            <1> 	or	byte [CMD_BLOCK+6], NO_RETRIES 
  6303                              <1> 					; VALID OPERATION FOR RETRY SUPPRESS
  6304                              <1> COMMAND3:
  6305                              <1> 	;mov	al, [CMD_BLOCK+edi]	; GET THE COMMAND STRING BYTE
  6306                              <1> 	; 10/07/2022
  6307 00005651 8A440DF8            <1> 	mov	al, [CMD_BLOCK+ecx]
  6308 00005655 EE                  <1> 	out	dx, al			; GIVE IT TO CONTROLLER
  6309                              <1> 	IODELAY
    78 00005656 EB00                <2>  jmp short $+2
    79 00005658 EB00                <2>  jmp short $+2
  6310                              <1> 	;inc	edi			; NEXT BYTE IN COMMAND BLOCK
  6311                              <1> 	; 10/07/2022
  6312 0000565A 41                  <1> 	inc	ecx
  6313                              <1> 	;inc	dx			; NEXT DISK ADAPTER REGISTER
  6314 0000565B 42                  <1> 	inc	edx   ; 10/07/2022	
  6315                              <1> 	;cmp	di, 7 ; 01/01/2015	; ALL DONE?
  6316                              <1> 	;jne	short COMMAND3		; NO--GO DO NEXT ONE
  6317 0000565C 80F907              <1> 	cmp	cl, 7 ; 10/07/2022
  6318 0000565F 72F0                <1> 	jb	short COMMAND3
  6319                              <1> 	;pop	edi ; 10/07/2022
  6320 00005661 C3                  <1> 	retn				; ZERO FLAG IS SET
  6321                              <1> 
  6322                              <1> 	; 20/06/2024
  6323                              <1> COMMAND5:
  6324                              <1> 	; 48 bit LBA r/w
  6325 00005662 8A45F8              <1> 	mov	al, [CMD_BLOCK] ; 0
  6326 00005665 EE                  <1> 	out	dx, al	; hd base port + 1
  6327                              <1> 	;
  6328 00005666 80C205              <1> 	add	dl, 5	; hd base port + 6 ; 1F6h or 176h
  6329 00005669 A0[32660000]        <1> 	mov	al, [hf_m_s]
  6330                              <1> 	; 23/06/2024
  6331                              <1> 	;shl	al, 4
  6332                              <1> 	;;add	al, 40h
  6333                              <1> 	;or	al, 40h	
  6334                              <1> 	;; al = 40h (for master), 50h (for slave)
  6335                              <1> 	;
  6336 0000566E EE                  <1> 	out	dx, al
  6337 0000566F 80EA04              <1> 	sub	dl, 4	; hd base port + 2 ; 1F2h or 172h
  6338 00005672 30C0                <1> 	xor	al, al	; 0
  6339 00005674 EE                  <1> 	out	dx, al	; sector count hb (bits 8 to 15) = 0
  6340 00005675 42                  <1> 	inc	edx	; hd base port + 3
  6341 00005676 8B45FA              <1> 	mov	eax, [CMD_BLOCK+2]
  6342 00005679 C1C008              <1> 	rol	eax, 8
  6343 0000567C EE                  <1> 	out	dx, al	; LBA byte 4 (bits 24 to 31)
  6344 0000567D 42                  <1> 	inc	edx	; hd base port + 4
  6345 0000567E 30C0                <1> 	xor	al, al
  6346 00005680 EE                  <1> 	out	dx, al	; LBA byte 5 (bits 32 to 39) = 0
  6347 00005681 42                  <1> 	inc	edx	; hd base port + 5
  6348 00005682 28C0                <1> 	sub	al, al
  6349 00005684 EE                  <1> 	out	dx, al	; LBA byte 6 (bits 40 to 47) = 0
  6350 00005685 8A45F9              <1> 	mov	al, [CMD_BLOCK+1] ; sector count
  6351 00005688 80EA03              <1> 	sub	dl, 3	; hd base port + 2
  6352 0000568B EE                  <1> 	out	dx, al	; sector count lb (bits 0 to 7)
  6353 0000568C C1E808              <1> 	shr	eax, 8
  6354 0000568F 42                  <1> 	inc	edx	; hd base port + 3 ; 1F3h or 173h
  6355 00005690 EE                  <1> 	out	dx, al	; LBA byte 1 (bits 0 to 7)
  6356 00005691 C1E808              <1> 	shr	eax, 8
  6357 00005694 42                  <1> 	inc	edx	; hd base port + 4
  6358 00005695 EE                  <1> 	out	dx, al	; LBA byte 2 (bits 8 to 15)
  6359 00005696 C1E808              <1> 	shr	eax, 8
  6360 00005699 42                  <1> 	inc	edx	; hd base port + 5
  6361 0000569A EE                  <1> 	out	dx, al	; LBA byte 3 (bits 16 to 23
  6362 0000569B 42                  <1> 	inc	edx	; hd base port + 6
  6363 0000569C 8A45FE              <1> 	mov	al, [CMD_BLOCK+6] ; 48 bit read or write command
  6364                              <1> 	; al = 24h or 34h
  6365 0000569F 42                  <1> 	inc	edx	; hd base port + 7 ; 1F7h or 177h
  6366 000056A0 EE                  <1> 	out	dx, al
  6367 000056A1 31C0                <1> 	xor	eax, eax ; 0
  6368                              <1> 	; zf = 1
  6369 000056A3 C3                  <1> 	retn
  6370                              <1> 
  6371                              <1> ;CMD_TIMEOUT:
  6372                              <1> ;	mov	byte [DISK_STATUS1], BAD_CNTLR
  6373                              <1> ;COMMAND4:
  6374                              <1> ;	pop	ebx
  6375                              <1> ;	cmp	byte [DISK_STATUS1], 0 	; SET CONDITION CODE FOR CALLER
  6376                              <1> ;	retn
  6377                              <1> 
  6378                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6379                              <1> 	; 10/07/2022 - Retro UNIX 386 v1.1 (Kernel v0.2.1.5)
  6380                              <1> 
  6381                              <1> ;----------------------------------------
  6382                              <1> ;	WAIT FOR INTERRUPT		:
  6383                              <1> ;----------------------------------------
  6384                              <1> ;WAIT:
  6385                              <1> _WAIT:
  6386 000056A4 FB                  <1> 	sti				; MAKE SURE INTERRUPTS ARE ON
  6387                              <1> 	;sub	cx, cx			; SET INITIAL DELAY BEFORE TEST
  6388                              <1> 	;clc
  6389                              <1> 	;mov	ax, 9000h		; DEVICE WAIT INTERRUPT
  6390                              <1> 	;int	15h
  6391                              <1> 	;jc	short WT2		; DEVICE TIMED OUT
  6392                              <1> 	;mov	bl, DELAY_1		; SET DELAY COUNT
  6393                              <1> 
  6394                              <1> 	;mov	bl, WAIT_HDU_INT_HI
  6395                              <1> 	;; 21/02/2015
  6396                              <1> 	;;mov	bl, WAIT_HDU_INT_HI + 1
  6397                              <1> 	;;mov	cx, WAIT_HDU_INT_LO
  6398 000056A5 B915160500          <1> 	mov	ecx, WAIT_HDU_INT_LH
  6399                              <1> 					; (AWARD BIOS -> WAIT_FOR_MEM)
  6400                              <1> ;-----	WAIT LOOP
  6401                              <1> 
  6402                              <1> WT1:	
  6403                              <1> 	;test	byte [HF_INT_FLAG], 80h	; TEST FOR INTERRUPT
  6404 000056AA F605[827D0100]C0    <1> 	test 	byte [HF_INT_FLAG], 0C0h
  6405                              <1> 	;loopz	WT1
  6406 000056B1 7512                <1> 	jnz	short WT3		; INTERRUPT--LETS GO
  6407                              <1> 	;dec	bl
  6408                              <1> 	;jnz	short WT1		; KEEP TRYING FOR A WHILE
  6409                              <1> 
  6410                              <1> WT1_hi:
  6411 000056B3 E461                <1> 	in	al, SYS1 ; 61h (PORT_B)	; wait for lo to hi
  6412 000056B5 A810                <1> 	test	al, 10h			; transition on memory
  6413 000056B7 75FA                <1> 	jnz	short WT1_hi		; refresh.
  6414                              <1> WT1_lo:
  6415 000056B9 E461                <1> 	in	al, SYS1 		; 061h (PORT_B)	
  6416 000056BB A810                <1> 	test	al, 10h			
  6417 000056BD 74FA                <1> 	jz	short WT1_lo
  6418 000056BF E2E9                <1> 	loop	WT1
  6419                              <1> 	;;or	bl, bl
  6420                              <1> 	;;jz	short WT2	
  6421                              <1> 	;;dec	bl
  6422                              <1> 	;;jmp	short WT1
  6423                              <1> 	;dec	bl
  6424                              <1> 	;jnz	short WT1	
  6425                              <1> WT2:	
  6426                              <1> 	; 10/07/2022
  6427                              <1> 	;mov	byte [DISK_STATUS1], TIME_OUT ; REPORT TIME OUT ERROR
  6428 000056C1 B080                <1> 	mov	al, TIME_OUT
  6429 000056C3 EB07                <1> 	jmp	short WT4
  6430                              <1> WT3:
  6431                              <1> 	;mov	byte [DISK_STATUS1], 0
  6432                              <1> 	;mov	byte [HF_INT_FLAG], 0
  6433 000056C5 28C0                <1> 	sub	al, al ; 0
  6434 000056C7 A2[827D0100]        <1> 	mov	byte [HF_INT_FLAG], al
  6435                              <1> WT4:
  6436                              <1> NB2:	
  6437 000056CC A2[877D0100]        <1> 	mov	byte [DISK_STATUS1], al
  6438                              <1> 
  6439                              <1> 	;cmp	byte [DISK_STATUS1], 0 	; SET CONDITION CODE FOR CALLER
  6440 000056D1 20C0                <1> 	and	al, al
  6441                              <1> 	; zf = 0 -> time out, zf = 1 -> ok
  6442 000056D3 C3                  <1> 	retn
  6443                              <1> 
  6444                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6445                              <1> 	; 10/07/2022 - Retro UNIX 386 v1.1 (Kernel v0.2.1.5)
  6446                              <1> 
  6447                              <1> ;----------------------------------------
  6448                              <1> ;	WAIT FOR CONTROLLER NOT BUSY	:
  6449                              <1> ;----------------------------------------
  6450                              <1> NOT_BUSY:
  6451 000056D4 FB                  <1> 	sti				; MAKE SURE INTERRUPTS ARE ON
  6452                              <1> 	;push	ebx
  6453                              <1> 	;sub	cx, cx			; SET INITIAL DELAY BEFORE TEST
  6454 000056D5 668B15[2E660000]    <1> 	mov	dx, [HF_PORT]
  6455 000056DC 80C207              <1> 	add	dl, 7			; Status port (HF_PORT+7)
  6456                              <1> 	;mov	bl, DELAY_1
  6457                              <1> 					; wait for 10 seconds
  6458                              <1> 	;mov 	cx, WAIT_HDU_INT_LO	; 1615h
  6459                              <1> 	;;mov 	bl, WAIT_HDU_INT_HI	;   05h
  6460                              <1> 	;mov	bl, WAIT_HDU_INT_HI + 1
  6461 000056DF B915160500          <1> 	mov	ecx, WAIT_HDU_INT_LH  ; 21/02/2015
  6462                              <1> 	;
  6463                              <1> 	;;mov	byte [wait_count], 0    ; Reset wait counter
  6464                              <1> NB1:	
  6465 000056E4 EC                  <1> 	in	al, dx			; CHECK STATUS
  6466                              <1> 	;test	al, ST_BUSY
  6467 000056E5 2480                <1> 	and	al, ST_BUSY
  6468                              <1> 	;loopnz NB1
  6469 000056E7 74E3                <1> 	jz	short NB2 ; al = 0	; NOT BUSY--LETS GO
  6470                              <1> 	;dec	bl			
  6471                              <1> 	;jnz	short NB1		; KEEP TRYING FOR A WHILE
  6472                              <1> 
  6473                              <1> NB1_hi: 
  6474 000056E9 E461                <1> 	in	al, SYS1		; wait for hi to lo
  6475 000056EB A810                <1> 	test	al, 010h		; transition on memory
  6476 000056ED 75FA                <1> 	jnz	short NB1_hi		; refresh.
  6477                              <1> NB1_lo: 
  6478 000056EF E461                <1> 	in	al, SYS1
  6479 000056F1 A810                <1> 	test	al, 010h
  6480 000056F3 74FA                <1> 	jz	short NB1_lo
  6481 000056F5 E2ED                <1> 	loop	NB1
  6482                              <1> 	;dec	bl
  6483                              <1> 	;jnz	short NB1
  6484                              <1> 	;
  6485                              <1> 	;;cmp	byte [wait_count], 182  ; 10 seconds (182 timer ticks)
  6486                              <1> 	;;jb	short NB1
  6487                              <1> 	;
  6488                              <1> 	;mov	byte [DISK_STATUS1], TIME_OUT ; REPORT TIME OUT ERROR
  6489                              <1> 	;jmp	short NB3
  6490 000056F7 B080                <1> 	mov	al, TIME_OUT
  6491                              <1> ;NB2:	
  6492 000056F9 EBD1                <1> 	jmp	short NB2 ; 10/07/2022
  6493                              <1> 
  6494                              <1> ;	;mov	byte [DISK_STATUS1], 0
  6495                              <1> ;;NB3:	
  6496                              <1> ;	;pop	ebx
  6497                              <1> ;	mov	[DISK_STATUS1], al	;;; will be set after return
  6498                              <1> ;	;cmp	byte [DISK_STATUS1], 0 	; SET CONDITION CODE FOR CALLER
  6499                              <1> ;	or	al, al			; (zf = 0 --> timeout)
  6500                              <1> ;	retn
  6501                              <1> 
  6502                              <1> ;----------------------------------------
  6503                              <1> ;	WAIT FOR DATA REQUEST		:
  6504                              <1> ;----------------------------------------
  6505                              <1> WAIT_DRQ:
  6506                              <1> 	;mov	cx, DELAY_3
  6507                              <1> 	;mov	dx, HF_PORT+7
  6508 000056FB 668B15[2E660000]    <1> 	mov	dx, [HF_PORT]
  6509 00005702 80C207              <1> 	add	dl, 7
  6510                              <1> 	;;mov	bl, WAIT_HDU_DRQ_HI	; 0
  6511                              <1> 	;mov	cx, WAIT_HDU_DRQ_LO	; 1000 (30 milli seconds)
  6512                              <1> 					; (but it is written as 2000
  6513                              <1> 					; micro seconds in ATORGS.ASM file
  6514                              <1> 					; of Award Bios - 1999, D1A0622)
  6515 00005705 B9E8030000          <1> 	mov 	ecx, WAIT_HDU_DRQ_LH ; 21/02/2015 
  6516                              <1> WQ_1:
  6517 0000570A EC                  <1> 	in	al, dx			; GET STATUS
  6518 0000570B A808                <1> 	test	al, ST_DRQ		; WAIT FOR DRQ
  6519 0000570D 7516                <1> 	jnz	short WQ_OK
  6520                              <1> 	;loop	WQ_1			; KEEP TRYING FOR A SHORT WHILE
  6521                              <1> WQ_hi:	
  6522 0000570F E461                <1> 	in	al, SYS1		; wait for hi to lo
  6523 00005711 A810                <1> 	test	al, 010h		; transition on memory
  6524 00005713 75FA                <1> 	jnz	short WQ_hi		; refresh.
  6525                              <1> WQ_lo:  
  6526 00005715 E461                <1> 	in	al, SYS1
  6527 00005717 A810                <1> 	test	al, 010h
  6528 00005719 74FA                <1> 	jz	short WQ_lo
  6529 0000571B E2ED                <1> 	loop	WQ_1
  6530                              <1> 
  6531 0000571D C605[877D0100]80    <1> 	mov	byte [DISK_STATUS1], TIME_OUT ; ERROR
  6532 00005724 F9                  <1> 	stc
  6533                              <1> WQ_OK:
  6534 00005725 C3                  <1> 	retn
  6535                              <1> ;WQ_OK:
  6536                              <1> 	;clc
  6537                              <1> 	;ret
  6538                              <1> 
  6539                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6540                              <1> 
  6541                              <1> ;----------------------------------------
  6542                              <1> ;	CHECK FIXED DISK STATUS BYTE	:
  6543                              <1> ;----------------------------------------
  6544                              <1> CHECK_ST:
  6545                              <1> 	;mov	dx, HF_PORT+7		; GET THE STATUS
  6546 00005726 668B15[2E660000]    <1> 	mov	dx, [HF_PORT]
  6547 0000572D 80C207              <1> 	add	dl, 7
  6548                              <1> 	
  6549                              <1> 	; 17/02/2016
  6550                              <1> 	;(http://wiki.osdev.org/ATA_PIO_Mode)
  6551                              <1> 	;"delay 400ns to allow drive to set new values of BSY and DRQ"
  6552 00005730 EC                  <1> 	in	al, dx
  6553                              <1> 	;in	al, dx ; 100ns
  6554                              <1> 	;in	al, dx ; 100ns
  6555                              <1>  	;in	al, dx ; 100ns
  6556                              <1> 	NEWIODELAY ; 18/02/2016 (AWARD BIOS - 1999, 'CKST' in AHSDK.ASM)
    83 00005731 E6EB                <2>  out 0EBh, al
  6557                              <1> 	;
  6558                              <1> 
  6559                              <1> 	; 16/07/2022
  6560 00005733 A2[817D0100]        <1> 	mov	[HF_STATUS], al
  6561                              <1> 	;mov	ah, 0
  6562 00005738 28E4                <1> 	sub	ah, ah ; 0
  6563 0000573A A880                <1> 	test	al, ST_BUSY		; IF STILL BUSY
  6564 0000573C 751A                <1> 	jnz	short CKST_EXIT		; REPORT OK
  6565 0000573E B4CC                <1> 	mov	ah, WRITE_FAULT
  6566 00005740 A820                <1> 	test 	al, ST_WRT_FLT		; CHECK FOR WRITE FAULT
  6567 00005742 7514                <1> 	jnz	short CKST_EXIT
  6568 00005744 B4AA                <1> 	mov	ah, NOT_RDY
  6569 00005746 A840                <1> 	test	al, ST_READY		; CHECK FOR NOT READY
  6570 00005748 740E                <1> 	jz	short CKST_EXIT
  6571 0000574A B440                <1> 	mov	ah, BAD_SEEK
  6572 0000574C A810                <1> 	test	al, ST_SEEK_COMPL	; CHECK FOR SEEK NOT COMPLETE
  6573 0000574E 7408                <1> 	jz	short CKST_EXIT
  6574 00005750 B411                <1> 	mov	ah, DATA_CORRECTED
  6575 00005752 A804                <1> 	test	al, ST_CORRCTD		; CHECK FOR CORRECTED ECC
  6576 00005754 7502                <1> 	jnz	short CKST_EXIT
  6577                              <1> 	;mov	ah, 0
  6578 00005756 30E4                <1> 	xor	ah, ah ; 0
  6579                              <1> CKST_EXIT:
  6580 00005758 8825[877D0100]      <1> 	mov	[DISK_STATUS1], ah	; SET ERROR FLAG
  6581 0000575E 80FC11              <1> 	cmp	ah, DATA_CORRECTED	; KEEP GOING WITH DATA CORRECTED
  6582 00005761 7402                <1> 	je	short CKST_EX1
  6583                              <1> 	;cmp	ah, 0
  6584 00005763 20E4                <1> 	and	ah, ah
  6585                              <1> CKST_EX1:
  6586 00005765 C3                  <1> 	retn
  6587                              <1> 
  6588                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6589                              <1> 
  6590                              <1> ;----------------------------------------
  6591                              <1> ;	CHECK FIXED DISK ERROR REGISTER :
  6592                              <1> ;----------------------------------------
  6593                              <1> CHECK_ER:
  6594                              <1> 	;mov	dx, HF_PORT+1		; GET THE ERROR REGISTER
  6595 00005766 668B15[2E660000]    <1> 	mov	dx, [HF_PORT]		;
  6596 0000576D FEC2                <1> 	inc	dl
  6597 0000576F EC                  <1> 	in	al, dx
  6598                              <1> 	; 16/07/2022
  6599                              <1> 	;mov	[HF_ERROR], al
  6600                              <1> 	;push	ebx  ; 21/02/2015
  6601 00005770 29C9                <1> 	sub	ecx, ecx
  6602                              <1> 	;mov	ecx, 8			; TEST ALL 8 BITS
  6603 00005772 B108                <1> 	mov	cl, 8
  6604                              <1> CK1:	
  6605 00005774 D0E0                <1> 	shl	al, 1			; MOVE NEXT ERROR BIT TO CARRY
  6606 00005776 7202                <1> 	jc	short CK2		; FOUND THE ERROR
  6607 00005778 E2FA                <1> 	loop	CK1			; KEEP TRYING
  6608                              <1> CK2:
  6609                              <1> 	;mov	ebx, ERR_TBL		; COMPUTE ADDRESS OF
  6610                              <1> 	;add	ebx, ecx		; ERROR CODE
  6611 0000577A 81C1[24660000]      <1> 	add	ecx, ERR_TBL ; 16/07/2022	
  6612                              <1> 
  6613                              <1> 	;;;mov	ah, byte [cs:bx]	; GET ERROR CODE
  6614                              <1> 	;;mov	ah, [bx]
  6615                              <1> 	;mov	ah, [ebx] ; 21/02/2015
  6616 00005780 8A21                <1> 	mov	ah, [ecx]	
  6617                              <1> CKEX:
  6618 00005782 8825[877D0100]      <1> 	mov	[DISK_STATUS1], ah	; SAVE ERROR CODE
  6619                              <1> 	; 16/07/2022
  6620                              <1> 	;pop	ebx
  6621                              <1> 	;;cmp	ah, 0
  6622                              <1> 	;and	ah, ah
  6623 00005788 C3                  <1> 	retn
  6624                              <1> 
  6625                              <1> ;--------------------------------------------------------
  6626                              <1> ; CHECK_DMA						:
  6627                              <1> ;  -CHECK ES:BX AND # SECTORS TO MAKE SURE THAT IT WILL :
  6628                              <1> ;   FIT WITHOUT SEGMENT OVERFLOW.			:
  6629                              <1> ;  -ES:BX HAS BEEN REVISED TO THE FORMAT SSSS:000X	:
  6630                              <1> ;  -OK IF # SECTORS < 80H (7FH IF LONG READ OR WRITE)	:
  6631                              <1> ;  -OK IF # SECTORS = 80H (7FH) AND BX <= 00H (04H)	:
  6632                              <1> ;  -ERROR OTHERWISE					:
  6633                              <1> ;--------------------------------------------------------
  6634                              <1> 
  6635                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6636                              <1> 	; (not needed for hard disks and 32 bit OS)
  6637                              <1> 
  6638                              <1> ;CHECK_DMA:
  6639                              <1> ;	; 11/04/2021 (32 bit push/pop)
  6640                              <1> ;	push	eax			; SAVE REGISTERS
  6641                              <1> ;	mov	ax, 8000h		; AH = MAX # SECTORS
  6642                              <1> ;					; AL = MAX OFFSET
  6643                              <1> ;	test	byte [CMD_BLOCK+6], ECC_MODE
  6644                              <1> ;	jz	short CKD1
  6645                              <1> ;	mov	ah, 7F04h		; ECC IS 4 MORE BYTES
  6646                              <1> ;CKD1:	
  6647                              <1> ;	cmp	ah, [CMD_BLOCK+1] 	; NUMBER OF SECTORS
  6648                              <1> ;	ja	short CKDOK		; IT WILL FIT
  6649                              <1> ;	jb	short CKDERR		; TOO MANY
  6650                              <1> ;	cmp	al, bl			; CHECK OFFSET ON MAX SECTORS
  6651                              <1> ;	;jb	short CKDERR		; ERROR
  6652                              <1> ;	jnb	short CKDOK ; 16/07/2022
  6653                              <1> ;;CKDOK:	
  6654                              <1> ;	;clc				; CLEAR CARRY
  6655                              <1> ;	;pop	eax
  6656                              <1> ;	;retn				; NORMAL RETURN
  6657                              <1> ;CKDERR:
  6658                              <1> ;	;stc				; INDICATE ERROR
  6659                              <1> ;	mov	byte [DISK_STATUS1], DMA_BOUNDARY
  6660                              <1> ;CKDOK:
  6661                              <1> ;	pop	eax
  6662                              <1> ;	retn
  6663                              <1> 
  6664                              <1> ;----------------------------------------
  6665                              <1> ;	SET UP EBX-> DISK PARMS		:
  6666                              <1> ;----------------------------------------
  6667                              <1> 					
  6668                              <1> ; INPUT -> DL = 0 based drive number
  6669                              <1> ; OUTPUT -> EBX = disk parameter table address
  6670                              <1> 
  6671                              <1> GET_VEC:
  6672                              <1> 	;sub	ax, ax			; GET DISK PARAMETER ADDRESS
  6673                              <1> 	;mov	es, ax
  6674                              <1> 	;test	dl, 1
  6675                              <1> 	;jz	short GV_0
  6676                              <1> ;	les	bx, [HF1_TBL_VEC] 	; ES:BX -> DRIVE PARAMETERS
  6677                              <1> ;	jmp	short GV_EXIT
  6678                              <1> ;GV_0:
  6679                              <1> ;	les 	bx,[HF_TBL_VEC]		; ES:BX -> DRIVE PARAMETERS
  6680                              <1> ;
  6681 00005789 31DB                <1> 	xor	ebx, ebx
  6682 0000578B 88D3                <1> 	mov	bl, dl
  6683                              <1> 	;02/01/2015
  6684                              <1> 	;xor	bh, bh
  6685                              <1> 	;shl	bl, 1			; port address offset
  6686                              <1> 	;mov	ax, [bx+hd_ports]	; Base port address (1F0h, 170h)
  6687                              <1> 	;shl	bl, 1			; dpt pointer offset
  6688 0000578D C0E302              <1> 	shl	bl, 2
  6689                              <1> 	;add	bx, HF_TBL_VEC		; Disk parameter table pointer
  6690 00005790 81C3[8C7D0100]      <1> 	add	ebx, HF_TBL_VEC ; 21/02/2015
  6691                              <1> 	;push	word [bx+2]		; dpt segment
  6692                              <1> 	;pop	es
  6693                              <1> 	;mov	bx, [bx]		; dpt offset
  6694 00005796 8B1B                <1> 	mov	ebx, [ebx]		
  6695                              <1> ;GV_EXIT:
  6696 00005798 C3                  <1> 	retn
  6697                              <1> 
  6698                              <1> hdc1_int: ; 21/02/2015
  6699                              <1> ;--- HARDWARE INT 76H -- ( IRQ LEVEL 14 ) -----------------------
  6700                              <1> ;								:
  6701                              <1> ;	FIXED DISK INTERRUPT ROUTINE				:
  6702                              <1> ;								:
  6703                              <1> ;----------------------------------------------------------------
  6704                              <1> 
  6705                              <1> ; 22/12/2014
  6706                              <1> ; IBM PC-XT Model 286 System BIOS Source Code - DISK.ASM (HD_INT)
  6707                              <1> ;	 '11/15/85'
  6708                              <1> ; AWARD BIOS 1999 (D1A0622) 
  6709                              <1> ;	Source Code - ATORGS.ASM (INT_HDISK, INT_HDISK1)
  6710                              <1> 
  6711                              <1> ;int_76h:
  6712                              <1> HD_INT:
  6713                              <1> 	; 11/04/2021 (32 bit push/pop)
  6714 00005799 50                  <1> 	push	eax
  6715 0000579A 1E                  <1> 	push	ds
  6716                              <1> 	;call	DDS
  6717                              <1> 	; 21/02/2015 (32 bit, 386 pm modification)
  6718 0000579B 66B81000            <1> 	mov	ax, KDATA
  6719 0000579F 8ED8                <1> 	mov 	ds, ax
  6720                              <1> 	;
  6721                              <1> 	;;mov	@HF_INT_FLAG,0FFH	; ALL DONE
  6722                              <1>         ;mov	byte [CS:HF_INT_FLAG], 0FFh
  6723 000057A1 C605[827D0100]FF    <1> 	mov	byte [HF_INT_FLAG], 0FFh
  6724                              <1> 	;
  6725 000057A8 52                  <1> 	push	edx
  6726 000057A9 66BAF701            <1> 	mov	dx, HDC1_BASEPORT+7	; Status Register (1F7h)
  6727                              <1> 					; Clear Controller
  6728                              <1> Clear_IRQ1415:				; (Award BIOS - 1999)
  6729 000057AD EC                  <1> 	in	al, dx			;
  6730 000057AE 5A                  <1> 	pop	edx
  6731                              <1> 	NEWIODELAY
    83 000057AF E6EB                <2>  out 0EBh, al
  6732                              <1> 	;
  6733 000057B1 B020                <1> 	mov	al, EOI			; NON-SPECIFIC END OF INTERRUPT
  6734 000057B3 E6A0                <1> 	out	INTB00, al		; FOR CONTROLLER #2
  6735                              <1> 	;jmp	$+2			; WAIT
  6736                              <1> 	NEWIODELAY
    83 000057B5 E6EB                <2>  out 0EBh, al
  6737 000057B7 E620                <1> 	out	INTA00, al		; FOR CONTROLLER #1
  6738 000057B9 1F                  <1> 	pop	ds
  6739                              <1> 	;sti				; RE-ENABLE INTERRUPTS
  6740                              <1> 	;mov	ax, 9100h		; DEVICE POST
  6741                              <1> 	;int	15h			;  INTERRUPT
  6742                              <1> irq15_iret: ; 25/02/2015
  6743 000057BA 58                  <1> 	pop	eax
  6744 000057BB CF                  <1> 	iretd				; RETURN FROM INTERRUPT
  6745                              <1> 
  6746                              <1> hdc2_int: ; 21/02/2015
  6747                              <1> ;--- HARDWARE INT 77H -- ( IRQ LEVEL 15 ) -----------------------
  6748                              <1> ;								:
  6749                              <1> ;	FIXED DISK INTERRUPT ROUTINE				:
  6750                              <1> ;								:
  6751                              <1> ;----------------------------------------------------------------
  6752                              <1> 
  6753                              <1> ;int_77h:
  6754                              <1> HD1_INT:
  6755                              <1> 	; 11/04/2021 (32 bit push/pop)
  6756 000057BC 50                  <1> 	push	eax
  6757                              <1> 	; Check if that is a spurious IRQ (from slave PIC)
  6758                              <1> 	; 25/02/2015 (source: http://wiki.osdev.org/8259_PIC)
  6759 000057BD B00B                <1> 	mov	al, 0Bh  ; In-Service Register
  6760 000057BF E6A0                <1> 	out	0A0h, al
  6761 000057C1 EB00                <1>         jmp short $+2
  6762 000057C3 EB00                <1> 	jmp short $+2
  6763 000057C5 E4A0                <1> 	in	al, 0A0h
  6764 000057C7 2480                <1> 	and 	al, 80h ; bit 7 (is it real IRQ 15 or fake?)
  6765 000057C9 74EF                <1> 	jz	short irq15_iret ; Fake (spurious) IRQ, do not send EOI)
  6766                              <1> 	;
  6767 000057CB 1E                  <1> 	push	ds
  6768                              <1> 	;call	DDS
  6769                              <1> 	; 21/02/2015 (32 bit, 386 pm modification)
  6770 000057CC 66B81000            <1> 	mov	ax, KDATA
  6771 000057D0 8ED8                <1> 	mov 	ds, ax
  6772                              <1> 	;
  6773                              <1> 	;;mov	@HF_INT_FLAG,0FFH	; ALL DONE
  6774                              <1>         ;or	byte [CS:HF_INT_FLAG],0C0h 
  6775 000057D2 800D[827D0100]C0    <1> 	or	byte [HF_INT_FLAG], 0C0h
  6776                              <1> 	;
  6777 000057D9 52                  <1> 	push	edx
  6778 000057DA 66BA7701            <1> 	mov	dx, HDC2_BASEPORT+7	; Status Register (177h)
  6779                              <1> 					; Clear Controller (Award BIOS 1999)
  6780 000057DE EBCD                <1> 	jmp	short Clear_IRQ1415
  6781                              <1> 
  6782                              <1> ;%include 'diskdata.inc' ; 11/03/2015
  6783                              <1> ;%include 'diskbss.inc' ; 11/03/2015
  6784                              <1> 
  6785                              <1> ;////////////////////////////////////////////////////////////////////
  6786                              <1> ;; END OF DISK I/O SYTEM ///
  3226                                  %include 'memory.s'  ; 09/03/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.8 - memory.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 04/06/2024  (Previous: 02/12/2023 - Kernel v2.0.7)
     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 000057E0 A1[F87C0100]        <1> 	mov	eax, [free_pages]
   339 000057E5 21C0                <1> 	and	eax, eax
   340 000057E7 7438                <1> 	jz	short out_of_memory
   341                              <1> 	;
   342 000057E9 53                  <1> 	push	ebx
   343 000057EA 51                  <1> 	push	ecx
   344                              <1> 	;
   345 000057EB BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL   ; Memory Allocation Table offset
   346 000057F0 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 000057F2 031D[FC7C0100]      <1> 	add	ebx, [next_page] ; Free page searching starts from here
   354                              <1> 				 ; next_free_page >> 5
   355 000057F8 030D[007D0100]      <1> 	add	ecx, [last_page] ; Free page searching ends here
   356                              <1> 				 ; (total_pages - 1) >> 5
   357                              <1> al_p_scan:
   358 000057FE 39CB                <1> 	cmp	ebx, ecx
   359 00005800 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 00005802 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 00005805 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 00005807 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 0000580A EBF2                <1>         jmp     short al_p_scan
   393                              <1> 	;
   394                              <1> al_p_notfound:
   395 0000580C 81E900001000        <1> 	sub	ecx, MEM_ALLOC_TBL
   396 00005812 890D[FC7C0100]      <1> 	mov	[next_page], ecx ; next/first free page = last page 
   397                              <1> 				 ; (deallocate_page procedure will change it)
   398 00005818 31C0                <1> 	xor	eax, eax
   399 0000581A A3[F87C0100]        <1> 	mov	[free_pages], eax ; 0
   400 0000581F 59                  <1> 	pop	ecx
   401 00005820 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 00005821 F9                  <1> 	stc
   412 00005822 C3                  <1> 	retn
   413                              <1> 
   414                              <1> al_p_found:
   415 00005823 89D9                <1> 	mov	ecx, ebx
   416 00005825 81E900001000        <1> 	sub	ecx, MEM_ALLOC_TBL
   417 0000582B 890D[FC7C0100]      <1> 	mov	[next_page], ecx ; Set first free page searching start
   418                              <1> 				 ; address/offset (to the next)
   419 00005831 FF0D[F87C0100]      <1>         dec     dword [free_pages] ; 1 page has been allocated (X = X-1) 
   420                              <1> 	;
   421 00005837 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 0000583A C1E103              <1> 	shl	ecx, 3		 ; (page block offset * 32) + page index
   429 0000583D 01C8                <1> 	add	eax, ecx	 ; = page number
   430 0000583F 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 00005842 59                  <1> 	pop	ecx
   436 00005843 5B                  <1> 	pop	ebx
   437                              <1> al_p_ok:
   438 00005844 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 00005845 E896FFFFFF          <1> 	call	allocate_page
   459 0000584A 7216                <1> 	jc	short mkpd_error
   460                              <1> 	;
   461 0000584C A3[04950100]        <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 00005851 57                  <1> 	push	edi
   475 00005852 51                  <1> 	push	ecx
   476 00005853 50                  <1> 	push	eax
   477 00005854 B900040000          <1> 	mov	ecx, PAGE_SIZE / 4
   478 00005859 89C7                <1> 	mov	edi, eax
   479 0000585B 31C0                <1> 	xor	eax, eax
   480 0000585D F3AB                <1> 	rep	stosd
   481 0000585F 58                  <1> 	pop	eax
   482 00005860 59                  <1> 	pop	ecx
   483 00005861 5F                  <1> 	pop	edi
   484                              <1> mkpd_error:
   485                              <1> mkpt_error:
   486 00005862 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 00005863 E878FFFFFF          <1> 	call	allocate_page
   510 00005868 72F8                <1> 	jc	short mkpt_error
   511 0000586A E811000000          <1> 	call	set_pde	
   512 0000586F 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 00005871 E86AFFFFFF          <1> 	call	allocate_page
   533 00005876 7207                <1> 	jc	short mkp_err
   534 00005878 E821000000          <1> 	call	set_pte	
   535 0000587D 73D2                <1> 	jnc	short clear_page ; 18/04/2015
   536                              <1> mkp_err:
   537 0000587F 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 00005880 89DA                <1> 	mov	edx, ebx
   563 00005882 C1EA16              <1> 	shr	edx, PAGE_D_SHIFT ; 22
   564 00005885 C1E202              <1> 	shl	edx, 2 ; offset to page directory (1024*4)
   565 00005888 0315[04950100]      <1> 	add	edx, [u.pgdir]
   566                              <1> 	;
   567 0000588E 21C0                <1> 	and	eax, eax
   568 00005890 7506                <1> 	jnz	short spde_1
   569                              <1> 	;
   570 00005892 8B02                <1> 	mov	eax, [edx]  ; old PDE value
   571                              <1> 	;test	al, 1
   572                              <1> 	;jz	short spde_2
   573 00005894 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h  ; clear lower 12 bits
   574                              <1> spde_1:
   575                              <1> 	;and	cx, 0FFFh
   576 00005898 8902                <1> 	mov	[edx], eax
   577 0000589A 66090A              <1> 	or	[edx], cx
   578 0000589D 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 0000589E 50                  <1> 	push	eax
   609 0000589F A1[04950100]        <1> 	mov	eax, [u.pgdir] ; 20/07/2015
   610 000058A4 E837000000          <1> 	call 	get_pde
   611                              <1> 		; EDX = PDE address
   612                              <1> 		; EAX = PDE value
   613 000058A9 5A                  <1> 	pop	edx ; physical page address
   614 000058AA 722A                <1> 	jc	short spte_err ; PDE not present
   615                              <1> 	;
   616 000058AC 53                  <1> 	push	ebx ; 24/07/2015
   617 000058AD 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear lower 12 bits
   618                              <1> 			    ; EDX = PT address (physical)	
   619 000058B1 C1EB0C              <1> 	shr	ebx, PAGE_SHIFT ; 12
   620 000058B4 81E3FF030000        <1> 	and	ebx, PTE_MASK	; 03FFh
   621                              <1> 			 ; clear higher 10 bits (PD bits)
   622 000058BA C1E302              <1> 	shl	ebx, 2   ; offset to page table (1024*4)
   623 000058BD 01C3                <1> 	add	ebx, eax
   624                              <1> 	;
   625 000058BF 8B03                <1> 	mov	eax, [ebx] ; Old PTE value
   626 000058C1 A801                <1> 	test	al, 1
   627 000058C3 740C                <1> 	jz	short spte_0
   628 000058C5 09D2                <1> 	or	edx, edx
   629 000058C7 750F                <1> 	jnz	short spte_1
   630 000058C9 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear lower 12 bits
   631 000058CD 89C2                <1> 	mov	edx, eax
   632 000058CF 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 000058D1 21C0                <1> 	and	eax, eax
   638 000058D3 7403                <1> 	jz	short spte_1
   639                              <1> 	; 24/07/2015
   640                              <1> 	; swapped page ! (on disk)
   641 000058D5 5B                  <1> 	pop	ebx
   642                              <1> spte_err:
   643 000058D6 F9                  <1> 	stc
   644 000058D7 C3                  <1> 	retn
   645                              <1> spte_1: 
   646 000058D8 89D0                <1> 	mov	eax, edx
   647                              <1> spte_2:
   648 000058DA 09CA                <1> 	or	edx, ecx
   649                              <1> 	; 23/06/2015
   650 000058DC 8913                <1> 	mov	[ebx], edx ; PTE value in EDX
   651                              <1> 	; 24/07/2015
   652 000058DE 5B                  <1> 	pop	ebx
   653 000058DF 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 000058E0 89DA                <1> 	mov	edx, ebx
   671 000058E2 C1EA16              <1> 	shr	edx, PAGE_D_SHIFT ; 22  (12+10)
   672 000058E5 C1E202              <1> 	shl 	edx, 2 ; offset to page directory (1024*4)
   673 000058E8 01C2                <1> 	add	edx, eax ; page directory address (physical)
   674 000058EA 8B02                <1> 	mov	eax, [edx]
   675 000058EC A801                <1> 	test	al, PDE_A_PRESENT ; page table is present or not !
   676 000058EE 751F                <1> 	jnz	short gpte_retn
   677 000058F0 F9                  <1> 	stc
   678                              <1> gpde_retn:	
   679 000058F1 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 000058F2 E8E9FFFFFF          <1> 	call 	get_pde
   701 000058F7 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 000058F9 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear lower 12 bits
   706 000058FD 89DA                <1> 	mov	edx, ebx
   707 000058FF C1EA0C              <1> 	shr	edx, PAGE_SHIFT ; 12
   708 00005902 81E2FF030000        <1> 	and	edx, PTE_MASK	; 03FFh
   709                              <1> 			 ; clear higher 10 bits (PD bits)
   710 00005908 C1E202              <1> 	shl	edx, 2 ; offset from start of page table (1024*4)
   711 0000590B 01C2                <1> 	add	edx, eax
   712 0000590D 8B02                <1> 	mov	eax, [edx]
   713                              <1> gpte_retn:
   714 0000590F 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 00005910 56                  <1> 	push	esi
   737 00005911 51                  <1> 	push	ecx
   738 00005912 50                  <1> 	push	eax
   739 00005913 89C6                <1> 	mov	esi, eax 
   740 00005915 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 00005917 890E                <1> 	mov	[esi], ecx ; 0 ; clear PDE 0
   744                              <1> dapd_0:
   745 00005919 AD                  <1> 	lodsd
   746 0000591A A801                <1> 	test	al, PDE_A_PRESENT ; bit 0, present flag (must be 1)
   747 0000591C 7409                <1> 	jz	short dapd_1	
   748 0000591E 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
   749 00005922 E812000000          <1> 	call	deallocate_page_table			
   750                              <1> dapd_1:
   751 00005927 41                  <1> 	inc	ecx ; page directory entry index
   752 00005928 81F900040000        <1> 	cmp	ecx, PAGE_SIZE / 4 ; 1024
   753 0000592E 72E9                <1> 	jb	short dapd_0
   754                              <1> dapd_2:
   755 00005930 58                  <1> 	pop	eax
   756 00005931 E869000000          <1> 	call	deallocate_page	; deallocate the page dir's itself
   757 00005936 59                  <1> 	pop	ecx
   758 00005937 5E                  <1> 	pop	esi
   759 00005938 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 00005939 56                  <1> 	push	esi
   787 0000593A 57                  <1> 	push	edi
   788 0000593B 52                  <1> 	push	edx
   789 0000593C 50                  <1> 	push	eax ; *
   790 0000593D 89C6                <1> 	mov	esi, eax 
   791 0000593F 31FF                <1> 	xor	edi, edi ; 0
   792                              <1> dapt_0:
   793 00005941 AD                  <1> 	lodsd
   794 00005942 A801                <1> 	test	al, PTE_A_PRESENT ; bit 0, present flag (must be 1)
   795 00005944 744C                <1> 	jz	short dapt_1
   796                              <1> 	;
   797 00005946 A802                <1> 	test	al, PTE_A_WRITE   ; bit 1, writable (r/w) flag
   798                              <1> 				  ; (must be 1)
   799 00005948 753D                <1> 	jnz	short dapt_3
   800                              <1> 	; Read only -duplicated- page (belongs to a parent or a child)
   801 0000594A 66A90002            <1>         test    ax, PTE_DUPLICATED ; Was this page duplicated 
   802                              <1> 				   ; as child's page ?
   803 0000594E 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 00005950 53                  <1> 	push	ebx
   807 00005951 51                  <1> 	push	ecx
   808                              <1> 	;shl	cx, 2 ; *4
   809                              <1> 	; 29/08/2023
   810 00005952 C1E102              <1> 	shl	ecx, 2
   811 00005955 01CB                <1> 	add	ebx, ecx ; PDE offset (for the parent)
   812 00005957 8B0B                <1> 	mov	ecx, [ebx]
   813 00005959 F6C101              <1> 	test	cl, PDE_A_PRESENT ; present (valid) or not ?
   814 0000595C 7427                <1> 	jz	short dapt_2	; parent process does not use this page
   815 0000595E 6681E100F0          <1> 	and	cx, PDE_A_CLEAR ; 0F000h ; Clear attribute bits
   816                              <1> 	; EDI = page table entry index (0-1023)
   817 00005963 89FA                <1> 	mov	edx, edi 
   818                              <1> 	;shl	dx, 2 ; *4
   819                              <1> 	; 29/08/2023
   820 00005965 C1E202              <1> 	shl	edx, 2
   821 00005968 01CA                <1> 	add	edx, ecx ; PTE offset (for the parent)
   822 0000596A 8B1A                <1> 	mov	ebx, [edx]
   823 0000596C F6C301              <1> 	test	bl, PTE_A_PRESENT ; present or not ?
   824 0000596F 7414                <1> 	jz	short dapt_2	; parent process does not use this page
   825 00005971 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; Clear attribute bits 
   826 00005975 6681E300F0          <1> 	and	bx, PTE_A_CLEAR ; 0F000h ; Clear attribute bits
   827 0000597A 39D8                <1> 	cmp	eax, ebx	; parent's and child's pages are same ?
   828 0000597C 7507                <1> 	jne	short dapt_2	; not same page
   829                              <1> 				; deallocate the child's page
   830 0000597E 800A02              <1>         or      byte [edx], PTE_A_WRITE ; convert to writable page (parent)
   831 00005981 59                  <1> 	pop	ecx
   832 00005982 5B                  <1> 	pop	ebx
   833 00005983 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 00005985 59                  <1> 	pop	ecx
   848 00005986 5B                  <1> 	pop	ebx
   849                              <1> dapt_3:	
   850                              <1> 	; 12/07/2016
   851 00005987 66A90004            <1> 	test	ax, PTE_SHARED ; shared or direct memory access indicator
   852 0000598B 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 0000598D 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 00005992 47                  <1> 	inc	edi ; page table entry index
   867 00005993 81FF00040000        <1> 	cmp	edi, PAGE_SIZE / 4 ; 1024
   868 00005999 72A6                <1> 	jb	short dapt_0
   869                              <1> 	;
   870 0000599B 58                  <1> 	pop	eax ; *
   871 0000599C 5A                  <1> 	pop	edx
   872 0000599D 5F                  <1> 	pop	edi	
   873 0000599E 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 0000599F 53                  <1> 	push	ebx
   896 000059A0 52                  <1> 	push	edx
   897                              <1> 	;
   898 000059A1 C1E80C              <1> 	shr	eax, PAGE_SHIFT      ; shift physical address to 
   899                              <1> 				     ; 12 bits right
   900                              <1> 				     ; to get page number
   901 000059A4 89C2                <1> 	mov	edx, eax
   902                              <1> 	; 15/09/2015
   903 000059A6 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 000059A9 80E2FC              <1> 	and	dl, 0FCh 	     ; clear lower 2 bits
   907                              <1> 				     ; (to get 32 bit position)			
   908                              <1> 	;
   909 000059AC BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL   ; Memory Allocation Table address
   910 000059B1 01D3                <1> 	add	ebx, edx
   911 000059B3 83E01F              <1> 	and	eax, 1Fh	     ; lower 5 bits only
   912                              <1> 				     ; (allocation bit position)	 
   913 000059B6 3B15[FC7C0100]      <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 000059BC 7306                <1> 	jnb	short dap_1	     ; no	
   917 000059BE 8915[FC7C0100]      <1> 	mov	[next_page], edx     ; yes
   918                              <1> dap_1:
   919 000059C4 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 000059C7 FF05[F87C0100]      <1>         inc     dword [free_pages]
   927                              <1> dap_2:
   928 000059CD 5A                  <1> 	pop	edx
   929 000059CE 5B                  <1> 	pop	ebx
   930 000059CF 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 000059D0 E80BFEFFFF          <1> 	call	allocate_page
  1014 000059D5 723E                <1> 	jc	short dpd_err
  1015                              <1> 	;
  1016 000059D7 55                  <1> 	push	ebp ; 20/07/2015
  1017 000059D8 56                  <1> 	push	esi
  1018 000059D9 57                  <1> 	push	edi
  1019 000059DA 53                  <1> 	push	ebx
  1020 000059DB 51                  <1> 	push	ecx
  1021 000059DC 8B35[04950100]      <1> 	mov	esi, [u.pgdir]
  1022 000059E2 89C7                <1> 	mov	edi, eax
  1023 000059E4 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 000059E5 A5                  <1> 	movsd
  1028 000059E6 BD00004000          <1> 	mov	ebp, 1024*4096 ; pass the 1st 4MB (system space)
  1029 000059EB B9FF030000          <1> 	mov	ecx, (PAGE_SIZE / 4) - 1 ; 1023
  1030                              <1> dpd_0:	
  1031 000059F0 AD                  <1> 	lodsd
  1032                              <1> 	;or	eax, eax
  1033                              <1>         ;jnz     short dpd_1
  1034 000059F1 A801                <1> 	test	al, PDE_A_PRESENT ;  bit 0 =  1
  1035 000059F3 7508                <1> 	jnz	short dpd_1
  1036                              <1>  	; 20/07/2015 (virtual address at the end of the page table)	
  1037 000059F5 81C500004000        <1> 	add	ebp, 1024*4096 ; page size * PTE count
  1038 000059FB EB0F                <1> 	jmp	short dpd_2
  1039                              <1> dpd_1:	
  1040 000059FD 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear attribute bits
  1041 00005A01 89C3                <1> 	mov	ebx, eax
  1042                              <1> 	; EBX = Parent's page table address
  1043 00005A03 E81F000000          <1> 	call	duplicate_page_table
  1044 00005A08 720C                <1> 	jc	short dpd_p_err
  1045                              <1> 	; EAX = Child's page table address
  1046 00005A0A 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 00005A0C AB                  <1> 	stosd
  1051 00005A0D E2E1                <1> 	loop	dpd_0
  1052                              <1> 	;
  1053 00005A0F 58                  <1> 	pop	eax  ; restore child's page directory address
  1054                              <1> dpd_3:
  1055 00005A10 59                  <1> 	pop	ecx
  1056 00005A11 5B                  <1> 	pop	ebx
  1057 00005A12 5F                  <1> 	pop	edi
  1058 00005A13 5E                  <1> 	pop	esi
  1059 00005A14 5D                  <1> 	pop	ebp ; 20/07/2015
  1060                              <1> dpd_err:
  1061 00005A15 C3                  <1> 	retn
  1062                              <1> dpd_p_err:
  1063                              <1> 	; release the allocated pages missing (recover free space)
  1064 00005A16 58                  <1> 	pop	eax  ; the new page directory address (physical)
  1065 00005A17 8B1D[04950100]      <1> 	mov	ebx, [u.pgdir] ; parent's page directory address 
  1066 00005A1D E8EEFEFFFF          <1> 	call 	deallocate_page_dir
  1067 00005A22 29C0                <1> 	sub	eax, eax ; 0
  1068 00005A24 F9                  <1> 	stc
  1069 00005A25 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 00005A27 E8B4FDFFFF          <1> 	call	allocate_page
  1100 00005A2C 7258                <1> 	jc	short dpt_err
  1101                              <1> 	;
  1102 00005A2E 50                  <1> 	push	eax ; *
  1103 00005A2F 56                  <1> 	push	esi
  1104 00005A30 57                  <1> 	push	edi
  1105 00005A31 52                  <1> 	push	edx
  1106 00005A32 51                  <1> 	push	ecx
  1107                              <1> 	;
  1108 00005A33 89DE                <1> 	mov	esi, ebx
  1109 00005A35 89C7                <1> 	mov	edi, eax
  1110 00005A37 89C2                <1> 	mov	edx, eax
  1111 00005A39 81C200100000        <1> 	add	edx, PAGE_SIZE 	
  1112                              <1> dpt_0:
  1113 00005A3F AD                  <1> 	lodsd
  1114 00005A40 21C0                <1> 	and	eax, eax
  1115 00005A42 7432                <1> 	jz	short dpt_3
  1116 00005A44 A801                <1> 	test	al, PTE_A_PRESENT ;  bit 0 =  1
  1117                              <1> 	; 17/04/2021 (temporary)
  1118                              <1> 	;jnz	short dpt_1
  1119 00005A46 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 00005A48 89C1                <1> 	mov	ecx, eax
  1131 00005A4A 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear attribute bits
  1132 00005A4E F6C102              <1> 	test	cl, PTE_A_WRITE ; writable page ?
  1133 00005A51 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 00005A53 E888FDFFFF          <1> 	call	allocate_page
  1138 00005A58 7227                <1> 	jc	short dpt_p_err
  1139 00005A5A 57                  <1> 	push	edi
  1140 00005A5B 56                  <1> 	push	esi
  1141 00005A5C 89CE                <1> 	mov	esi, ecx
  1142 00005A5E 89C7                <1> 	mov	edi, eax
  1143 00005A60 B900040000          <1> 	mov	ecx, PAGE_SIZE/4
  1144 00005A65 F3A5                <1> 	rep	movsd	; copy page (4096 bytes)
  1145 00005A67 5E                  <1> 	pop	esi
  1146 00005A68 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 00005A69 0C07                <1> 	or	al, PTE_A_USER+PTE_A_WRITE+PTE_A_PRESENT 
  1163                              <1> 		; user + writable + present page
  1164 00005A6B EB09                <1> 	jmp	short dpt_3
  1165                              <1> dpt_2:
  1166                              <1> 	;or	ax, PTE_A_USER+PTE_A_PRESENT 
  1167 00005A6D 0C05                <1> 	or	al, PTE_A_USER+PTE_A_PRESENT 
  1168                              <1> 		    ; (read only page!)
  1169 00005A6F 8946FC              <1> 	mov	[esi-4], eax ; update parent's PTE
  1170 00005A72 660D0002            <1> 	or      ax, PTE_DUPLICATED  ; (read only page & duplicated PTE!)
  1171                              <1> dpt_3:
  1172 00005A76 AB                  <1> 	stosd  ; EDI points to child's PTE  	 
  1173                              <1> 	;
  1174 00005A77 81C500100000        <1> 	add	ebp, 4096 ; 20/07/2015 (next page)
  1175                              <1> 	;
  1176 00005A7D 39D7                <1> 	cmp	edi, edx
  1177 00005A7F 72BE                <1> 	jb	short dpt_0
  1178                              <1> dpt_p_err:
  1179 00005A81 59                  <1> 	pop	ecx
  1180 00005A82 5A                  <1> 	pop	edx
  1181 00005A83 5F                  <1> 	pop	edi
  1182 00005A84 5E                  <1> 	pop	esi
  1183 00005A85 58                  <1> 	pop	eax ; *
  1184                              <1> dpt_err:
  1185 00005A86 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 00005A87 53                  <1> 	push	ebx
  1331 00005A88 52                  <1> 	push	edx
  1332 00005A89 51                  <1> 	push	ecx
  1333                              <1> 	;
  1334                              <1> 	; 21/09/2015 (debugging)
  1335 00005A8A FF05[1C950100]      <1> 	inc	dword [u.pfcount] ; page fault count for running process
  1336 00005A90 FF05[C8960100]      <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 00005A96 8A15[C0960100]      <1> 	mov	dl, [error_code]
  1340                              <1> 	;
  1341 00005A9C F6C201              <1> 	test	dl, 1	; page fault was caused by a non-present page
  1342                              <1> 			; sign
  1343 00005A9F 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 00005AA1 F6C202              <1> 	test	dl, 2	; page fault was caused by a page write
  1366                              <1> 			; sign
  1367 00005AA4 7418                <1>         jz      short pfh_p_err
  1368                              <1> 	; 31/08/2015
  1369 00005AA6 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 00005AA9 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 00005AAB 0F20D3              <1> 	mov	ebx, cr2 ; CR2 contains the linear address 
  1377                              <1> 			 ; which has caused to page fault
  1378 00005AAE E87C000000          <1> 	call 	copy_page
  1379 00005AB3 7202                <1>         jc	short pfh_im_err ; insufficient memory
  1380                              <1> 	;
  1381 00005AB5 EB72                <1>         jmp     pfh_cpp_ok
  1382                              <1> 
  1383                              <1> 	; 29/11/2023
  1384                              <1> pfh_im_err:
  1385 00005AB7 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 00005ABC 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 00005ABE 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 00005AC3 F9                  <1> 	stc
  1398 00005AC4 EB65                <1> 	jmp	short pfh_err_retn
  1399                              <1> 
  1400                              <1> pfh_alloc_np:
  1401 00005AC6 E815FDFFFF          <1> 	call	allocate_page	; (allocate a new page)
  1402 00005ACB 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 00005ACD 80E204              <1> 	and	dl, 4	; CPL = 3 ?
  1408 00005AD0 7505                <1> 	jnz	short pfh_um
  1409                              <1> 			; Page fault handler for kernel/system mode (CPL=0)		
  1410 00005AD2 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 00005AD5 EB06                <1> 	jmp	short pfh_get_pde
  1415                              <1> 	;
  1416                              <1> pfh_um:			; Page fault handler for user/appl. mode (CPL=3)
  1417 00005AD7 8B1D[04950100]      <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 00005ADD 80CA03              <1> 	or	dl, 3	; USER + WRITE + PRESENT or SYSTEM + WRITE + PRESENT
  1422 00005AE0 0F20D1              <1> 	mov	ecx, cr2 ; CR2 contains the virtual address 
  1423                              <1> 			 ; which has been caused to page fault
  1424                              <1> 			 ;
  1425 00005AE3 C1E914              <1> 	shr	ecx, 20	 ; shift 20 bits right
  1426 00005AE6 80E1FC              <1> 	and	cl, 0FCh ; mask lower 2 bits to get PDE offset		
  1427                              <1> 	;
  1428 00005AE9 01CB                <1> 	add	ebx, ecx ; now, EBX points to the relevant page dir entry 
  1429 00005AEB 8B0B                <1> 	mov	ecx, [ebx] ; physical (base) address of the page table 	
  1430 00005AED F6C101              <1> 	test	cl, 1	 ; check bit 0 is set (1) or not (0).
  1431 00005AF0 740B                <1> 	jz	short pfh_set_pde ; Page directory entry is not valid,
  1432                              <1> 			  	  ; set/validate page directory entry
  1433 00005AF2 6681E100F0          <1> 	and	cx, PDE_A_CLEAR ; 0F000h ; Clear attribute bits
  1434 00005AF7 89CB                <1> 	mov	ebx, ecx ; Physical address of the page table
  1435 00005AF9 89C1                <1> 	mov	ecx, eax ; new page address (physical) 	
  1436 00005AFB 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 00005AFD 08D0                <1> 	or	al, dl	 ; lower 3 bits are used as U/S, R/W, P flags
  1442 00005AFF 8903                <1> 	mov	[ebx], eax ; Let's put the new page directory entry here !
  1443 00005B01 30C0                <1> 	xor	al, al	 ; clear lower (3..8) bits
  1444 00005B03 89C3                <1> 	mov	ebx, eax
  1445 00005B05 E8D6FCFFFF          <1> 	call	allocate_page	 ; (allocate a new page)
  1446 00005B0A 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 00005B0C 89C1                <1> 	mov	ecx, eax
  1450 00005B0E E83EFDFFFF          <1> 	call	clear_page ; Clear page content
  1451                              <1> pfh_get_pte:
  1452 00005B13 0F20D0              <1> 	mov	eax, cr2 ; virtual address
  1453                              <1> 			 ; which has been caused to page fault
  1454 00005B16 89C7                <1> 	mov	edi, eax ; 20/07/2015
  1455 00005B18 C1E80C              <1> 	shr	eax, 12	 ; shift 12 bit right to get 
  1456                              <1> 			 ; higher 20 bits of the page fault address 
  1457 00005B1B 25FF030000          <1> 	and	eax, 3FFh ; mask PDE# bits, the result is PTE# (0 to 1023)
  1458 00005B20 C1E002              <1> 	shl	eax, 2	; shift 2 bits left to get PTE offset
  1459 00005B23 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 00005B25 08D1                <1> 	or	cl, dl	; lower 3 bits are used as U/S, R/W, P flags
  1485 00005B27 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 00005B29 31C0                <1> 	xor	eax, eax  ; 0
  1501                              <1> 	;
  1502                              <1> pfh_err_retn:
  1503 00005B2B 59                  <1> 	pop	ecx
  1504 00005B2C 5A                  <1> 	pop	edx
  1505 00005B2D 5B                  <1> 	pop	ebx
  1506 00005B2E 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 00005B2F 56                  <1> 	push	esi
  1537 00005B30 57                  <1> 	push	edi
  1538                              <1> 	;push	ebx
  1539                              <1> 	;push	ecx
  1540 00005B31 31F6                <1> 	xor 	esi, esi
  1541 00005B33 C1EB0C              <1> 	shr	ebx, 12 ; shift 12 bits right to get PDE & PTE numbers
  1542 00005B36 89D9                <1> 	mov	ecx, ebx ; save page fault address (as 12 bit shifted)
  1543 00005B38 C1EB08              <1> 	shr	ebx, 8	 ; shift 8 bits right and then
  1544 00005B3B 80E3FC              <1> 	and	bl, 0FCh ; mask lower 2 bits to get PDE offset	
  1545 00005B3E 89DF                <1> 	mov 	edi, ebx ; save it for the parent of current process
  1546 00005B40 031D[04950100]      <1> 	add	ebx, [u.pgdir] ; EBX points to the relevant page dir entry 
  1547 00005B46 8B03                <1> 	mov	eax, [ebx] ; physical (base) address of the page table
  1548 00005B48 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear attribute bits 	
  1549 00005B4C 89CB                <1> 	mov	ebx, ecx   ; (restore higher 20 bits of page fault address)
  1550 00005B4E 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 00005B54 C1E302              <1> 	shl	ebx, 2
  1554 00005B57 01C3                <1> 	add	ebx, eax   ; EBX points to the relevant page table entry 
  1555                              <1> 	; 07/09/2015
  1556 00005B59 66F7030002          <1>         test    word [ebx], PTE_DUPLICATED ; (Does current process share this
  1557                              <1> 				     ; read only page as a child process?)	
  1558 00005B5E 7509                <1> 	jnz	short cpp_0 ; yes
  1559 00005B60 8B0B                <1> 	mov	ecx, [ebx] ; PTE value
  1560 00005B62 6681E100F0          <1> 	and	cx, PTE_A_CLEAR ; 0F000h  ; clear page attributes
  1561 00005B67 EB31                <1> 	jmp	short cpp_1
  1562                              <1> cpp_0:
  1563 00005B69 89FE                <1> 	mov	esi, edi
  1564 00005B6B 0335[08950100]      <1> 	add	esi, [u.ppgdir] ; the parent's page directory entry
  1565 00005B71 8B06                <1> 	mov	eax, [esi] ; physical (base) address of the page table
  1566 00005B73 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear attribute bits
  1567 00005B77 89CE                <1> 	mov	esi, ecx   ; (restore higher 20 bits of page fault address)	
  1568 00005B79 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 00005B7F C1E602              <1> 	shl	esi, 2
  1572 00005B82 01C6                <1> 	add	esi, eax   ; EDX points to the relevant page table entry  	
  1573 00005B84 8B0E                <1> 	mov	ecx, [esi] ; PTE value of the parent process
  1574                              <1> 	; 21/09/2015
  1575 00005B86 8B03                <1> 	mov	eax, [ebx] ; PTE value of the child process
  1576 00005B88 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear page attributes	
  1577                              <1> 	;
  1578 00005B8C F6C101              <1> 	test	cl, PTE_A_PRESENT ; is it a present/valid page ?
  1579 00005B8F 7424                <1> 	jz	short cpp_3 ; the parent's page is not same page  	
  1580                              <1> 	;
  1581 00005B91 6681E100F0          <1> 	and	cx, PTE_A_CLEAR ; 0F000h ; clear page attributes
  1582 00005B96 39C8                <1> 	cmp	eax, ecx   ; Same page?	
  1583 00005B98 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 00005B9A E841FCFFFF          <1> 	call	allocate_page
  1587 00005B9F 721A                <1> 	jc	short cpp_4 ; 'insufficient memory' error
  1588 00005BA1 21F6                <1> 	and	esi, esi    ; check ESI is valid or not
  1589 00005BA3 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 00005BA5 890E                <1> 	mov	[esi], ecx
  1595 00005BA7 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 00005BAA 89C7                <1> 	mov	edi, eax ; new page address of the child process
  1599                              <1> 	; 07/09/2015
  1600 00005BAC 89CE                <1> 	mov	esi, ecx ; the page address of the parent process
  1601 00005BAE B900040000          <1> 	mov	ecx, PAGE_SIZE / 4
  1602 00005BB3 F3A5                <1> 	rep	movsd ; 31/08/2015
  1603                              <1> cpp_3:		
  1604 00005BB5 0C07                <1> 	or	al, PTE_A_PRESENT + PTE_A_WRITE + PTE_A_USER ; 1+2+4 = 7
  1605 00005BB7 8903                <1> 	mov	[ebx], eax ; Update PTE
  1606 00005BB9 28C0                <1> 	sub	al, al ; clear attributes
  1607                              <1> cpp_4:
  1608                              <1> 	;pop	ecx
  1609                              <1> 	;pop	ebx
  1610 00005BBB 5F                  <1> 	pop	edi
  1611 00005BBC 5E                  <1> 	pop	esi
  1612 00005BBD 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 00005BBE 81C300004000        <1> 	add	ebx, CORE ; 18/10/2015
  2487                              <1> get_physical_addr_x: ; 27/05/2016
  2488 00005BC4 A1[04950100]        <1> 	mov	eax, [u.pgdir]
  2489 00005BC9 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 00005BCE 731C                <1> 	jnc	short gpa_1
  2496                              <1> 	;
  2497 00005BD0 E80BFCFFFF          <1> 	call	allocate_page
  2498 00005BD5 723F                <1> 	jc	short gpa_im_err  ; 'insufficient memory' error
  2499                              <1> gpa_0:
  2500 00005BD7 E875FCFFFF          <1> 	call 	clear_page
  2501                              <1> 	; EAX = Physical (base) address of the allocated (new) page
  2502 00005BDC 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 00005BDE 8902                <1> 	mov	[edx], eax ; Let's put the new page directory entry here !
  2506 00005BE0 A1[04950100]        <1> 	mov	eax, [u.pgdir]	
  2507 00005BE5 E808FDFFFF          <1> 	call	get_pte
  2508 00005BEA 722A                <1> 	jc	short gpa_im_err ; 'insufficient memory' error
  2509                              <1> gpa_1:
  2510                              <1> 	; EAX = PTE value, EDX = PTE address
  2511 00005BEC A801                <1> 	test 	al, PTE_A_PRESENT
  2512 00005BEE 7516                <1> 	jnz	short gpa_3 ; 26/03/2017
  2513 00005BF0 09C0                <1> 	or	eax, eax
  2514 00005BF2 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 00005BF4 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 00005BF6 803D[968E0100]00    <1> 	cmp	byte [no_page_swap], 0
  2542 00005BFD 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 00005BFF E844000000          <1> 	call	gpa_8 ; 26/03/2017
  2548 00005C04 EB16                <1> 	jmp	short gpa_5
  2549                              <1> gpa_3: 
  2550                              <1> 	; 26/03/2017
  2551 00005C06 803D[968E0100]00    <1> 	cmp	byte [no_page_swap], 0
  2552 00005C0D 7611                <1> 	jna	short gpa_6 ; this page can be swapped out
  2553 00005C0F E834000000          <1> 	call	gpa_8
  2554 00005C14 EB0A                <1> 	jmp	short gpa_6
  2555                              <1> 
  2556                              <1> gpa_im_err:	
  2557 00005C16 B804000000          <1> 	mov	eax, ERR_MINOR_IM ; Insufficient memory (minor) error!
  2558                              <1> 				  ; Major error = 0 (No protection fault)	
  2559 00005C1B 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 00005C1C 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 00005C1E 8902                <1> 	mov	[edx], eax  ; Update PTE value
  2580                              <1> gpa_6:
  2581                              <1> 	; 18/10/2015
  2582 00005C20 89D9                <1> 	mov	ecx, ebx
  2583 00005C22 81E1FF0F0000        <1> 	and	ecx, PAGE_OFF
  2584 00005C28 89C2                <1> 	mov 	edx, eax
  2585 00005C2A 662500F0            <1> 	and	ax, PTE_A_CLEAR
  2586 00005C2E 01C8                <1> 	add	eax, ecx
  2587 00005C30 F7D9                <1> 	neg	ecx ; 1 -> -1 (0FFFFFFFFh), 4095 (0FFFh) -> -4095
  2588 00005C32 81C100100000        <1> 	add	ecx, PAGE_SIZE
  2589 00005C38 F8                  <1> 	clc
  2590                              <1> gpa_retn:
  2591 00005C39 C3                  <1> 	retn
  2592                              <1> gpa_7:	
  2593 00005C3A E8A1FBFFFF          <1> 	call	allocate_page
  2594 00005C3F 72D5                <1> 	jc	short gpa_im_err ; 'insufficient memory' error
  2595 00005C41 E80BFCFFFF          <1> 	call	clear_page
  2596 00005C46 EBAE                <1> 	jmp	short gpa_2
  2597                              <1> 
  2598                              <1> gpa_8: ; 26/03/2017
  2599 00005C48 C605[968E0100]00    <1> 	mov	byte [no_page_swap], 0
  2600                              <1> 
  2601 00005C4F 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 00005C50 E88BFBFFFF          <1> 	call	allocate_page
  2682 00005C55 723E                <1> 	jc	short cpd_err
  2683                              <1> 	;
  2684 00005C57 55                  <1> 	push	ebp ; 20/07/2015
  2685 00005C58 56                  <1> 	push	esi
  2686 00005C59 57                  <1> 	push	edi
  2687 00005C5A 53                  <1> 	push	ebx
  2688 00005C5B 51                  <1> 	push	ecx
  2689 00005C5C 8B35[04950100]      <1> 	mov	esi, [u.pgdir]
  2690 00005C62 89C7                <1> 	mov	edi, eax
  2691 00005C64 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 00005C65 A5                  <1> 	movsd
  2695 00005C66 BD00004000          <1> 	mov	ebp, 1024*4096 ; pass the 1st 4MB (system space)
  2696 00005C6B B9FF030000          <1> 	mov	ecx, (PAGE_SIZE / 4) - 1 ; 1023
  2697                              <1> cpd_0:	
  2698 00005C70 AD                  <1> 	lodsd
  2699                              <1> 	;or	eax, eax
  2700                              <1>         ;jnz     short cpd_1
  2701 00005C71 A801                <1> 	test	al, PDE_A_PRESENT ;  bit 0 =  1
  2702 00005C73 7508                <1> 	jnz	short cpd_1
  2703                              <1>  	; (virtual address at the end of the page table)	
  2704 00005C75 81C500004000        <1> 	add	ebp, 1024*4096 ; page size * PTE count
  2705 00005C7B EB0F                <1> 	jmp	short cpd_2
  2706                              <1> cpd_1:	
  2707 00005C7D 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear attribute bits
  2708 00005C81 89C3                <1> 	mov	ebx, eax
  2709                              <1> 	; EBX = Parent's page table address
  2710 00005C83 E81F000000          <1> 	call	copy_page_table
  2711 00005C88 720C                <1> 	jc	short cpd_p_err
  2712                              <1> 	; EAX = Child's page table address
  2713 00005C8A 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 00005C8C AB                  <1> 	stosd
  2718 00005C8D E2E1                <1> 	loop	cpd_0
  2719                              <1> 	;
  2720 00005C8F 58                  <1> 	pop	eax  ; restore child's page directory address
  2721                              <1> cpd_3:
  2722 00005C90 59                  <1> 	pop	ecx
  2723 00005C91 5B                  <1> 	pop	ebx
  2724 00005C92 5F                  <1> 	pop	edi
  2725 00005C93 5E                  <1> 	pop	esi
  2726 00005C94 5D                  <1> 	pop	ebp
  2727                              <1> cpd_err:
  2728 00005C95 C3                  <1> 	retn
  2729                              <1> cpd_p_err:
  2730                              <1> 	; release the allocated pages missing (recover free space)
  2731 00005C96 58                  <1> 	pop	eax  ; the new page directory address (physical)
  2732 00005C97 8B1D[04950100]      <1> 	mov	ebx, [u.pgdir] ; parent's page directory address 
  2733 00005C9D E86EFCFFFF          <1> 	call 	deallocate_page_dir
  2734 00005CA2 29C0                <1> 	sub	eax, eax ; 0
  2735 00005CA4 F9                  <1> 	stc
  2736 00005CA5 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 00005CA7 E834FBFFFF          <1> 	call	allocate_page
  2755 00005CAC 7244                <1> 	jc	short cpt_err
  2756                              <1> 	;
  2757 00005CAE 50                  <1> 	push	eax ; *
  2758                              <1> 	;push 	ebx
  2759 00005CAF 56                  <1> 	push	esi
  2760 00005CB0 57                  <1> 	push	edi
  2761 00005CB1 52                  <1> 	push	edx
  2762 00005CB2 51                  <1> 	push	ecx
  2763                              <1> 	;
  2764 00005CB3 89DE                <1> 	mov	esi, ebx
  2765 00005CB5 89C7                <1> 	mov	edi, eax
  2766 00005CB7 89C2                <1> 	mov	edx, eax
  2767 00005CB9 81C200100000        <1> 	add	edx, PAGE_SIZE 	
  2768                              <1> cpt_0:
  2769 00005CBF AD                  <1> 	lodsd
  2770 00005CC0 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 00005CC2 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 00005CC4 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear attribute bits
  2784 00005CC8 89C1                <1> 	mov	ecx, eax
  2785                              <1> 	; Allocate a new page for the child process
  2786 00005CCA E811FBFFFF          <1> 	call	allocate_page
  2787 00005CCF 721C                <1> 	jc	short cpt_p_err
  2788 00005CD1 57                  <1> 	push	edi
  2789 00005CD2 56                  <1> 	push	esi
  2790 00005CD3 89CE                <1> 	mov	esi, ecx
  2791 00005CD5 89C7                <1> 	mov	edi, eax
  2792 00005CD7 B900040000          <1> 	mov	ecx, PAGE_SIZE/4
  2793 00005CDC F3A5                <1> 	rep	movsd	; copy page (4096 bytes)
  2794 00005CDE 5E                  <1> 	pop	esi
  2795 00005CDF 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 00005CE0 0C07                <1> 	or	al, PTE_A_USER+PTE_A_WRITE+PTE_A_PRESENT 
  2811                              <1> cpt_2:
  2812 00005CE2 AB                  <1> 	stosd  ; EDI points to child's PTE  	 
  2813                              <1> 	;
  2814 00005CE3 81C500100000        <1> 	add	ebp, 4096 ; 20/07/2015 (next page)
  2815                              <1> 	;
  2816 00005CE9 39D7                <1> 	cmp	edi, edx
  2817 00005CEB 72D2                <1> 	jb	short cpt_0
  2818                              <1> cpt_p_err:
  2819 00005CED 59                  <1> 	pop	ecx
  2820 00005CEE 5A                  <1> 	pop	edx
  2821 00005CEF 5F                  <1> 	pop	edi
  2822 00005CF0 5E                  <1> 	pop	esi
  2823                              <1> 	;pop	ebx
  2824 00005CF1 58                  <1> 	pop	eax ; *
  2825                              <1> cpt_err:
  2826 00005CF2 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 00005CF3 52                  <1> 	push	edx ; *
  2869 00005CF4 BAFF0F0000          <1> 	mov	edx, PAGE_SIZE - 1   ; 4095
  2870 00005CF9 01D0                <1> 	add	eax, edx
  2871 00005CFB 01D1                <1> 	add	ecx, edx
  2872 00005CFD C1E90C              <1> 	shr	ecx, PAGE_SHIFT	     ; 12
  2873                              <1> 
  2874                              <1> 	; ECX = number of contiguous pages to be allocated
  2875 00005D00 8B15[F87C0100]      <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 00005D06 39D1                <1> 	cmp	ecx, edx
  2882 00005D08 7760                <1> 	ja	short amb_3
  2883                              <1> 
  2884 00005D0A C1E80C              <1> 	shr	eax, PAGE_SHIFT      ; 12
  2885                              <1> 
  2886 00005D0D 89C2                <1> 	mov	edx, eax 	     ; page number
  2887 00005D0F 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 00005D12 80E2FC              <1> 	and	dl, 0FCh 	     ; clear lower 2 bits
  2891                              <1> 				     ; (to get 32 bit position)	
  2892 00005D15 53                  <1> 	push	ebx ; **
  2893                              <1> amb_0:
  2894 00005D16 890D[AC880100]      <1> 	mov	[mem_ipg_count], ecx ; initial (reset) value of page count
  2895 00005D1C 890D[B0880100]      <1> 	mov	[mem_pg_count], ecx
  2896 00005D22 31C9                <1> 	xor	ecx, ecx ; 0
  2897 00005D24 890D[B4880100]      <1> 	mov	[mem_aperture], ecx ; 0
  2898 00005D2A 890D[B8880100]      <1> 	mov	[mem_max_aperture], ecx ; 0
  2899                              <1> 	
  2900 00005D30 BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL   ; Memory Allocation Table address.
  2901 00005D35 3B15[FC7C0100]      <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 00005D3B 7208                <1> 	jb	short amb_1
  2905 00005D3D 3B15[007D0100]      <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 00005D43 7606                <1> 	jna	short amb_2	     ; no	
  2909                              <1> amb_1:
  2910 00005D45 8B15[FC7C0100]      <1> 	mov	edx, [next_page]     ; M.A.T. offset (1 M.A.T. byte = 8 pages)
  2911                              <1> amb_2:
  2912 00005D4B 01D3                <1> 	add	ebx, edx
  2913                              <1> 
  2914                              <1> 	; 28/04/2017
  2915                              <1> 	;xor	ecx, ecx
  2916 00005D4D 0FBC0B              <1> 	bsf	ecx, [ebx]	     ; 0 to 31
  2917 00005D50 89D0                <1> 	mov	eax, edx
  2918 00005D52 C1E003              <1> 	shl	eax, 3		     ; *8	
  2919 00005D55 01C8                <1> 	add	eax, ecx	     ; beginning page number
  2920                              <1> 
  2921 00005D57 A3[BC880100]        <1> 	mov	[mem_pg_pos], eax    ; beginning page no (for curr. mem. aperture)
  2922 00005D5C A3[C0880100]        <1>  	mov	[mem_max_pg_pos], eax ; beginning page no for max. mem. aperture
  2923                              <1> 
  2924 00005D61 83E01F              <1> 	and	eax, 1Fh	     ; lower 5 bits only (0 to 31)
  2925                              <1> 				     ; (allocation bit position)	 
  2926 00005D64 750E                <1> 	jnz	short amb_4	     ; 0
  2927 00005D66 B120                <1> 	mov	cl, 32
  2928 00005D68 EB4B                <1> 	jmp	short amb_10
  2929                              <1> 
  2930                              <1> amb_3:	; out_of_memory
  2931 00005D6A 31C0                <1> 	xor	eax, eax ; 0
  2932 00005D6C 89D1                <1> 	mov	ecx, edx ; free pages
  2933 00005D6E C1E10C              <1> 	shl	ecx, PAGE_SHIFT
  2934 00005D71 5A                  <1> 	pop	edx ; *
  2935 00005D72 F9                  <1> 	stc
  2936 00005D73 C3                  <1> 	retn	
  2937                              <1> amb_4:
  2938 00005D74 8B13                <1> 	mov	edx, [ebx]
  2939 00005D76 88C1                <1> 	mov	cl, al ; 1 to 31
  2940 00005D78 D3EA                <1> 	shr	edx, cl
  2941 00005D7A 89D0                <1> 	mov	eax, edx
  2942                              <1> amb_5:
  2943 00005D7C D1E8                <1> 	shr	eax, 1 ; (***)
  2944 00005D7E 7317                <1> 	jnc	short amb_7
  2945 00005D80 FF05[B4880100]      <1> 	inc	dword [mem_aperture]
  2946 00005D86 FF0D[B0880100]      <1> 	dec	dword [mem_pg_count]
  2947 00005D8C 747F                <1> 	jz	short amb_15
  2948                              <1> amb_6:
  2949                              <1> 	; 28/04/2017
  2950 00005D8E FEC1                <1> 	inc	cl
  2951 00005D90 80F920              <1> 	cmp	cl, 32
  2952 00005D93 730D                <1> 	jnb	short amb_9
  2953 00005D95 EBE5                <1> 	jmp	short amb_5
  2954                              <1> amb_7:
  2955 00005D97 50                  <1> 	push	eax ; (***) allocation bits (in shifted status)
  2956 00005D98 E828010000          <1> 	call	amb_26 ; set maximum memory aperture (free memory block size)
  2957 00005D9D 58                  <1> 	pop	eax ; (***)
  2958 00005D9E EBEE                <1> 	jmp	short amb_6
  2959                              <1> amb_8:
  2960                              <1> 	; 28/04/2017
  2961 00005DA0 B120                <1> 	mov	cl, 32
  2962                              <1> amb_9:
  2963 00005DA2 89DA                <1> 	mov	edx, ebx
  2964 00005DA4 81EA00001000        <1> 	sub	edx, MEM_ALLOC_TBL
  2965 00005DAA 3B15[007D0100]      <1> 	cmp	edx, [last_page]
  2966 00005DB0 7336                <1> 	jnb	short amb_14 ; contiguous pages not enough
  2967 00005DB2 83C304              <1> 	add	ebx, 4
  2968                              <1> amb_10:
  2969 00005DB5 8B03                <1> 	mov	eax, [ebx]
  2970 00005DB7 21C0                <1> 	and 	eax, eax
  2971 00005DB9 7408                <1>         jz      short amb_11 ; there is not a free page bit in this alloc dword
  2972 00005DBB 40                  <1> 	inc	eax ; 0FFFFFFFFh -> 0
  2973 00005DBC 740C                <1> 	jz	short amb_12 ; all of bits are set (32 free pages)
  2974 00005DBE 48                  <1> 	dec	eax
  2975 00005DBF 28C9                <1> 	sub	cl, cl ; 0
  2976 00005DC1 EBB9                <1> 	jmp	short amb_5
  2977                              <1> amb_11:
  2978 00005DC3 E8FD000000          <1> 	call	amb_26 ; set maximum memory aperture (free memory block size)
  2979 00005DC8 EBD8                <1> 	jmp	short amb_9	
  2980                              <1> amb_12:
  2981 00005DCA 390D[B0880100]      <1> 	cmp	[mem_pg_count], ecx ; 32
  2982 00005DD0 7306                <1> 	jnb	short amb_13
  2983 00005DD2 8B0D[B0880100]      <1> 	mov	ecx, [mem_pg_count]
  2984                              <1> amb_13:
  2985 00005DD8 010D[B4880100]      <1> 	add	[mem_aperture], ecx
  2986 00005DDE 290D[B0880100]      <1> 	sub	[mem_pg_count], ecx
  2987 00005DE4 7627                <1> 	jna	short amb_15
  2988 00005DE6 EBBA                <1> 	jmp	short amb_9 ; 01/05/2017
  2989                              <1> amb_14:
  2990 00005DE8 E8D8000000          <1> 	call	amb_26 ; 28/04/2017
  2991 00005DED A1[C0880100]        <1> 	mov	eax, [mem_max_pg_pos] ; begin address of max. mem aperture	
  2992 00005DF2 8B0D[B8880100]      <1> 	mov	ecx, [mem_max_aperture] ; max. (largest) memory aperture
  2993 00005DF8 F9                  <1> 	stc
  2994 00005DF9 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 00005DFE A3[BC880100]        <1> 	mov	[mem_pg_pos], eax    ; LFB start/base address as page number
  3002 00005E03 890D[B4880100]      <1> 	mov	[mem_aperture], ecx  ; number of LFB pages
  3003                              <1> 				     ; (!which overlapping main memory!)
  3004 00005E09 52                  <1> 	push	edx ; *
  3005 00005E0A 53                  <1> 	push	ebx ; **
  3006 00005E0B EB0B                <1> 	jmp	short amb_16
  3007                              <1> 
  3008                              <1> amb_15: ; OK !
  3009 00005E0D A1[BC880100]        <1> 	mov	eax, [mem_pg_pos]    ; Beginning address as page number
  3010 00005E12 8B0D[B4880100]      <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 00005E18 89C2                <1> 	mov	edx, eax
  3014                              <1> 	; 25/04/2017
  3015 00005E1A C1EA03              <1> 	shr	edx, 3		 ; 8 pages in one allocation byte
  3016 00005E1D 80E2FC              <1> 	and	dl, 0FCh	 ; clear lower 2 bits
  3017                              <1> 				 ; (for dword/32bit positioning)
  3018                              <1> 
  3019 00005E20 BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL
  3020 00005E25 01D3                <1> 	add	ebx, edx
  3021 00005E27 83E01F              <1> 	and	eax, 1Fh ; 31
  3022                              <1> 	; 03/04/2016
  3023 00005E2A BA20000000          <1> 	mov	edx, 32
  3024 00005E2F 28C2                <1> 	sub	dl, al
  3025 00005E31 39CA                <1> 	cmp	edx, ecx	 ; ecx >= 1
  3026 00005E33 7602                <1> 	jna	short amb_17
  3027 00005E35 89CA                <1> 	mov	edx, ecx
  3028                              <1> amb_17:
  3029 00005E37 29D1                <1> 	sub	ecx, edx
  3030 00005E39 51                  <1> 	push	ecx ; ***
  3031 00005E3A 89D1                <1> 	mov	ecx, edx
  3032                              <1> amb_18:		
  3033 00005E3C 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 00005E3F FF0D[F87C0100]      <1> 	dec     dword [free_pages] ; 1 page has been allocated (X = X-1) 
  3046                              <1> ;amb_28:	; 20/10/2023
  3047 00005E45 49                  <1> 	dec	ecx
  3048 00005E46 7404                <1> 	jz	short amb_19
  3049 00005E48 FEC0                <1> 	inc	al
  3050 00005E4A EBF0                <1> 	jmp	short amb_18
  3051                              <1> amb_19:	
  3052 00005E4C 59                  <1> 	pop	ecx ; ***
  3053                              <1> 	;and	ecx, ecx ; 0 ?
  3054                              <1> 	;jz	short amb_22	
  3055                              <1> 	; 28/11/2023
  3056 00005E4D E31E                <1> 	jecxz	amb_22
  3057                              <1> 	; 01/04/2016
  3058 00005E4F B020                <1> 	mov	al, 32
  3059                              <1> amb_20:
  3060 00005E51 83C304              <1> 	add	ebx, 4
  3061 00005E54 39C1                <1> 	cmp	ecx, eax ; 32
  3062 00005E56 7305                <1> 	jnb	short amb_21
  3063                              <1> 	; ECX < 32
  3064 00005E58 28C0                <1> 	sub	al, al ; 0
  3065 00005E5A 50                  <1> 	push	eax ; 0 ***
  3066 00005E5B EBDF                <1> 	jmp	short amb_18
  3067                              <1> amb_21:
  3068 00005E5D 2905[F87C0100]      <1> 	sub	[free_pages], eax   ; [free_pages] = [free_pages] - 32
  3069 00005E63 C70300000000        <1> 	mov	dword [ebx], 0	    ; reset 32 bits
  3070 00005E69 29C1                <1> 	sub	ecx, eax ; 32
  3071 00005E6B 75E4                <1> 	jnz	short amb_20
  3072                              <1> amb_22:
  3073 00005E6D A1[BC880100]        <1> 	mov	eax, [mem_pg_pos]   ; Beginning address as page number
  3074 00005E72 8B0D[B4880100]      <1> 	mov	ecx, [mem_aperture] ; Free contiguous page count
  3075                              <1> 	; [next_page] update
  3076 00005E78 89C2                <1> 	mov	edx, eax
  3077                              <1> 	; 03/04/2016
  3078 00005E7A 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 00005E7D 80E2FC              <1> 	and	dl, 0FCh 	     ; clear lower 2 bits
  3082                              <1> 				     ; (to get 32 bit position)	
  3083 00005E80 3B15[FC7C0100]      <1> 	cmp	edx, [next_page] ; first free page pointer offset
  3084 00005E86 7732                <1> 	ja	short amb_25
  3085 00005E88 BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL
  3086 00005E8D 833C1300            <1> 	cmp	dword [ebx+edx], 0
  3087 00005E91 7721                <1> 	ja	short amb_24
  3088 00005E93 89C2                <1> 	mov	edx, eax
  3089 00005E95 01CA                <1> 	add	edx, ecx
  3090 00005E97 C1EA03              <1> 	shr	edx, 3
  3091 00005E9A 80E2FC              <1> 	and	dl, 0FCh
  3092                              <1> amb_23:
  3093 00005E9D 833C1300            <1> 	cmp	dword [ebx+edx], 0
  3094 00005EA1 7711                <1> 	ja	short amb_24
  3095 00005EA3 83C204              <1> 	add	edx, 4
  3096 00005EA6 3B15[007D0100]      <1> 	cmp	edx, [last_page]    ; last page pointer offset
  3097 00005EAC 76EF                <1> 	jna	short amb_23
  3098 00005EAE 8B15[047D0100]      <1> 	mov	edx, [first_page]   ; (for) beginning of user's space
  3099                              <1> amb_24:
  3100 00005EB4 8915[FC7C0100]      <1> 	mov	[next_page], edx
  3101                              <1> amb_25:
  3102 00005EBA 9C                  <1> 	pushf
  3103 00005EBB C1E00C              <1> 	shl	eax, PAGE_SHIFT	     ; convert to phy. address in bytes
  3104 00005EBE C1E10C              <1> 	shl	ecx, PAGE_SHIFT	     ; convert to byte counts
  3105 00005EC1 9D                  <1> 	popf
  3106 00005EC2 5B                  <1> 	pop	ebx ; **
  3107 00005EC3 5A                  <1> 	pop	edx ; *
  3108 00005EC4 C3                  <1> 	retn
  3109                              <1> 
  3110                              <1> amb_26:	; set maximum free memory aperture (free memory block size) 
  3111 00005EC5 89DA                <1> 	mov	edx, ebx ; current address
  3112 00005EC7 81EA00001000        <1> 	sub	edx, MEM_ALLOC_TBL ; MAT beginning address
  3113                              <1> 	; 02/04/2016 
  3114 00005ECD C1E203              <1> 	shl	edx, 3 ; MAT byte offset * 8 = page number base
  3115 00005ED0 01CA                <1> 	add	edx, ecx ; current page number (ecx = 0 to 32)
  3116                              <1> 	;
  3117 00005ED2 A1[B4880100]        <1> 	mov	eax, [mem_aperture]
  3118 00005ED7 21C0                <1> 	and	eax, eax
  3119 00005ED9 7421                <1>         jz      short amb_27
  3120 00005EDB C705[B4880100]0000- <1>         mov     dword [mem_aperture], 0
  3120 00005EE3 0000                <1>
  3121 00005EE5 3B05[B8880100]      <1> 	cmp	eax, [mem_max_aperture]
  3122 00005EEB 760F                <1> 	jna	short amb_27
  3123 00005EED A3[B8880100]        <1> 	mov	[mem_max_aperture], eax
  3124                              <1> 	; 25/04/2017
  3125 00005EF2 A1[BC880100]        <1> 	mov	eax, [mem_pg_pos]
  3126                              <1> 	; EAX = Beginning page number of the max. aperture 
  3127 00005EF7 A3[C0880100]        <1> 	mov	[mem_max_pg_pos], eax
  3128                              <1> amb_27: 
  3129 00005EFC 8915[BC880100]      <1> 	mov	[mem_pg_pos], edx ; current page
  3130                              <1> 
  3131 00005F02 A1[AC880100]        <1> 	mov	eax, [mem_ipg_count] ; initial (reset) value of page count
  3132 00005F07 A3[B0880100]        <1> 	mov	[mem_pg_count], eax
  3133                              <1> 
  3134 00005F0C C3                  <1> 	retn
  3135                              <1> 
  3136                              <1> ; 04/06/2024
  3137                              <1> %if 0
  3138                              <1> deallocate_memory_block_x:
  3139                              <1> 	; 26/11/2023 - TRDOS 386 v2.0.7
  3140                              <1> 	; deallocate pages after rounding up
  3141                              <1> 	; ((audio buffer size etc. may not be rounded up to page boundary)) 
  3142                              <1> 	add	ecx, PAGE_SIZE - 1   ; 4095
  3143                              <1> %endif
  3144                              <1> 
  3145                              <1> deallocate_memory_block:
  3146                              <1> 	; 03/04/2016
  3147                              <1> 	; 14/03/2016 (TRDOS 386 = TRDOS v2.0)
  3148                              <1> 	; Deallocating contiguous memory pages (in the kernel's memory space)
  3149                              <1> 	;
  3150                              <1> 	; INPUT -> 
  3151                              <1> 	;	EAX = Beginning address (physical)
  3152                              <1> 	;	ECX = Number of bytes to be deallocated
  3153                              <1> 	;
  3154                              <1> 	; OUTPUT ->
  3155                              <1> 	;	Memory Allocation Table bits will be updated
  3156                              <1> 	;	[free_pages] will be changed (increased)
  3157                              <1> 	;
  3158                              <1> 	; (Modified Registers -> EAX, ECX)
  3159                              <1> 	;
  3160                              <1> 	; PURPOSE: Unloading/Freeing a file -or an allocated memory block- 
  3161                              <1> 	; at memory after copying, running, saving, reading, writing etc.
  3162                              <1> 	;
  3163                              <1> 
  3164 00005F0D 52                  <1> 	push	edx ; *
  3165 00005F0E 53                  <1> 	push	ebx ; **
  3166                              <1> 
  3167 00005F0F C1E80C              <1> 	shr	eax, PAGE_SHIFT	     ; 12
  3168 00005F12 C1E90C              <1> 	shr	ecx, PAGE_SHIFT	     ; 12
  3169                              <1> 
  3170                              <1> 	; EAX = Beginning page number
  3171                              <1> 	; ECX = Number of contiguous pages to be deallocated
  3172                              <1> damb_0:
  3173                              <1> 	; deallocate contiguous memory pages (via memory allocation table bits)
  3174 00005F15 89C2                <1> 	mov	edx, eax
  3175 00005F17 C1EA03              <1> 	shr	edx, 3		     ; to get offset to M.A.T.
  3176                              <1> 				     ; (1 allocation bit = 1 page)
  3177                              <1> 				     ; (1 allocation bytes = 8 pages)
  3178 00005F1A 80E2FC              <1> 	and	dl, 0FCh 	     ; clear lower 2 bits
  3179                              <1> 				     ; (to get 32 bit position)	
  3180 00005F1D 3B15[FC7C0100]      <1> 	cmp	edx, [next_page] ; next free page
  3181 00005F23 7306                <1> 	jnb	short damb_1
  3182 00005F25 8915[FC7C0100]      <1> 	mov	[next_page], edx
  3183                              <1> damb_1:
  3184 00005F2B BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL
  3185 00005F30 01D3                <1> 	add	ebx, edx
  3186 00005F32 83E01F              <1> 	and	eax, 1Fh ; 31
  3187                              <1> 
  3188                              <1> 	; 03/04/2016
  3189 00005F35 BA20000000          <1> 	mov	edx, 32
  3190 00005F3A 28C2                <1> 	sub	dl, al
  3191 00005F3C 39CA                <1> 	cmp	edx, ecx
  3192 00005F3E 7602                <1> 	jna	short damb_2
  3193 00005F40 89CA                <1> 	mov	edx, ecx
  3194                              <1> damb_2:
  3195 00005F42 29D1                <1> 	sub	ecx, edx
  3196 00005F44 51                  <1> 	push	ecx ; ***
  3197 00005F45 89D1                <1> 	mov	ecx, edx
  3198                              <1> damb_3:		
  3199 00005F47 0FAB03              <1> 	bts	[ebx], eax	     ; unlink/release/deallocate page
  3200                              <1> 				     ; set relevant bit to 1.
  3201                              <1> 				     ; set CF to the previous bit value	
  3202 00005F4A FF05[F87C0100]      <1> 	inc     dword [free_pages]   ; 1 page has been deallocated (X = X+1) 
  3203 00005F50 49                  <1> 	dec	ecx
  3204 00005F51 7404                <1> 	jz	short damb_4
  3205 00005F53 FEC0                <1> 	inc	al
  3206 00005F55 EBF0                <1> 	jmp	short damb_3
  3207                              <1> damb_4:	
  3208 00005F57 59                  <1> 	pop	ecx ; ***
  3209 00005F58 21C9                <1> 	and	ecx, ecx ; 0 ?
  3210 00005F5A 741E                <1> 	jz	short damb_7
  3211                              <1> 	; 03/04/2016
  3212 00005F5C B020                <1> 	mov	al, 32
  3213                              <1> damb_5:
  3214 00005F5E 83C304              <1> 	add	ebx, 4
  3215 00005F61 39C1                <1> 	cmp	ecx, eax ; 32
  3216 00005F63 7305                <1> 	jnb	short damb_6
  3217                              <1> 	; ECX < 32
  3218 00005F65 28C0                <1> 	sub	al, al ; 0
  3219 00005F67 50                  <1> 	push	eax ; 0 ***
  3220 00005F68 EBDD                <1> 	jmp	short damb_3
  3221                              <1> damb_6:
  3222 00005F6A 0105[F87C0100]      <1> 	add	[free_pages], eax ; [free_pages] = [free_pages] + 32
  3223 00005F70 C703FFFFFFFF        <1> 	mov	dword [ebx], 0FFFFFFFFh ; set 32 bits
  3224 00005F76 29C1                <1> 	sub	ecx, eax ; 32
  3225 00005F78 75E4                <1> 	jnz	short damb_5
  3226                              <1> damb_7:
  3227 00005F7A 5B                  <1> 	pop	ebx ; **
  3228 00005F7B 5A                  <1> 	pop	edx ; *
  3229 00005F7C C3                  <1> 	retn
  3230                              <1> 
  3231                              <1> direct_memory_access:
  3232                              <1> 	; 20/10/2023
  3233                              <1> 	; 17/04/2021 (temporary modifications)
  3234                              <1> 	; 22/07/2017
  3235                              <1> 	; 12/05/2017
  3236                              <1> 	; 16/07/2016
  3237                              <1> 	; 12/07/2016 (TRDOS 386 = TRDOS v2.0)
  3238                              <1> 	; This processure will be called to map
  3239                              <1> 	; user's (ring 3) page tables to access phsical
  3240                              <1> 	; (flat/linear) memory addresses, directly (without
  3241                              <1> 	;  kernel's data transfer functions).
  3242                              <1> 	; 
  3243                              <1> 	; Purpose: Video memory access and shared memory access.
  3244                              <1> 	;
  3245                              <1> 	; INPUT -> 
  3246                              <1> 	;	EAX = Beginning address (physical).
  3247                              <1> 	;	EBX = User's buffer address ; 12/05/2017
  3248                              <1> 	;	ECX = Number of contiguous pages to be mapped.
  3249                              <1> 	; OUTPUT ->
  3250                              <1> 	;	User's page directory and pages tables
  3251                              <1> 	;	will be updated.
  3252                              <1> 	;	
  3253                              <1> 	;	If an old page table entry has valid page address, 
  3254                              <1> 	;	that page will be deallocated just before PTE will
  3255                              <1> 	;	be changed for direct (1 to 1) memory page access.
  3256                              <1> 	;
  3257                              <1> 	;	If old PTE value points to a swapped page,
  3258                              <1>         ;       that page (block) will be unlinked on swap disk. 
  3259                              <1> 	;
  3260                              <1> 	;	Newly allocated pages (except page tables) will not
  3261                              <1> 	;	be applied to Memory Allocation Table.
  3262                              <1> 	;	AVL bit 1 (PTE bit 10) of page table entry will be
  3263                              <1> 	;	used to indicate shared (direct) memory page; then,
  3264                              <1> 	;	this page will not be deallocated later during
  3265                              <1> 	;	process termination. (Memory Allocation Table and
  3266                              <1> 	;	free memory count will not be affected.
  3267                              <1> 	;	(Except deallocating page table's itself.)
  3268                              <1> 	;	
  3269                              <1> 	;      CF = 1 -> error (EAX = error code)
  3270                              <1> 	;      CF = 0 -> success (EAX = beginning address)
  3271                              <1> 	;
  3272                              <1> 	;; (Modified Registers -> none)
  3273                              <1> 	; Modified registers: ebp, edx, ecx, ebx, esi, edi	
  3274                              <1> 	;
  3275                              <1> 
  3276                              <1> 	;push	ebp
  3277                              <1> 	;push	ebx
  3278                              <1> 	;push	ecx
  3279                              <1> 	;push	edx
  3280 00005F7D 662500F0            <1> 	and	ax, PTE_A_CLEAR ; clear page offset
  3281 00005F81 50                  <1> 	push	eax
  3282                              <1> 	;and	ecx, ecx ; page count
  3283                              <1> 	;jz	dmem_acc_7  ; 'insufficient memory' error
  3284 00005F82 89C5                <1> 	mov	ebp, eax
  3285 00005F84 81C300004000        <1> 	add	ebx, CORE ; 12/05/2017
  3286                              <1> dmem_acc_0: 
  3287 00005F8A 891D[68930100]      <1> 	mov	[base_addr], ebx ; 12/05/2017
  3288 00005F90 A1[04950100]        <1> 	mov	eax, [u.pgdir] ; page dir address (physical)
  3289 00005F95 E858F9FFFF          <1> 	call	get_pte
  3290                              <1> 		; EDX = Page table entry address (if CF=0)
  3291                              <1> 	        ;       Page directory entry address (if CF=1)
  3292                              <1> 		;       (Bit 0 value is 0 if PT is not present)
  3293                              <1> 		; EAX = Page table entry value (page address)
  3294                              <1> 		;	CF = 1 -> PDE not present or invalid ? 	
  3295 00005F9A 7321                <1> 	jnc	short dmem_acc_1
  3296                              <1> 	; 20/10/2023
  3297                              <1> 	; Allocate a page as a new page table
  3298 00005F9C E83FF8FFFF          <1> 	call	allocate_page
  3299                              <1> 	;jc	dmem_acc_7  ; 'insufficient memory' error
  3300                              <1> 	; 17/04/2021
  3301 00005FA1 7215                <1> 	jc	short _dmem_acc_7
  3302                              <1> 	;
  3303 00005FA3 E8A9F8FFFF          <1> 	call 	clear_page
  3304                              <1> 	; EAX = Physical (base) address of the allocated (new) page
  3305 00005FA8 0C07                <1> 	or	al, PDE_A_PRESENT + PDE_A_WRITE + PDE_A_USER ; 4+2+1 = 7
  3306                              <1> 			   ; lower 3 bits are used as U/S, R/W, P flags
  3307                              <1> 			   ; (user, writable, present page)	
  3308 00005FAA 8902                <1> 	mov	[edx], eax ; Let's put the new page directory entry here !
  3309 00005FAC A1[04950100]        <1> 	mov	eax, [u.pgdir]	
  3310 00005FB1 E83CF9FFFF          <1> 	call	get_pte
  3311                              <1>         ;jc	dmem_acc_7 ; 'insufficient memory' error
  3312                              <1> 	; 17/04/2021
  3313 00005FB6 7305                <1> 	jnc	short dmem_acc_1
  3314                              <1> _dmem_acc_7:
  3315 00005FB8 E985000000          <1> 	jmp	dmem_acc_7
  3316                              <1> dmem_acc_1:
  3317                              <1> 	; EAX = PTE value, EDX = PTE address
  3318 00005FBD A801                <1> 	test 	al, PTE_A_PRESENT
  3319                              <1> 	;jnz	short dmem_acc_2   ; 17/04/2021 (*)
  3320                              <1> 	; 17/04/2021 (temporary)
  3321 00005FBF 745F                <1> 	jz	short short dmem_acc_6  ; ! temporary ! (*)	
  3322                              <1> 	; 20/10/2023
  3323                              <1> 	; If the page table entry is zero or invalid -not present-
  3324                              <1> 	; it will be directy allocated for the physical memory section
  3325                              <1> 	; without using the M.A.T. (Specially for LFB access -generally-
  3326                              <1> 	; is at the beyod of the physical main memory end.)
  3327                              <1> 	; (M.A.T bits are not used for direct memory access. To cancel
  3328                              <1> 	; direct memory access also is out of the M.A.T scope because
  3329                              <1> 	; direct accessed physical pages are marked as SHARED on their
  3330                              <1> 	; PTE. Shared pages are not dealloaced.)
  3331                              <1> 
  3332                              <1> ; 17/04/2021
  3333                              <1> ; (following code is disabled as temporary)
  3334                              <1> ;
  3335                              <1> ;	or	eax, eax
  3336                              <1> ;	jz	short dmem_acc_6   ; Change PTE
  3337                              <1> ;	shr	eax, 1		; swap disk block (8 sectors) address
  3338                              <1> ;	; unlink swap disk block
  3339                              <1> ;	call	unlink_swap_block
  3340                              <1> ;	jmp	short dmem_acc_6
  3341                              <1> 
  3342                              <1> dmem_acc_2:
  3343 00005FC1 A802                <1> 	test	al, PTE_A_WRITE   ; bit 1, writable (r/w) flag
  3344                              <1> 				  ; (must be 1)
  3345 00005FC3 7550                <1> 	jnz	short dmem_acc_4
  3346                              <1> 	; Read only -duplicated- page (belongs to a parent or a child)
  3347 00005FC5 66A90002            <1>         test    ax, PTE_DUPLICATED ; Was this page duplicated 
  3348                              <1> 				   ; as child's page ?
  3349 00005FC9 7455                <1> 	jz	short dmem_acc_5 ; Change PTE but don't deallocate the page!
  3350                              <1> 
  3351                              <1> 	;push	edi
  3352                              <1> 	;push	esi
  3353                              <1> 
  3354 00005FCB 51                  <1> 	push	ecx
  3355                              <1> 	;push	ebx
  3356 00005FCC 8B1D[08950100]      <1> 	mov	ebx, [u.ppgdir] ; parent's page dir address (physical)
  3357                              <1> 	
  3358                              <1> 	; check the parent's PTE value is read only & same page or not.. 
  3359 00005FD2 89EF                <1> 	mov	edi, ebp
  3360 00005FD4 C1EF16              <1> 	shr	edi, PAGE_D_SHIFT ; 22
  3361                              <1> 	; EDI = page directory entry index (0-1023)
  3362 00005FD7 89EE                <1> 	mov	esi, ebp
  3363 00005FD9 C1EE0C              <1> 	shr	esi, PAGE_SHIFT ; 12	
  3364 00005FDC 81E6FF030000        <1> 	and	esi, PTE_MASK
  3365                              <1> 	; ESI = page table entry index (0-1023)
  3366                              <1> 
  3367 00005FE2 66C1E702            <1> 	shl	di, 2 ; * 4
  3368 00005FE6 01FB                <1> 	add	ebx, edi ; PDE offset (for the parent)
  3369 00005FE8 8B0F                <1> 	mov	ecx, [edi]
  3370 00005FEA F6C101              <1> 	test	cl, PDE_A_PRESENT ; present (valid) or not ?
  3371 00005FED 7425                <1> 	jz	short dmem_acc_3	; parent process does not use this page
  3372 00005FEF 6681E100F0          <1> 	and	cx, PDE_A_CLEAR ; 0F000h ; Clear attribute bits
  3373 00005FF4 66C1E602            <1> 	shl	si, 2 ; *4 
  3374 00005FF8 01CE                <1> 	add	esi, ecx ; PTE offset (for the parent)
  3375 00005FFA 8B1E                <1> 	mov	ebx, [esi]
  3376 00005FFC F6C301              <1> 	test	bl, PTE_A_PRESENT ; present or not ?
  3377 00005FFF 7413                <1> 	jz	short dmem_acc_3	; parent process does not use this page
  3378 00006001 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; Clear attribute bits 
  3379 00006005 6681E300F0          <1> 	and	bx, PTE_A_CLEAR ; 0F000h ; Clear attribute bits
  3380 0000600A 39D8                <1> 	cmp	eax, ebx	; parent's and child's pages are same ?
  3381 0000600C 7506                <1> 	jne	short dmem_acc_3	; not same page
  3382                              <1> 				; deallocate the child's page
  3383 0000600E 800E02              <1>         or      byte [esi], PTE_A_WRITE ; convert to writable page (parent)
  3384                              <1> 	;pop	ebx
  3385 00006011 59                  <1> 	pop	ecx
  3386 00006012 EB0C                <1> 	jmp	short dmem_acc_5
  3387                              <1> dmem_acc_3:
  3388                              <1> 	;pop	ebx
  3389 00006014 59                  <1> 	pop	ecx
  3390                              <1> dmem_acc_4:	
  3391 00006015 66A90004            <1> 	test	ax, PTE_SHARED ; shared or direct memory access indicator
  3392 00006019 7505                <1> 	jnz	short dmem_acc_5   ; AVL bit 1 = 1, do not deallocate this page!
  3393                              <1> 	;
  3394                              <1> 	;and	ax, PTE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
  3395 0000601B E87FF9FFFF          <1> 	call	deallocate_page
  3396                              <1> dmem_acc_5:
  3397                              <1> 	;pop	esi
  3398                              <1> 	;pop	edi
  3399                              <1> dmem_acc_6:
  3400 00006020 89E8                <1> 	mov	eax, ebp ; physical page (offset=0) address
  3401                              <1> 	; EAX = memory page address
  3402                              <1> 	; EDX = PTE entry address (physical)
  3403 00006022 660D0704            <1> 	or	ax, PTE_A_PRESENT+PTE_A_USER+PTE_A_WRITE+PTE_SHARED
  3404                              <1> 			; present flag, bit 0 = 1
  3405                              <1> 			; user flag, bit 2 = 1	
  3406                              <1> 			; writable flag, bit 1 = 1
  3407                              <1> 			; direct memory access flag, bit 10 = 1
  3408                              <1> 			; (This page must not be deallocated!)
  3409 00006026 8902                <1> 	mov	[edx], eax  ; Update PTE value
  3410 00006028 49                  <1> 	dec	ecx ; remain count of contiguous pages
  3411 00006029 741E                <1> 	jz	short dmem_acc_8
  3412 0000602B 81C500100000        <1> 	add	ebp, PAGE_SIZE ; next physical page address
  3413                              <1> 	; 22/07/2017
  3414                              <1> 	;mov	eax, ebp
  3415                              <1> 	; 12/05/2017
  3416 00006031 8B1D[68930100]      <1> 	mov	ebx, [base_addr] ; linear address (virtual+CORE)
  3417 00006037 81C300100000        <1> 	add	ebx, PAGE_SIZE	; next linear address
  3418 0000603D E948FFFFFF          <1>         jmp     dmem_acc_0
  3419                              <1> dmem_acc_7:  ; ERROR ! 
  3420 00006042 C7042404000000      <1> 	mov	dword [esp], ERR_MINOR_IM 
  3421                              <1> 		; Insufficient memory (minor) error!
  3422                              <1> 		; Major error = 0 (No protection fault)	
  3423                              <1> 	; cf = 1
  3424                              <1> dmem_acc_8:
  3425 00006049 58                  <1> 	pop	eax
  3426                              <1> 	;pop	edx
  3427                              <1> 	;pop	ecx
  3428                              <1> 	;pop	ebx
  3429                              <1> 	;pop	ebp
  3430 0000604A C3                  <1> 	retn
  3431                              <1> 
  3432                              <1> deallocate_user_pages:
  3433                              <1> 	; 20/05/2017
  3434                              <1> 	; 15/05/2017
  3435                              <1> 	; 20/02/2017
  3436                              <1> 	; 19/02/2017 (TRDOS 386 = TRDOS v2.0)
  3437                              <1> 	;
  3438                              <1> 	; Deallocate virtually contiguous user pages (memory block)
  3439                              <1> 	; (caller: 'sysdalloc' system call)
  3440                              <1> 	;
  3441                              <1> 	; INPUT ->
  3442                              <1> 	;	EBX = VIRTUAL ADDRESS (beginning address)
  3443                              <1> 	;	ECX = byte count
  3444                              <1> 	;	[u.pgdir] = user's page directory
  3445                              <1> 	;	[u.ppdir] = parent's page directory
  3446                              <1> 	;
  3447                              <1> 	; OUTPUT ->
  3448                              <1> 	;    If CF = 0 	
  3449                              <1> 	;	EAX = Deallocated memory bytes
  3450                              <1> 	;	  (Even if shared or read only pages will not be
  3451                              <1> 	;	   deallocated on M.A.T., this byte count will be
  3452                              <1> 	;	   returned as virtually deallocated bytes; in fact
  3453                              <1> 	;	   virtually deallocated user pages * 4096.) 
  3454                              <1> 	;	EBX = Virtual address (as rounded up)
  3455                              <1> 	;    If CF = 1    	
  3456                              <1> 	;	EAX = 0 (there is not any deallocated pages)
  3457                              <1> 	;
  3458                              <1> 	; Note: Empty page tables will not be deallocated!!!
  3459                              <1> 	;     (they will be deallocated at process termination stage)
  3460                              <1> 	;
  3461                              <1> 	; Modified Registers -> EAX, EDX, ESI, EDI, EBX, ECX, EBP
  3462                              <1> 	;
  3463 0000604B 89DE                <1> 	mov	esi, ebx
  3464 0000604D 89F7                <1> 	mov	edi, esi
  3465 0000604F 01CF                <1> 	add	edi, ecx
  3466 00006051 81C6FF0F0000        <1> 	add	esi, PAGE_SIZE - 1  ; 4095 (round up)	
  3467 00006057 C1EE0C              <1> 	shr	esi, PAGE_SHIFT
  3468 0000605A C1EF0C              <1> 	shr	edi, PAGE_SHIFT
  3469 0000605D 89F8                <1> 	mov	eax, edi ; end page
  3470 0000605F 29F0                <1> 	sub	eax, esi ; end page - start page
  3471 00006061 0F86C8000000        <1> 	jna	da_u_pd_err  ; < 1
  3472 00006067 89F3                <1> 	mov	ebx, esi
  3473 00006069 C1E30C              <1> 	shl	ebx, PAGE_SHIFT ; virtual address (as rounded up)
  3474 0000606C 53                  <1> 	push	ebx ; *
  3475 0000606D 89C1                <1> 	mov	ecx, eax ; page count
  3476 0000606F C1E00C              <1> 	shl	eax, PAGE_SHIFT ; byte count as adjusted
  3477 00006072 50                  <1> 	push	eax ; **
  3478 00006073 8B1D[04950100]      <1> 	mov	ebx, [u.pgdir] ; physical addr of user's page dir
  3479 00006079 81C600040000        <1>  	add	esi, CORE/PAGE_SIZE 
  3480 0000607F 89F7                <1> 	mov	edi, esi
  3481 00006081 81E7FF030000        <1> 	and	edi, PTE_MASK ; PTE entry in the page table
  3482 00006087 57                  <1> 	push	edi ; *** ; PTE index (of page directory)
  3483 00006088 C1EE0A              <1> 	shr	esi, PAGE_D_SHIFT - PAGE_SHIFT ; 22-12=10
  3484 0000608B 89F2                <1> 	mov	edx, esi 
  3485                              <1> 	; EDX = PDE index
  3486 0000608D C1E602              <1> 	shl	esi, 2 ; convert PDE index to dword offset
  3487 00006090 01DE                <1> 	add	esi, ebx ; add page directory address
  3488                              <1> da_u_pd_1:
  3489 00006092 AD                  <1> 	lodsd
  3490                              <1> 	;
  3491 00006093 89F5                <1> 	mov	ebp, esi ; 20/02/2017
  3492                              <1> 	; EBP = next PDE address
  3493                              <1> 	;
  3494 00006095 A801                <1> 	test	al, PDE_A_PRESENT ; bit 0, present flag (must be 1)
  3495 00006097 0F8487000000        <1> 	jz	da_u_pd_3 ; 20/05/2017	
  3496 0000609D 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
  3497                              <1> 	; EAX = PHYSICAL (flat) ADDRESS OF THE PAGE TABLE
  3498 000060A1 8B3C24              <1> 	mov	edi, [esp] ; ***
  3499                              <1> 	; EDI = PTE index (of complete page directory)
  3500                              <1> 	;and	edi, PTE_MASK ; PTE entry in the page table
  3501 000060A4 C1E702              <1> 	shl	edi, 2 ; convert PTE index to dword offset
  3502 000060A7 89FE                <1> 	mov	esi, edi ; PTE offset in page table (0-4092)
  3503 000060A9 01C6                <1> 	add	esi, eax ; now, esi points to requested PTE
  3504                              <1> da_u_pt_0:
  3505 000060AB AD                  <1> 	lodsd
  3506 000060AC A801                <1> 	test	al, PTE_A_PRESENT ; bit 0, present flag (must be 1)
  3507 000060AE 7452                <1> 	jz	short da_u_pt_1
  3508                              <1> 	;
  3509 000060B0 A802                <1> 	test	al, PTE_A_WRITE   ; bit 1, writable (r/w) flag
  3510                              <1> 				  ; (must be 1)
  3511 000060B2 753C                <1> 	jnz	short da_u_pt_3
  3512                              <1> 	; Read only -duplicated- page (belongs to a parent or a child)
  3513 000060B4 66A90002            <1>         test    ax, PTE_DUPLICATED ; Was this page duplicated 
  3514                              <1> 				   ; as child's page ?
  3515 000060B8 7441                <1> 	jz	short da_u_pt_4 ; Clear PTE but don't deallocate the page!
  3516                              <1> 	;
  3517                              <1> 	; check the parent's PTE value is read only & same page or not.. 
  3518                              <1> 	; EDX = page directory entry index (0-1023)
  3519 000060BA 52                  <1> 	push	edx ; ****
  3520                              <1> 	; EDI = page table entry offset (0-4092)
  3521 000060BB 8B1D[08950100]      <1> 	mov	ebx, [u.ppgdir] ; page directory of the parent process
  3522 000060C1 66C1E202            <1> 	shl	dx, 2 ; *4 
  3523 000060C5 01D3                <1> 	add	ebx, edx ; PDE address (for the parent)
  3524 000060C7 8B13                <1> 	mov	edx, [ebx] ; page table address
  3525 000060C9 F6C201              <1> 	test	dl, PDE_A_PRESENT ; present (valid) or not ?
  3526 000060CC 7421                <1> 	jz	short da_u_pt_2	; parent process does not use this page
  3527 000060CE 6681E200F0          <1> 	and	dx, PDE_A_CLEAR ; 0F000h ; Clear attribute bits
  3528                              <1> 	; EDI = page table entry offset (0-4092)
  3529 000060D3 01D7                <1> 	add	edi, edx	; PTE address (for the parent)
  3530 000060D5 8B1F                <1> 	mov	ebx, [edi]
  3531 000060D7 F6C301              <1> 	test	bl, PTE_A_PRESENT ; present or not ?
  3532 000060DA 7413                <1> 	jz	short da_u_pt_2	; parent process does not use this page
  3533 000060DC 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; Clear attribute bits 
  3534 000060E0 6681E300F0          <1> 	and	bx, PTE_A_CLEAR ; 0F000h ; Clear attribute bits
  3535 000060E5 39D8                <1> 	cmp	eax, ebx	; parent's and child's pages are same ?
  3536 000060E7 7506                <1> 	jne	short da_u_pt_2	; not same page
  3537                              <1> 				; deallocate the child's page
  3538 000060E9 800F02              <1>         or      byte [edi], PTE_A_WRITE ; convert to writable page (parent)
  3539 000060EC 5A                  <1> 	pop	edx ; ****
  3540 000060ED EB0C                <1> 	jmp	short da_u_pt_4
  3541                              <1> 
  3542                              <1> ; 17/04/2021
  3543                              <1> ; ('da_u_pt_1' is disabled as temporary)
  3544                              <1> 
  3545                              <1> ;da_u_pt_1:
  3546                              <1> ;	or	eax, eax	; swapped page ?
  3547                              <1> ;	jz	short da_u_pt_5	; no
  3548                              <1> ;				; yes
  3549                              <1> ;	shr	eax, 1
  3550                              <1> ;	call	unlink_swap_block ; Deallocate swapped page block
  3551                              <1> ;				  ; on the swap disk (or in file)
  3552                              <1> ;	jmp	short da_u_pt_5
  3553                              <1> da_u_pt_2:
  3554 000060EF 5A                  <1> 	pop	edx ; ****
  3555                              <1> da_u_pt_3:
  3556 000060F0 66A90004            <1> 	test	ax, PTE_SHARED	; shared or direct memory access indicator
  3557 000060F4 7505                <1> 	jnz	short da_u_pt_4	; AVL bit 1 = 1, do not deallocate this page!
  3558                              <1> 	;
  3559                              <1> 	;and	ax, PTE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
  3560 000060F6 E8A4F8FFFF          <1> 	call	deallocate_page ; set the mem allocation bit of this page
  3561                              <1> da_u_pt_4:
  3562 000060FB C746FC00000000      <1> 	mov	dword [esi-4], 0 ; clear/reset PTE (child, dupl. as parent)
  3563                              <1> ; 17/04/2021 (temporary)
  3564                              <1> da_u_pt_1:
  3565                              <1> da_u_pt_5:
  3566                              <1> 	; 20/05/2017
  3567 00006102 58                  <1> 	pop	eax ; *** PTE index (of page directory)
  3568 00006103 49                  <1> 	dec	ecx ; remain page count
  3569 00006104 7426                <1> 	jz	short da_u_pd_4
  3570 00006106 40                  <1> 	inc	eax ; next PTE
  3571 00006107 6625FF03            <1> 	and	ax, PTE_MASK ; PTE entry index in the page table
  3572 0000610B 50                  <1> 	push	eax ; *** (save again)
  3573                              <1> 	;mov	edi, eax
  3574                              <1> 	;and 	di, PTE_MASK
  3575                              <1> 	;cmp	edi, PAGE_SIZE / 4 ; 1024
  3576                              <1> 	;jnb	short da_u_pd_2
  3577 0000610C 89C7                <1> 	mov	edi, eax
  3578 0000610E C1E702              <1> 	shl	edi, 2 ; convert index to dword offset
  3579                              <1> 	;test	ax, PTE_MASK ; 3FFh
  3580 00006111 09C0                <1> 	or	eax, eax
  3581 00006113 7596                <1> 	jnz	short da_u_pt_0 ; 1-1023
  3582                              <1> da_u_pd_2:
  3583 00006115 42                  <1> 	inc	edx
  3584                              <1> 	; 20/05/2017
  3585 00006116 6681E2FF03          <1> 	and	dx, PTE_MASK  ; 3FFh
  3586 0000611B 740F                <1> 	jz	short da_u_pd_4  ; 0 (1024)
  3587                              <1> 	;cmp	edx, 1024
  3588                              <1> 	;jnb	short da_u_pd_4
  3589 0000611D 89EE                <1> 	mov	esi, ebp ; 20/02/2017
  3590 0000611F E96EFFFFFF          <1> 	jmp	da_u_pd_1
  3591                              <1> da_u_pd_3:
  3592                              <1> 	; 15/05/2017 (empty page directory entry)
  3593 00006124 81E900040000        <1> 	sub	ecx, 1024
  3594 0000612A 77E9                <1> 	ja	short da_u_pd_2 ; 20/05/2017
  3595                              <1> da_u_pd_4:
  3596 0000612C 58                  <1> 	pop	eax ; **
  3597 0000612D 5B                  <1> 	pop	ebx ; *
  3598 0000612E C3                  <1> 	retn
  3599                              <1> 
  3600                              <1> da_u_pd_err:
  3601 0000612F 31C0                <1> 	xor	eax, eax
  3602 00006131 F9                  <1> 	stc	
  3603 00006132 C3                  <1> 	retn
  3604                              <1> 
  3605                              <1> allocate_user_pages:
  3606                              <1> 	; 20/05/2017
  3607                              <1> 	; 01/05/2017, 02/05/2017, 15/05/2017
  3608                              <1> 	; 04/03/2017
  3609                              <1> 	; 20/02/2017 (TRDOS 386 = TRDOS v2.0)
  3610                              <1> 	;
  3611                              <1> 	; Allocate physically contiguous user pages (memory block)
  3612                              <1> 	; (caller: 'sysalloc' system call)
  3613                              <1> 	;
  3614                              <1> 	; Note: This procedure does not alloc a page's itself
  3615                              <1> 	;	(page bits) on Memory Allocation Table.
  3616                              <1> 	;	(allocate_memory_block is needed before this proc)
  3617                              <1> 	;
  3618                              <1> 	; INPUT ->
  3619                              <1> 	;	EAX = PHYSICAL ADDRESS (beginning address)
  3620                              <1> 	;	EBX = VIRTUAL ADDRESS (beginning address)
  3621                              <1> 	;	ECX = byte count (>=4096)
  3622                              <1> 	;	[u.pgdir] = user's page directory
  3623                              <1> 	;	
  3624                              <1> 	;	Note: All addresses are (must be) already adjusted
  3625                              <1> 	;	to page	borders, otherwise, lower 12bits of addresses
  3626                              <1> 	;	and byte count would be truncated.
  3627                              <1> 	;
  3628                              <1> 	; OUTPUT ->
  3629                              <1> 	;	none
  3630                              <1> 	;
  3631                              <1> 	;	CF = 1 -> insufficient memory error
  3632                              <1> 	;
  3633                              <1> 	; Note: All pages will be allocated in physical page order 
  3634                              <1> 	;	from the beginning page address. 
  3635                              <1> 	;	* A new page table will be added to the page dir
  3636                              <1> 	;	  when the requested PDE is invalid.
  3637                              <1> 	;	* Those pages will not be added to swap queue
  3638                              <1> 	;	  because main purpose of this allocation is to
  3639                              <1> 	;	  set a direct memory access (DMA controller) buffer.
  3640                              <1> 	;	 (Swapping out a page in a DMA buffer would be wrong!)
  3641                              <1> 	;	* Previous content of page tables (PTEs) would be
  3642                              <1> 	;	  (should be) deallocated before entering this
  3643                              <1> 	;	  procedure. So, new page table entries (PTEs)
  3644                              <1> 	;	  directly will be written without checking
  3645                              <1> 	;	  their previous content.	
  3646                              <1> 	;	* Only solution to increase free memory by removing
  3647                              <1> 	;	  that non-swappable memory block is to terminate
  3648                              <1> 	;	  the process or to wait until the process will 
  3649                              <1> 	;	  deallocate that memory block as itself. ('sysdalloc')
  3650                              <1> 	;	  (No problem, if the process does not grab all of
  3651                              <1> 	;	  -very big amount of- free memory by using
  3652                              <1> 	;	  'sysalloc' system call!?)
  3653                              <1> 	;	  (Even if the process has grabbed all of free memory, 
  3654                              <1> 	;	  no problem if the process is not running in 
  3655                              <1> 	;	  multitasking mode. No problem in multitasking
  3656                              <1> 	;	  mode if there is not another process which is running
  3657                              <1> 	;	  or waiting or sleeping for an event as it's pages
  3658                              <1> 	;	  are swapped-out. But a new process can not start to
  3659                              <1> 	;	  run if all of free memory has beeen allocated 
  3660                              <1> 	;	  by running processes. Deallocation -'sysdalloc'- 
  3661                              <1> 	;	  or terminate a running process is needed 
  3662                              <1> 	;	  in order to run a new process.) 
  3663                              <1> 	;
  3664                              <1> 	; Modified Registers -> EAX, EDX, ESI, EDI, EBX, ECX, EBP
  3665                              <1> 	;
  3666                              <1> 
  3667                              <1> 	; 01/05/2017
  3668 00006133 662500F0            <1> 	and	ax, ~PAGE_OFF
  3669 00006137 6681E300F0          <1> 	and	bx, ~PAGE_OFF
  3670                              <1> 	; 02/05/2017 
  3671 0000613C BD00F0FFFF          <1> 	mov	ebp, 0FFFFF000h ; 4 Giga Bytes - 4096 Bytes (for Stack)
  3672 00006141 C1E90C              <1> 	shr	ecx, PAGE_SHIFT ; page count
  3673 00006144 83F901              <1> 	cmp	ecx, 1
  3674 00006147 7251                <1> 	jb	short a_u_im_retn
  3675 00006149 89C2                <1> 	mov	edx, eax
  3676 0000614B 01CA                <1> 	add	edx, ecx
  3677 0000614D 724B                <1> 	jc	short a_u_im_retn
  3678 0000614F 39D5                <1> 	cmp	ebp, edx
  3679 00006151 7247                <1> 	jb	short a_u_im_retn
  3680 00006153 89DA                <1> 	mov	edx, ebx
  3681 00006155 81C200004000        <1> 	add	edx, CORE
  3682 0000615B 723D                <1> 	jc	short a_u_im_retn	
  3683 0000615D 01CA                <1> 	add	edx, ecx
  3684 0000615F 7239                <1> 	jc	short a_u_im_retn
  3685 00006161 39D5                <1> 	cmp	ebp, edx
  3686 00006163 7235                <1> 	jb	short a_u_im_retn
  3687                              <1> 	;
  3688 00006165 89C5                <1> 	mov	ebp, eax ; physical address
  3689 00006167 89DE                <1> 	mov	esi, ebx
  3690 00006169 81C600004000        <1> 	add	esi, CORE ; start of user's memory (4M) 
  3691 0000616F C1EE0C              <1> 	shr	esi, PAGE_SHIFT ; higher 20 bits of the linear address
  3692                              <1> 	;shr	ecx, PAGE_SHIFT ; page count
  3693 00006172 8B1D[04950100]      <1> 	mov	ebx, [u.pgdir] ; physical addr of user's page dir
  3694 00006178 89F7                <1> 	mov	edi, esi
  3695 0000617A 81E7FF030000        <1> 	and	edi, PTE_MASK ; PTE entry index in the page table
  3696 00006180 57                  <1> 	push	edi  ; * ; PTE index (in page directory)
  3697 00006181 C1EE0A              <1> 	shr	esi, PAGE_D_SHIFT - PAGE_SHIFT ; 22-12=10
  3698 00006184 89F2                <1> 	mov	edx, esi 
  3699                              <1> 	; EDX = PDE index
  3700 00006186 C1E602              <1> 	shl	esi, 2 ; convert PDE index to dword offset
  3701 00006189 01DE                <1> 	add	esi, ebx ; add page directory address
  3702                              <1> a_u_pd_0:
  3703 0000618B AD                  <1> 	lodsd
  3704                              <1> 	;
  3705 0000618C 89F3                <1> 	mov	ebx, esi ; next PDE address
  3706                              <1> 	;
  3707 0000618E A801                <1> 	test	al, PDE_A_PRESENT ; bit 0, present flag (must be 1)
  3708 00006190 7513                <1> 	jnz	short a_u_pd_2
  3709                              <1> 	;
  3710                              <1> 	; empty PDE (it does not point to valid page table address)
  3711 00006192 E849F6FFFF          <1> 	call	allocate_page  ; (allocate a new page table)
  3712 00006197 7302                <1> 	jnc	short a_u_pd_1 ; OK... now, we have a new page table.
  3713                              <1> 	; cf = 1
  3714                              <1> 	; There is not a free memory page to allocate a new page table !!!
  3715 00006199 5E                  <1> 	pop	esi ; *
  3716                              <1> a_u_im_retn:
  3717 0000619A C3                  <1> 	retn	; return to 'sysalloc' with 'insufficient memory' error
  3718                              <1> 	;
  3719                              <1> a_u_pd_1: ; clear the new page table content 
  3720                              <1> 	; EAX = Physical (base) address of the new page table
  3721 0000619B E8B1F6FFFF          <1> 	call	clear_page ; Clear page content
  3722                              <1> 	;
  3723 000061A0 0C07                <1> 	or	al, PDE_A_PRESENT + PDE_A_WRITE + PDE_A_USER
  3724                              <1> 		 ; set bit 0, bit 1 and bit 2 to 1
  3725                              <1> 		 ; (present, writable, user)
  3726 000061A2 8946FC              <1> 	mov	[esi-4], eax
  3727                              <1> a_u_pd_2:
  3728 000061A5 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
  3729                              <1> 	; EAX = PHYSICAL (flat) ADDRESS OF THE PAGE TABLE
  3730 000061A9 8B3C24              <1> 	mov	edi, [esp] ; *
  3731                              <1> 	; EDI = PTE index (of page directory)
  3732                              <1> 	;and	edi, PTE_MASK ; PTE entry index in the page table	
  3733                              <1> 	; EBX = next PDE address
  3734 000061AC 89FE                <1> 	mov	esi, edi ; PTE index in page table (0-1023)
  3735 000061AE C1E702              <1> 	shl	edi, 2 ; convert PTE index to dword offset
  3736 000061B1 01C7                <1> 	add	edi, eax ; now, edi points to requested PTE
  3737                              <1> a_u_pt_0:
  3738                              <1> 	; 02/05/2017
  3739 000061B3 8B07                <1> 	mov	eax, [edi]
  3740                              <1> 	;
  3741 000061B5 A801                <1> 	test	al, PTE_A_PRESENT ; bit 0, present flag (must be 1)
  3742 000061B7 7445                <1> 	jz	short a_u_pt_1
  3743                              <1> 	;
  3744 000061B9 A802                <1> 	test	al, PTE_A_WRITE   ; bit 1, writable (r/w) flag
  3745                              <1> 				  ; (must be 1)
  3746 000061BB 7550                <1> 	jnz	short a_u_pt_3
  3747                              <1> 	; Read only -duplicated- page (belongs to a parent or a child)
  3748 000061BD 66A90002            <1>         test    ax, PTE_DUPLICATED ; Was this page duplicated 
  3749                              <1> 				   ; as child's page ?
  3750 000061C1 7455                <1> 	jz	short a_u_pt_4	; Clear PTE but don't deallocate the page!
  3751                              <1> 	;
  3752                              <1> 	; check the parent's PTE value is read only & same page or not.. 
  3753                              <1> 	; EDX = page directory entry index (0-1023)
  3754 000061C3 52                  <1> 	push	edx ; **
  3755 000061C4 53                  <1> 	push	ebx ; ***
  3756                              <1> 	; ESI = page table entry index (0-1023)
  3757                              <1> 	;push	esi ; **** ; 20/05/2017
  3758 000061C5 8B1D[08950100]      <1> 	mov	ebx, [u.ppgdir] ; page directory of the parent process
  3759 000061CB 66C1E202            <1> 	shl	dx, 2 ; *4 
  3760 000061CF 01D3                <1> 	add	ebx, edx ; PTE address,0 (for the parent)
  3761 000061D1 8B13                <1> 	mov	edx, [ebx] ; page table address
  3762 000061D3 F6C201              <1> 	test	dl, PDE_A_PRESENT ; present (valid) or not ?
  3763 000061D6 7433                <1> 	jz	short a_u_pt_2	; parent process does not use this page
  3764 000061D8 6681E200F0          <1> 	and	dx, PDE_A_CLEAR ; 0F000h ; Clear attribute bits
  3765 000061DD 66C1E602            <1> 	shl	si, 2 ; *4
  3766                              <1> 	; ESI = page table entry offset (0-4092)
  3767 000061E1 01D6                <1> 	add	esi, edx	; PTE address (for the parent)
  3768 000061E3 8B1E                <1> 	mov	ebx, [esi]
  3769 000061E5 F6C301              <1> 	test	bl, PTE_A_PRESENT ; present or not ?
  3770 000061E8 7421                <1> 	jz	short a_u_pt_2	; parent process does not use this page
  3771 000061EA 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; Clear attribute bits 
  3772 000061EE 6681E300F0          <1> 	and	bx, PTE_A_CLEAR ; 0F000h ; Clear attribute bits
  3773 000061F3 39D8                <1> 	cmp	eax, ebx	; parent's and child's pages are same ?
  3774 000061F5 7514                <1> 	jne	short a_u_pt_2	; not same page
  3775                              <1> 				; deallocate the child's page
  3776 000061F7 800E02              <1>         or      byte [esi], PTE_A_WRITE ; convert to writable page (parent)
  3777                              <1> 	;pop	esi ; **** ; 20/05/2017
  3778 000061FA 5B                  <1> 	pop	ebx ; ***
  3779 000061FB 5A                  <1> 	pop	edx ; **
  3780 000061FC EB1A                <1> 	jmp	short a_u_pt_4
  3781                              <1> a_u_pt_1:
  3782 000061FE 09C0                <1> 	or	eax, eax	; swapped page ?
  3783 00006200 7416                <1> 	jz	short a_u_pt_4	; no
  3784                              <1> 				; yes
  3785 00006202 D1E8                <1> 	shr	eax, 1
  3786 00006204 E8B5F9FFFF          <1> 	call	unlink_swap_block ; Deallocate swapped page block
  3787                              <1> 				  ; on the swap disk (or in file)
  3788 00006209 EB0D                <1> 	jmp	short a_u_pt_4
  3789                              <1> a_u_pt_2:
  3790                              <1> 	;pop	esi ; **** ; 20/05/2017
  3791 0000620B 5B                  <1> 	pop	ebx ; ***
  3792 0000620C 5A                  <1> 	pop	edx ; **
  3793                              <1> a_u_pt_3:
  3794 0000620D 66A90004            <1> 	test	ax, PTE_SHARED	; shared or direct memory access indicator
  3795 00006211 7505                <1> 	jnz	short a_u_pt_4	; AVL bit 1 = 1, do not deallocate this page!
  3796                              <1> 	;
  3797                              <1> 	;and	ax, PTE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
  3798 00006213 E887F7FFFF          <1> 	call	deallocate_page ; set the mem allocation bit of this page
  3799                              <1> 	;
  3800                              <1> a_u_pt_4:
  3801 00006218 89E8                <1> 	mov	eax, ebp ; physical address
  3802 0000621A 0C07                <1> 	or	al, PTE_A_PRESENT + PTE_A_WRITE + PTE_A_USER ; 04/03/2017
  3803 0000621C AB                  <1> 	stosd
  3804 0000621D 5E                  <1> 	pop	esi ; * ; 20/05/2017
  3805 0000621E 49                  <1> 	dec	ecx ; remain page count
  3806 0000621F 7417                <1> 	jz	short a_u_pd_5
  3807 00006221 81C500100000        <1> 	add	ebp, PAGE_SIZE
  3808 00006227 46                  <1> 	inc	esi ; next PTE (index)
  3809                              <1> 	; 20/05/2017
  3810                              <1> 	;cmp	esi, PAGE_SIZE/4 ; 1024
  3811                              <1> 	;jb	short a_u_pt_0
  3812 00006228 6681E6FF03          <1> 	and	si, PTE_MASK ; 3FFh (0 to 1023)
  3813 0000622D 56                  <1> 	push	esi ; *
  3814 0000622E 7583                <1> 	jnz	short a_u_pt_0 ; > 0 (<1024)
  3815                              <1> a_u_pd_3:
  3816 00006230 42                  <1> 	inc	edx
  3817                              <1> ;	cmp	edx, 1024
  3818                              <1> ;	jnb	short a_u_pd_4 ; 02/05/2017 (error!, ecx > 0)
  3819 00006231 89DE                <1> 	mov	esi, ebx ; the next PDE address
  3820 00006233 E953FFFFFF          <1> 	jmp	a_u_pd_0
  3821                              <1> a_u_pd_4:
  3822                              <1> 	; 02/05/2017
  3823                              <1> ;	stc
  3824                              <1> a_u_pd_5:
  3825                              <1> 	; 20/05/2017
  3826                              <1> 	;pop	edi ; *
  3827 00006238 C3                  <1> 	retn
  3828                              <1> 
  3829                              <1> 	; 28/11/2023
  3830                              <1> ;a_lfb_k__err:
  3831                              <1> 	;retn
  3832                              <1> 
  3833                              <1> allocate_lfb_pages_for_kernel:
  3834                              <1> 	; 02/12/2023
  3835                              <1> 	; 29/11/2023
  3836                              <1> 	; 28/11/2023
  3837                              <1> 	; 20/10/2023 - TRDOS 386 v2.0.7
  3838                              <1> 	; (only the overlapped main memory pages will be allocated)
  3839                              <1> 	; 28/11/2023
  3840                              <1> 	; (but all LFB pages will be added to the kernel's page tables)
  3841                              <1> 	; (NOTE: LFB size -which will be used- is the size of the max.
  3842                              <1> 	;  recognized screen resolution. For example: 1024*768*4 bytes)
  3843                              <1> 	; 15/12/2020
  3844                              <1> 	; 14/12/2020 - TRDOS 386 v2.0.3
  3845                              <1> 	; Set kernel page tables for linear frame buffer 
  3846                              <1> 	;
  3847                              <1> 	; Input:
  3848                              <1> 	;	;[LFB_ADDR] = linear frame buffer base address
  3849                              <1> 	;	;[LFB_SIZE] = linear frame buffer size in bytes
  3850                              <1> 	;	; 29/11/2023
  3851                              <1> 	;	;ebx = Linear frame buffer base address as page num
  3852                              <1> 	;	; 20/10/2023
  3853                              <1> 	;	esi = linear frame buffer base address
  3854                              <1> 	;	ecx = memory size in pages = [memory_size]
  3855                              <1> 	;	; 28/11/2023
  3856                              <1> 	;	edx = linear frame buffer size in pages
  3857                              <1> 	; Output:
  3858                              <1> 	;	none
  3859                              <1> 	;	cf = 1 -> error
  3860                              <1> 	;
  3861                              <1> 	; Modified registers: eax, ebx, ecx, edx, esi, edi, ebp
  3862                              <1> 
  3863                              <1> 
  3864                              <1> ; 02/12/2023 ; (!**!)
  3865                              <1> ; ('memory size' -for M.A.T.- is always <= LFB stat/base address) 
  3866                              <1> %if 0
  3867                              <1> 
  3868                              <1> 	; 29/11/2023
  3869                              <1> 	; allocate LFB blocks which < memory size at first
  3870                              <1> 	
  3871                              <1> 	;mov	eax, edx
  3872                              <1> 	;shl	eax, 12
  3873                              <1> 	;add	eax, esi
  3874                              <1> 	;jc	short a_lfb_k__err ; > 4GB limit
  3875                              <1> 	;
  3876                              <1> 	;;mov	eax, 1048576 ; page count of (full) 4GB memory
  3877                              <1> 	;;sub	eax, edx
  3878                              <1> 	;;cmp	eax, esi
  3879                              <1> 	;jb	short a_lfb_k__err ; > 4GB limit
  3880                              <1> 
  3881                              <1> 	mov	ebx, esi ; LFB base/start address
  3882                              <1> 	shr	ebx, 12	 ; convert byte address to page address
  3883                              <1> 	; ebx = LFB start/base page number 
  3884                              <1> 
  3885                              <1> 	sub	ecx, ebx
  3886                              <1> 	jna	short a_lfb_k_2 ; skip M.A.T. bit allocation 
  3887                              <1> 	cmp	ecx, edx
  3888                              <1> 	jna	short a_lfb_k_0
  3889                              <1> 	mov	ecx, edx
  3890                              <1> a_lfb_k_0:
  3891                              <1> 	sub	edx, ecx
  3892                              <1> 	jna	short a_lfb_k_1
  3893                              <1> 
  3894                              <1> 	; edx = remain count of LFB pages which are out of the M.A.T. 
  3895                              <1> 	; ebx = LFB start/base page number
  3896                              <1> 	; ecx = page allocation count in the M.A.T.
  3897                              <1> 
  3898                              <1> 	;mov	eax, 4096
  3899                              <1> 	;mul	ecx
  3900                              <1> 	mov	eax, ecx
  3901                              <1> 	shl	eax, 12 ; * 4096
  3902                              <1> 
  3903                              <1> 	add	esi, eax
  3904                              <1> 	; esi = LFB address just after the main memory if there is	
  3905                              <1> a_lfb_k_1:
  3906                              <1> 	mov	eax, ebx ; LFB start/base page number
  3907                              <1> 	call	allocate_lfb_memory_block
  3908                              <1> 
  3909                              <1> 	; here if there is, remain (the 2nd) part of the LFB 
  3910                              <1> 	; will be allocated by using new kernel page table(s)
  3911                              <1> 	; (but M.A.T. bits will not be cleared because 
  3912                              <1> 	;  the 2nd LFB part is out of the M.A.T.)	
  3913                              <1> 	
  3914                              <1> 	and	edx, edx
  3915                              <1> 	jz	short a_lfb_k_6  ; all LFB pages have been allocated
  3916                              <1> 
  3917                              <1> %endif
  3918                              <1> 
  3919                              <1> a_lfb_k_2:
  3920                              <1> 	; 29/11/2023
  3921 00006239 C1EE0C              <1> 	shr	esi, 12	; convert LFB address to page number
  3922                              <1> 	; edx = count of pages to be added (in kernel page tables)
  3923                              <1> 	; 28/11/2023
  3924 0000623C 89D5                <1> 	mov	ebp, edx
  3925 0000623E 81C2FF030000        <1> 	add	edx, 1023 ; round up
  3926 00006244 C1EA0A              <1> 	shr	edx, 10	  ; / 1024
  3927                              <1> 	; edx = count of kernel page tables to be added
  3928                              <1> 	; (edx = 1 or edx = 2)
  3929                              <1> 	; ((1024*768*4 = 3145728 bytes, 768 PTEs, 1 page table))
  3930                              <1> 	; ((1920*1080*4 = 8294400 bytes, 2025 PTEs, 2 page tables)) 
  3931 00006247 E894F5FFFF          <1> 	call	allocate_page
  3932                              <1> 	;jc	short a_lfb_k__err
  3933                              <1> 	; (mem alloc error is not expected at this startup stage)
  3934                              <1> 	; eax = physical address of the new page table
  3935 0000624C 89F7                <1> 	mov	edi, esi  ; LFB start/base page number
  3936 0000624E C1EF0A              <1> 	shr	edi, 10
  3937                              <1> 	; edi = PDE entry number of the Linear Frame Buffer addr
  3938                              <1> 	; (edi = 832 for 0D0000000h, edi = 896 for 0E0000000h)
  3939 00006251 C1E702              <1> 	shl	edi, 2
  3940                              <1> 	; edi = PDE offset
  3941 00006254 033D[F07C0100]      <1> 	add	edi, [k_page_dir] ; Kernel's Page Dir Address
  3942 0000625A 50                  <1> 	push	eax ; +
  3943 0000625B 660D0304            <1> 	or	ax, PDE_A_PRESENT + PDE_A_WRITE + PDE_EXTERNAL
  3944                              <1> 				; supervisor + read&write + present
  3945                              <1> 				; + external memory block (LFB)
  3946 0000625F AB                  <1> 	stosd
  3947                              <1> 
  3948 00006260 4A                  <1> 	dec	edx
  3949 00006261 740C                <1> 	jz	short a_lfb_k_3	; only 1 new page table
  3950                              <1> 
  3951                              <1> 	; the 2nd page table
  3952 00006263 E878F5FFFF          <1> 	call	allocate_page
  3953                              <1> 	;jc	short a_lfb_k__err
  3954                              <1> 	; (mem alloc error is not expected at this startup stage)
  3955                              <1> 	; eax = physical address of the new page table
  3956 00006268 89C3                <1> 	mov	ebx, eax
  3957 0000626A 660D0304            <1> 	or	ax, PDE_A_PRESENT + PDE_A_WRITE + PDE_EXTERNAL
  3958                              <1> 				; supervisor + read&write + present
  3959                              <1> 				; + external memory block (LFB)
  3960 0000626E AB                  <1> 	stosd
  3961                              <1> 
  3962                              <1> a_lfb_k_3:
  3963                              <1> 	; set new PTEs
  3964                              <1> 	;
  3965                              <1> 	; ebp = count of pages (PTEs) to be allocated
  3966 0000626F 5F                  <1> 	pop	edi ; +	 ; 1st page table address	
  3967                              <1> 	; 29/11/2023
  3968 00006270 B900040000          <1> 	mov	ecx, 1024	; number of PTEs in a page table
  3969 00006275 89F0                <1> 	mov	eax, esi	; LFB base/start page number
  3970                              <1> 			 	; (may be the 2nd part of the LFB)
  3971 00006277 C1E00C              <1> 	shl	eax, 12
  3972 0000627A 660D0304            <1> 	or	ax, PTE_A_PRESENT + PTE_A_WRITE + PTE_EXTERNAL
  3973                              <1> 				; supervisor + read&write + present
  3974                              <1> 				; + external memory block (LFB)
  3975                              <1> a_lfb_k_4:
  3976 0000627E AB                  <1> 	stosd			; save as PTE
  3977 0000627F 4D                  <1> 	dec	ebp
  3978 00006280 740D                <1> 	jz	short a_lfb_k_5
  3979 00006282 0500100000          <1> 	add	eax, 4096	; the next page address
  3980 00006287 E2F5                <1> 	loop	a_lfb_k_4
  3981                              <1> 	
  3982                              <1> 	;and	ebx, ebx
  3983                              <1> 	;jz	short a_lfb_k_6
  3984 00006289 89DF                <1> 	mov	edi, ebx	; the 2nd page table address
  3985                              <1> 	;xor	ebx, ebx
  3986                              <1> 	;mov	ecx, 1024
  3987 0000628B B504                <1> 	mov	ch, 4 ; cx = 4*256 = 1024
  3988 0000628D EBEF                <1> 	jmp	short a_lfb_k_4 ; only 1 more loop (no the 3rd pt)
  3989                              <1> 				; (ebp <= 1024 here)
  3990                              <1> a_lfb_k_5:
  3991 0000628F 49                  <1> 	dec	ecx
  3992 00006290 7404                <1> 	jz	short a_lfb_k_6
  3993 00006292 31C0                <1> 	xor	eax, eax	; clear page table entry (empty)
  3994 00006294 F3AB                <1> 	rep	stosd
  3995                              <1> a_lfb_k_6:
  3996                              <1> 	; 29/11/2023
  3997 00006296 C3                  <1> 	retn
  3998                              <1> 
  3999                              <1> ; 28/11/2023
  4000                              <1> %if 0 
  4001                              <1> 
  4002                              <1> allocate_lfb_pages_for_kernel:
  4003                              <1> 	; 20/10/2023 - TRDOS 386 v2.0.7
  4004                              <1> 	; (only the overlapped main memory pages will be allocated)
  4005                              <1> 	; ((if LFB base/start address is greater than -or equal to-
  4006                              <1> 	;      main memory size, this procedure is not called/used)) 
  4007                              <1> 	; 15/12/2020
  4008                              <1> 	; 14/12/2020 - TRDOS 386 v2.0.3
  4009                              <1> 	; Set kernel page tables for linear frame buffer 
  4010                              <1> 	;
  4011                              <1> 	; Input:
  4012                              <1> 	;	;[LFB_ADDR] = linear frame buffer base address
  4013                              <1> 	;	;[LFB_SIZE] = linear frame buffer size in bytes
  4014                              <1> 	;	; 20/10/2023
  4015                              <1> 	;	eax = Linear frame buffer base address as page num
  4016                              <1> 	;	      (eax < memory size)
  4017                              <1> 	;	esi = linear frame buffer base address
  4018                              <1> 	;	ecx = memory size in pages = [memory_size]
  4019                              <1> 	; Output:
  4020                              <1> 	;	none
  4021                              <1> 	;	cf = 1 -> error
  4022                              <1> 	;
  4023                              <1> 	; Modified registers: eax, ecx, edx, edi
  4024                              <1> 
  4025                              <1> 	; 20/10/2023
  4026                              <1> 	;mov	edi, [LFB_ADDR]
  4027                              <1> 	;mov	edx, [LFB_SIZE]
  4028                              <1> 
  4029                              <1> 	;;;
  4030                              <1> 	; 20/10/2023
  4031                              <1> 	mov	edi, eax ; LFB base/start page number
  4032                              <1> 	;mov	ecx, [memory_size]
  4033                              <1> 	sub	ecx, eax	
  4034                              <1> 
  4035                              <1> 	; ecx = number of pages to be set as (already) allocated 
  4036                              <1> 	;;;
  4037                              <1> 
  4038                              <1> 	; 20/10/2023
  4039                              <1> 	shr	edi, 10 ; convert page number to PDE entry number
  4040                              <1> 			; (1024 pages per page table -the shift
  4041                              <1> 			; result is a page table index number
  4042                              <1> 			; or page directory entry number <= 1023)
  4043                              <1> 	;shr	edi, 22	; convert address to page number
  4044                              <1> 			; and then convert it to PDE entry offset
  4045                              <1> 			; (1 PDE is for 4MB, 22 bit shift)
  4046                              <1> 
  4047                              <1> 	shl	di, 2	; * 4 to obtain the PDE offset
  4048                              <1> 
  4049                              <1> 	; 20/10/2023
  4050                              <1> 	;;add	edx, 4095
  4051                              <1> 	;shr	edx, 12	; convert LFB size to LFB page count
  4052                              <1> 	
  4053                              <1> 	;mov	ecx, edx ; * ; LFB page count
  4054                              <1> 	; 20/10/2023
  4055                              <1> 	mov	edx, ecx ; *
  4056                              <1> 			; 20/10/2023
  4057                              <1> 			; edx = page count (to be set as allocated)
  4058                              <1> 			; 	from the LFB start page
  4059                              <1> 			; (it may be <= linear frame buffer size) 
  4060                              <1> 
  4061                              <1> 	add	ecx, 1023 ; page count + 1023
  4062                              <1> 	shr	ecx, 10 ; convert to page directory entry count	
  4063                              <1> 			; (page table count)
  4064                              <1> 	push	ecx ; **
  4065                              <1> 	shl	ecx, 12 ; convert to byte count
  4066                              <1> 
  4067                              <1> 	; 20/10/2023
  4068                              <1> 	; (absolute allocation is needed instead of the first fit)
  4069                              <1> 	;xor	eax, eax ; first available pages
  4070                              <1> 	
  4071                              <1> 	; 20/10/2023
  4072                              <1> 	;mov	esi, [LFB_ADDR]
  4073                              <1> 	mov	eax, esi ; linear frame buffer's base/start address	
  4074                              <1> 
  4075                              <1> 	; allocate contiguous memory block for these kernel pages
  4076                              <1> 	
  4077                              <1> 	;call	allocate_memory_block
  4078                              <1> 	; 20/10/2023 
  4079                              <1> 	; (short way to set LFB page bits on the 'M.A.T.)
  4080                              <1> 	call	allocate_lfb_memory_block ; in 'allocate_memory_block'	
  4081                              <1> 
  4082                              <1> 	; eax = start address of (contiguous) memory block
  4083                              <1> 	pop	ecx ; ** ; PDE count
  4084                              <1> 	jnc	short a_lfb_k_1
  4085                              <1> 	; error (cf=1)
  4086                              <1> 	retn
  4087                              <1> a_lfb_k_1:
  4088                              <1> 	; Allocate (new) page tables in kernel's page directory
  4089                              <1> 	push	ecx ; PDE (page table) count
  4090                              <1> 	push	eax ; start address of contiguous memory pages
  4091                              <1> 		    ; (at page boundary)	
  4092                              <1> 	; edi = 1st page directory entry offset
  4093                              <1> 	add	edi, [k_page_dir] ; Kernel's Page Dir Address
  4094                              <1> a_lfb_k_2:
  4095                              <1> 	or	ax, PDE_A_PRESENT + PDE_A_WRITE + PDE_EXTERNAL
  4096                              <1> 				; supervisor + read&write + present 	
  4097                              <1> 				; + external memory block (LFB)
  4098                              <1> 	stosd
  4099                              <1> 	add	eax, 4096
  4100                              <1> 	loop	a_lfb_k_2
  4101                              <1> 	
  4102                              <1> 	pop	edi ; start addr of contiguous memory pages
  4103                              <1> 	pop	ecx ; page table (PDE) count
  4104                              <1> 
  4105                              <1> 	; Allocate pages in (new) kernel page tables
  4106                              <1> 	
  4107                              <1> 	; (Note: page tables are contiguous in pyhsical memory)
  4108                              <1> 	shl	ecx, 10 ; * 1024, convert to (total) PTE count 
  4109                              <1> 	
  4110                              <1> 	mov	eax, [LFB_ADDR]
  4111                              <1> 	; edx = LFB page count
  4112                              <1> 	;and	ax, ~4095  ; lw of LFB address is 0
  4113                              <1> a_lfb_k_3:	
  4114                              <1> 	or	ax, PTE_A_PRESENT + PTE_A_WRITE + PTE_EXTERNAL
  4115                              <1> 				; supervisor + read&write + present 	
  4116                              <1> 				; + external memory block (LFB)
  4117                              <1> 	stosd
  4118                              <1> 	dec	edx
  4119                              <1> 	jz	short a_lfb_k_4 ; LFB size has been completed (!?)
  4120                              <1> 	add	eax, 4096	
  4121                              <1> 	loop	a_lfb_k_3
  4122                              <1> 
  4123                              <1> 	retn
  4124                              <1> 	
  4125                              <1> a_lfb_k_4:
  4126                              <1> 	; clear PTEs for empty/free pages 
  4127                              <1> 	; 	(if there are after LFB !?)
  4128                              <1> 	xor	eax, eax ; clear page table entry (empty)
  4129                              <1> 	rep	stosd
  4130                              <1> 	retn
  4131                              <1> 
  4132                              <1> %endif
  4133                              <1> 
  4134                              <1> ;deallocate_lfb_pages_for_kernel:
  4135                              <1> 	; 15/12/2020
  4136                              <1> 	; 14/12/2020 - TRDOS 386 v2.0.3
  4137                              <1> 	; Reset/Release kernel page tables
  4138                              <1> 	;	 which are used for linear frame buffer 
  4139                              <1> 	; (this procedure will be called by kernel only)
  4140                              <1> 	;
  4141                              <1> 	; Input:
  4142                              <1> 	;	[LFB_ADDR] = linear frame buffer base address
  4143                              <1>  	;	[FFB_SIZE] = linear frame buffer size in bytes
  4144                              <1> 	; Output:
  4145                              <1> 	;	none
  4146                              <1> 	;
  4147                              <1> 	; Modified registers: eax, ecx, edi
  4148                              <1> 
  4149                              <1> 	;mov	edi, [LFB_ADDR]
  4150                              <1> 	;mov	ecx, [LFB_SIZE]
  4151                              <1> 	;
  4152                              <1> 	;shr	edi, 22	; convert address to page number
  4153                              <1> 	;		; and then convert it to PDE entry offset
  4154                              <1> 	;		; (1 PDE is for 4MB, 22 bit shift)
  4155                              <1> 	;
  4156                              <1> 	;shl	di, 2	; * 4 for offset 
  4157                              <1> 	;
  4158                              <1> 	;;add	ecx, 4095
  4159                              <1> 	;shr	ecx, 12	; convert LFB size to page count  
  4160                              <1> 	;
  4161                              <1> 	;add	ecx, 1023 ; page count + 1023
  4162                              <1> 	;shr	ecx, 10 ; convert to page directory entry count	
  4163                              <1> 	;		; (page table count)
  4164                              <1> 	;push	ecx ; *
  4165                              <1> 	;shl	ecx, 12 ; convert to byte count
  4166                              <1> 	;
  4167                              <1> 	;xor	eax, eax ; first available pages
  4168                              <1> 	;
  4169                              <1> 	;; deallocate contiguous memory block for kernel pages
  4170                              <1> 	;
  4171                              <1> 	;call	deallocate_memory_block
  4172                              <1> 	;
  4173                              <1> 	;pop	ecx ; * ; PDE count
  4174                              <1> 	;
  4175                              <1> 	;; Release/Free PDEs (page tables) in kernel's page dir
  4176                              <1> 	;; edi = 1st page directory entry offset
  4177                              <1> 	;add	edi, [k_page_dir] ; Kernel's Page Dir Address
  4178                              <1> 	;sub	eax, eax ; clear (also invalidate)
  4179                              <1> 	;rep	stosd
  4180                              <1> 	;
  4181                              <1> 	;retn
  4182                              <1> 
  4183                              <1> ; /// End Of MEMORY MANAGEMENT FUNCTIONS ///
  4184                              <1> 
  4185                              <1> ;; Data:
  4186                              <1> 
  4187                              <1> ; 09/03/2015
  4188                              <1> ;swpq_count: dw 0 ; count of pages on the swap que
  4189                              <1> ;swp_drv:    dd 0 ; logical drive description table address of the swap drive/disk
  4190                              <1> ;swpd_size:  dd 0 ; size of swap drive/disk (volume) in sectors (512 bytes). 		  				
  4191                              <1> ;swpd_free:  dd 0 ; free page blocks (4096 bytes) on swap disk/drive (logical)
  4192                              <1> ;swpd_next:  dd 0 ; next free page block
  4193                              <1> ;swpd_last:  dd 0 ; last swap page block
  3227                                  %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 00006297 9C                  <1> 	pushfd
    31 00006298 0E                  <1> 	push 	cs
    32 00006299 E801000000          <1> 	call 	TIME_OF_DAY_1
    33 0000629E 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 0000629F 80642408FE          <1> 	and	byte [esp+8], 11111110b	; clear carry bit of eflags register
   119                              <1> 	;
   120 000062A4 80FC08              <1> 	cmp	ah, (RTC_TBE-RTC_TB)/4	; CHECK IF COMMAND IN VALID RANGE (0-7)
   121 000062A7 F5                  <1> 	cmc				; COMPLEMENT CARRY FOR ERROR EXIT
   122                              <1> 	; (*) jc short TIME_9		; EXIT WITH CARRY = 1 IF NOT VALID
   123 000062A8 721A                <1> 	jc	short _TIME_9 ; 29/05/2016
   124                              <1> 
   125 000062AA 1E                  <1> 	push	ds
   126 000062AB 56                  <1> 	push	esi
   127 000062AC 66BE1000            <1> 	mov	si, KDATA		; kernel data segment
   128 000062B0 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 000062B2 C0E402              <1> 	shl	ah, 2			; convert function to dword offset
   137 000062B5 0FB6F4              <1> 	movzx	esi, ah			; PLACE INTO ADDRESSING REGISTER
   138                              <1> 	;cli				; NO INTERRUPTS DURING TIME FUNCTIONS
   139 000062B8 FF96[CA620000]      <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 000062BE B400                <1> 	mov	ah, 0			; CLEAR (AH) TO ZERO
   143 000062C0 5E                  <1> 	pop	esi			; RECOVER USERS REGISTER
   144 000062C1 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 000062C2 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 000062C4 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 000062C9 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 000062CA [EA620000]          <1> 	dd	RTC_00			; 0 = READ CURRENT CLOCK COUNT
   187 000062CE [FD620000]          <1> 	dd	RTC_10			; 1 = SET CLOCK COUNT
   188 000062D2 [0B630000]          <1> 	dd	RTC_20			; 2 = READ THE REAL TIME CLOCK TIME
   189 000062D6 [39630000]          <1> 	dd	RTC_30			; 3 = SET REAL TIME CLOCK TIME
   190 000062DA [76630000]          <1> 	dd	RTC_40			; 4 = READ THE REAL TIME CLOCK DATE
   191 000062DE [9C630000]          <1> 	dd	RTC_50			; 5 = SET REAL TIME CLOCK DATE
   192 000062E2 [FB630000]          <1> 	dd	RTC_60			; 6 = SET THE REAL TIME CLOCK ALARM
   193 000062E6 [4D640000]          <1> 	dd	RTC_70			; 7 = RESET ALARM
   194                              <1> 
   195                              <1> RTC_TBE	equ	$
   196                              <1> 
   197                              <1> RTC_00:				; READ TIME COUNT
   198 000062EA A0[747D0100]        <1> 	mov	al, [TIMER_OFL]		; GET THE OVERFLOW FLAG
   199 000062EF C605[747D0100]00    <1> 	mov	byte [TIMER_OFL], 0	; AND THEN RESET THE OVERFLOW FLAG
   200 000062F6 8B0D[707D0100]      <1>         mov     ecx, [TIMER_LH]         ; GET COUNT OF TIME
   201 000062FC C3                  <1> 	retn
   202                              <1> 
   203                              <1> RTC_10:				; SET TIME COUNT
   204 000062FD 890D[707D0100]      <1>         mov     [TIMER_LH], ecx         ; SET TIME COUNT
   205 00006303 C605[747D0100]00    <1> 	mov	byte [TIMER_OFL], 0	; RESET OVERFLOW FLAG
   206 0000630A C3                  <1> 	retn				; RETURN WITH NO CARRY
   207                              <1> 
   208                              <1> RTC_20:				; GET RTC TIME
   209 0000630B E8C7010000          <1> 	call	UPD_IPR			; CHECK FOR UPDATE IN PROCESS
   210 00006310 7226                <1> 	jc	short RTC_29		; EXIT IF ERROR (CY= 1)
   211                              <1> 
   212 00006312 B000                <1> 	mov	al, CMOS_SECONDS	; SET ADDRESS OF SECONDS
   213 00006314 E8F4010000          <1> 	call	CMOS_READ		; GET SECONDS
   214 00006319 88C6                <1> 	mov	dh, al			; SAVE
   215 0000631B B00B                <1> 	mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   216 0000631D E8EB010000          <1> 	call	CMOS_READ		; READ CURRENT VALUE OF DSE BIT
   217 00006322 2401                <1> 	and	al, 00000001b		; MASK FOR VALID DSE BIT
   218 00006324 88C2                <1> 	mov	dl, al			; SET [DL] TO ZERO FOR NO DSE BIT
   219 00006326 B002                <1> 	mov	al, CMOS_MINUTES	; SET ADDRESS OF MINUTES
   220 00006328 E8E0010000          <1> 	call	CMOS_READ		; GET MINUTES
   221 0000632D 88C1                <1> 	mov	cl, al			; SAVE
   222 0000632F B004                <1>         mov     al, CMOS_HOURS          ; SET ADDRESS OF HOURS
   223                              <1> RTC_41:		; 29/07/2022
   224 00006331 E8D7010000          <1> 	call	CMOS_READ		; GET HOURS
   225 00006336 88C5                <1> 	mov	ch, al			; SAVE
   226                              <1> 	; 29/07/2022
   227                              <1> 	;clc				; SET CY= 0
   228                              <1> RTC_29:
   229 00006338 C3                  <1> 	retn				; RETURN WITH RESULT IN CARRY FLAG
   230                              <1> 
   231                              <1> RTC_30:				; SET RTC TIME
   232 00006339 E899010000          <1> 	call	UPD_IPR			; CHECK FOR UPDATE IN PROCESS
   233 0000633E 7305                <1> 	jnc	short RTC_35		; GO AROUND IF CLOCK OPERATING
   234 00006340 E8AD010000          <1> 	call	RTC_STA			; ELSE TRY INITIALIZING CLOCK
   235                              <1> RTC_35:
   236 00006345 88F4                <1> 	mov	ah, dh			; GET TIME BYTE - SECONDS
   237 00006347 B000                <1> 	mov	al, CMOS_SECONDS	; ADDRESS SECONDS
   238 00006349 E894000000          <1> 	call	CMOS_WRITE		; UPDATE SECONDS
   239 0000634E 88CC                <1> 	mov	ah, cl			; GET TIME BYTE - MINUTES
   240 00006350 B002                <1> 	mov	al, CMOS_MINUTES	; ADDRESS MINUTES
   241 00006352 E88B000000          <1> 	call	CMOS_WRITE		; UPDATE MINUTES
   242 00006357 88EC                <1> 	mov	ah, ch			; GET TIME BYTE - HOURS
   243 00006359 B004                <1> 	mov	al, CMOS_HOURS		; ADDRESS HOURS
   244 0000635B E882000000          <1> 	call	CMOS_WRITE		; UPDATE ADDRESS
   245                              <1> 	;mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   246                              <1> 	;mov	ah, al
   247 00006360 66B80B0B            <1> 	mov	ax, CMOS_REG_B * 257
   248 00006364 E8A4010000          <1> 	call	CMOS_READ		; READ CURRENT TIME
   249 00006369 2462                <1> 	and	al, 01100010b		; MASK FOR VALID BIT POSITIONS
   250 0000636B 0C02                <1> 	or	al, 00000010b		; TURN ON 24 HOUR MODE
   251 0000636D 80E201              <1> 	and	dl, 00000001b		; USE ONLY THE DSE BIT
   252 00006370 08D0                <1> 	or	al, dl			; GET DAY LIGHT SAVINGS TIME BIT (OSE)
   253 00006372 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 00006374 EB6C                <1> 	jmp	short CMOS_WRITE
   259                              <1> 
   260                              <1> RTC_40:				; GET RTC DATE
   261 00006376 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 0000637B 72BB                <1> 	jc	short RTC_29
   265                              <1> 
   266 0000637D B007                <1> 	mov	al, CMOS_DAY_MONTH	; ADDRESS DAY OF MONTH
   267 0000637F E889010000          <1> 	call	CMOS_READ		; READ DAY OF MONTH
   268 00006384 88C2                <1> 	mov	dl, al			; SAVE
   269 00006386 B008                <1> 	mov	al, CMOS_MONTH		; ADDRESS MONTH
   270 00006388 E880010000          <1> 	call	CMOS_READ		; READ MONTH
   271 0000638D 88C6                <1> 	mov	dh, al			; SAVE
   272 0000638F B009                <1> 	mov	al, CMOS_YEAR		; ADDRESS YEAR
   273 00006391 E877010000          <1> 	call	CMOS_READ		; READ YEAR
   274 00006396 88C1                <1> 	mov	cl, al			; SAVE
   275 00006398 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 0000639A EB95                <1> 	jmp	short RTC_41
   286                              <1> 
   287                              <1> 
   288                              <1> RTC_50:				; SET RTC DATE
   289 0000639C E836010000          <1> 	call	UPD_IPR			; CHECK FOR UPDATE IN PROCESS
   290 000063A1 7305                <1> 	jnc	short RTC_55		; GO AROUND IF NO ERROR
   291 000063A3 E84A010000          <1> 	call	RTC_STA			; ELSE INITIALIZE CLOCK
   292                              <1> RTC_55:
   293 000063A8 66B80600            <1> 	mov	ax, CMOS_DAY_WEEK	; ADDRESS OF DAY OF WEEK BYTE
   294 000063AC E831000000          <1> 	call	CMOS_WRITE		; LOAD ZEROS TO DAY OF WEEK
   295 000063B1 88D4                <1> 	mov	ah, dl			; GET DAY OF MONTH BYTE
   296 000063B3 B007                <1> 	mov	al, CMOS_DAY_MONTH	; ADDRESS DAY OF MONTH BYTE
   297 000063B5 E828000000          <1> 	call	CMOS_WRITE		; WRITE OF DAY OF MONTH REGISTER
   298 000063BA 88F4                <1> 	mov	ah, dh			; GET MONTH
   299 000063BC B008                <1> 	mov	al, CMOS_MONTH		; ADDRESS MONTH BYTE
   300 000063BE E81F000000          <1> 	call	CMOS_WRITE		; WRITE MONTH REGISTER
   301 000063C3 88CC                <1> 	mov	ah, cl			; GET YEAR BYTE
   302 000063C5 B009                <1> 	mov	al, CMOS_YEAR		; ADDRESS YEAR REGISTER
   303 000063C7 E816000000          <1> 	call	CMOS_WRITE		; WRITE YEAR REGISTER
   304 000063CC 88EC                <1> 	mov	ah, ch			; GET CENTURY BYTE
   305 000063CE B032                <1> 	mov	al, CMOS_CENTURY	; ADDRESS CENTURY BYTE
   306 000063D0 E80D000000          <1> 	call	CMOS_WRITE		; WRITE CENTURY LOCATION
   307                              <1> 	;mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   308                              <1> 	;mov	ah, al
   309 000063D5 66B80B0B            <1> 	mov	ax, CMOS_REG_B * 257
   310 000063D9 E82F010000          <1> 	call	CMOS_READ		; READ CURRENT SETTINGS
   311 000063DE 247F                <1> 	and	al, 07Fh		; CLEAR 'SET BIT'
   312 000063E0 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 000063E2 D0C0                <1> 	rol	al, 1			; MOVE NMI BIT TO LOW POSITION
   350 000063E4 F9                  <1> 	stc				; FORCE NMI BIT ON IN CARRY FLAG
   351 000063E5 D0D8                <1> 	rcr	al, 1			; HIGH BIT ON TO DISABLE NMI - OLD IN CY
   352 000063E7 FA                  <1> 	cli				; DISABLE INTERRUPTS
   353 000063E8 E670                <1> 	out	CMOS_PORT, al		; ADDRESS LOCATION AND DISABLE NMI
   354 000063EA 88E0                <1> 	mov	al, ah			; GET THE DATA BYTE TO WRITE
   355 000063EC E671                <1> 	out	CMOS_DATA, al		; PLACE IN REQUESTED CMOS LOCATION
   356 000063EE 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 000063F0 D0D8                <1> 	rcr	al, 1			; PUT ORIGINAL NMI MASK BIT INTO ADDRESS
   359 000063F2 E670                <1> 	out	CMOS_PORT, al		; SET DEFAULT TO READ ONLY REGISTER
   360                              <1> 	;nop				; I/O DELAY
   361                              <1> 	; 29/07/2022
   362 000063F4 E6EB                <1> 	out	0EBh, al ; NEWIODELAY ; AWARD BIOS 1999, ATIME.ASM
   363 000063F6 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 000063F8 30C0                <1> 	xor	al, al
   372 000063FA C3                  <1> 	retn
   373                              <1> 
   374                              <1> ;-------------------------------------------------------------------------------
   375                              <1> 
   376                              <1> RTC_60:				; SET RTC ALARM
   377 000063FB B00B                <1> 	mov	al, CMOS_REG_B		; ADDRESS ALARM
   378 000063FD E80B010000          <1> 	call	CMOS_READ		; READ ALARM REGISTER
   379 00006402 A820                <1> 	test	al, 20h			; CHECK FOR ALARM ALREADY ENABLED
   380 00006404 F9                  <1> 	stc				; SET CARRY IN CASE OF ERROR
   381 00006405 7541                <1> 	jnz	short RTC_69		; ERROR EXIT IF ALARM SET
   382 00006407 E8CB000000          <1> 	call	UPD_IPR			; CHECK FOR UPDATE IN PROCESS
   383 0000640C 7305                <1> 	jnc	short RTC_65		; SKIP INITIALIZATION IF NO ERROR
   384 0000640E E8DF000000          <1> 	call	RTC_STA			; ELSE INITIALIZE CLOCK
   385                              <1> RTC_65:	
   386 00006413 88F4                <1> 	mov	ah, dh			; GET SECONDS BYTE
   387 00006415 B001                <1> 	mov	al, CMOS_SEC_ALARM	; ADDRESS THE SECONDS ALARM REGISTER
   388 00006417 E8C6FFFFFF          <1> 	call	CMOS_WRITE		; INSERT SECONDS
   389 0000641C 88CC                <1> 	mov	ah, cl			; GET MINUTES PARAMETER
   390 0000641E B003                <1> 	mov	al, CMOS_MIN_ALARM	; ADDRESS MINUTES ALARM REGISTER
   391 00006420 E8BDFFFFFF          <1> 	call	CMOS_WRITE		; INSERT MINUTES
   392 00006425 88EC                <1> 	mov	ah, ch			; GET HOURS PARAMETER
   393 00006427 B005                <1> 	mov	al, CMOS_HR_ALARM	; ADDRESS HOUR ALARM REGISTER
   394 00006429 E8B4FFFFFF          <1> 	call	CMOS_WRITE		; INSERT HOURS
   395 0000642E E4A1                <1> 	in	al, INTB01		; READ SECOND INTERRUPT MASK REGISTER
   396 00006430 24FE                <1> 	and	al, 0FEh		; ENABLE ALARM TIMER BIT (CY= 0)
   397 00006432 E6A1                <1> 	out	INTB01, al		; WRITE UPDATED MASK
   398                              <1> 	;mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   399                              <1> 	;mov	ah, al
   400 00006434 66B80B0B            <1> 	mov	ax, CMOS_REG_B * 257
   401 00006438 E8D0000000          <1> 	call	CMOS_READ		; READ CURRENT ALARM REGISTER
   402 0000643D 247F                <1> 	and	al, 07Fh		; ENSURE SET BIT TURNED OFF
   403 0000643F 0C20                <1> 	or	al, 20h			; TURN ON ALARM ENABLE
   404 00006441 86E0                <1> 	xchg	ah, al			; MOVE MASK TO OUTPUT REGISTER
   405 00006443 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 00006448 66B80000            <1> 	mov	ax, 0			; CLEAR AX REGISTER
   410 0000644C 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 0000644D 66B80B0B            <1> 	mov	ax, CMOS_REG_B * 257	; ADDRESS ALARM REGISTER (TO BOTH AH,AL)
   416 00006451 E8B7000000          <1> 	call	CMOS_READ		; READ ALARM REGISTER
   417 00006456 2457                <1> 	and	al, 57h			; TURN OFF ALARM ENABLE
   418 00006458 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 0000645A 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 0000645C 1E                  <1> 	push	ds			; LEAVE INTERRUPTS DISABLED
   447 0000645D 50                  <1> 	push	eax			; SAVE REGISTERS
   448 0000645E 57                  <1> 	push	edi
   449                              <1> RTC_I_1:				; CHECK FOR SECOND INTERRUPT
   450 0000645F 66B88C8B            <1> 	mov	ax, 256*(CMOS_REG_B+NMI)+CMOS_REG_C+NMI ; ALARM AND STATUS
   451 00006463 E670                <1> 	out	CMOS_PORT, al		; WRITE ALARM FLAG MASK ADDRESS
   452 00006465 90                  <1> 	nop				; I/O DELAY
   453 00006466 EB00                <1> 	jmp	short $+2
   454 00006468 E471                <1> 	in	al, CMOS_DATA		; READ AND RESET INTERRUPT REQUEST FLAGS
   455 0000646A A860                <1> 	test	al, 01100000b		; CHECK FOR EITHER INTERRUPT PENDING
   456 0000646C 745B                <1> 	jz	short	RTC_I_9		; EXIT IF NOT A VALID RTC INTERRUPT
   457                              <1> 
   458 0000646E 86E0                <1> 	xchg	ah, al			; SAVE FLAGS AND GET ENABLE ADDRESS
   459 00006470 E670                <1> 	out	CMOS_PORT, al		; WRITE ALARM ENABLE MASK ADDRESS
   460 00006472 90                  <1> 	nop				; I/O DELAY
   461 00006473 EB00                <1> 	jmp	short $+2	
   462 00006475 E471                <1> 	in	al, CMOS_DATA		; READ CURRENT ALARM ENABLE MASK
   463 00006477 20E0                <1> 	and	al, ah			; ALLOW ONLY SOURCES THAT ARE ENABLED
   464 00006479 A840                <1> 	test	al, 01000000b		; CHECK FOR PERIODIC INTERRUPT
   465 0000647B 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 0000647D 66BF1000            <1> 	mov	di, KDATA		; kernel data segment
   470 00006481 8EDF                <1> 	mov	ds, di
   471                              <1> 	
   472 00006483 812D[687D0100]D003- <1> 	sub	dword [RTC_LH], 976	; DECREMENT COUNT BY 1/1024
   472 0000648B 0000                <1>
   473 0000648D 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 0000648F 50                  <1> 	push	eax
   480 00006490 66B88B8B            <1> 	mov	ax, 257*(CMOS_REG_B+NMI) ; INTERRUPT ENABLE REGISTER
   481 00006494 E670                <1> 	out	CMOS_PORT, al		; WRITE ADDRESS TO CMOS CLOCK
   482 00006496 90                  <1> 	nop				; I/O DELAY
   483 00006497 EB00                <1> 	jmp	short $+2
   484 00006499 E471                <1> 	in	al, CMOS_DATA		; READ CURRENT ENABLES
   485 0000649B 24BF                <1> 	and	al, 0BFh		; TURN OFF PIE
   486 0000649D 86C4                <1> 	xchg	al, ah			; GET CMOS ADDRESS AND SAVE VALUE
   487 0000649F E670                <1> 	out	CMOS_PORT, al		; ADDRESS REGISTER B
   488 000064A1 86C4                <1> 	xchg	al, ah			; GET NEW INTERRUPT ENABLE MASK
   489 000064A3 E671                <1> 	out	CMOS_DATA, al		; SET MASK IN INTERRUPT ENABLE REGISTER
   490 000064A5 C605[6C7D0100]00    <1> 	mov	byte [RTC_WAIT_FLAG], 0	; SET FUNCTION ACTIVE FLAG OFF
   491 000064AC 8B3D[6D7D0100]      <1> 	mov	edi, [USER_FLAG]	; SET UP (DS:DI) TO POINT TO USER FLAG
   492 000064B2 C60780              <1> 	mov	byte [edi], 80h		; TURN ON USERS FLAG
   493                              <1> 	;pop	ax			; GET INTERRUPT SOURCE BACK
   494                              <1> 	; 18/04/2021
   495 000064B5 58                  <1> 	pop	eax
   496                              <1> RTC_I_5:
   497 000064B6 A820                <1> 	test	al, 00100000b		; TEST FOR ALARM INTERRUPT
   498 000064B8 740D                <1> 	jz	short RTC_I_7		; SKIP USER INTERRUPT CALL IF NOT ALARM
   499                              <1> 
   500 000064BA B00D                <1> 	mov	al, CMOS_REG_D		; POINT TO DEFAULT READ ONLY REGISTER
   501 000064BC E670                <1> 	out	CMOS_PORT, al		; ENABLE NMI AND CMOS ADDRESS TO DEFAULT
   502 000064BE FB                  <1> 	sti				; INTERRUPTS BACK ON NOW
   503 000064BF 52                  <1> 	push	edx
   504 000064C0 E87ABD0000          <1> 	call	INT4Ah			; TRANSFER TO USER ROUTINE
   505 000064C5 5A                  <1> 	pop	edx
   506 000064C6 FA                  <1> 	cli				; BLOCK INTERRUPT FOR RETRY
   507                              <1> RTC_I_7:				; RESTART ROUTINE TO HANDLE DELAYED
   508 000064C7 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 000064C9 B00D                <1> 	mov	al, CMOS_REG_D		; POINT TO DEFAULT READ ONLY REGISTER
   512 000064CB E670                <1> 	out	CMOS_PORT, al		; ENABLE NMI AND CMOS ADDRESS TO DEFAULT
   513 000064CD B020                <1> 	mov	al, EOI			; END OF INTERRUPT MASK TO 8259 - 2
   514 000064CF E6A0                <1> 	out	INTB00, al		; TO 8259 - 2
   515 000064D1 E620                <1> 	out	INTA00,	al		; TO 8259 - 1
   516 000064D3 5F                  <1> 	pop	edi			; RESTORE REGISTERS
   517 000064D4 58                  <1> 	pop	eax
   518 000064D5 1F                  <1> 	pop	ds
   519 000064D6 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 000064D7 51                  <1> 	push	ecx
   528                              <1> 
   529                              <1> 	; 29/05/2016
   530 000064D8 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 000064DD B00A                <1> 	mov	al, CMOS_REG_A		; ADDRESS STATUS REGISTER A
   539 000064DF FA                  <1> 	cli				; NO TIMER INTERRUPTS DURING UPDATES
   540 000064E0 E828000000          <1> 	call	CMOS_READ		; READ UPDATE IN PROCESS FLAG
   541 000064E5 A880                <1> 	test	al, 80h			; IF UIP BIT IS ON ( CANNOT READ TIME )
   542 000064E7 7406                <1> 	jz	short UPD_90		; EXIT WITH CY= 0 IF CAN READ CLOCK NOW
   543 000064E9 FB                  <1> 	sti				; ALLOW INTERRUPTS WHILE WAITING
   544 000064EA E2F1                <1> 	loop	UPD_10			; LOOP TILL READY OR TIMEOUT
   545 000064EC 31C0                <1> 	xor	eax, eax ; xor ax, ax	; CLEAR RESULTS IF ERROR
   546 000064EE F9                  <1> 	stc				; SET CARRY FOR ERROR
   547                              <1> UPD_90:
   548 000064EF 59                  <1> 	pop	ecx			; RESTORE CALLERS REGISTER
   549 000064F0 FA                  <1> 	cli				; INTERRUPTS OFF DURING SET
   550 000064F1 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 000064F2 66B80A26            <1> 	mov	ax, (26h*100h)+CMOS_REG_A
   557 000064F6 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 000064FB 66B80B82            <1> 	mov	ax, (82h*100h)+CMOS_REG_B
   561 000064FF E8DEFEFFFF          <1> 	call	CMOS_WRITE		; AND 24 HOUR MODE TO REGISTER B
   562 00006504 B00C                <1> 	mov	al, CMOS_REG_C		; ADDRESS REGISTER C
   563 00006506 E802000000          <1> 	call	CMOS_READ		; READ REGISTER C TO INITIALIZE
   564 0000650B 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 0000650D D0C0                <1> 	rol	al, 1			; MOVE NMI BIT TO LOW POSITION
   597 0000650F F9                  <1> 	stc				; FORCE NMI BIT ON IN CARRY FLAG
   598 00006510 D0D8                <1> 	rcr	al, 1			; HIGH BIT ON TO DISABLE NMI - OLD IN CY
   599 00006512 FA                  <1> 	cli				; DISABLE INTERRUPTS
   600 00006513 E670                <1> 	out	CMOS_PORT, al		; ADDRESS LOCATION AND DISABLE NMI
   601                              <1> 	; 29/05/2016
   602                              <1> 	;nop				; I/O DELAY
   603 00006515 E6EB                <1> 	out	0EBh, al ; NEWIODELAY ; AWARD BIOS 1999, ATIME.ASM
   604                              <1> 	;
   605 00006517 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 00006519 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 0000651A 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 0000651C D0D8                <1> 	rcr	al, 1			; PUT ORIGINAL NMI MASK BIT INTO ADDRESS
   614 0000651E 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 00006520 58                  <1> 	pop	eax
   618                              <1> 	; 29/07/2022
   619                              <1> 	;popf
   620 00006521 F8                  <1> 	clc	; 29/07/2022	
   621 00006522 C3                  <1> 	retn				; RETURN WITH FLAGS RESTORED
   622                              <1> 
   623                              <1> ;-------------------------------------------------------------------------------
   624                              <1> 
   625                              <1> ; /// End Of TIMER FUNCTIONS ///
  3228                                  
  3229 00006523 90<rep Dh>              Align 16
  3230                                  
  3231                                  gdt:	; Global Descriptor Table
  3232                                  	; 02/12/2020
  3233                                  	; (30/07/2015, conforming cs)
  3234                                  	; (26/03/2015)
  3235                                  	; (24/03/2015, tss)
  3236                                  	; (19/03/2015)
  3237                                  	; (29/12/2013)
  3238                                  	;
  3239 00006530 0000000000000000        	dw 0, 0, 0, 0		; NULL descriptor
  3240                                  gdt_kcode:
  3241                                  	; 18/08/2014
  3242                                  			; 8h kernel code segment, base = 00000000h		
  3243                                  	;dw 0FFFFh, 0, 9E00h, 00CFh	; KCODE  ; 30/12/2016	 
  3244 00006538 FFFF0000009ACF00        	dw 0FFFFh, 0, 9A00h, 00CFh	; KCODE
  3245                                  gdt_kdata:
  3246                                  			; 10h kernel data segment, base = 00000000h	
  3247 00006540 FFFF00000092CF00        	dw 0FFFFh, 0, 9200h, 00CFh	; KDATA
  3248                                  gdt_ucode:
  3249                                  			; 1Bh user code segment, base address = 400000h ; CORE
  3250                                  	;dw 0FBFFh, 0, 0FE40h, 00CFh	; UCODE  ; 30/12/2016	
  3251 00006548 FFFB000040FACF00        	dw 0FBFFh, 0, 0FA40h, 00CFh	; UCODE
  3252                                  gdt_udata: 
  3253                                  			; 23h user data segment, base address = 400000h ; CORE
  3254 00006550 FFFB000040F2CF00        	dw 0FBFFh, 0, 0F240h, 00CFh	; UDATA
  3255                                  gdt_tss:
  3256                                  			; Task State Segment
  3257 00006558 6700                    	dw 0067h ; Limit = 103 ; (104-1, tss size = 104 byte, 
  3258                                  			       ;  no IO permission in ring 3)
  3259                                  gdt_tss0:
  3260 0000655A 0000                    	dw 0  ; TSS base address, bits 0-15 
  3261                                  gdt_tss1:
  3262 0000655C 00                      	db 0  ; TSS base address, bits 16-23 
  3263                                  	      		; 49h	
  3264 0000655D E9                      	db 11101001b ; 0E9h => P=1/DPL=11/0/1/0/B/1 --> B = Task is busy (1)
  3265 0000655E 00                      	db 0 ; G/0/0/AVL/LIMIT=0000 ; (Limit bits 16-19 = 0000) (G=0, 1 byte)
  3266                                  gdt_tss2:
  3267 0000655F 00                      	db 0  ; TSS base address, bits 24-31 
  3268                                  
  3269                                  	; 04/12/2023 - TRDOS v2.0.7
  3270                                  	; 30/11/2020
  3271                                  	; 29/11/2020 - TRDOS v2.0.3
  3272                                  	; VESA VBE3 VIDE BIOS 32 BIT PMI SEGMENTS (16 bit segments)
  3273                                  			; 30h ; VBE3CS
  3274                                  _vbe3_CS:  ; vesa vbe3 bios uses this as code seg (same addr with _vbe3_DS)
  3275                                  	; limit = 65536, base addr = 0, P/DPL/1/Type/C/R/A = 9Ah, 16 bit
  3276                                  	;dw 0FFFFh, 0, 9A00h, 0 ; Note: base addr will be initialized
  3277                                  	; 04/12/2023 - TRDOS 386 v2.0.7	; (+!*!+)
  3278 00006560 FFFF0000069A0000        	dw 0FFFFh, 0, 9A06h, 0	; VBE3BIOSCODE_ADDR = 60000h
  3279                                  			; 38h ; VBE3BDS
  3280                                  _vbe3_BDS: ; vesa vbe3 bios uses this as equivalent of rombios data segment
  3281                                  	; limit = 1536, base addr = 0, P/DPL/1/Type/E/W/A = 92h, 16 bit
  3282 00006568 FF05000000920000        	dw 05FFh, 0, 9200h, 0 ; Note: base addr will be initialized	
  3283                                  			; 40h ; VBE3A000 
  3284                                  _A0000Sel: ; VGA default video memory address
  3285                                  	; limit = 65536, base addr = 0A0000h, 16 bit
  3286 00006570 FFFF00000A920000        	dw 0FFFFh, 0, 920Ah, 0
  3287                                  			; 48h ; VBE3B000 
  3288                                  _B0000Sel: ; MDA (monochrome) video memory address
  3289                                  	; limit = 65536, base addr = 0B0000h, 16 bit
  3290 00006578 FFFF00000B920000        	dw 0FFFFh, 0, 920Bh, 0
  3291                                  			; 50h ; VBE3B800 
  3292                                  _B8000Sel: ; CGA video memory address
  3293                                  	; limit = 32768, base addr = 0B8000h, 16 bit
  3294 00006580 FF7F00800B920000        	dw 07FFFh, 8000h, 920Bh, 0
  3295                                  			; 58h ; VBE3DS 
  3296                                  _vbe3_DS: ; vesa vbe3 bios uses this as data seg (CodeSegSel in PMInfoBlock)
  3297                                  	; limit = 65536, base addr = 0, P/DPL/1/Type/E/W/A = 92h, 16 bit
  3298                                  	;dw 0FFFFh, 0, 9200h, 0 ; Note: base addr will be initialized
  3299                                  	; 04/12/2023 - TRDOS 386 v2.0.7	; (+!*!+)
  3300 00006588 FFFF000006920000        	dw 0FFFFh, 0, 9206h, 0	; VBE3BIOSCODE_ADDR = 60000h
  3301                                  			; 60h ; VBE3SS   
  3302                                  _vbe3_SS: ; kernel's stack segment but 16 bit version (same stack addr)
  3303                                  	; limit = 1024, base addr = 0, P/DPL/1/Type/E/W/A = 92h, 16 bit
  3304 00006590 FF03000000920000        	dw 03FFh, 0, 9200h, 0 ; Note: base addr will be initialized
  3305                                  			; 68h ; VBE3ES 	
  3306                                  _vbe3_ES: ; extra 16 bit segment points to buffers in kernel's mem space
  3307                                  	; limit = 2048, base addr = 0, P/DPL/1/Type/E/W/A = 92h, 16 bit
  3308 00006598 FF07000000920000        	dw 07FFh, 0, 9200h,0 ; Note: base addr will be initialized
  3309                                  			; 70h ; KODE16	
  3310                                  _16bit_CS: ; 16 bit code segment points to kernel's far return addr
  3311                                  	; limit = 16M, base addr = 0, P/DPL/1/Type/E/W/A = 92h, 16 bit
  3312 000065A0 FFFF0000009AFF00        	dw 0FFFFh, 0, 9A00h, 00FFh ; Note: base addr will be initialized
  3313                                  
  3314                                  gdt_end:
  3315                                  	;; 9Eh = 1001 1110b (GDT byte 5) P=1/DPL=00/1/TYPE=1110, 
  3316                                  					;; Type= 1 (code)/C=1/R=1/A=0
  3317                                  		; P= Present, DPL=0=ring 0,  1= user (0= system)
  3318                                  		; 1= Code C= Conforming, R= Readable, A= Accessed
  3319                                  
  3320                                  	;; 9Ah = 1001 1010b (GDT byte 5) P=1/DPL=00/1/TYPE=1010, 
  3321                                  					;; Type= 1 (code)/C=0/R=1/A=0
  3322                                  		; P= Present, DPL=0=ring 0,  1= user (0= system)
  3323                                  		; 1= Code C= non-Conforming, R= Readable, A= Accessed
  3324                                  
  3325                                  	;; 92h = 1001 0010b (GDT byte 5) P=1/DPL=00/1/TYPE=1010, 
  3326                                  					;; Type= 0 (data)/E=0/W=1/A=0
  3327                                  		; P= Present, DPL=0=ring 0,  1= user (0= system)
  3328                                  		; 0= Data E= Expansion direction (1= down, 0= up)
  3329                                  		; W= Writeable, A= Accessed
  3330                                  
  3331                                  	;; FEh = 1111 1110b (GDT byte 5) P=1/DPL=11/1/TYPE=1110, 
  3332                                  					;; Type= 1 (code)/C=1/R=1/A=0
  3333                                  		; P= Present, DPL=3=ring 3,  1= user (0= system)
  3334                                  		; 1= Code C= Conforming, R= Readable, A= Accessed
  3335                                  	
  3336                                  	;; FAh = 1111 1010b (GDT byte 5) P=1/DPL=11/1/TYPE=1010, 
  3337                                  					;; Type= 1 (code)/C=0/R=1/A=0
  3338                                  		; P= Present, DPL=3=ring 3,  1= user (0= system)
  3339                                  		; 1= Code C= non-Conforming, R= Readable, A= Accessed
  3340                                  
  3341                                  	;; F2h = 1111 0010b (GDT byte 5) P=1/DPL=11/1/TYPE=0010, 
  3342                                  					;; Type= 0 (data)/E=0/W=1/A=0
  3343                                  		; P= Present, DPL=3=ring 3,  1= user (0= system)
  3344                                  		; 0= Data E= Expansion direction (1= down, 0= up)
  3345                                  	
  3346                                  	;; CFh = 1100 1111b (GDT byte 6) G=1/B=1/0/AVL=0, Limit=1111b (3)
  3347                                  
  3348                                  		;; Limit = FFFFFh (=> FFFFFh+1= 100000h) // bits 0-15, 48-51 //
  3349                                  		;	 = 100000h * 1000h (G=1) = 4GB
  3350                                  		;; Limit = FFBFFh (=> FFBFFh+1= FFC00h) // bits 0-15, 48-51 //
  3351                                  		;	 = FFC00h * 1000h (G=1) = 4GB - 4MB
  3352                                  		; G= Granularity (1= 4KB), B= Big (32 bit), 
  3353                                  		; AVL= Available to programmers	
  3354                                  
  3355                                  gdtd:
  3356 000065A8 7700                            dw gdt_end - gdt - 1    ; Limit (size)
  3357 000065AA [30650000]                      dd gdt			; Address of the GDT
  3358                                  
  3359                                  	; 20/08/2014
  3360                                  idtd:
  3361 000065AE 7F02                            dw idt_end - idt - 1    ; Limit (size)
  3362 000065B0 [087A0100]                      dd idt			; Address of the IDT
  3363                                  
  3364                                  ; 20/02/2017
  3365                                  ;;; 11/03/2015
  3366                                  %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 000065B4 [17660000]          <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 000065B8 01                  <1> 		DB	01		; DRIVE TYPE, MEDIA TABLE
   113                              <1>                 ;DW	MD_TBL1
   114 000065B9 [D6650000]          <1> 		dd	MD_TBL1
   115 000065BD 82                  <1> 		DB	02+BIT7ON
   116                              <1> 		;DW	MD_TBL2
   117 000065BE [E3650000]          <1>                 dd      MD_TBL2
   118 000065C2 02                  <1> DR_DEFAULT:	DB	02
   119                              <1>                 ;DW	MD_TBL3
   120 000065C3 [F0650000]          <1> 		dd      MD_TBL3
   121 000065C7 03                  <1> 		DB	03
   122                              <1>                 ;DW	MD_TBL4
   123 000065C8 [FD650000]          <1> 		dd      MD_TBL4
   124 000065CC 84                  <1> 		DB	04+BIT7ON
   125                              <1>                 ;DW	MD_TBL5
   126 000065CD [0A660000]          <1> 		dd      MD_TBL5
   127 000065D1 04                  <1> 		DB	04
   128                              <1>                 ;DW	MD_TBL6
   129 000065D2 [17660000]          <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 000065D6 DF                  <1> 	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   141 000065D7 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   142 000065D8 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   143 000065D9 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   144 000065DA 09                  <1> 	DB	09		; EOT (LAST SECTOR ON TRACK)
   145 000065DB 2A                  <1> 	DB	02AH		; GAP LENGTH
   146 000065DC FF                  <1> 	DB	0FFH		; DTL
   147 000065DD 50                  <1> 	DB	050H		; GAP LENGTH FOR FORMAT
   148 000065DE F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   149 000065DF 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   150 000065E0 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   151 000065E1 27                  <1> 	DB	39		; MAX. TRACK NUMBER
   152 000065E2 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 000065E3 DF                  <1> 	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   158 000065E4 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   159 000065E5 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   160 000065E6 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   161 000065E7 09                  <1> 	DB	09		; EOT (LAST SECTOR ON TRACK)
   162 000065E8 2A                  <1> 	DB	02AH		; GAP LENGTH
   163 000065E9 FF                  <1> 	DB	0FFH		; DTL
   164 000065EA 50                  <1> 	DB	050H		; GAP LENGTH FOR FORMAT
   165 000065EB F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   166 000065EC 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   167 000065ED 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   168 000065EE 27                  <1> 	DB	39		; MAX. TRACK NUMBER
   169 000065EF 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 000065F0 DF                  <1> 	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   175 000065F1 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   176 000065F2 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   177 000065F3 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   178 000065F4 0F                  <1> 	DB	15		; EOT (LAST SECTOR ON TRACK)
   179 000065F5 1B                  <1> 	DB	01BH		; GAP LENGTH
   180 000065F6 FF                  <1> 	DB	0FFH		; DTL
   181 000065F7 54                  <1> 	DB	054H		; GAP LENGTH FOR FORMAT
   182 000065F8 F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   183 000065F9 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   184 000065FA 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   185 000065FB 4F                  <1> 	DB	79		; MAX. TRACK NUMBER
   186 000065FC 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 000065FD DF                  <1> 	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   192 000065FE 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   193 000065FF 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   194 00006600 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   195 00006601 09                  <1> 	DB	09		; EOT (LAST SECTOR ON TRACK)
   196 00006602 2A                  <1> 	DB	02AH		; GAP LENGTH
   197 00006603 FF                  <1> 	DB	0FFH		; DTL
   198 00006604 50                  <1> 	DB	050H		; GAP LENGTH FOR FORMAT
   199 00006605 F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   200 00006606 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   201 00006607 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   202 00006608 4F                  <1> 	DB	79		; MAX. TRACK NUMBER
   203 00006609 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 0000660A DF                  <1> 	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   209 0000660B 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   210 0000660C 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   211 0000660D 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   212 0000660E 09                  <1> 	DB	09		; EOT (LAST SECTOR ON TRACK)
   213 0000660F 2A                  <1> 	DB	02AH		; GAP LENGTH
   214 00006610 FF                  <1> 	DB	0FFH		; DTL
   215 00006611 50                  <1> 	DB	050H		; GAP LENGTH FOR FORMAT
   216 00006612 F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   217 00006613 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   218 00006614 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   219 00006615 4F                  <1> 	DB	79		; MAX. TRACK NUMBER
   220 00006616 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 00006617 AF                  <1> 	DB	10101111B	; SRT=A, HD UNLOAD=0F - 1ST SPECIFY BYTE
   226 00006618 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   227 00006619 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   228 0000661A 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   229 0000661B 12                  <1> 	DB	18		; EOT (LAST SECTOR ON TRACK)
   230 0000661C 1B                  <1> 	DB	01BH		; GAP LENGTH
   231 0000661D FF                  <1> 	DB	0FFH		; DTL
   232 0000661E 6C                  <1> 	DB	06CH		; GAP LENGTH FOR FORMAT
   233 0000661F F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   234 00006620 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   235 00006621 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   236 00006622 4F                  <1> 	DB	79		; MAX. TRACK NUMBER
   237 00006623 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 00006624 E0                  <1> 	db	NO_ERR
   280 00006625 024001BB            <1> 	db	BAD_ADDR_MARK,BAD_SEEK,BAD_CMD,UNDEF_ERR
   281 00006629 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 0000662D FF                  <1> pfd:		db	0FFh
   296                              <1> 
   297                              <1> align 2
   298                              <1> 
   299 0000662E F001                <1> HF_PORT:	dw 	1F0h  ; Default = 1F0h
   300                              <1> 			      ; (170h)
   301 00006630 F603                <1> HF_REG_PORT:	dw	3F6h  ; HF_PORT + 206h
   302                              <1> 
   303                              <1> ; 05/01/2015 
   304 00006632 00                  <1> hf_m_s:         db      0     ; (0 = Master, 1 = Slave)
   305                              <1> 
   306                              <1> ; *****************************************************************************
  3367                                  
  3368 00006633 90                      Align 2
  3369                                  
  3370                                  ; 04/11/2014 (Retro UNIX 386 v1)
  3371 00006634 0000                    mem_1m_1k:   dw 0  ; Number of contiguous KB between
  3372                                                       ; 1 and 16 MB, max. 3C00h = 15 MB.
  3373 00006636 0000                    mem_16m_64k: dw 0  ; Number of contiguous 64 KB blocks
  3374                                  		   ; between 16 MB and 4 GB.
  3375                                  
  3376                                  ; 12/11/2014 (Retro UNIX 386 v1)
  3377 00006638 00                      boot_drv:    db 0 ; boot drive number (physical)
  3378                                  ; 24/11/2014
  3379 00006639 00                      drv:	     db 0 
  3380 0000663A 00                      last_drv:    db 0 ; last hdd
  3381 0000663B 00                      hdc:         db 0  ; number of hard disk drives
  3382                                  		     ; (present/detected)
  3383                                  
  3384                                  ; 24/11/2014 (Retro UNIX 386 v1)
  3385                                  ; Physical drive type & flags
  3386 0000663C 00                      fd0_type:    db 0  ; floppy drive type
  3387 0000663D 00                      fd1_type:    db 0  ; 4 = 1.44 Mb, 80 track, 3.5" (18 spt)
  3388                                  		     ; 6 = 2.88 Mb, 80 track, 3.5" (36 spt)
  3389                                  		     ; 3 = 720 Kb, 80 track, 3.5" (9 spt)
  3390                                  		     ; 2 = 1.2 Mb, 80 track, 5.25" (15 spt)
  3391                                  		     ; 1 = 360 Kb, 40 track, 5.25" (9 spt)		
  3392 0000663E 00                      hd0_type:    db 0  ; EDD status for hd0 (bit 7 = present flag)
  3393 0000663F 00                      hd1_type:    db 0  ; EDD status for hd1 (bit 7 = present flag)
  3394 00006640 00                      hd2_type:    db 0  ; EDD status for hd2 (bit 7 = present flag)
  3395 00006641 00                      hd3_type:    db 0  ; EDD status for hd3 (bit 7 = present flag)
  3396                                  		     ; bit 0 - Fixed disk access subset supported
  3397                                  		     ; bit 1 - Drive locking and ejecting
  3398                                  		     ; bit 2 - Enhanced disk drive support
  3399                                  		     ; bit 3 = Reserved (64 bit EDD support)
  3400                                  		     ; (If bit 0 is '1' Retro UNIX 386 v1
  3401                                  		     ; will interpret it as 'LBA ready'!)
  3402                                  
  3403                                  ; 08/08/2022
  3404                                  ; (drv.cylinders, drv.spt, drv.spt will not be used now on)
  3405                                  ; ('diskio.inc')
  3406                                  ; ((spt and heads and cylinder counts will be taken from DPT))
  3407                                  
  3408                                  ;; 11/03/2015 - 10/07/2015
  3409                                  ;drv.cylinders: dw 0,0,0,0,0,0,0
  3410                                  ;drv.heads:     dw 0,0,0,0,0,0,0
  3411                                  ;drv.spt:       dw 0,0,0,0,0,0,0
  3412                                  ; 12/07/2022 - 11/03/2015
  3413 00006642 000000000000000000-     drv.size:      dd 0,0,0,0,0,0,0
  3413 0000664B 000000000000000000-
  3413 00006654 000000000000000000-
  3413 0000665D 00                 
  3414 0000665E 00000000000000          drv.status:    db 0,0,0,0,0,0,0
  3415 00006665 00000000000000          drv.error:     db 0,0,0,0,0,0,0
  3416                                  ;
  3417                                  
  3418                                  Align 2
  3419                                  
  3420                                  ;;; 11/03/2015
  3421                                  %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 0000666C 524F50514B          <1> K30:	db	82,79,80,81,75
    37 00006671 4C4D474849          <1> 	db	76,77,71,72,73		; 10 NUMBER ON KEYPAD
    38                              <1> ;-----	SUPER-SHIFT-TABLE 
    39 00006676 101112131415        <1> 	db	16,17,18,19,20,21	; A-Z TYPEWRITER CHARS
    40 0000667C 161718191E1F        <1> 	db	22,23,24,25,30,31
    41 00006682 202122232425        <1> 	db	32,33,34,35,36,37
    42 00006688 262C2D2E2F30        <1> 	db	38,44,45,46,47,48
    43 0000668E 3132                <1> 	db	49,50
    44                              <1> 
    45                              <1> ;-----	TABLE OF SHIFT KEYS AND MASK VALUES
    46                              <1> ;-----	KEY_TABLE 
    47 00006690 52                  <1> _K6:    db      INS_KEY                 ; INSERT KEY
    48 00006691 3A4546381D          <1> 	db	CAPS_KEY,NUM_KEY,SCROLL_KEY,ALT_KEY,CTL_KEY
    49 00006696 2A36                <1>         db      LEFT_KEY,RIGHT_KEY
    50                              <1> _K6L    equ     $-_K6
    51                              <1> 
    52                              <1> ;-----	MASK_TABLE
    53 00006698 80                  <1> _K7:    db      INS_SHIFT               ; INSERT MODE SHIFT
    54 00006699 4020100804          <1> 	db	CAPS_SHIFT,NUM_SHIFT,SCROLL_SHIFT,ALT_SHIFT,CTL_SHIFT
    55 0000669E 0201                <1> 	db	LEFT_SHIFT,RIGHT_SHIFT
    56                              <1> 
    57                              <1> ;-----	TABLES FOR CTRL CASE		;---- CHARACTERS ------
    58 000066A0 1BFF00FFFFFF        <1> _K8:	db	27,-1,0,-1,-1,-1	; Esc, 1, 2, 3, 4, 5
    59 000066A6 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 000066AC FF7F94111705        <1> 	db	-1,127,148,17,23,5 ; 24/07/2022
    62 000066B2 12141915090F        <1> 	db	18,20,25,21,9,15	; R, T, Y, U, I, O
    63 000066B8 101B1D0AFF01        <1> 	db	16,27,29,10,-1,1	; P, [, ], Enter, Ctrl, A
    64 000066BE 13040607080A        <1> 	db	19,4,6,7,8,10		; S, D, F, G, H, J
    65 000066C4 0B0CFFFFFFFF        <1> 	db	11,12,-1,-1,-1,-1	; K, L, :, ', `, LShift
    66 000066CA 1C1A18031602        <1> 	db	28,26,24,3,22,2		; Bkslash, Z, X, C, V, B
    67 000066D0 0E0DFFFFFFFF        <1> 	db	14,13,-1,-1,-1,-1	; N, M, ,, ., /, RShift
    68 000066D6 96FF20FF            <1> 	db	150,-1,' ',-1		; *, ALT, Spc, CL
    69                              <1> 	;				;----- FUNCTIONS ------		
    70 000066DA 5E5F60616263        <1> 	db 	94,95,96,97,98,99	; F1 - F6
    71 000066E0 64656667FFFF        <1> 	db	100,101,102,103,-1,-1	; F7 - F10, NL, SL
    72 000066E6 778D848E738F        <1> 	db	119,141,132,142,115,143	; Home, Up, PgUp, -, Left, Pad5
    73 000066EC 749075917692        <1> 	db 	116,144,117,145,118,146 ; Right, +, End, Down, PgDn, Ins
    74 000066F2 93FFFFFF898A        <1> 	db	147,-1,-1,-1,137,138	; Del, SysReq, Undef, WT, F11, F12
    75                              <1> 
    76                              <1> ;-----	TABLES FOR LOWER CASE ----------
    77 000066F8 1B3132333435363738- <1> K10:	db 	27,'1234567890-=',8,9
    77 00006701 39302D3D0809        <1>
    78 00006707 71776572747975696F- <1> 	db 	'qwertyuiop[]',13,-1,'asdfghjkl;',39
    78 00006710 705B5D0DFF61736466- <1>
    78 00006719 67686A6B6C3B27      <1>
    79 00006720 60FF5C7A786376626E- <1> 	db	96,-1,92,'zxcvbnm,./',-1,'*',-1,' ',-1
    79 00006729 6D2C2E2FFF2AFF20FF  <1>
    80                              <1> ;-----	LC TABLE SCAN
    81 00006732 3B3C3D3E3F          <1> 	db	59,60,61,62,63		; BASE STATE OF F1 - F10
    82 00006737 4041424344          <1> 	db	64,65,66,67,68
    83 0000673C FFFF                <1> 	db	-1,-1			; NL, SL
    84                              <1> 
    85                              <1> ;-----	KEYPAD TABLE
    86 0000673E 474849FF4BFF        <1> K15:	db	71,72,73,-1,75,-1	; BASE STATE OF KEYPAD KEYS
    87 00006744 4DFF4F50515253      <1> 	db	77,-1,79,80,81,82,83
    88 0000674B FFFF5C8586          <1> 	db	-1,-1,92,133,134	; SysRq, Undef, WT, F11, F12
    89                              <1> 
    90                              <1> ;-----	TABLES FOR UPPER CASE ----------
    91 00006750 1B21402324255E262A- <1> K11:	db 	27,'!@#$%',94,'&*()_+',8,0
    91 00006759 28295F2B0800        <1>
    92 0000675F 51574552545955494F- <1> 	db 	'QWERTYUIOP{}',13,-1,'ASDFGHJKL:"'
    92 00006768 507B7D0DFF41534446- <1>
    92 00006771 47484A4B4C3A22      <1>
    93 00006778 7EFF7C5A584356424E- <1> 	db	126,-1,'|ZXCVBNM<>?',-1,'*',-1,' ',-1
    93 00006781 4D3C3E3FFF2AFF20FF  <1>
    94                              <1> ;-----	UC TABLE SCAN
    95 0000678A 5455565758          <1> K12:	db	84,85,86,87,88		; SHIFTED STATE OF F1 - F10
    96 0000678F 595A5B5C5D          <1> 	db	89,90,91,92,93
    97 00006794 FFFF                <1> 	db	-1,-1			; NL, SL
    98                              <1> 
    99                              <1> ;-----	NUM STATE TABLE
   100 00006796 3738392D3435362B31- <1> K14:	db 	'789-456+1230.'		; NUMLOCK STATE OF KEYPAD KEYS
   100 0000679F 3233302E            <1>
   101                              <1> 	;
   102 000067A3 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 000067A8 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 000067A9 00                  <1> KB_FLAG		db	0		; KEYBOARD SHIFT STATE AND STATUS FLAGS
   120 000067AA 00                  <1> KB_FLAG_1	db	0		; SECOND BYTE OF KEYBOARD STATUS
   121 000067AB 00                  <1> KB_FLAG_2	db	0		; KEYBOARD LED FLAGS
   122 000067AC 00                  <1> KB_FLAG_3	db	0		; KEYBOARD MODE STATE AND TYPE FLAGS
   123 000067AD 00                  <1> ALT_INPUT	db	0		; STORAGE FOR ALTERNATE KEY PAD ENTRY
   124 000067AE [BE670000]          <1> BUFFER_START	dd	KB_BUFFER 	; OFFSET OF KEYBOARD BUFFER START
   125 000067B2 [DE670000]          <1> BUFFER_END	dd	KB_BUFFER + 32	; OFFSET OF END OF BUFFER
   126 000067B6 [BE670000]          <1> BUFFER_HEAD	dd	KB_BUFFER 	; POINTER TO HEAD OF KEYBOARD BUFFER
   127 000067BA [BE670000]          <1> BUFFER_TAIL	dd	KB_BUFFER 	; POINTER TO TAIL OF KEYBOARD BUFFER
   128                              <1> ; ------	HEAD = TAIL INDICATES THAT THE BUFFER IS EMPTY
   129 000067BE 0000<rep 10h>       <1> KB_BUFFER	times	16 dw 0		; ROOM FOR 16 SCAN CODE ENTRIES
   130                              <1> 
   131                              <1> ; /// End Of KEYBOARD DATA ///
  3422                                  %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 000067DE 03                  <1> CRT_MODE:	db	3	; CURRENT DISPLAY MODE (TYPE)
    29 000067DF 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 000067E0 50                  <1> CRT_COLS:	db	80	; Number of columns
    52                              <1> 
    53                              <1> ; 01/07/2016
    54 000067E1 00                  <1> CRT_PALETTE:	db 	0	; Current palette setting
    55                              <1> 
    56                              <1> ; 03/07/2016
    57 000067E2 10                  <1> CHAR_HEIGHT:	db	16	; Default character height
    58 000067E3 60                  <1> VGA_VIDEO_CTL:	db	60h	; ROM BIOS DATA AREA Offset 87h
    59 000067E4 F9                  <1> VGA_SWITCHES:	db 	0F9h	; Feature Bit Switches (the basic screen)
    60 000067E5 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 000067E6 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 000067E7 0707070707070707    <1> 	db	07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
    77                              <1> ; 30/01/2016
    78                              <1> vmode:
    79 000067EF 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 000067F7 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 000067F9 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 000067FA 0302010007040506    <1> 	db 	03h, 02h, 01h, 00h, 07h, 04h, 05h, 06h
    96                              <1> vga_g_modes: ; 31/07/2016
    97 00006802 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 0000680A [6A680000]          <1> 	dd	vga_mode_03h
   104 0000680E [6A680000]          <1> 	dd	vga_mode_03h ; mode 02h -> mode 03h 
   105 00006812 [AA680000]          <1> 	dd	vga_mode_01h
   106 00006816 [AA680000]          <1> 	dd	vga_mode_01h ; mode 00h -> mode 01h
   107                              <1> 	;dd	vga_mode_07h
   108 0000681A [6A680000]          <1> 	dd	vga_mode_03h ; mode 07h -> mode 03h
   109 0000681E [EA680000]          <1> 	dd	vga_mode_04h
   110 00006822 [EA680000]          <1> 	dd	vga_mode_04h ; mode 05h -> mode 04h	
   111 00006826 [2A690000]          <1> 	dd	vga_mode_06h
   112 0000682A [6A690000]          <1> 	dd	vga_mode_13h
   113 0000682E [AA690000]          <1> 	dd	vga_mode_F0h
   114 00006832 [EA690000]          <1> 	dd	vga_mode_12h
   115 00006836 [2A6A0000]          <1> 	dd	vga_mode_6Ah
   116 0000683A [6A6A0000]          <1> 	dd	vga_mode_0Dh
   117 0000683E [AA6A0000]          <1> 	dd	vga_mode_0Eh
   118 00006842 [EA6A0000]          <1> 	dd	vga_mode_10h
   119 00006846 [2A6B0000]          <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 0000684A 0000000000020202    <1> 	db	CTEXT, CTEXT, CTEXT, CTEXT, MTEXT, CGA, CGA, CGA
   132                              <1> vga_g_memmodel: ; 31/07/2016
   133 00006852 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 0000685A 020202020001010103- <1> 	db	2, 2, 2, 2, 0, 1, 1, 1, 3, 3, 2, 2, 1, 1, 2, 2  
   139 00006863 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 0000686A 5018100010          <1>  	db	80, 24, 16, 00h, 10h ; tw, th-1, ch, slength (5)
   178 0000686F 00030002            <1>  	db	00h, 03h, 00h, 02h ; sequ regs (4)
   179 00006873 67                  <1>  	db	67h	; misc reg (1)
   180 00006874 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 0000687C 004F                <1> 	db	00h, 4Fh
   184                              <1> vga_p_cm_pos equ $ - vga_mode_03h
   185 0000687E 0D0E00000000        <1> 	db	0Dh, 0Eh, 00h, 00h, 00h, 00h
   186 00006884 9C8E8F281F96B9A3    <1>  	db	9Ch, 8Eh, 8Fh, 28h, 1Fh, 96h, 0B9h, 0A3h
   187 0000688C FF                  <1> 	db	0FFh	; crtc_regs (25)
   188 0000688D 0001020304051407    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
   189 00006895 38393A3B3C3D3E3F    <1>  	db	38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
   190                              <1>  	; 17/10/2023
   191 0000689D 0C000F08            <1> 	db	0Ch, 00h, 0Fh, 08h  ; actl regs (20)
   192                              <1> 	;db	0Ch, 00h, 0Fh, 00h  ; 19/11/2020
   193 000068A1 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 000068AA 2818100008          <1> 	db	40, 24, 16, 00h, 08h ; tw, th-1, ch, slength
   198 000068AF 08030002            <1> 	db	08h, 03h, 00h, 02h  ; sequ regs
   199 000068B3 67                  <1> 	db	67h	; misc reg
   200 000068B4 2D2728902BA0BF1F    <1> 	db	2Dh, 27h, 28h, 90h, 2Bh, 0A0h, 0BFh, 1Fh
   201 000068BC 004F0D0E00000000    <1> 	db	00h, 4Fh, 0Dh, 0Eh, 00h, 00h, 00h, 00h
   202 000068C4 9C8E8F141F96B9A3    <1> 	db	9Ch, 8Eh, 8Fh, 14h, 1Fh, 96h, 0B9h, 0A3h
   203 000068CC FF                  <1> 	db	0FFh	; crtc_regs
   204 000068CD 0001020304051407    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
   205 000068D5 38393A3B3C3D3E3F    <1> 	db	38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
   206                              <1>  	;db	0Ch, 00h, 0Fh, 08h  ; actl regs (20)
   207 000068DD 0C000F00            <1> 	db	0Ch, 00h, 0Fh, 00h  ; 19/11/2020
   208 000068E1 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 000068EA 2818080040          <1> 	db	40, 24, 8, 00h, 40h ; tw, th-1, ch, slength
   224 000068EF 09030002            <1> 	db	09h, 03h, 00h, 02h ; sequ regs
   225 000068F3 63                  <1> 	db	63h	; misc reg
   226 000068F4 2D2728902B80BF1F    <1> 	db	2Dh, 27h, 28h, 90h, 2Bh, 80h, 0BFh, 1Fh
   227 000068FC 00C1000000000000    <1> 	db	00h, 0C1h, 00h, 00h, 00h, 00h, 00h, 00h
   228 00006904 9C8E8F140096B9A2    <1> 	db	9Ch, 8Eh, 8Fh, 14h, 00h, 96h, 0B9h, 0A2h
   229 0000690C FF                  <1> 	db	0FFh	; crtc_regs
   230 0000690D 0013151702040607    <1> 	db	00h, 13h, 15h, 17h, 02h, 04h, 06h, 07h
   231 00006915 1011121314151617    <1> 	db	10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h
   232 0000691D 01000300            <1> 	db	01h, 00h, 03h, 00h ; actl regs
   233 00006921 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 0000692A 5018080040          <1> 	db	80, 24, 8, 00h, 40h   ;	tw, th-1, ch, slength
   237 0000692F 01010006            <1> 	db	01h, 01h, 00h, 06h ; sequ regs
   238 00006933 63                  <1> 	db	63h	; misc reg
   239 00006934 5F4F50825480BF1F    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0BFh, 1Fh
   240 0000693C 00C1000000000000    <1> 	db	00h, 0C1h, 00h, 00h, 00h, 00h, 00h, 00h
   241 00006944 9C8E8F280096B9C2    <1> 	db	9Ch, 8Eh, 8Fh, 28h, 00h, 96h, 0B9h, 0C2h
   242 0000694C FF                  <1> 	db	0FFh	; crtc regs
   243 0000694D 0017171717171717    <1> 	db	00h, 17h, 17h, 17h, 17h, 17h, 17h, 17h
   244 00006955 1717171717171717    <1> 	db	17h, 17h, 17h, 17h, 17h, 17h, 17h, 17h
   245 0000695D 01000100            <1> 	db	01h, 00h, 01, 00h  ; actl regs
   246 00006961 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 0000696A 28180800FA          <1> 	db 	40, 24, 8, 00h, 0FAh ; tw, th-1, ch, slength (5)
   252 0000696F 010F000E            <1> 	db	01h, 0Fh, 00h, 0Eh ; sequ regs (4)
   253 00006973 63                  <1> 	db	63h	; misc reg (1)
   254 00006974 5F4F50825480BF1F    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0BFh, 1Fh 
   255 0000697C 0041000000000000    <1> 	db 	00h, 041h, 00h, 00h, 00h, 00h, 00h, 00h
   256 00006984 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 0000698C FF                  <1> 	db	0FFh	; crtc regs (25)
   259 0000698D 0001020304050607    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h
   260 00006995 08090A0B0C0D0E0F    <1>  	db	08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 0Fh
   261 0000699D 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 000069A1 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 000069AA 2818080000          <1> 	db 	40, 24, 8, 00h, 00h ; tw, th-1, ch, slength
   268 000069AF 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   269 000069B3 E3                  <1> 	db	0E3h	; misc reg
   270 000069B4 5F4F508254800D3E    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0Dh, 3Eh 
   271 000069BC 0041000000000000    <1>  	db 	00h, 41h, 00h, 00h, 00h, 00h, 00h, 00h
   272 000069C4 EAACDF2800E706E3    <1> 	db	0EAh, 0ACh, 0DFh, 28h, 00h, 0E7h, 06h, 0E3h
   273 000069CC FF                  <1> 	db	0FFh	; crtc regs (25)
   274 000069CD 0001020304050607    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h
   275 000069D5 08090A0B0C0D0E0F    <1>  	db	08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 0Fh
   276 000069DD 41000F00            <1>  	db	41h, 00h, 0Fh, 00h  ; actl regs
   277 000069E1 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 000069EA 501D1000A0          <1>  	db 	80, 29, 16, 00h, 0A0h ; tw, th-1, ch, slength
   283 000069EF 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   284 000069F3 E3                  <1> 	db 	0E3h	; misc reg
   285 000069F4 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 000069FC 0040000000000000    <1> 	db	00h, 40h, 00h, 00h, 00h, 00h, 00h, 00h
   289 00006A04 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 00006A0C FF                  <1> 	db	0FFh	; crtc regs
   293 00006A0D 0001020304051407    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
   294 00006A15 38393A3B3C3D3E3F    <1> 	db	38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
   295 00006A1D 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   296 00006A21 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 00006A2A 6424100000          <1>  	db 	100, 36, 16, 00h, 00h ; tw, th-1, ch, slength
   300 00006A2F 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   301 00006A33 E3                  <1> 	db 	0E3h	; misc reg
   302 00006A34 7F6363836B1B72F0    <1> 	db	7Fh, 63h, 63h, 83h, 6Bh, 1Bh, 72h, 0F0h
   303 00006A3C 0060000000000000    <1> 	db	00h, 60h, 00h, 00h, 00h, 00h, 00h, 00h
   304 00006A44 598D5732005773E3    <1>  	db	59h, 8Dh, 57h, 32h, 00h, 57h, 73h, 0E3h
   305 00006A4C FF                  <1> 	db	0FFh	; crtc regs
   306 00006A4D 0001020304051407    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
   307 00006A55 38393A3B3C3D3E3F    <1> 	db	38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
   308 00006A5D 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   309 00006A61 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 00006A6A 2818080020          <1>  	db 	40, 24, 8, 00h, 20h ; tw, th-1, ch, slength
   312 00006A6F 090F0006            <1> 	db	09h, 0Fh, 00h, 06h ; sequ regs
   313 00006A73 63                  <1> 	db 	63h	; misc reg
   314 00006A74 2D2728902B80BF1F    <1> 	db	2Dh, 27h, 28h, 90h, 2Bh, 80h, 0BFh, 1Fh
   315 00006A7C 00C0000000000000    <1> 	db	00h, 0C0h, 00h, 00h, 00h, 00h, 00h, 00h
   316 00006A84 9C8E8F140096B9E3    <1>  	db	9Ch, 8Eh, 8Fh, 14h, 00h, 96h, 0B9h, 0E3h
   317 00006A8C FF                  <1> 	db	0FFh	; crtc regs
   318 00006A8D 0001020304050607    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h
   319 00006A95 1011121314151617    <1> 	db	10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h
   320 00006A9D 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   321 00006AA1 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 00006AAA 5018080040          <1>  	db 	80, 24, 8, 00h, 40h ; tw, th-1, ch, slength
   324 00006AAF 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   325 00006AB3 63                  <1> 	db 	63h	; misc reg
   326 00006AB4 5F4F50825480BF1F    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0BFh, 1Fh
   327 00006ABC 00C0000000000000    <1> 	db	00h, 0C0h, 00h, 00h, 00h, 00h, 00h, 00h
   328 00006AC4 9C8E8F280096B9E3    <1>  	db	9Ch, 8Eh, 8Fh, 28h, 00h, 96h, 0B9h, 0E3h
   329 00006ACC FF                  <1> 	db	0FFh	; crtc regs
   330 00006ACD 0001020304050607    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h
   331 00006AD5 1011121314151617    <1> 	db	10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h
   332 00006ADD 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   333 00006AE1 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 00006AEA 50180E0080          <1>  	db 	80, 24, 14, 00h, 80h ; tw, th-1, ch, slength
   336 00006AEF 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   337 00006AF3 A3                  <1> 	db 	0A3h	; misc reg
   338 00006AF4 5F4F50825480BF1F    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0BFh, 1Fh
   339 00006AFC 0040000000000000    <1> 	db	00h, 40h, 00h, 00h, 00h, 00h, 00h, 00h
   340 00006B04 83855D280F63BAE3    <1>  	db	83h, 85h, 5Dh, 28h, 0Fh, 63h, 0BAh, 0E3h
   341 00006B0C FF                  <1> 	db	0FFh	; crtc regs
   342 00006B0D 0001020304051407    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
   343 00006B15 38393A3B3C3D3E3F    <1> 	db	38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
   344 00006B1D 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   345 00006B21 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 00006B2A 501D1000A0          <1> 	db 	80, 29, 16, 00h, 0A0h ; tw, th-1, ch, slength
   349 00006B2F 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   350 00006B33 E3                  <1> 	db 	0E3h	; misc reg
   351 00006B34 5F4F508254800B3E    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0Bh, 3Eh
   352 00006B3C 0040000000000000    <1> 	db	00h, 40h, 00h, 00h, 00h, 00h, 00h, 00h
   353 00006B44 EA8CDF2800E704C3    <1>  	db	0EAh, 8Ch, 0DFh, 28h, 00h, 0E7h, 04h, 0C3h ; 11/11/2020
   354 00006B4C FF                  <1> 	db	0FFh	; crtc regs
   355 00006B4D 003F003F003F003F    <1> 	db	00h, 3Fh, 00h, 3Fh, 00h, 3Fh, 00h, 3Fh
   356 00006B55 003F003F003F003F    <1> 	db	00h, 3Fh, 00h, 3Fh, 00h, 3Fh, 00h, 3Fh
   357 00006B5D 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   358 00006B61 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 00006B6A 0001800290010800    <1> 	dw 100h,  640, 400,  8
   372 00006B72 01018002E0010800    <1> 	dw 101h,  640, 480,  8
   373 00006B7A 0301200358020800    <1> 	dw 103h,  800, 600,  8
   374 00006B82 0501000400030800    <1> 	dw 105h, 1024, 768,  8
   375 00006B8A 0E014001C8001000    <1> 	dw 10Eh,  320, 200, 16
   376 00006B92 0F014001C8001800    <1> 	dw 10Fh,  320, 200, 24
   377 00006B9A 11018002E0011000    <1> 	dw 111h,  640, 480, 16
   378 00006BA2 12018002E0011800    <1> 	dw 112h,  640, 480, 24
   379 00006BAA 1401200358021000    <1> 	dw 114h,  800, 600, 16
   380 00006BB2 1501200358021800    <1> 	dw 115h,  800, 600, 24
   381 00006BBA 1701000400031000    <1> 	dw 117h, 1024, 768, 16
   382 00006BC2 1801000400031800    <1> 	dw 118h, 1024, 768, 24
   383                              <1> 
   384                              <1> ;/* BOCHS/PLEX86 'own' mode numbers */
   385 00006BCA 40014001C8002000    <1> 	dw 140h,  320,  200, 32
   386 00006BD2 4101800290012000    <1> 	dw 141h,  640,  400, 32
   387 00006BDA 42018002E0012000    <1> 	dw 142h,  640,  480, 32
   388 00006BE2 4301200358022000    <1> 	dw 143h,  800,  600, 32
   389 00006BEA 4401000400032000    <1> 	dw 144h, 1024,  768, 32
   390 00006BF2 46014001C8000800    <1> 	dw 146h,  320,  200,  8
   391 00006BFA 8D010005D0021000    <1> 	dw 18Dh, 1280,  720, 16
   392 00006C02 8E010005D0021800    <1> 	dw 18Eh, 1280,  720, 24
   393 00006C0A 8F010005D0022000    <1> 	dw 18Fh, 1280,  720, 32
   394 00006C12 9001800738041000    <1> 	dw 190h, 1920, 1080, 16
   395 00006C1A 9101800738041800    <1> 	dw 191h, 1920, 1080, 24
   396 00006C22 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 00006C2A 00                  <1> r_size_8:  db 0
  1545 00006C2B 00                  <1> r_pos_8:   db 0
  1546 00006C2C 00                  <1> g_size_8:  db 0
  1547 00006C2D 00                  <1> g_pos_8:   db 0
  1548 00006C2E 00                  <1> b_size_8:  db 0
  1549 00006C2F 00                  <1> b_pos_8:   db 0
  1550 00006C30 00                  <1> a_size_8:  db 0
  1551 00006C31 00                  <1> a_pos_8:   db 0
  1552                              <1> 
  1553                              <1> ;case 16:
  1554 00006C32 05                  <1> r_size_16:  db 5
  1555 00006C33 0B                  <1> r_pos_16:   db 11
  1556 00006C34 06                  <1> g_size_16:  db 6
  1557 00006C35 05                  <1> g_pos_16:   db 5
  1558 00006C36 05                  <1> b_size_16:  db 5
  1559 00006C37 00                  <1> b_pos_16:   db 0
  1560 00006C38 00                  <1> a_size_16:  db 0
  1561 00006C39 00                  <1> a_pos_16:   db 0
  1562                              <1> 
  1563                              <1> ;case 24:
  1564 00006C3A 08                  <1> r_size_24:  db 8
  1565 00006C3B 10                  <1> r_pos_24:   db 16
  1566 00006C3C 08                  <1> g_size_24:  db 8
  1567 00006C3D 08                  <1> g_pos_24:   db 8
  1568 00006C3E 08                  <1> b_size_24:  db 8
  1569 00006C3F 00                  <1> b_pos_24:   db 0
  1570 00006C40 00                  <1> a_size_24:  db 0
  1571 00006C41 00                  <1> a_pos_24:   db 0
  1572                              <1> 
  1573                              <1> ;case 32:
  1574 00006C42 08                  <1> r_size_32:  db 8
  1575 00006C43 10                  <1> r_pos_32:   db 16
  1576 00006C44 08                  <1> g_size_32:  db 8
  1577 00006C45 08                  <1> g_pos_32:   db 8
  1578 00006C46 08                  <1> b_size_32:  db 8
  1579 00006C47 00                  <1> b_pos_32:   db 0
  1580 00006C48 08                  <1> a_size_32:  db 8
  1581 00006C49 18                  <1> a_pos_32:   db 24
  3423                                  ;%include 'diskdata.s'	; DISK (BIOS) DATA (initialized)
  3424                                  ;;;
  3425                                  
  3426                                  Align 2
  3427                                  
  3428                                  %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> 			 		
  3429                                  %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
  3430                                  %include 'trdosk1.s' ; 04/01/2016 
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.9) - SYS INIT : trdosk1.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 26/09/2024 (Previous: 25/07/2022)
     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> 	; 26/09/2024 (TRDOS v2.0.9)
    18                              <1> 	; 18/04/2021 (TRDOS 386 v2.0.4)
    19                              <1> 	; 20/01/2018  (v2.0.1)
    20                              <1> 	; 23/01/2017  (v2.0.0)
    21                              <1> 	; 07/05/2016
    22                              <1> 	; 02/05/2016
    23                              <1> 	; 24/04/2016
    24                              <1> 	; 14/04/2016
    25                              <1> 	; 13/04/2016
    26                              <1> 	; 30/03/2016
    27                              <1> 	; 24/01/2016
    28                              <1> 	; 06/01/2016
    29                              <1> 	; 04/01/2016 (TRDOS 386 v2.0 - Beginning)
    30                              <1> 
    31                              <1> 	; 23/01/2017 - reset timer frequency (to 18.2Hz)
    32 00006C4A B036                <1> 	mov	al, 00110110b ; 36h
    33 00006C4C E643                <1>  	out	43h, al
    34 00006C4E 31C0                <1> 	xor	eax, eax  ; sub	al, al ; 0
    35 00006C50 E640                <1> 	out	40h, al ; LB
    36 00006C52 E640                <1> 	out	40h, al ; HB
    37                              <1>  	;
    38                              <1> 	; 30/03/2016
    39                              <1> 	; Clear Logical DOS Disk Description Tables Area
    40                              <1> 	;xor	eax, eax
    41 00006C54 BF00010900          <1> 	mov	edi, Logical_DOSDisks
    42 00006C59 B980060000          <1> 	mov	ecx, 6656/4 ; 26*256 = 6656 bytes
    43 00006C5E F3AB                <1> 	rep	stosd ; 1664 times 4 bytes
    44                              <1> 
    45 00006C60 B83F3A2F00          <1> 	mov	eax, '?:/'
    46 00006C65 A3[B37D0100]        <1> 	mov	[Current_Dir_Drv], eax
    47                              <1> 
    48                              <1> 	; Logical DRV INIT (only for hard disks)
    49 00006C6A E8C3030000          <1> 	call 	ldrv_init  ; trdosk2.s
    50                              <1> 
    51                              <1> 	; When floppy_drv_init call is disabled
    52                              <1> 	; media changed sign is needed
    53                              <1> 	; for proper drive initialization
    54                              <1> 
    55 00006C6F BE00010900          <1> 	mov 	esi, Logical_DOSDisks
    56 00006C74 B001                <1> 	mov 	al, 1 ; Initialization sign (invalid_fd_parameter)
    57 00006C76 83C67E              <1> 	add 	esi, LD_MediaChanged ; Media Change Status = 1 (init needed)
    58 00006C79 8806                <1> 	mov 	[esi], al ; A:
    59                              <1> 	; Temporary - 26/09/2024
    60                              <1> 	;;mov	dword [esi+LD_Clusters], -1 ; *
    61                              <1> 	;dec	dword [esi+LD_Clusters]
    62 00006C7B 81C600010000        <1> 	add 	esi, 100h 
    63 00006C81 8806                <1> 	mov 	[esi], al ; B:
    64                              <1> 	;;mov	dword [esi+LD_Clusters], -1 ; *
    65                              <1> 	;dec	dword [esi+LD_Clusters]
    66                              <1> 
    67                              <1> _current_drive_bootdisk:
    68 00006C83 8A15[38660000]      <1> 	mov 	dl, [boot_drv] ; physical drive number
    69 00006C89 80FAFF              <1> 	cmp 	dl, 0FFh
    70 00006C8C 740A                <1> 	je 	short _last_dos_diskno_check
    71                              <1> _boot_drive_check:
    72 00006C8E 80FA80              <1> 	cmp 	dl, 80h
    73 00006C91 7218                <1> 	jb 	short _current_drive_a
    74 00006C93 80EA7E              <1> 	sub 	dl, 7Eh ; C = 2 , D = 3
    75 00006C96 EB13                <1> 	jmp 	short _current_drive_a
    76                              <1> 
    77                              <1> _last_dos_diskno_check:
    78 00006C98 8A15[CE340100]      <1> 	mov 	dl, [Last_DOS_DiskNo]
    79 00006C9E 80FA02              <1> 	cmp 	dl, 2
    80 00006CA1 7706                <1> 	ja 	short _current_drive_c
    81 00006CA3 7406                <1> 	je 	short _current_drive_a
    82 00006CA5 30D2                <1> 	xor 	dl, dl ; A:
    83 00006CA7 EB02                <1> 	jmp 	short _current_drive_a
    84                              <1> 
    85                              <1> _current_drive_c:
    86 00006CA9 B202                <1> 	mov 	dl, 2 ; C:
    87                              <1> 
    88                              <1> _current_drive_a:
    89 00006CAB 8815[39660000]      <1> 	mov	[drv], dl
    90 00006CB1 BE[D0340100]        <1>         mov     esi, msg_CRLF_temp
    91 00006CB6 E8AF000000          <1> 	call 	print_msg
    92                              <1> 
    93 00006CBB 8A15[39660000]      <1> 	mov	dl, [drv]
    94                              <1> _default_drive_c:
    95 00006CC1 E8B70B0000          <1> 	call 	change_current_drive
    96 00006CC6 731C                <1> 	jnc 	short _start_mainprog
    97                              <1> 
    98                              <1> _drv_not_ready_error: 
    99 00006CC8 BE[94370100]        <1> 	mov 	esi, msgl_drv_not_ready
   100 00006CCD E898000000          <1> 	call 	print_msg
   101                              <1>         ;jmp	_end_of_mainprog
   102                              <1> 
   103                              <1> 	; 20/01/2018
   104 00006CD2 B202                <1> 	mov	dl, 2
   105 00006CD4 3815[39660000]      <1> 	cmp	[drv], dl
   106 00006CDA 736C                <1> 	jnb	short _end_of_mainprog
   107 00006CDC 8815[39660000]      <1> 	mov	[drv], dl
   108 00006CE2 EBDD                <1> 	jmp	short _default_drive_c
   109                              <1> 
   110                              <1> _start_mainprog:
   111                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   112                              <1> 	; 18/04/2021 (TRDOS 386 v2.0.4 - Beginning)
   113                              <1> 	; 07/01/2017
   114                              <1> 	; 07/05/2016
   115                              <1> 	; 02/05/2016
   116                              <1> 	; 24/04/2016 (TRDOS 386 v2)
   117                              <1> 	; Retro UNIX 386 v1, 'sys_init' (u0.s)
   118                              <1> 	; 23/06/2015
   119                              <1> 
   120                              <1> 	; 02/05/2016
   121                              <1> 	; 24/04/2016
   122                              <1> 	;mov	ax, 1
   123                              <1> 	; 18/04/2021 - TRDOS 386 v2.0.4
   124 00006CE4 31C0                <1> 	xor	eax, eax
   125 00006CE6 FEC0                <1> 	inc	al  ; eax = 1
   126 00006CE8 A2[FD940100]        <1> 	mov	[u.uno], al
   127 00006CED 66A3[94940100]      <1> 	mov	[mpid], ax
   128 00006CF3 66A3[80930100]      <1> 	mov	[p.pid], ax
   129 00006CF9 A2[E0930100]        <1> 	mov	[p.stat], al
   130 00006CFE C605[F4940100]04    <1> 	mov	byte [u.quant], time_count  ; 07/01/2017
   131                              <1> 	;
   132 00006D05 A1[F07C0100]        <1> 	mov	eax, [k_page_dir]
   133 00006D0A A3[04950100]        <1> 	mov	[u.pgdir], eax ; reset
   134                              <1> 	;
   135 00006D0F E8CCEAFFFF          <1> 	call	allocate_page
   136                              <1> 	;jc	panic
   137                              <1> 	; 25/07/2022
   138 00006D14 7305                <1> 	jnc	short _start_mainprog_1
   139 00006D16 E9AE000000          <1> 	jmp	panic
   140                              <1> 
   141                              <1> _start_mainprog_1:
   142 00006D1B A3[00950100]        <1> 	mov	[u.upage], eax ; user structure page
   143 00006D20 A3[F0930100]        <1> 	mov	[p.upage], eax
   144 00006D25 E827EBFFFF          <1> 	call	clear_page
   145                              <1> 	;
   146                              <1> 	; 24/08/2015
   147 00006D2A FE0D[A0940100]      <1> 	dec 	byte [sysflg] ; FFh = ready for system call
   148                              <1> 			      ; 0 = executing a system call
   149                              <1> 	; 13/04/2016
   150                              <1> 	; Clear Environment Variables Page/Area
   151 00006D30 BF00300900          <1> 	mov	edi, Env_Page ; 93000h
   152 00006D35 B980000000          <1> 	mov	ecx, Env_Page_Size / 4	; 512/4  (4096/4)
   153 00006D3A 31C0                <1> 	xor	eax, eax
   154 00006D3C F3AB                <1> 	rep	stosd
   155                              <1> 
   156                              <1> 	; 14/04/2016
   157 00006D3E E855330000          <1>  	call	mainprog_startup_configuration
   158                              <1> 
   159 00006D43 E8720C0000          <1>         call    dos_prompt
   160                              <1> 
   161                              <1> _end_of_mainprog:
   162 00006D48 BE[D0340100]        <1>         mov     esi, msg_CRLF_temp
   163 00006D4D E818000000          <1> 	call 	print_msg
   164 00006D52 BE[D6340100]        <1> 	mov 	esi, mainprog_Version
   165 00006D57 E80E000000          <1> 	call 	print_msg
   166                              <1> 	; 24/01/2016
   167 00006D5C 28E4                <1> 	sub	ah, ah
   168 00006D5E E8B9A1FFFF          <1> 	call	int16h ; call getch
   169 00006D63 E947A6FFFF          <1> 	jmp	cpu_reset
   170                              <1> 
   171 00006D68 EBFE                <1> infinitiveloop: jmp short infinitiveloop
   172                              <1> 
   173                              <1> print_msg:
   174                              <1> 	; 13/05/2016
   175                              <1> 	; 04/01/2016
   176                              <1> 	; 01/07/2015
   177                              <1> 	; 13/03/2015 (Retro UNIX 386 v1)
   178                              <1> 	; 07/03/2014 (Retro UNIX 8086 v1)
   179                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX, ESI, EDI)
   180                              <1> 	;
   181 00006D6A 8A3D[1E7D0100]      <1> 	mov	bh, [ACTIVE_PAGE] ; 04/01/2016 (ptty)
   182                              <1> 	;mov	bl, 07h ; Black background, light gray forecolor
   183                              <1> 
   184 00006D70 AC                  <1> 	lodsb
   185                              <1> pmsg1:
   186 00006D71 56                  <1> 	push 	esi
   187                              <1> 	;mov	bh, [ACTIVE_PAGE] ; 04/01/2016 (ptty)
   188 00006D72 B307                <1> 	mov	bl, 07h ; Black background, light gray forecolor
   189 00006D74 E81CB5FFFF          <1> 	call 	_write_tty
   190 00006D79 5E                  <1> 	pop	esi
   191 00006D7A AC                  <1> 	lodsb
   192 00006D7B 20C0                <1> 	and 	al, al
   193 00006D7D 75F2                <1> 	jnz 	short pmsg1
   194 00006D7F C3                  <1> 	retn
   195                              <1> 
   196                              <1> clear_screen:
   197                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   198                              <1> 	; 06/12/2020 
   199                              <1> 	; 03/12/2020 (TRDOS 386 v2.0.3)
   200                              <1> 	; 13/05/2016
   201                              <1> 	; 30/01/2016
   202                              <1> 	; 24/01/2016
   203                              <1> 	; 04/01/2016
   204 00006D80 0FB61D[1E7D0100]    <1> 	movzx	ebx, byte [ACTIVE_PAGE] ; video page number (0 to 7)
   205                              <1> 	; 25/07/2022
   206                              <1> 	;sub	al, al
   207                              <1> 	; al = 0
   208 00006D87 8AA3[EF670000]      <1> 	mov 	ah, [ebx+vmode] ; default = 03h (80x25 text)
   209 00006D8D 80FC04              <1> 	cmp	ah, 4
   210 00006D90 7205                <1> 	jb	short cls1
   211 00006D92 80FC07              <1> 	cmp	ah, 7
   212 00006D95 752B                <1> 	jne	short vga_clear
   213                              <1> cls1:
   214                              <1> 	;mov	bh, bl
   215                              <1> 	;mov	bl, 7
   216 00006D97 3A25[DE670000]      <1> 	cmp	ah, [CRT_MODE] ; current video mode ? 
   217 00006D9D 740D                <1> 	je	short cls2 ; yes (current video mode = 3)
   218                              <1> 	;;call	set_mode_3 ; set video mode to 3 (& clear screen)
   219                              <1> 	;;retn
   220                              <1> 	; 06/12/2020
   221                              <1> 	;cmp	byte [pmi32], 0
   222                              <1> 	; 25/07/2022
   223 00006D9F 383D[64A30100]      <1> 	cmp	[pmi32], bh ; 0
   224 00006DA5 771B                <1> 	ja	short vga_clear
   225 00006DA7 E9F3B4FFFF          <1> 	jmp	set_mode_3
   226                              <1> cls2:
   227 00006DAC 88DF                <1> 	mov	bh, bl ; video page (0 to 7)
   228 00006DAE B307                <1> 	mov	bl, 07h ; attribute to be used on blanked line
   229                              <1> 	; 25/07/2022
   230                              <1> 	;sub 	al, al ; 0 = entire window
   231                              <1> 	;xor 	cx, cx
   232                              <1> 	; 25/07/2022
   233                              <1> 	; al = 0
   234 00006DB0 31C9                <1> 	xor	ecx, ecx
   235 00006DB2 66BA4F18            <1> 	mov 	dx, 184Fh
   236 00006DB6 E82CB2FFFF          <1> 	call	_scroll_up ; 24/01/2016
   237                              <1> 	;
   238                              <1> 	;mov	bh, [ACTIVE_PAGE] ; video page number (0 to 7)
   239                              <1> 	;xor 	dx, dx
   240                              <1> 	; 25/07/2022
   241 00006DBB 31D2                <1> 	xor	edx, edx
   242                              <1> 	;call	_set_cpos ; 24/01/2016 
   243                              <1> 	;;retn
   244                              <1> 	; 03/12/2020
   245 00006DBD E96BB5FFFF          <1> 	jmp	_set_cpos ; returns to the caller of this proc
   246                              <1> ;cls3:
   247                              <1> ;	retn
   248                              <1> 
   249                              <1> 	; 06/12/2020
   250                              <1> vga_clear:
   251                              <1> 	; 03/12/2020
   252                              <1> 	; set mode by using _int10h
   253                              <1> 	; (also clears screen)
   254                              <1> 	;mov	al, ah
   255                              <1> 	;sub	ah, ah  ; set current video mode
   256                              <1> 	; 25/07/2022
   257 00006DC2 86E0                <1> 	xchg	ah, al
   258                              <1> 	; ah = 0
   259                              <1> 	; al = video mode
   260                              <1> 	;call	_int10h ; simulates int 10h in TRDOS 386 kernel
   261                              <1> 	;jmp	short cls3
   262 00006DC4 E95BA9FFFF          <1> 	jmp	_int10h ; returns to the caller of this proc
   263                              <1> 
   264                              <1> panic:
   265                              <1> 	; 13/05/2016 (TRDOS 386 = TRDOS v2)
   266                              <1> 	; 13/03/2015 (Retro UNIX 386 v1)
   267                              <1> 	; 07/03/2014 (Retro UNIX 8086 v1)
   268 00006DC9 BE[833F0100]        <1> 	mov 	esi, panic_msg
   269 00006DCE E897FFFFFF          <1> 	call 	print_msg
   270                              <1> key_to_reboot:
   271                              <1>         ; 24/01/2016
   272 00006DD3 28E4                <1>         sub     ah, ah
   273 00006DD5 E842A1FFFF          <1>         call    int16h	; call getch
   274                              <1>         ; wait for a character from the current tty
   275                              <1> 	;
   276 00006DDA B00A                <1> 	mov	al, 0Ah
   277 00006DDC 8A3D[1E7D0100]      <1> 	mov	bh, [ptty] ; [ACTIVE_PAGE]
   278 00006DE2 B307                <1> 	mov	bl, 07h ; Black background, 
   279                              <1> 			; light gray forecolor
   280 00006DE4 E8ACB4FFFF          <1> 	call 	_write_tty
   281 00006DE9 E9C1A5FFFF          <1> 	jmp	cpu_reset
   282                              <1> 
   283                              <1> ctrlbrk:
   284                              <1> 	; 21/08/2024 (TRDOS 386 Kernel v2.0.9)
   285                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   286                              <1> 	; 12/11/2015
   287                              <1> 	; 13/03/2015 (Retro UNIX 386 v1)
   288                              <1> 	; 06/12/2013 (Retro UNIX 8086 v1)
   289                              <1> 	;
   290                              <1> 	; INT 1Bh (control+break) handler
   291                              <1> 	;
   292                              <1>       	; Retro Unix 8086 v1 feature only!
   293                              <1>       	;
   294                              <1> 
   295                              <1> 	; 25/07/2022
   296 00006DEE 52                  <1> 	push	edx
   297 00006DEF 31D2                <1> 	xor	edx, edx
   298                              <1> 
   299                              <1> ; 21/08/2024 - TRDOS 386 v2.0.9
   300                              <1> %if 0
   301                              <1> 	;cmp 	word [u.intr], 0
   302                              <1> 	cmp	[u.intr], dx ; 0
   303                              <1> 	jna 	short cbrk4
   304                              <1> cbrk0:
   305                              <1> 	; 12/11/2015
   306                              <1> 	; 06/12/2013
   307                              <1> 	;cmp 	word [u.quit], 0
   308                              <1> 	cmp	[u.quit], dx ; 0 ; 25/07/2022
   309                              <1> 	jz	short cbrk4
   310                              <1> %endif
   311                              <1> 	; 20/09/2013
   312                              <1> 	;push 	ax
   313 00006DF1 50                  <1> 	push	eax ; 25/07/2022
   314 00006DF2 A0[1E7D0100]        <1> 	mov	al, [ptty]
   315                              <1> 
   316                              <1> ; 21/08/2024 - TRDOS 386 v2.0.9
   317                              <1> %if 1
   318 00006DF7 3A05[E2940100]      <1> 	cmp	al, [u.ttyn]
   319 00006DFD 7509                <1> 	jne	short cbrk3
   320                              <1> %else
   321                              <1> 	; 12/11/2015
   322                              <1> 	;
   323                              <1> 	; ctrl+break (EOT, CTRL+D) from serial port
   324                              <1> 	; or ctrl+break from console (pseudo) tty
   325                              <1> 	; (!redirection!)
   326                              <1> 
   327                              <1> 	cmp	al, 8 ; serial port tty nums > 7
   328                              <1>         jb      short cbrk1 ; console (pseudo) tty
   329                              <1> 
   330                              <1> 	; Serial port interrupt handler sets [ptty]
   331                              <1> 	; to the port's tty number (as temporary).
   332                              <1> 	;
   333                              <1> 	; If active process is using a stdin or
   334                              <1> 	; stdout redirection (by the shell),
   335                              <1>         ; console tty keyboard must be available
   336                              <1> 	; to terminate running process,
   337                              <1> 	; in order to prevent a deadlock.
   338                              <1> 
   339                              <1> 	; 25/07/2022
   340                              <1> 	;push	edx
   341                              <1> 	;movzx	edx, byte [u.uno]
   342                              <1> 	mov	dl, [u.uno]
   343                              <1> 	cmp     al, [edx+p.ttyc-1] ; console tty (rw)
   344                              <1> 	;pop	edx
   345                              <1> 	je	short cbrk2
   346                              <1> cbrk1:
   347                              <1> 	inc 	al  ; [u.ttyp] : 1 based tty number
   348                              <1> 	; 06/12/2013
   349                              <1> 	cmp	al, [u.ttyp]   ; recent open tty (r)
   350                              <1> 	je	short cbrk2
   351                              <1>         cmp     al, [u.ttyp+1] ; recent open tty (w)
   352                              <1> 	jne	short cbrk3
   353                              <1> cbrk2:
   354                              <1> 	;; 06/12/2013
   355                              <1> 	;mov	ax, [u.quit]
   356                              <1> 	;and	ax, ax
   357                              <1> 	;jz	short cbrk3
   358                              <1> %endif
   359                              <1> 	;xor	ax, ax ; 0
   360                              <1> 	;dec	ax
   361                              <1> 	; 0FFFFh = 'ctrl+brk' keystroke
   362                              <1> 	; 25/07/2022
   363                              <1> 	;xor	eax, eax ; 0
   364                              <1> 	;dec	eax ; -1 ; 0FFFFFFFFh
   365                              <1> 	;mov	[u.quit], ax
   366                              <1> 	; 21/08/2024
   367                              <1> 	; set CTRL+BREAK flag (even if it is not activated)
   368                              <1> 	; (u.intr is it's activation flag, 0 = disabled))
   369 00006DFF 66C705[FA940100]FF- <1> 	mov	word [u.quit], -1 ; 0FFFFh
   369 00006E07 FF                  <1>
   370                              <1> cbrk3:
   371                              <1> 	;pop	ax
   372 00006E08 58                  <1> 	pop	eax ; 25/07/2022
   373                              <1> cbrk4:
   374                              <1> 	; 25/07/2022
   375 00006E09 5A                  <1> 	pop	edx
   376 00006E0A C3                  <1> 	retn
   377                              <1> 
   378                              <1> ; 31/12/2017
   379                              <1> ; TRDOS 386 - 30/12/2017
   380                              <1> %define get_rtc_date RTC_40
   381                              <1> %define get_rtc_time RTC_20
   382                              <1> %define	set_rtc_date RTC_50
   383                              <1> %define set_rtc_time RTC_30
   384                              <1> get_rtc_date_time:
   385                              <1> ; Retro UNIX 8086 v1 - UNIX.ASM (01/09/2014)
   386                              <1> ;epoch:
   387                              <1> 	; 18/04/2021 (TRDOS 386 v2.0.3)
   388                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0)
   389                              <1> 	; 15/03/2015 (Retro UNIX 386 v1 - 32 bit version)
   390                              <1> 	; 09/04/2013 (Retro UNIX 8086 v1 - UNIX.ASM)
   391                              <1> 	; 'epoch' procedure prototype: 
   392                              <1> 	; 	            UNIXCOPY.ASM, 10/03/2013
   393                              <1> 	; 14/11/2012
   394                              <1> 	; unixboot.asm (boot file configuration)
   395                              <1> 	; version of "epoch" procedure in "unixproc.asm"
   396                              <1> 	; 21/7/2012
   397                              <1> 	; 15/7/2012
   398                              <1> 	; 14/7/2012
   399                              <1> 	; Erdogan Tan - RETRO UNIX v0.1
   400                              <1> 	; compute current date and time as UNIX Epoch/Time
   401                              <1> 	; UNIX Epoch: seconds since 1/1/1970 00:00:00
   402                              <1> 	;
   403                              <1>         ;  ((Modified registers: EAX, EDX, ECX, EBX))
   404                              <1> 	;
   405                              <1> 
   406                              <1> 	; 18/04/2021
   407                              <1> 	; INPUT:
   408                              <1> 	;	none (real time clock)
   409                              <1> 	; OUTPUT:
   410                              <1> 	;	eax = unix epoch time value
   411                              <1> 	;	    (seconds since 1/1/1970 00:00:00)
   412                              <1> 
   413 00006E0B E8FBF4FFFF          <1> 	call 	get_rtc_time		; Return Current Time
   414                              <1>         ;xchg 	ch, cl ; 18/04/2021
   415 00006E10 66890D[BE790100]    <1>         mov 	[hour], cx    ; BCD, cl = minute, ch = hour
   416                              <1>         ;xchg 	dh, dl ; 18/04/2021
   417                              <1> 	;mov 	[second], dx  ; BCD, dh = second, dl = dse
   418                              <1> 	; 18/04/2021
   419 00006E17 8835[C2790100]      <1> 	mov	[second], dh  ; second
   420                              <1> 	;
   421 00006E1D E854F5FFFF          <1>         call 	get_rtc_date		; Return Current Date
   422                              <1>         ;xchg 	ch, cl ; 18/04/2021
   423 00006E22 66890D[B8790100]    <1>         mov 	[year], cx    ; BCD, cl = year, ch = century
   424                              <1>         ;xchg 	dh, dl ; 18/04/2021
   425 00006E29 668915[BA790100]    <1>         mov 	[month], dx   ; BCD, dl = day, dh = month
   426                              <1> 	;
   427                              <1> 	;mov 	al, [hour]    ; Hour
   428                              <1>         ; 18/04/2021
   429 00006E30 A0[BF790100]        <1> 	mov	al, [hour+1]  ; Hour
   430                              <1> 	   	; AL <-- BCD number
   431 00006E35 D410                <1>         db 	0D4h, 10h		; Undocumented inst. AAM
   432                              <1> 					; AH = AL / 10h
   433                              <1> 					; AL = AL MOD 10h
   434 00006E37 D50A                <1>         aad 	; AX= AH*10+AL
   435                              <1> 	;mov 	[hour], al
   436                              <1> 	;mov 	al, [hour+1]  ; Minute
   437 00006E39 8605[BE790100]      <1> 	xchg	al, [hour]    ; [hour] = hour, al = minute
   438                              <1> 	   	; AL <-- BCD number
   439 00006E3F D410                <1>         db 	0D4h, 10h		; Undocumented inst. AAM
   440                              <1> 					; AH = AL / 10h
   441                              <1> 					; AL = AL MOD 10h
   442 00006E41 D50A                <1>         aad 	; AX= AH*10+AL
   443 00006E43 A2[C0790100]        <1> 	mov 	[minute], al
   444 00006E48 A0[C2790100]        <1> 	mov 	al, [second]  ; Second
   445                              <1> 	   	; AL <-- BCD number
   446 00006E4D D410                <1>         db 	0D4h, 10h		; Undocumented inst. AAM
   447                              <1> 					; AH = AL / 10h
   448                              <1> 					; AL = AL MOD 10h
   449 00006E4F D50A                <1>         aad 	; AX= AH*10+AL
   450 00006E51 A2[C2790100]        <1> 	mov 	[second], al
   451 00006E56 66A1[B8790100]      <1> 	mov 	ax, [year]    ; Year (century)
   452                              <1> 	; 18/04/2021
   453                              <1> 	;push 	eax ; puhs ax
   454                              <1> 	;mov	al, ah ; century ; 18/04/2021
   455                              <1> 	   	; AL <-- BCD number
   456 00006E5C D410                <1>         db 	0D4h, 10h		; Undocumented inst. AAM
   457                              <1> 					; AH = AL / 10h
   458                              <1> 					; AL = AL MOD 10h
   459 00006E5E D50A                <1>         aad 	; AX= AH*10+AL
   460                              <1> 	;mov 	ah, 100
   461                              <1> 	;mul 	ah
   462                              <1> 	;mov 	[year], ax
   463                              <1> 	; 18/04/2021
   464                              <1> 	; ax = al = year (0 to 99)
   465 00006E60 668705[B8790100]    <1> 	xchg	ax, [year]    ; [year+1] = century -> ah
   466                              <1> 	;pop	eax ; pop ax
   467 00006E67 88E0                <1> 	mov	al, ah  ; century
   468                              <1> 	   	; AL <-- BCD number
   469 00006E69 D410                <1>         db 	0D4h, 10h		; Undocumented inst. AAM
   470                              <1> 					; AH = AL / 10h
   471                              <1> 					; AL = AL MOD 10h
   472 00006E6B D50A                <1>         aad 	; AX= AH*10+AL
   473                              <1> 	; 18/04/2021
   474 00006E6D B464                <1> 	mov	ah, 100	      ; 100*(century byte of year)
   475 00006E6F F6E4                <1> 	mul	ah
   476                              <1> 	;
   477 00006E71 660105[B8790100]    <1> 	add 	[year], ax
   478                              <1> 	;mov 	al, [month]   ; Month
   479                              <1> 	; 18/04/2021
   480 00006E78 A0[BB790100]        <1> 	mov	al, [month+1] ; Month
   481                              <1> 	   	; AL <-- BCD number
   482 00006E7D D410                <1>         db 	0D4h, 10h		; Undocumented inst. AAM
   483                              <1> 					; AH = AL / 10h
   484                              <1> 					; AL = AL MOD 10h
   485 00006E7F D50A                <1>         aad 	; AX= AH*10+AL
   486                              <1> 	;mov 	[month], al
   487                              <1>         ;mov	al, [month+1] ; Day
   488                              <1> 	; 18/04/2021
   489 00006E81 8605[BA790100]      <1> 	xchg	al, [month]   ; [month] = month, al = day
   490                              <1> 	   	; AL <-- BCD number
   491 00006E87 D410                <1>         db 	0D4h, 10h		; Undocumented inst. AAM
   492                              <1> 					; AH = AL / 10h
   493                              <1> 					; AL = AL MOD 10h
   494 00006E89 D50A                <1>         aad 	; AX= AH*10+AL
   495 00006E8B A2[BC790100]        <1>         mov     [day], al
   496                              <1> 
   497 00006E90 C3                  <1> 	retn	; 30/12/2017
   498                              <1> 
   499                              <1> epoch:
   500 00006E91 E875FFFFFF          <1> 	call	get_rtc_date_time ; TRDOS 386 - 30/12/2017
   501                              <1> 
   502                              <1> convert_to_epoch:
   503                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   504                              <1> 	; 31/12/2017 (TRDOS 386 = TRDOS v2.0)
   505                              <1> 	; 15/03/2015 (Retro UNIX 386 v1 - 32 bit modification)
   506                              <1> 	; 09/04/2013 (Retro UNIX 8086 v1)
   507                              <1> 	;
   508                              <1> 	; ((Modified registers: EAX, EDX, EBX))
   509                              <1> 	;
   510                              <1> 	; Derived from DALLAS Semiconductor
   511                              <1> 	; Application Note 31 (DS1602/DS1603)
   512                              <1> 	; 6 May 1998
   513 00006E96 29C0                <1> 	sub 	eax, eax
   514 00006E98 66A1[B8790100]      <1> 	mov 	ax, [year]
   515 00006E9E 662DB207            <1> 	sub 	ax, 1970
   516 00006EA2 BA6D010000          <1> 	mov 	edx, 365
   517 00006EA7 F7E2                <1> 	mul 	edx
   518 00006EA9 31DB                <1> 	xor 	ebx, ebx
   519 00006EAB 8A1D[BA790100]      <1> 	mov 	bl, [month]
   520 00006EB1 FECB                <1> 	dec 	bl
   521 00006EB3 D0E3                <1> 	shl 	bl, 1
   522                              <1> 	;sub	edx, edx
   523 00006EB5 668B93[C4790100]    <1> 	mov 	dx, [EBX+DMonth]
   524 00006EBC 8A1D[BC790100]      <1>         mov     bl, [day]
   525 00006EC2 FECB                <1> 	dec 	bl
   526 00006EC4 01D0                <1> 	add 	eax, edx
   527 00006EC6 01D8                <1> 	add 	eax, ebx
   528                              <1> 			; EAX = days since 1/1/1970
   529 00006EC8 668B15[B8790100]    <1> 	mov 	dx, [year]
   530 00006ECF 6681EAB107          <1> 	sub 	dx, 1969
   531                              <1> 	;shr 	dx, 1
   532                              <1> 	;shr 	dx, 1
   533                              <1> 	; 25/07/2022
   534 00006ED4 C1EA02              <1> 	shr	edx, 2
   535                              <1> 		; (year-1969)/4
   536 00006ED7 01D0                <1> 	add 	eax, edx
   537                              <1> 			; + leap days since 1/1/1970
   538 00006ED9 803D[BA790100]02    <1> 	cmp 	byte [month], 2	; if past february
   539 00006EE0 760E                <1> 	jna 	short cte1
   540 00006EE2 668B15[B8790100]    <1> 	mov 	dx, [year]
   541 00006EE9 6683E203            <1> 	and 	dx, 3 ; year mod 4
   542 00006EED 7501                <1> 	jnz 	short cte1
   543                              <1> 			; and if leap year
   544                              <1> 	;add 	eax, 1 	; add this year's leap day (february 29)
   545                              <1> 	; 25/07/2022
   546 00006EEF 40                  <1> 	inc	eax
   547                              <1> cte1: 			; compute seconds since 1/1/1970
   548 00006EF0 BA18000000          <1> 	mov 	edx, 24
   549 00006EF5 F7E2                <1> 	mul	edx
   550 00006EF7 8A15[BE790100]      <1> 	mov 	dl, [hour]
   551 00006EFD 01D0                <1> 	add 	eax, edx
   552                              <1> 		; EAX = hours since 1/1/1970 00:00:00
   553                              <1> 	;mov	ebx, 60
   554 00006EFF B33C                <1> 	mov	bl, 60
   555 00006F01 F7E3                <1> 	mul	ebx
   556 00006F03 8A15[C0790100]      <1> 	mov 	dl, [minute]
   557 00006F09 01D0                <1> 	add 	eax, edx
   558                              <1> 		; EAX = minutes since 1/1/1970 00:00:00
   559                              <1> 	;mov 	ebx, 60
   560 00006F0B F7E3                <1> 	mul	ebx
   561 00006F0D 8A15[C2790100]      <1> 	mov 	dl, [second]
   562 00006F13 01D0                <1> 	add 	eax, edx
   563                              <1>  		; EAX -> seconds since 1/1/1970 00:00:00
   564 00006F15 C3                  <1> 	retn
   565                              <1> 
   566                              <1> ;set_date_time:
   567                              <1> convert_from_epoch:
   568                              <1> 	; 25/07/2022 (v2.0.5)
   569                              <1> 	; 18/04/2021 (v2.0.4)
   570                              <1> 	; 31/12/2017 (v2.0.0)
   571                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0)
   572                              <1> 	; 15/03/2015 (Retro UNIX 386 v1 - 32 bit version)
   573                              <1> 	; 20/06/2013 (Retro UNIX 8086 v1)
   574                              <1> 	; 'convert_from_epoch' procedure prototype:
   575                              <1> 	; 	            UNIXCOPY.ASM, 10/03/2013
   576                              <1> 	;
   577                              <1> 	; ((Modified registers: EAX, EDX, ECX, EBX))
   578                              <1> 	;
   579                              <1> 	; Derived from DALLAS Semiconductor
   580                              <1> 	; Application Note 31 (DS1602/DS1603)
   581                              <1> 	; 6 May 1998
   582                              <1> 	;
   583                              <1> 	; INPUT:
   584                              <1> 	; EAX = Unix (Epoch) Time
   585                              <1> 	;
   586 00006F16 31D2                <1> 	xor 	edx, edx
   587                              <1> 	;mov 	ecx, 60
   588                              <1> 	; 25/07/2022
   589 00006F18 29C9                <1> 	sub	ecx, ecx
   590 00006F1A B13C                <1> 	mov	cl, 60
   591 00006F1C F7F1                <1> 	div	ecx
   592                              <1> 	;mov 	[imin], eax   ; whole minutes
   593                              <1> 			  ; since 1/1/1970
   594 00006F1E 668915[C2790100]    <1> 	mov 	[second], dx  ; leftover seconds
   595 00006F25 29D2                <1> 	sub 	edx, edx
   596 00006F27 F7F1                <1> 	div	ecx
   597                              <1> 	;mov 	[ihrs], eax   ; whole hours
   598                              <1> 	;		      ; since 1/1/1970
   599 00006F29 668915[C0790100]    <1> 	mov 	[minute], dx  ; leftover minutes
   600 00006F30 31D2                <1> 	xor	edx, edx
   601                              <1> 	;mov 	cx, 24
   602 00006F32 B118                <1> 	mov 	cl, 24
   603 00006F34 F7F1                <1> 	div	ecx
   604                              <1> 	;mov 	[iday], ax   ; whole days
   605                              <1> 			     ; since 1/1/1970
   606 00006F36 668915[BE790100]    <1> 	mov 	[hour], dx   ; leftover hours
   607 00006F3D 05DB020000          <1> 	add 	eax, 365+366 ; whole day since
   608                              <1> 			     ; 1/1/1968
   609                              <1> 	;mov 	[iday], ax
   610 00006F42 50                  <1> 	push 	eax
   611 00006F43 29D2                <1> 	sub	edx, edx
   612                              <1> 	;mov 	ecx, (4*365)+1 ; 4 years = 1461 days
   613                              <1> 	; 25/07/2022
   614 00006F45 66B9B505            <1> 	mov	cx, (4*365)+1
   615 00006F49 F7F1                <1> 	div	ecx
   616 00006F4B 59                  <1> 	pop 	ecx
   617                              <1> 	;mov 	[lday], ax   ; count of quadyrs (4 years)
   618                              <1> 	;push 	dx
   619                              <1> 	; 18/04/2021
   620 00006F4C 52                  <1> 	push	edx
   621                              <1> 	;mov 	[qday], dx   ; days since quadyr began
   622 00006F4D 6683FA3C            <1> 	cmp 	dx, 31+29    ; if past feb 29 then
   623 00006F51 F5                  <1> 	cmc		     ; add this quadyr's leap day
   624 00006F52 83D000              <1> 	adc 	eax, 0	     ; to # of qadyrs (leap days)
   625                              <1> 	;mov 	[lday], ax   ; since 1968
   626                              <1> 	;mov 	cx, [iday]
   627 00006F55 91                  <1> 	xchg 	ecx, eax     ; ECX = lday, EAX = iday
   628 00006F56 29C8                <1> 	sub 	eax, ecx     ; iday - lday
   629                              <1> 	;mov 	ecx, 365
   630                              <1> 	; 25/07/2022
   631 00006F58 66B96D01            <1> 	mov	cx, 365
   632 00006F5C 31D2                <1> 	xor	edx, edx
   633                              <1> 	; EAX = iday-lday, EDX = 0
   634 00006F5E F7F1                <1> 	div	ecx
   635                              <1> 	;mov 	[iyrs], ax   ; whole years since 1968
   636                              <1> 	;jday = iday - (iyrs*365) - lday
   637                              <1> 	;mov	[jday], dx   ; days since 1/1 of current year
   638                              <1> 	;add	eax, 1968
   639 00006F60 6605B007            <1> 	add 	ax, 1968     ; compute year
   640 00006F64 66A3[B8790100]      <1> 	mov 	[year], ax
   641                              <1> 	;mov 	cx, dx
   642                              <1> 	; 25/07/2022
   643 00006F6A 89D1                <1> 	mov	ecx, edx
   644                              <1> 	;;mov 	dx, [qday]
   645                              <1> 	;pop 	dx
   646                              <1> 	; 18/04/2021
   647 00006F6C 5A                  <1> 	pop	edx
   648 00006F6D 6681FA6D01          <1> 	cmp 	dx, 365	     ; if qday <= 365 and qday >= 60
   649 00006F72 7708                <1> 	ja 	short cfe1   ; jday = jday +1
   650 00006F74 6683FA3C            <1> 	cmp 	dx, 60       ; if past 2/29 and leap year then
   651 00006F78 F5                  <1>         cmc		     ; add a leap day to the # of whole
   652                              <1> 	;adc 	cx, 0        ; days since 1/1 of current year
   653                              <1> 	; 25/07/2022
   654 00006F79 83D100              <1> 	adc	ecx, 0
   655                              <1> cfe1:
   656                              <1> 	;mov 	[jday], cx
   657                              <1> 	;mov 	bx, 12       ; estimate month
   658                              <1> 	; 18/04/2021
   659 00006F7C 29DB                <1> 	sub	ebx, ebx
   660 00006F7E B30C                <1> 	mov	bl, 12
   661 00006F80 66BA6E01            <1> 	mov 	dx, 366      ; mday, max. days since 1/1 is 365
   662 00006F84 6683E003            <1> 	and 	ax, 11b      ; year mod 4 (and dx, 3)
   663                              <1> cfe2:	; Month calculation  ; 0 to 11  (11 to 0)
   664                              <1> 	;cmp 	cx, dx       ; mday = # of days passed from 1/1
   665                              <1> 	; 25/07/2022
   666 00006F88 39D1                <1> 	cmp	ecx, edx
   667 00006F8A 731B                <1> 	jnb 	short cfe3
   668                              <1> 	;dec 	bx           ; month = month - 1
   669                              <1> 	;shl 	bx, 1
   670                              <1> 	; 18/04/2021
   671 00006F8C FECB                <1> 	dec	bl
   672 00006F8E D0E3                <1> 	shl	bl, 1 
   673 00006F90 668B93[C4790100]    <1> 	mov 	dx, [EBX+DMonth] ; # elapsed days at 1st of month
   674                              <1> 	; 18/04/2021
   675                              <1> 	;shr 	bx, 1        ; bx = month - 1 (0 to 11)
   676 00006F97 D0EB                <1> 	shr	bl, 1
   677                              <1> 	;cmp	bx, 1        ; if month > 2 and year mod 4  = 0	
   678 00006F99 80FB01              <1> 	cmp	bl, 1
   679 00006F9C 76EA                <1> 	jna 	short cfe2   ; then mday = mday + 1
   680 00006F9E 76E8                <1> 	jna 	short cfe2   ; then mday = mday + 1
   681 00006FA0 08C0                <1> 	or 	al, al       ; if past 2/29 and leap year then
   682 00006FA2 75E4                <1> 	jnz 	short cfe2   ; add leap day (to mday)
   683                              <1> 	;inc 	dx           ; mday = mday + 1
   684                              <1> 	; 25/07/2022
   685 00006FA4 42                  <1> 	inc	edx
   686 00006FA5 EBE1                <1> 	jmp 	short cfe2
   687                              <1> cfe3:
   688                              <1> 	;inc 	bx	     ; -> bx = month, 1 to 12
   689                              <1> 	; 18/04/2021
   690 00006FA7 FEC3                <1> 	inc	bl
   691 00006FA9 66891D[BA790100]    <1> 	mov 	[month], bx
   692                              <1> 	;sub 	cx, dx	     ; day = jday - mday + 1
   693                              <1> 	; 25/07/2022
   694 00006FB0 29D1                <1> 	sub	ecx, edx
   695                              <1> 	;inc 	cx
   696                              <1> 	; 18/04/2021
   697 00006FB2 FEC1                <1> 	inc	cl
   698                              <1> 	;mov 	[day], cx
   699 00006FB4 880D[BC790100]      <1> 	mov	[day], cl
   700                              <1> 
   701                              <1> 	; eax, ebx, ecx, edx is changed at return
   702                              <1> 	; output ->
   703                              <1> 	; [year], [month], [day], [hour], [minute], [second]
   704                              <1> 
   705 00006FBA C3                  <1> 	retn	; 31/12/2017 (TRDOS 386)
   706                              <1> 
   707                              <1> set_rtc_date_time:
   708                              <1> 	; 31/12/2017 (v2.0.0)
   709                              <1> 	; 30/12/2017 (TRDOS 386)
   710                              <1> 	; 15/03/2015 (Retro UNIX 386 v1 - 32 bit version)
   711                              <1> 	; 20/06/2013 (Retro UNIX 8086 v1)
   712 00006FBB E80F000000          <1> 	call	set_date_bcd
   713                              <1> 	; Set real-time clock date
   714 00006FC0 E8D7F3FFFF          <1> 	call	set_rtc_date ; RTC_50
   715                              <1> 	; Set real-time clock time
   716 00006FC5 E832000000          <1> 	call	set_time_bcd
   717 00006FCA E96AF3FFFF          <1> 	jmp	set_rtc_time ; RTC_30
   718                              <1> 
   719                              <1> ; 31/12/2017
   720                              <1> set_date_bcd:
   721 00006FCF A0[B9790100]        <1>         mov     al, [year+1]
   722 00006FD4 D40A                <1> 	aam 	; ah = al / 10, al = al mod 10
   723 00006FD6 D510                <1> 	db 	0D5h, 10h    ; Undocumented inst. AAD
   724                              <1> 			     ; AL = AH * 10h + AL
   725 00006FD8 88C5                <1> 	mov 	ch, al ; century (BCD)
   726 00006FDA A0[B8790100]        <1> 	mov 	al, [year]
   727 00006FDF D40A                <1> 	aam 	; ah = al / 10, al = al mod 10
   728 00006FE1 D510                <1> 	db 	0D5h, 10h    ; Undocumented inst. AAD
   729                              <1> 			     ; AL = AH * 10h + AL
   730 00006FE3 88C1                <1> 	mov 	cl, al ; year (BCD)
   731 00006FE5 A0[BA790100]        <1>         mov 	al, [month]
   732 00006FEA D40A                <1> 	aam 	; ah = al / 10, al = al mod 10
   733 00006FEC D510                <1> 	db 	0D5h, 10h    ; Undocumented inst. AAD
   734                              <1> 			     ; AL = AH * 10h + AL
   735 00006FEE 88C6                <1> 	mov 	dh, al ; month (BCD)
   736 00006FF0 A0[BC790100]        <1> 	mov 	al, [day]
   737 00006FF5 D40A                <1> 	aam 	; ah = al / 10, al = al mod 10
   738 00006FF7 D510                <1> 	db 	0D5h, 10h    ; Undocumented inst. AAD
   739                              <1> 			     ; AL = AH * 10h + AL
   740                              <1> 	; 18/04/2021
   741 00006FF9 88C2                <1> 	mov 	dl, al ; day (BCD)
   742 00006FFB C3                  <1> 	retn	; 30/12/2017
   743                              <1> 
   744                              <1> ; 31/12/2017
   745                              <1> set_time_bcd:
   746                              <1>         ; Read real-time clock time 
   747                              <1> 	; (get day light saving time bit status)
   748 00006FFC FA                  <1>  	cli
   749 00006FFD E8D5F4FFFF          <1> 	call	UPD_IPR 		; CHECK FOR UPDATE IN PROCESS
   750                              <1> 	; cf = 1 -> al = 0
   751 00007002 7207                <1>         jc      short stime1
   752 00007004 B00B                <1> 	mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   753 00007006 E802F5FFFF          <1> 	call	CMOS_READ		; READ CURRENT VALUE OF DSE BIT
   754                              <1> stime1:
   755 0000700B FB                  <1> 	sti
   756 0000700C 2401                <1> 	and	al, 00000001b		; MASK FOR VALID DSE BIT
   757 0000700E 88C2                <1> 	mov	dl, al			; SET [DL] TO ZERO FOR NO DSE BIT
   758                              <1> 	; DL = 1 or 0 (day light saving time)
   759                              <1> 	
   760 00007010 A0[BE790100]        <1> 	mov 	al, [hour]
   761 00007015 D40A                <1> 	aam 	; ah = al / 10, al = al mod 10
   762 00007017 D510                <1> 	db 	0D5h,10h     ; Undocumented inst. AAD
   763                              <1> 			     ; AL = AH * 10h + AL
   764 00007019 88C5                <1> 	mov 	ch, al ; hour (BCD)
   765 0000701B A0[C0790100]        <1>         mov     al, [minute]
   766 00007020 D40A                <1> 	aam 	; ah = al / 10, al = al mod 10
   767 00007022 D510                <1> 	db 	0D5h,10h     ; Undocumented inst. AAD
   768                              <1> 			     ; AL = AH * 10h + AL
   769 00007024 88C1                <1> 	mov 	cl, al       ; minute (BCD)
   770 00007026 A0[C2790100]        <1>         mov     al, [second]
   771 0000702B D40A                <1> 	aam 	; ah = al / 10, al = al mod 10
   772 0000702D D510                <1> 	db 	0D5h,10h     ; Undocumented inst. AAD
   773                              <1> 			     ; AL = AH * 10h + AL
   774 0000702F 88C6                <1> 	mov 	dh, al	     ; second (BCD)
   775 00007031 C3                  <1> 	retn	; 30/12/2017
  3431                                  %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 00007032 A0[887D0100]        <1> 	mov	al, [HF_NUM] ; number of fixed disks
    40 00007037 20C0                <1> 	and 	al, al
    41 00007039 7501                <1> 	jnz	short load_hd_partition_tables
    42                              <1> 
    43                              <1> 	; no any hard disks
    44 0000703B 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 0000703C BE[8C7D0100]        <1> 	mov	esi, HDPM_TBL_VEC
    50 00007041 BF[B2810100]        <1> 	mov 	edi, PTable_hd0
    51 00007046 B280                <1> 	mov 	dl, 80h
    52                              <1> 	; 15/07/2020
    53 00007048 A2[3B660000]        <1> 	mov	[hdc], al
    54                              <1> 	;xor	ecx, ecx ; 0
    55                              <1> load_next_hd_partition_table:
    56                              <1> 	; 20/07/2020
    57 0000704D 31C9                <1> 	xor	ecx, ecx ; 0
    58                              <1> 	;push	ecx
    59 0000704F 57                  <1> 	push	edi ; *
    60                              <1> 	;push	esi ; FDPT (+ DPTE) address
    61                              <1> 	; 15/07/2020
    62 00007050 AD                  <1> 	lodsd
    63 00007051 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 00007052 8A4814              <1> 	mov	cl, [eax+20]
    72 00007055 80E140              <1> 	and	cl, 40h
    73                              <1> 	;mov	[HD_LBA_yes], cl
    74                              <1> 	; 22/05/2024 (BugFix)
    75 00007058 0FB6C2              <1> 	movzx	eax, dl
    76 0000705B 05[32820100]        <1> 	add	eax, HD_LBA_yes - 80h
    77 00007060 8808                <1> 	mov	[eax], cl
    78                              <1> 
    79 00007062 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 00007067 7305                <1> 	jnc	short load_mbr_ok
    85 00007069 E98A000000          <1> 	jmp	pass_pt_this_hard_disk
    86                              <1> 
    87                              <1> load_mbr_ok:
    88 0000706E BB[70810100]        <1> 	mov	ebx, PartitionTable
    89 00007073 89DE                <1> 	mov	esi, ebx
    90                              <1> 	;mov	ecx, 16
    91 00007075 B110                <1> 	mov	cl, 16
    92 00007077 F3A5                <1> 	rep 	movsd
    93 00007079 89DE                <1> 	mov 	esi, ebx
    94                              <1> 	;mov 	byte [hdc], 4 ; 4 - partition index
    95                              <1> 	; 15/07/2020
    96 0000707B C605[B7820100]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 00007082 8A4604              <1> 	mov	al, [esi+ptFileSystemID]
   102 00007085 20C0                <1> 	and	al, al
   103 00007087 7457                <1> 	jz	short loc_validate_next_hdp_partition2
   104                              <1> 
   105 00007089 56                  <1> 	push	esi ; *** ; Masterboot partition table offset
   106 0000708A 52                  <1> 	push	edx ; **** ; dl = Physical drive number
   107                              <1> 
   108                              <1> 	; 13/08/2020
   109 0000708B 3C05                <1> 	cmp	al, 05h  ; Extended partition CHS
   110 0000708D 7404                <1>  	je	short loc_set_ep_counter
   111 0000708F 3C0F                <1> 	cmp	al, 0Fh  ; Extended partition LBA
   112 00007091 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 00007093 803D[B8820100]80    <1> 	cmp	byte [EP_Counter], 80h
   121 0000709A 7342                <1> 	jnb	short loc_validate_next_hdp_partition1
   122                              <1> 
   123 0000709C 8815[B8820100]      <1> 	mov	byte [EP_Counter], dl ; disk drv has extd. part.
   124                              <1> 
   125 000070A2 EB3A                <1> 	jmp	short loc_validate_next_hdp_partition1
   126                              <1> 
   127                              <1> loc_validate_next_hdp_partition0:
   128 000070A4 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 000070A6 E88C010000          <1> 	call 	validate_hd_fat_partition
   134 000070AB 730E                <1> 	jnc 	short loc_set_valid_hdp_partition_entry
   135                              <1> 
   136                              <1> 	;pop	edx
   137                              <1> 	;push	edx
   138 000070AD 8B1424              <1> 	mov	edx, [esp]  ; ****
   139 000070B0 8B742404            <1> 	mov	esi, [esp+4] ; *** ; 30/01/2018
   140 000070B4 E8D1020000          <1> 	call	validate_hd_fs_partition
   141 000070B9 7223                <1> 	jc	short loc_validate_next_hdp_partition1
   142                              <1> loc_set_valid_hdp_partition_entry:
   143 000070BB 8A0D[CE340100]      <1> 	mov 	cl, [Last_DOS_DiskNo] 
   144 000070C1 80C141              <1> 	add 	cl, 'A'
   145                              <1> 	; ESI = Logical dos drive description table address
   146 000070C4 880E                <1> 	mov	[esi+LD_Name], cl
   147                              <1> 	; 15/07/2020
   148 000070C6 8A4602              <1> 	mov	al, [esi+LD_PhyDrvNo] ; Physical drive number
   149                              <1> 	;mov	al, [esp] ; ****
   150 000070C9 2C7F                <1> 	sub	al, 7Fh
   151                              <1> 		; AL = 1 to 4
   152 000070CB C0E002              <1> 	shl	al, 2 ; AL = 4 to 16
   153                              <1> 
   154 000070CE 8A15[B7820100]      <1> 	mov	dl, [PP_Counter]
   155                              <1> 
   156                              <1> 	;sub	al, [PP_Counter]
   157 000070D4 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 000070D6 B404                <1> 	mov	ah, 4
   167                              <1> 	;sub	ah, [PP_Counter]
   168 000070D8 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 000070DA 6689467C            <1> 	mov 	[esi+LD_PartitionEntry], ax
   175                              <1> 
   176                              <1> loc_validate_next_hdp_partition1:
   177 000070DE 5A                  <1> 	pop 	edx ; **** ; dl = Physical drive number 
   178 000070DF 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 000070E0 FE0D[B7820100]      <1> 	dec	byte [PP_Counter] ; 4 - partition index
   188 000070E6 7410                <1> 	jz	short pass_pt_this_hard_disk
   189                              <1> 
   190 000070E8 83C610              <1> 	add	esi, 16 ; 10h
   191 000070EB EB95                <1> 	jmp	short loc_validate_hdp_partition
   192                              <1> 
   193                              <1> loc_not_any_extd_partitions:
   194                              <1> 	; 15/07/2020
   195 000070ED C3                  <1> 	retn
   196                              <1> 
   197                              <1> loc_next_hd_partition_table:
   198 000070EE FEC2                <1> 	inc	dl
   199                              <1> 	; 15/07/2020
   200                              <1> 	;add	esi, 32 ; next FDPT address
   201 000070F0 83C740              <1> 	add	edi, 64 ; next partition table destination
   202 000070F3 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 000070F8 5E                  <1> 	pop	esi ; ** ; next FDPT (+ DPTE) address ptr
   208 000070F9 5F                  <1> 	pop	edi ; * ; Ptable_hd?
   209                              <1> 	;pop	ecx
   210                              <1> 	;loop	loc_next_hd_partition_table
   211 000070FA FE0D[3B660000]      <1> 	dec	byte [hdc]
   212 00007100 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 00007102 A0[B8820100]        <1> 	mov	al, [EP_Counter] ; 1st disk drv has extd partition
   227 00007107 08C0                <1> 	or	al, al ; 0 ?
   228 00007109 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 0000710B A2[3B660000]        <1> 	mov	byte [hdc], al ; 1st disk drv has extd partition
   234                              <1> 	; 25/08/2020
   235 00007110 2C80                <1> 	sub	al, 80h
   236 00007112 740E                <1> 	jz	short loc_set_ext_ptable_hd0
   237 00007114 C0E006              <1> 	shl	al, 6 ; * 64
   238 00007117 0FB6F0              <1> 	movzx	esi, al
   239 0000711A 81C6[B2810100]      <1> 	add	esi, PTable_hd0
   240 00007120 EB05                <1> 	jmp 	short next_hd_extd_partition
   241                              <1> 
   242                              <1> 	; 25/08/2020
   243                              <1> loc_set_ext_ptable_hd0:
   244 00007122 BE[B2810100]        <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 00007127 66C705[B8820100]00- <1> 	mov 	word [EP_Counter], 0 ; Reset EP index and LD index
   251 0000712F 00                  <1>
   252                              <1> 
   253 00007130 56                  <1> 	push	esi ; **** ; PTable_hd? offset
   254                              <1> 
   255 00007131 C605[B7820100]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 00007138 8A15[3B660000]      <1> 	mov	dl, [hdc]
   260                              <1> hd_check_fs_id_05h:
   261 0000713E 8A4604              <1> 	mov	al, [esi+ptFileSystemID]
   262 00007141 3C05                <1> 	cmp	al, 05h ; Is it an extended dos partition ?
   263 00007143 7411                <1> 	je	short loc_set_ep_start_sector ; yes
   264                              <1> hd_check_fs_id_0Fh:
   265 00007145 3C0F                <1> 	cmp	al, 0Fh ; Is it an extended win4 (LBA mode) partition ?
   266 00007147 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 00007149 FE0D[B7820100]      <1> 	dec	byte [PP_Counter] ; 4 --> 0
   275 0000714F 7432                <1> 	jz	short continue_check_ep_next_disk
   276 00007151 83C610              <1> 	add	esi, 16
   277 00007154 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 00007156 8B4E08              <1> 	mov	ecx, [esi+ptStartSector]
   283                              <1> 	; 30/08/2020
   284 00007159 890D[BA820100]      <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 0000715F 0FB6FA              <1> 	movzx	edi, dl
   289 00007162 81C7[32820100]      <1> 	add	edi, HD_LBA_yes - 80h
   290                              <1> 	;
   291 00007168 890D[BE820100]      <1> 	mov	[EP_StartSector], ecx ; Extended partition's start sector
   292 0000716E BB[B27F0100]        <1>         mov	ebx, MasterBootBuff
   293                              <1> 	; 22/05/2024
   294 00007173 803F01              <1> 	cmp	byte [edi], 1 ; LBA ready = Yes
   295                              <1> 	;cmp	byte [HD_LBA_yes], 1 ; LBA ready = Yes
   296 00007176 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 00007178 66B8011B            <1> 	mov	ax, 1B01h
   315 0000717C E844DEFFFF          <1> 	call	int13h
   316                              <1> 	;pop	ecx
   317                              <1> 	;jnc	short loc_hd_move_ep_table
   318                              <1> 	; 15/07/2020
   319 00007181 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 00007183 5E                  <1> 	pop	esi ; **** ; PTable_hd?
   325 00007184 A0[887D0100]        <1> 	mov	al, [HF_NUM] ; number of hard disks
   326 00007189 047F                <1> 	add	al, 7Fh
   327 0000718B 3805[3B660000]      <1> 	cmp	[hdc], al
   328 00007191 730B                <1> 	jnb	short loc_validating_hd_partitions_ok
   329 00007193 83C640              <1> 	add	esi, 64
   330                              <1> 	; 15/07/2020
   331                              <1> 	;add	edi, 64
   332 00007196 FE05[3B660000]      <1> 	inc	byte [hdc]
   333 0000719C 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 0000719E 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 0000719F 8A7601              <1> 	mov	dh, [esi+ptBeginHead]
   350 000071A2 668B4E02            <1>         mov     cx, [esi+ptBeginSector]
   351 000071A6 66B80102            <1> 	mov	ax, 0201h ; Read 1 sector
   352                              <1> 	;mov	ebx, MasterBootBuff
   353 000071AA E816DEFFFF          <1> 	call	int13h ; 20/07/2020
   354                              <1> 		       ; 'diskio.s' modification, 'clc'
   355                              <1> 	;pop	ecx
   356 000071AF 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 000071B1 BE[70810100]        <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 000071B6 807E0400            <1> 	cmp	byte [esi+ptFileSystemID], 0
   408 000071BA 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 000071BC FE05[B8820100]      <1> 	inc	byte [EP_Counter] ; current (sub partition) index
   418                              <1> 				  ; in current extended partition
   419 000071C2 BF[BE820100]        <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 000071C7 E86B000000          <1> 	call	validate_hd_fat_partition
   425                              <1> 	;pop	ecx ; *
   426 000071CC 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 000071CE 8A15[3B660000]      <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 000071D4 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 000071D6 A0[3B660000]        <1> 	mov	al, [hdc] ; Hard disk drive number (>=80h)
   458 000071DB 88C2                <1> 	mov	dl, al ; mov dl, [hdc]
   459 000071DD 2C7F                <1> 	sub	al, 7Fh
   460                              <1> 		    ; 1 to 4
   461 000071DF C0E002              <1> 	shl	al, 2 ; 4 to 16
   462 000071E2 2A05[B7820100]      <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 000071E8 8A25[B9820100]      <1> 	mov	ah, [LD_Counter] ; Logical drive index number
   476                              <1> 				; (in current extended partition)
   477 000071EE 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 000071F1 6689467C            <1> 	mov	[esi+LD_PartitionEntry], ax
   487                              <1> 
   488 000071F5 8A0D[CE340100]      <1> 	mov	cl, [Last_DOS_DiskNo]
   489 000071FB 80C141              <1> 	add	cl, 'A'
   490 000071FE 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 00007200 FE05[B9820100]      <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 00007206 803D[B9820100]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 0000720D 7205                <1> 	jb	short validate_next_minidisk_partition_ok
   527 0000720F 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 00007214 BE[80810100]        <1> 	mov	esi, PartitionTable+16
   540                              <1> 
   541                              <1> 	; 20/07/2020
   542 00007219 8A4604              <1> 	mov	al, [esi+ptFileSystemID]
   543                              <1> 
   544                              <1> 	; 20/07/2020
   545 0000721C 3C05                <1> 	cmp	al, 05h ; Is it an extended dos partition ?
   546 0000721E 7409                <1> 	je	short loc_minidisk_next_ep_lba_chs ; 17/07/2020
   547 00007220 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 00007222 7405                <1> 	je	short loc_minidisk_next_ep_lba_chs
   554 00007224 E95AFFFFFF          <1> 	jmp	continue_check_ep_next_disk
   555                              <1> 
   556                              <1> loc_minidisk_next_ep_lba_chs:
   557                              <1> 	; 17/07/2020
   558 00007229 8B4E08              <1> 	mov	ecx, [esi+ptStartSector] ; relative start sector number
   559                              <1> 	;add	ecx, [EP_StartSector]
   560                              <1> 	; 30/08/2020	
   561 0000722C 030D[BA820100]      <1> 	add	ecx, [MBR_EP_StartSector]
   562                              <1> 	; 20/07/2020
   563 00007232 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 00007237 8A6604              <1> 	mov 	ah, [esi+ptFileSystemID]
   592 0000723A B002                <1> 	mov	al, 2 ; 27/12/2017
   593 0000723C 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 0000723F 7711                <1> 	ja	short vhdp_FAT16_32
   599 00007241 7425                <1> 	je	short loc_set_valid_hd_partition_params
   600                              <1> 
   601                              <1> vhdp_FAT12_16:
   602                              <1> 	; 27/12/2017
   603 00007243 FEC8                <1> 	dec	al ; mov al, 1
   604 00007245 38C4                <1> 	cmp	ah, al ; 1 ; FAT12 partition
   605 00007247 741F                <1> 	je	short loc_set_valid_hd_partition_params
   606                              <1> 	;
   607 00007249 FEC0                <1> 	inc	al ; mov al, 2
   608 0000724B 80FC04              <1> 	cmp	ah, 04h ; FAT16 CHS partition (< 32MB)
   609 0000724E 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 00007250 F9                  <1> 	stc
   615                              <1> 	; cf=1
   616 00007251 C3                  <1> 	retn
   617                              <1> 
   618                              <1> vhdp_FAT16_32:
   619                              <1> 	; 15/07/2020
   620                              <1> 	;mov	al, 3
   621 00007252 FEC0                <1> 	inc	al
   622 00007254 80FC0C              <1> 	cmp	ah, 0Ch ; FAT32 LBA partition
   623 00007257 740F                <1> 	je	short loc_set_valid_hd_partition_params
   624 00007259 7706                <1> 	ja	short vhdp_check_FAT16_lba
   625                              <1> 
   626                              <1> vhdp_check_FAT32_chs:
   627 0000725B 80FC0B              <1> 	cmp	ah, 0Bh ; FAT32 CHS partition 
   628 0000725E 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 00007260 C3                  <1> 	retn
   634                              <1> 
   635                              <1> vhdp_check_FAT16_lba:
   636 00007261 80FC0E              <1> 	cmp	ah, 0Eh ; FAT16 LBA partition
   637 00007264 75EA                <1> 	jne	short loc_not_a_valid_fat_partition1
   638                              <1> 
   639                              <1> 	;mov	al, 2
   640 00007266 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 00007268 31DB                <1> 	xor	ebx, ebx
   649 0000726A 8A3D[CE340100]      <1> 	mov	bh, [Last_DOS_DiskNo] ; * 256
   650 00007270 FEC7                <1> 	inc	bh ; 15/07/2020
   651 00007272 81C300010900        <1> 	add	ebx, Logical_DOSDisks
   652                              <1> 	;
   653 00007278 C6430102            <1> 	mov	byte [ebx+LD_DiskType], 2
   654 0000727C 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 0000727F 66894303            <1> 	mov	word [ebx+LD_FATType], ax
   658                              <1> 	;
   659 00007283 8B4E08              <1> 	mov	ecx, [esi+ptStartSector]
   660 00007286 09FF                <1> 	or	edi, edi 
   661 00007288 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 0000728A 030F                <1> 	add	ecx, [edi]
   665                              <1> pass_hd_FAT_ep_start_sector_adding:
   666 0000728C 894B6C              <1> 	mov	[ebx+LD_StartSector], ecx
   667                              <1> loc_hd_FAT_logical_drv_init:
   668 0000728F 89DD                <1> 	mov	ebp, ebx
   669                              <1> 	;mov	dl, [ebx+LD_PhyDrvNo]
   670 00007291 A0[B2820100]        <1> 	mov	al, [HD_LBA_yes] ; 07/01/2016
   671 00007296 884305              <1> 	mov	[ebx+LD_LBAYes], al
   672 00007299 BB[C2820100]        <1> 	mov	ebx, DOSBootSectorBuff ; buffer address
   673 0000729E 08C0                <1> 	or	al, al
   674 000072A0 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 000072A2 B41B                <1> 	mov	ah, 1Bh ; LBA read
   683 000072A4 B001                <1> 	mov	al, 1 ; sector count
   684 000072A6 E81ADDFFFF          <1> 	call	int13h
   685 000072AB 7313                <1> 	jnc	short loc_hd_drv_FAT_boot_validation
   686                              <1> loc_not_a_valid_fat_partition3:
   687 000072AD C3                  <1> 	retn
   688                              <1> loc_hd_FAT_drv_init_load_bs_chs:
   689 000072AE 8A7601              <1> 	mov	dh, [esi+ptBeginHead]
   690 000072B1 668B4E02            <1> 	mov	cx, [esi+ptBeginSector]
   691 000072B5 66B80102            <1> 	mov	ax, 0201h ; Read 1 sector
   692                              <1> 	;mov	ebx, DOSBootSectorBuff
   693 000072B9 E807DDFFFF          <1> 	call	int13h
   694 000072BE 72ED                <1> 	jc	short loc_not_a_valid_fat_partition3
   695                              <1> loc_hd_drv_FAT_boot_validation:
   696                              <1> 	;mov	esi, DOSBootSectorBuff
   697 000072C0 89DE                <1> 	mov	esi, ebx
   698 000072C2 6681BEFE01000055AA  <1> 	cmp	word [esi+BS_Validation], 0AA55h
   699 000072CB 7514                <1> 	jne	short loc_not_a_valid_fat_partition4
   700 000072CD 807E15F8            <1> 	cmp	byte [esi+BPB_Media], 0F8h
   701 000072D1 750E                <1> 	jne	short loc_not_a_valid_fat_partition4
   702                              <1> 
   703                              <1> 	; 25/07/2022
   704 000072D3 31C9                <1> 	xor	ecx, ecx
   705                              <1> 
   706                              <1> 	; 27/12/2017
   707 000072D5 807D0303            <1> 	cmp	byte [ebp+LD_FATType], 3
   708 000072D9 7508                <1> 	jne	short loc_hd_FAT16_BPB
   709                              <1> 
   710                              <1> loc_hd_drv_FAT32_boot_validation:
   711 000072DB 807E4229            <1> 	cmp	byte [esi+BS_FAT32_BootSig], 29h
   712 000072DF 7413                <1> 	je	short loc_hd_FAT32_BPB
   713                              <1> 
   714                              <1> loc_not_a_valid_fat_partition4:
   715 000072E1 F9                  <1> 	stc
   716 000072E2 C3                  <1> 	retn
   717                              <1> 
   718                              <1> loc_hd_FAT16_BPB:
   719 000072E3 807E2629            <1> 	cmp	byte [esi+BS_BootSig], 29h
   720 000072E7 75F8                <1> 	jne	short loc_not_a_valid_fat_partition4
   721                              <1> 
   722 000072E9 66837E1600          <1> 	cmp	word [esi+BPB_FATSz16], 0
   723 000072EE 7604                <1> 	jna	short loc_hd_big_FAT16_BPB
   724                              <1> 	;mov	ecx, 32
   725                              <1> 	; 25/07/2022
   726 000072F0 B120                <1> 	mov	cl, 32
   727                              <1> 	; ecx = 32
   728 000072F2 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 000072F4 B12D                <1> 	mov	cl, 45
   737                              <1> 	; ecx = 45
   738                              <1> loc_hd_move_FAT_BPB:
   739 000072F6 89EF                <1> 	mov 	edi, ebp
   740                              <1> 	;mov	esi, ebx ; Boot sector
   741 000072F8 57                  <1> 	push	edi
   742 000072F9 83C706              <1> 	add	edi, LD_BPB
   743 000072FC F366A5              <1> 	rep	movsw
   744 000072FF 5E                  <1> 	pop	esi
   745 00007300 0FB74614            <1> 	movzx	eax, word [esi+LD_BPB+BPB_RsvdSecCnt]
   746 00007304 03466C              <1> 	add	eax, [esi+LD_StartSector]
   747 00007307 894660              <1> 	mov	[esi+LD_FATBegin], eax
   748 0000730A 807E0303            <1> 	cmp	byte [esi+LD_FATType], 3
   749 0000730E 7223                <1> 	jb	short loc_set_FAT16_RootDirLoc
   750                              <1> loc_set_FAT32_RootDirLoc:
   751 00007310 8B462A              <1> 	mov	eax, [esi+LD_BPB+BPB_FATSz32]
   752 00007313 0FB65E16            <1>         movzx	ebx, byte [esi+LD_BPB+BPB_NumFATs]
   753 00007317 F7E3                <1> 	mul	ebx
   754 00007319 034660              <1> 	add	eax, [esi+LD_FATBegin]
   755                              <1> loc_set_FAT32_data_begin:
   756 0000731C 894668              <1> 	mov	[esi+LD_DATABegin], eax
   757 0000731F 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 00007322 8B4632              <1> 	mov	eax, [esi+LD_BPB+BPB_RootClus]
   762                              <1> 	;sub	eax, 2
   763                              <1> 	; 30/07/2022
   764 00007325 48                  <1> 	dec	eax ; 2 -> 1
   765 00007326 48                  <1> 	dec	eax ; 1 -> 0
   766 00007327 7433                <1> 	jz	short short loc_set_32bit_FAT_total_sectors
   767                              <1> 	;movzx	ebx, byte [esi+LD_BPB+BPB_SecPerClust]
   768 00007329 8A5E13              <1> 	mov	bl, [esi+LD_BPB+BPB_SecPerClust] 
   769 0000732C F7E3                <1> 	mul	ebx
   770 0000732E 014664              <1> 	add	[esi+LD_ROOTBegin], eax
   771 00007331 EB29                <1> 	jmp	short loc_set_32bit_FAT_total_sectors
   772                              <1> 	;
   773                              <1> loc_set_FAT16_RootDirLoc:
   774 00007333 0FB64616            <1> 	movzx	eax, byte [esi+LD_BPB+BPB_NumFATs]
   775 00007337 0FB7561C            <1> 	movzx	edx, word [esi+LD_BPB+BPB_FATSz16]
   776 0000733B F7E2                <1> 	mul	edx
   777 0000733D 034660              <1> 	add	eax, [esi+LD_FATBegin]
   778 00007340 894664              <1> 	mov	[esi+LD_ROOTBegin], eax
   779                              <1> loc_set_FAT16_data_begin:
   780 00007343 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 00007346 0FB74617            <1> 	movzx	eax, word [esi+LD_BPB+BPB_RootEntCnt]
   792 0000734A 6683C00F            <1> 	add	ax, 15
   793                              <1> 	;shr	ax, 4 ; / 16 ; (16 entries per sector)
   794                              <1> 	; 25/07/2022
   795 0000734E C1E804              <1> 	shr	eax, 4
   796 00007351 014668              <1> 	add	[esi+LD_DATABegin], eax
   797                              <1> 	;movzx	eax, word [esi+LD_BPB+BPB_TotalSec16]
   798 00007354 668B4619            <1> 	mov	ax, [esi+LD_BPB+BPB_TotalSec16]
   799                              <1> 	;test	ax, ax
   800                              <1> 	; 25/07/2022
   801 00007358 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 0000735A 7503                <1> 	jnz	short loc_set_hd_FAT_cluster_count
   808                              <1> loc_set_32bit_FAT_total_sectors:
   809 0000735C 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 0000735F 894670              <1> 	mov	[esi+LD_TotalSectors], eax ; 14/07/2020
   813 00007362 8B5668              <1> 	mov	edx, [esi+LD_DATABegin]
   814 00007365 2B566C              <1> 	sub	edx, [esi+LD_StartSector]
   815 00007368 29D0                <1> 	sub	eax, edx
   816 0000736A 31D2                <1> 	xor	edx, edx ; 0
   817 0000736C 0FB64E13            <1>         movzx   ecx, byte [esi+LD_BPB+BPB_SecPerClust]
   818 00007370 F7F1                <1>         div	ecx 
   819 00007372 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 00007375 E852010000          <1> 	call	get_free_FAT_sectors
   825 0000737A 720D                <1> 	jc	short loc_validate_hd_FAT_partition_retn
   826 0000737C 894674              <1> 	mov	[esi+LD_FreeSectors], eax
   827 0000737F C6467E06            <1> 	mov	byte [esi+LD_MediaChanged], 6  ; Volume Name Reset
   828                              <1> 
   829                              <1> 	; 15/07/2020
   830 00007383 FE05[CE340100]      <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 00007389 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 0000738A 8A6604              <1> 	mov	ah, [esi+ptFileSystemID]
   861 0000738D 80FCA1              <1> 	cmp	ah, 0A1h ; SINGLIX FS1 (trfs1) partition
   862 00007390 7549                <1> 	jne	short loc_validate_hd_fs_partition_stc_retn
   863                              <1> loc_set_valid_hd_fs_partition_params:
   864 00007392 FE05[CE340100]      <1> 	inc	byte [Last_DOS_DiskNo] ; > 1
   865 00007398 30C0                <1> 	xor	al, al ; mov al, 0
   866                              <1> 	;mov	[drv], dl
   867 0000739A 29DB                <1> 	sub	ebx, ebx ; 0
   868 0000739C 8A3D[CE340100]      <1> 	mov	bh, [Last_DOS_DiskNo]
   869 000073A2 81C300010900        <1> 	add	ebx, Logical_DOSDisks
   870 000073A8 C6430102            <1> 	mov	byte [ebx+LD_DiskType], 2
   871 000073AC 885302              <1> 	mov	[ebx+LD_PhyDrvNo], dl
   872                              <1> 	;mov	[ebx+LD_FATType], al ; 0
   873                              <1> 	;mov	[ebx+LD_FSType], ah
   874 000073AF 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 000073B3 89DD                <1> 	mov	ebp, ebx ; 10/01/2016
   879                              <1> 	;mov	dl, [ebx+LD_PhyDrvNo]
   880 000073B5 A0[B2820100]        <1> 	mov	al, [HD_LBA_yes] ; 10/01/2016
   881 000073BA 884305              <1> 	mov	[ebx+LD_LBAYes], al
   882 000073BD 89DE                <1> 	mov	esi, ebx
   883 000073BF BB[C2820100]        <1> 	mov	ebx, DOSBootSectorBuff ; buffer address
   884 000073C4 08C0                <1> 	or	al, al
   885 000073C6 7515                <1> 	jnz	short loc_hd_fs_drv_init_load_bs_lba
   886                              <1> loc_hd_fs_drv_init_load_bs_chs:
   887 000073C8 8A7601              <1> 	mov	dh, [esi+ptBeginHead]
   888 000073CB 668B4E02            <1> 	mov	cx, [esi+ptBeginSector]
   889 000073CF 66B80102            <1> 	mov	ax, 0201h ; Read 1 sector
   890                              <1> 	;mov	ebx, DOSBootSectorBuff
   891 000073D3 E8EDDBFFFF          <1> 	call	int13h
   892 000073D8 7311                <1> 	jnc	short loc_hd_drv_fs_boot_validation
   893                              <1> loc_validate_hd_fs_partition_err_retn:
   894 000073DA C3                  <1> 	retn
   895                              <1> loc_validate_hd_fs_partition_stc_retn:
   896 000073DB F9                  <1> 	stc
   897 000073DC 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 000073DD 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 000073E0 B41B                <1> 	mov	ah, 1Bh ; LBA read
   907 000073E2 B001                <1> 	mov	al, 1 ; sector count
   908 000073E4 E8DCDBFFFF          <1> 	call	int13h
   909 000073E9 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 000073EB 89DE                <1> 	mov	esi, ebx ; Boot sector buffer
   913 000073ED 6681BEFE01000055AA  <1> 	cmp	word [esi+BS_Validation], 0AA55h
   914 000073F6 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 000073F8 66817E034653        <1> 	cmp	word [esi+bs_FS_Identifier], 'FS' ; 03/02/2018
   918 000073FE 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 00007400 807E09A1            <1> 	cmp	byte [esi+bs_FS_PartitionID], 0A1h
   922 00007404 75D5                <1> 	jne	short loc_validate_hd_fs_partition_stc_retn
   923                              <1> 	;
   924 00007406 89EF                <1> 	mov	edi, ebp ; 10/01/2016
   925                              <1> 	;
   926 00007408 8A462D              <1> 	mov	al, byte [esi+bs_FS_LBA_Ready]
   927 0000740B 884705              <1> 	mov	[edi+LD_FS_LBAYes], al
   928                              <1> 	;
   929                              <1> 	; 03/01/2010 CHS -> DOS FAT/BPB compatibility fix
   930 0000740E 8A4608              <1> 	mov	al, [esi+bs_FS_MediaAttrib]
   931 00007411 884706              <1> 	mov	byte [edi+LD_FS_MediaAttrib], al
   932                              <1> 	;
   933 00007414 8A460A              <1> 	mov	al, [esi+bs_FS_VersionMaj]
   934 00007417 884707              <1> 	mov	[edi+LD_FS_VersionMajor], al
   935                              <1> 	;
   936 0000741A 668B4606            <1> 	mov	ax, [esi+bs_FS_BytesPerSec]
   937 0000741E 66894711            <1> 	mov	[edi+LD_FS_BytesPerSec], ax
   938 00007422 8A462E              <1> 	mov	al, [esi+bs_FS_SecPerTrack]
   939 00007425 30E4                <1> 	xor	ah, ah ; 09/12/2017
   940 00007427 6689471E            <1> 	mov	[edi+LD_FS_SecPerTrack], ax
   941 0000742B 8A462F              <1> 	mov	al, [esi+bs_FS_Heads]
   942 0000742E 66894720            <1> 	mov	[edi+LD_FS_NumHeads], ax
   943                              <1> 	;
   944 00007432 8B4628              <1> 	mov	eax, [esi+bs_FS_UnDelDirD]
   945 00007435 894722              <1> 	mov	[edi+LD_FS_UnDelDirD], eax
   946 00007438 8B5618              <1> 	mov	edx, [esi+bs_FS_MATLocation]
   947 0000743B 89570C              <1> 	mov	[edi+LD_FS_MATLocation], edx
   948 0000743E 8B461C              <1> 	mov	eax, [esi+bs_FS_RootDirD]
   949 00007441 894708              <1> 	mov	[edi+LD_FS_RootDirD], eax
   950 00007444 8B460C              <1> 	mov	eax, [esi+bs_FS_BeginSector]
   951 00007447 89476C              <1> 	mov	[edi+LD_FS_BeginSector], eax
   952 0000744A 8B4710              <1> 	mov	eax, [edi+bs_FS_VolumeSize]
   953 0000744D 894770              <1> 	mov	[edi+LD_FS_VolumeSize], eax
   954                              <1> 	;
   955 00007450 89D0                <1> 	mov	eax, edx ; [edi+LD_FS_MATLocation]
   956 00007452 03476C              <1> 	add	eax, [edi+LD_FS_BeginSector]
   957 00007455 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 00007457 29C9                <1> 	sub	ecx, ecx
   963 00007459 FEC1                <1> 	inc	cl
   964                              <1> 	; ecx = 1
   965 0000745B E8D4AB0000          <1> 	call	disk_read
   966 00007460 7248                <1> 	jc	short loc_validate_hd_fs_partition_retn
   967                              <1> 	; EDI will not be changed
   968 00007462 89DE                <1> 	mov	esi, ebx
   969                              <1> use_hdfs_mat_sector_params:
   970 00007464 8B460C              <1> 	mov	eax, [esi+FS_MAT_DATLocation]
   971 00007467 894714              <1> 	mov	[edi+LD_FS_DATLocation], eax
   972 0000746A 8B4610              <1> 	mov	eax, [esi+FS_MAT_DATScount]
   973 0000746D 894718              <1> 	mov	[edi+LD_FS_DATSectors], eax
   974 00007470 8B4614              <1> 	mov	eax, [esi+FS_MAT_FreeSectors]
   975 00007473 894774              <1>         mov     [edi+LD_FS_FreeSectors], eax
   976 00007476 8B4618              <1> 	mov	eax, [esi+FS_MAT_FirstFreeSector]
   977 00007479 894778              <1> 	mov	[edi+LD_FS_FirstFreeSector], eax
   978 0000747C 8B4708              <1> 	mov	eax, [edi+LD_FS_RootDirD]
   979 0000747F 03476C              <1> 	add	eax, [edi+LD_FS_BeginSector]
   980 00007482 89FE                <1> 	mov	esi, edi
   981                              <1> read_hd_fs_RDT_sector:
   982 00007484 BB[C2820100]        <1> 	mov	ebx, DOSBootSectorBuff
   983                              <1> 	;mov	ecx, 1
   984 00007489 B101                <1> 	mov	cl, 1
   985 0000748B E8A4AB0000          <1> 	call	disk_read
   986 00007490 7218                <1> 	jc	short loc_validate_hd_fs_partition_retn
   987                              <1> 	; EDI will not be changed
   988 00007492 89DE                <1> 	mov	esi, ebx
   989                              <1> use_hdfs_RDT_sector_params:
   990 00007494 8B461C              <1> 	mov	eax, [esi+FS_RDT_VolumeSerialNo]
   991 00007497 894728              <1> 	mov	[edi+LD_FS_VolumeSerial], eax
   992 0000749A 57                  <1> 	push	edi
   993                              <1> 	;mov	ecx, 16
   994 0000749B B110                <1> 	mov	cl, 16
   995 0000749D 83C640              <1> 	add	esi, FS_RDT_VolumeName
   996 000074A0 83C72C              <1> 	add	edi, LD_FS_VolumeName
   997 000074A3 F3A5                <1> 	rep	movsd ; 64 bytes
   998 000074A5 5E                  <1> 	pop	esi
   999                              <1> 		; Volume Name Reset
  1000 000074A6 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 000074AA 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 000074AB BB[B27F0100]        <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 000074B0 B101                <1> 	mov	cl, 1
  1029                              <1> 	; ecx = 1
  1030 000074B2 89C8                <1> 	mov	eax, ecx ; ch = cylinder = 0
  1031 000074B4 B402                <1> 	mov	ah, 2  ; chs read
  1032                              <1> 	; eax = 0201h
  1033 000074B6 30F6                <1> 	xor	dh, dh ; head = 0
  1034 000074B8 E808DBFFFF          <1> 	call	int13h
  1035 000074BD 720C                <1> 	jc	short harddisk_error
  1036                              <1> 	;
  1037 000074BF 66813D[B0810100]55- <1> 	cmp	word [MBIDCode], 0AA55h
  1037 000074C7 AA                  <1>
  1038 000074C8 7401                <1> 	je	short load_masterboot_ok
  1039 000074CA F9                  <1> 	stc
  1040                              <1> harddisk_error:
  1041                              <1> load_masterboot_ok:
  1042 000074CB 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 000074CC 31C0                <1> 	xor	eax, eax
  1060                              <1> 	;mov	[esi+LD_FreeSectors], eax ; Reset
  1061                              <1> 	
  1062 000074CE 807E0302            <1>         cmp     byte [esi+LD_FATType], 2
  1063 000074D2 7653                <1> 	jna	short loc_gfc_get_fat_free_clusters
  1064                              <1> 
  1065                              <1> 	; 29/02/2016
  1066 000074D4 48                  <1> 	dec	eax ; 0FFFFFFFFh
  1067 000074D5 89463A              <1> 	mov	[esi+LD_BPB+BPB_Reserved], eax ; Free cluster count (reset)
  1068 000074D8 89463E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], eax ; First Free Cluster (reset)
  1069 000074DB 40                  <1> 	inc	eax ; 0
  1070                              <1> 	;
  1071 000074DC 668B4636            <1> 	mov	ax, [esi+LD_BPB+BPB_FSInfo]
  1072 000074E0 03466C              <1> 	add	eax, [esi+LD_StartSector]
  1073                              <1> 
  1074 000074E3 BB[C2820100]        <1> 	mov	ebx, DOSBootSectorBuff
  1075                              <1> 	;mov	ecx, 1
  1076                              <1> 	; 25/07/2022
  1077 000074E8 31C9                <1> 	xor	ecx, ecx
  1078 000074EA FEC1                <1> 	inc	cl
  1079                              <1> 	; ecx = 1
  1080 000074EC E843AB0000          <1>  	call	disk_read
  1081 000074F1 7301                <1> 	jnc	short loc_gfc_check_fsinfo_signs
  1082                              <1> retn_gfc_get_fsinfo_sec:
  1083 000074F3 C3                  <1> 	retn
  1084                              <1> 
  1085                              <1> loc_gfc_check_fsinfo_signs:
  1086 000074F4 BB[C2820100]        <1> 	mov 	ebx, DOSBootSectorBuff ; 13/02/2016
  1087 000074F9 813B52526141        <1>         cmp     dword [ebx], 41615252h
  1088 000074FF 7524                <1> 	jne	short retn_gfc_get_fsinfo_stc
  1089                              <1> 	;add	ebx, 484
  1090                              <1> 	;cmp	dword [ebx], 61417272h
  1091 00007501 81BBE4010000727241- <1> 	cmp	dword [ebx+484], 61417272h
  1091 0000750A 61                  <1>
  1092 0000750B 7518                <1> 	jne	short retn_gfc_get_fsinfo_stc
  1093                              <1> 	;add	ebx, 4
  1094                              <1> 	;mov	eax, [ebx]
  1095 0000750D 8B83E8010000        <1> 	mov	eax, [ebx+488]
  1096                              <1> 	; 29/02/2016
  1097 00007513 89463A              <1> 	mov	[esi+LD_BPB+BPB_Reserved], eax ; Free cluster count
  1098 00007516 8B93EC010000        <1> 	mov	edx, [ebx+492] 
  1099                              <1> 	; 29/08/2023 (BugFix)
  1100 0000751C 89563E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], edx ; First Free Cluster
  1101                              <1> 	; 21/12/2017
  1102 0000751F 89C3                <1> 	mov	ebx, eax ; (initial value = 0FFFFFFFFh)
  1103 00007521 43                  <1> 	inc	ebx ; 0FFFFFFFFh -> 0  
  1104 00007522 7513                <1> 	jnz	short short retn_from_get_free_fat32_clusters
  1105 00007524 C3                  <1> 	retn
  1106                              <1> 
  1107                              <1> retn_gfc_get_fsinfo_stc:
  1108 00007525 F9                  <1> 	stc
  1109 00007526 C3                  <1> 	retn
  1110                              <1> 
  1111                              <1> loc_gfc_get_fat_free_clusters:
  1112                              <1> 	;mov	eax, 2
  1113 00007527 B002                <1> 	mov	al, 2
  1114                              <1> 	;mov	[FAT_CurrentCluster], eax
  1115                              <1> loc_gfc_loop_get_next_cluster:
  1116 00007529 E83E4E0000          <1> 	call	get_next_cluster
  1117 0000752E 730E                <1> 	jnc	short loc_gfc_free_fat_clusters_cont
  1118 00007530 21C0                <1> 	and	eax, eax
  1119 00007532 7411                <1> 	jz	short loc_gfc_pass_inc_free_cluster_count
  1120                              <1> 
  1121                              <1> retn_from_get_free_fat_clusters:
  1122 00007534 8B4674              <1> 	mov	eax, [esi+LD_FreeSectors] ; Free clusters !
  1123                              <1> retn_from_get_free_fat32_clusters:
  1124 00007537 0FB65E13            <1>         movzx	ebx, byte [esi+LD_BPB+BPB_SecPerClust]
  1125 0000753B F7E3                <1>       	mul	ebx
  1126                              <1> 	;mov	[esi+LD_FreeSectors], eax ; Free sectors
  1127                              <1> retn_get_free_sectors_calc:
  1128 0000753D C3                  <1> 	retn
  1129                              <1> 
  1130                              <1> loc_gfc_free_fat_clusters_cont:
  1131 0000753E 09C0                <1> 	or	eax, eax
  1132 00007540 7503                <1> 	jnz	short loc_gfc_pass_inc_free_cluster_count
  1133 00007542 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 00007545 89C8                <1> 	mov	eax, ecx ; [FAT_CurrentCluster]
  1138 00007547 3B4678              <1> 	cmp	eax, [esi+LD_Clusters]
  1139 0000754A 77E8                <1> 	ja	short retn_from_get_free_fat_clusters
  1140 0000754C 40                  <1> 	inc	eax
  1141                              <1> 	;mov	[FAT_CurrentCluster], eax
  1142 0000754D 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 0000754F BE[3C660000]        <1> 	mov	esi, fd0_type ; 10/01/2016
  1160 00007554 BF00010900          <1> 	mov	edi, Logical_DOSDisks
  1161 00007559 08D2                <1> 	or	dl, dl
  1162 0000755B 7407                <1> 	jz	short loc_drv_init_fd0_fd1
  1163 0000755D 81C700010000        <1> 	add	edi, 100h
  1164 00007563 46                  <1> 	inc	esi ; fd1_type ; 10/01/2016
  1165                              <1> loc_drv_init_fd0_fd1:
  1166 00007564 C6477E00            <1> 	mov	byte [edi+LD_MediaChanged], 0
  1167 00007568 803E01              <1> 	cmp	byte [esi], 1 ; type (>0 if it is existing) 
  1168                              <1> 		; 4 = 1.44 MB, 80 track, 3 1/2"
  1169 0000756B 7221                <1> 	jb	short read_fd_boot_sector_retn
  1170 0000756D 885702              <1> 	mov	[edi+LD_PhyDrvNo], dl
  1171                              <1> read_fd_boot_sector:
  1172 00007570 30F6                <1> 	xor	dh, dh
  1173 00007572 B904000000          <1> 	mov	ecx, 4 ; Retry Count
  1174                              <1> read_fd_boot_sector_again:
  1175 00007577 51                  <1> 	push 	ecx
  1176                              <1> 	;mov	cx, 1
  1177 00007578 B101                <1> 	mov	cl, 1
  1178 0000757A 66B80102            <1> 	mov	ax, 0201h ; Read 1 sector
  1179 0000757E BB[C2820100]        <1> 	mov	ebx, DOSBootSectorBuff
  1180 00007583 E83DDAFFFF          <1> 	call	int13h
  1181 00007588 59                  <1> 	pop	ecx
  1182 00007589 7304                <1> 	jnc	short use_fd_boot_sector_params
  1183 0000758B E2EA                <1> 	loop	read_fd_boot_sector_again
  1184                              <1> 
  1185                              <1> read_fd_boot_sector_stc_retn:
  1186 0000758D F9                  <1> 	stc
  1187                              <1> read_fd_boot_sector_retn:
  1188 0000758E C3                  <1> 	retn
  1189                              <1> 
  1190                              <1> use_fd_boot_sector_params:
  1191                              <1> 	;mov	esi, DOSBootSectorBuff
  1192 0000758F 89DE                <1> 	mov	esi, ebx
  1193 00007591 6681BEFE01000055AA  <1> 	cmp	word [esi+BS_Validation], 0AA55h
  1194 0000759A 75F1                <1> 	jne	short read_fd_boot_sector_stc_retn
  1195 0000759C 66817E035346        <1>         cmp     word [esi+bs_FS_Identifier], 'SF'
  1196                              <1> 	;jne	use_fd_fatfs_boot_sector_params
  1197                              <1> 	; 25/07/2022
  1198 000075A2 7405                <1> 	je	short use_fdfs_boot_sector_params
  1199 000075A4 E9A1000000          <1> 	jmp	use_fd_fatfs_boot_sector_params
  1200                              <1> use_fdfs_boot_sector_params:
  1201 000075A9 8A462D              <1> 	mov	al, [esi+bs_FS_LBA_Ready]
  1202 000075AC 884705              <1> 	mov	[edi+LD_FS_LBAYes], al
  1203                              <1> 	;
  1204                              <1> 	; 03/01/2010 CHS -> DOS FAT/BPB compatibility fix
  1205 000075AF 8A4608              <1> 	mov	al, [esi+bs_FS_MediaAttrib]
  1206 000075B2 884706              <1> 	mov	[edi+LD_FS_MediaAttrib], al
  1207                              <1> 	;
  1208 000075B5 8A460A              <1>         mov	al, [esi+bs_FS_VersionMaj]
  1209 000075B8 884707              <1> 	mov	byte [edi+LD_FS_VersionMajor], al
  1210 000075BB 668B4606            <1> 	mov	ax, [esi+bs_FS_BytesPerSec]
  1211 000075BF 66894711            <1> 	mov	[edi+LD_FS_BytesPerSec], ax
  1212 000075C3 8A462E              <1> 	mov	al, [esi+bs_FS_SecPerTrack]
  1213 000075C6 28E4                <1> 	sub	ah, ah ; 09/12/2017
  1214 000075C8 6689471E            <1> 	mov	[edi+LD_FS_SecPerTrack], ax
  1215 000075CC 8A462F              <1> 	mov	al, [esi+bs_FS_Heads]
  1216 000075CF 66894720            <1> 	mov	[edi+LD_FS_NumHeads], ax
  1217                              <1> 	;
  1218 000075D3 8B4628              <1> 	mov	eax, [esi+bs_FS_UnDelDirD]
  1219 000075D6 894722              <1> 	mov	[edi+LD_FS_UnDelDirD], eax
  1220 000075D9 8B4618              <1> 	mov	eax, [esi+bs_FS_MATLocation]
  1221 000075DC 89470C              <1> 	mov	[edi+LD_FS_MATLocation], eax
  1222 000075DF 8B461C              <1> 	mov	eax, [esi+bs_FS_RootDirD]
  1223 000075E2 894708              <1> 	mov	[edi+LD_FS_RootDirD], eax
  1224 000075E5 8B460C              <1> 	mov	eax, [esi+bs_FS_BeginSector]
  1225 000075E8 89476C              <1> 	mov	[edi+LD_FS_BeginSector], eax
  1226 000075EB 8B4610              <1> 	mov	eax, [esi+bs_FS_VolumeSize]
  1227 000075EE 894770              <1> 	mov	[edi+LD_FS_VolumeSize], eax
  1228                              <1> 	;		
  1229 000075F1 89FE                <1> 	mov	esi, edi
  1230 000075F3 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 000075F6 B101                <1> 	mov	cl, 1
  1236 000075F8 E83DAA0000          <1> 	call	chs_read
  1237 000075FD 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 000075FF 7248                <1> 	jc	short read_fd_RDT_sector_retn
  1243                              <1> use_fdfs_mat_sector_params:
  1244 00007601 8B460C              <1> 	mov	eax, [esi+FS_MAT_DATLocation]
  1245 00007604 894714              <1> 	mov	[edi+LD_FS_DATLocation], eax
  1246 00007607 8B4610              <1> 	mov	eax, [esi+FS_MAT_DATScount]
  1247 0000760A 894718              <1> 	mov	[edi+LD_FS_DATSectors], eax
  1248 0000760D 8B4714              <1> 	mov	eax, [edi+FS_MAT_FreeSectors]
  1249 00007610 894774              <1> 	mov	[edi+LD_FS_FreeSectors], eax
  1250 00007613 8B4618              <1> 	mov	eax, [esi+FS_MAT_FirstFreeSector]
  1251 00007616 894778              <1> 	mov	[edi+LD_FS_FirstFreeSector], eax
  1252                              <1> 	;
  1253 00007619 89FE                <1> 	mov	esi, edi
  1254 0000761B 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 0000761E B101                <1> 	mov	cl, 1
  1259 00007620 E815AA0000          <1> 	call	chs_read
  1260 00007625 89DE                <1> 	mov	esi, ebx
  1261 00007627 7220                <1> 	jc	short read_fd_RDT_sector_retn
  1262                              <1> use_fdfs_RDT_sector_params:
  1263 00007629 8B461C              <1> 	mov	eax, [esi+FS_RDT_VolumeSerialNo]
  1264 0000762C 894728              <1> 	mov	[edi+LD_FS_VolumeSerial], eax
  1265 0000762F 57                  <1> 	push	edi
  1266                              <1> 	;mov	ecx, 16
  1267 00007630 B110                <1> 	mov	cl, 16	
  1268 00007632 83C640              <1> 	add	esi, FS_RDT_VolumeName
  1269 00007635 83C72C              <1> 	add	edi, LD_FS_VolumeName
  1270 00007638 F3A5                <1> 	rep	movsd ; 64 bytes
  1271 0000763A 5E                  <1> 	pop	esi
  1272 0000763B C6460300            <1> 	mov	byte [esi+LD_FATType], 0
  1273 0000763F C64604A1            <1> 	mov	byte [esi+LD_FSType], 0A1h
  1274 00007643 E9A2000000          <1>         jmp     loc_cont_use_fd_boot_sector_params
  1275                              <1> 
  1276                              <1> read_fd_RDT_sector_stc_retn:
  1277 00007648 F9                  <1> 	stc
  1278                              <1> read_fd_RDT_sector_retn:
  1279 00007649 C3                  <1> 	retn
  1280                              <1> 
  1281                              <1> use_fd_fatfs_boot_sector_params:
  1282 0000764A 807E2629            <1> 	cmp	byte [esi+BS_BootSig], 29h
  1283 0000764E 75F8                <1> 	jne	short read_fd_RDT_sector_stc_retn
  1284 00007650 807E15F0            <1> 	cmp	byte [esi+BPB_Media], 0F0h
  1285 00007654 72F3                <1> 	jb	short read_fd_RDT_sector_retn
  1286 00007656 57                  <1> 	push	edi
  1287 00007657 83C706              <1> 	add	edi, LD_BPB
  1288                              <1> 	;mov	ecx, 16
  1289 0000765A B110                <1> 	mov	cl, 16
  1290 0000765C F3A5                <1> 	rep	movsd ; 64 bytes
  1291 0000765E 5E                  <1> 	pop	esi
  1292 0000765F 31C0                <1> 	xor	eax, eax
  1293 00007661 89466C              <1> 	mov	[esi+LD_StartSector], eax ; 0
  1294 00007664 668B461C            <1> 	mov	ax, [esi+LD_BPB+BPB_FATSz16]
  1295 00007668 8A4E16              <1> 	mov	cl, [esi+LD_BPB+BPB_NumFATs]
  1296 0000766B F7E1                <1>   	mul	ecx
  1297                              <1> 	; edx = 0 !
  1298 0000766D 668B5614            <1> 	mov	dx, [esi+LD_BPB+BPB_RsvdSecCnt]
  1299 00007671 66895660            <1> 	mov	[esi+LD_FATBegin], dx
  1300                              <1> 	; 25/07/2022
  1301 00007675 01D0                <1> 	add	eax, edx
  1302                              <1> 	;add	ax, dx
  1303 00007677 894664              <1> 	mov	[esi+LD_ROOTBegin], eax
  1304 0000767A 894668              <1> 	mov	[esi+LD_DATABegin], eax 
  1305 0000767D 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 00007681 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 00007685 C1EA04              <1> 	shr	edx, 4
  1316 00007688 015668              <1> 	add 	[esi+LD_DATABegin], edx ; + rd sectors
  1317                              <1> 	;movzx	eax, word [esi+LD_BPB+BPB_TotalSec16]
  1318 0000768B 668B4619            <1> 	mov	ax, [esi+LD_BPB+BPB_TotalSec16]
  1319 0000768F 894670              <1> 	mov	[esi+LD_TotalSectors], eax
  1320 00007692 2B4668              <1> 	sub	eax, [esi+LD_DATABegin]
  1321                              <1>   	;movzx	ecx, byte [esi+LD_BPB+BPB_SecPerClust]
  1322 00007695 8A4E13              <1> 	mov	cl, [esi+LD_BPB+BPB_SecPerClust]
  1323 00007698 80F901              <1> 	cmp	cl, 1
  1324 0000769B 7604                <1> 	jna	short save_fd_fatfs_cluster_count
  1325                              <1> 	; 25/07/2022
  1326 0000769D 29D2                <1> 	sub	edx, edx
  1327                              <1> 	;sub	dx, dx ; 0
  1328                              <1> 	;sub	dl, dl ; 06/07/2016
  1329 0000769F F7F1                <1> 	div	ecx
  1330                              <1> save_fd_fatfs_cluster_count:
  1331 000076A1 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 000076A4 29C0                <1> 	sub	eax, eax ; 0  
  1338 000076A6 A2[C6840100]        <1> 	mov	[FAT_BuffValidData], al ; 0
  1339 000076AB A2[C7840100]        <1> 	mov	[FAT_BuffDrvName], al ; 0
  1340 000076B0 A3[CA840100]        <1> 	mov	[FAT_BuffSector], eax ; 0
  1341                              <1> 
  1342                              <1> read_fd_FAT_sectors:
  1343 000076B5 BB001C0900          <1>   	mov	ebx, FAT_Buffer
  1344 000076BA 668B4614            <1> 	mov	ax, [esi+LD_BPB+BPB_RsvdSecCnt]
  1345                              <1> 	;mov	ecx, 3
  1346 000076BE B103                <1> 	mov	cl, 3 ; 3 sectors
  1347 000076C0 E875A90000          <1> 	call	chs_read
  1348 000076C5 7240                <1> 	jc	short read_fd_FAT_sectors_retn
  1349                              <1> use_fd_FAT_sectors:
  1350 000076C7 8A4602              <1> 	mov	al, [esi+LD_PhyDrvNo]
  1351 000076CA 0441                <1> 	add	al, 'A' 
  1352 000076CC A2[C7840100]        <1> 	mov	[FAT_BuffDrvName], al
  1353 000076D1 C605[C6840100]01    <1>  	mov	byte [FAT_BuffValidData], 1
  1354 000076D8 E82B000000          <1> 	call	fd_init_calculate_free_clusters
  1355 000076DD 7228                <1> 	jc	short read_fd_FAT_sectors_retn
  1356                              <1> 
  1357                              <1> loc_use_fd_boot_sector_params_FAT:
  1358 000076DF C6460301            <1> 	mov	byte [esi+LD_FATType], 1 ; FAT 12
  1359 000076E3 C6460401            <1> 	mov	byte [esi+LD_FSType], 1
  1360 000076E7 8B462D              <1>         mov     eax, [esi+LD_BPB+VolumeID]
  1361                              <1> loc_cont_use_fd_boot_sector_params:
  1362 000076EA 8A7E02              <1> 	mov	bh, [esi+LD_PhyDrvNo]
  1363 000076ED 887E7D              <1> 	mov	[esi+LD_DParamEntry], bh
  1364 000076F0 88FB                <1> 	mov	bl, bh
  1365 000076F2 80C341              <1> 	add	bl, 'A'
  1366 000076F5 881E                <1> 	mov	byte [esi+LD_Name], bl
  1367 000076F7 C6460101            <1> 	mov	byte [esi+LD_DiskType], 1
  1368 000076FB C6460500            <1> 	mov	byte [esi+LD_LBAYes], 0
  1369 000076FF C6467C00            <1> 	mov	byte [esi+LD_PartitionEntry], 0
  1370 00007703 C6467E06            <1> 	mov	byte [esi+LD_MediaChanged], 6 ; Volume Name Reset
  1371                              <1> 
  1372                              <1> read_fd_FAT_sectors_retn:
  1373 00007707 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 00007708 29C0                <1> 	sub	eax, eax
  1386 0000770A 894674              <1> 	mov	[esi+LD_FreeSectors], eax ; 0
  1387 0000770D B002                <1> 	mov	al, 2 ; eax = 2
  1388                              <1> 
  1389                              <1> fd_init_loop_get_next_cluster:
  1390 0000770F E828000000          <1> 	call	fd_init_get_next_cluster
  1391 00007714 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 00007716 21C0                <1> 	and	eax, eax ; 25/07/2022
  1400 00007718 7503                <1> 	jnz	short fd_init_pass_inc_free_cluster_count
  1401                              <1> 	; 25/07/2022
  1402 0000771A 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 0000771D A1[C2840100]        <1> 	mov	eax, [FAT_CurrentCluster]
  1408                              <1> 	;mov	ax, [FAT_CurrentCluster]
  1409 00007722 3B4678              <1> 	cmp	eax, [esi+LD_Clusters]
  1410                              <1> 	;cmp	ax, [esi+LD_Clusters]
  1411 00007725 7703                <1> 	ja	short short retn_from_fd_init_calculate_free_clusters
  1412 00007727 40                  <1> 	inc	eax
  1413                              <1> 	;inc	ax
  1414 00007728 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 0000772A 30E4                <1> 	xor	ah, ah
  1420 0000772C 8A4613              <1>   	mov	al, [esi+LD_BPB+BPB_SecPerClust]
  1421 0000772F 3C01                <1>   	cmp	al, 1
  1422 00007731 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 00007733 8B4E74              <1> 	mov	ecx, [esi+LD_FreeSectors]
  1427                              <1> 	;mov	cx, [esi+LD_FreeSectors] ; Count of free clusters
  1428 00007736 F7E1                <1>   	mul	ecx
  1429                              <1> 	;mul	cx
  1430 00007738 894674              <1> 	mov	[esi+LD_FreeSectors], eax
  1431                              <1> 	;mov	[esi+LD_FreeSectors], ax
  1432                              <1> fd_init_calculate_free_clusters_retn:
  1433 0000773B 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 0000773C A3[C2840100]        <1> 	mov	[FAT_CurrentCluster], eax
  1449                              <1> fd_init_get_next_cluster_readnext:
  1450 00007741 29D2                <1> 	sub	edx, edx ; 0
  1451 00007743 BB00040000          <1>   	mov	ebx, 1024 ; 400h
  1452 00007748 F7F3                <1>   	div	ebx
  1453                              <1>   	; EAX = Count of 3 FAT sectors
  1454                              <1>   	; EDX = Buffer entry index
  1455 0000774A 89C1                <1> 	mov	ecx, eax
  1456                              <1> 	;mov	eax, 3
  1457 0000774C B003                <1> 	mov	al, 3
  1458 0000774E F7E2                <1> 	mul	edx ; Multiply by 3
  1459                              <1> 	;shr	ax, 1 ; Divide by 2
  1460                              <1> 	; 25/07/2022
  1461 00007750 D1E8                <1> 	shr	eax, 1
  1462 00007752 89C3                <1> 	mov	ebx, eax ; Buffer byte offset
  1463 00007754 81C3001C0900        <1> 	add	ebx, FAT_Buffer
  1464 0000775A 89C8                <1> 	mov	eax, ecx
  1465                              <1> 	;mov	edx, 3
  1466 0000775C 66BA0300            <1> 	mov	dx, 3
  1467 00007760 F7E2                <1> 	mul	edx
  1468                              <1>   	; EAX = FAT Beginning Sector
  1469                              <1> 	; EDX = 0
  1470 00007762 8A0E                <1> 	mov	cl, [esi+LD_Name]
  1471                              <1> 	;cmp	byte [FAT_BuffValidData], 0
  1472                              <1> 	;jna	short fd_init_load_FAT_sectors0
  1473 00007764 3A0D[C7840100]      <1> 	cmp	cl, [FAT_BuffDrvName]
  1474 0000776A 751D                <1> 	jne	short fd_init_load_FAT_sectors0
  1475 0000776C 3B05[CA840100]      <1> 	cmp	eax, [FAT_BuffSector]
  1476 00007772 751B                <1> 	jne	short fd_init_load_FAT_sectors1
  1477                              <1> 	; 25/07/2022
  1478 00007774 A1[C2840100]        <1> 	mov	eax, [FAT_CurrentCluster]
  1479                              <1> 	;mov	al, [FAT_CurrentCluster]
  1480 00007779 D1E8                <1> 	shr	eax, 1
  1481                              <1> 	;shr	al, 1
  1482 0000777B 668B03              <1> 	mov	ax, [ebx]
  1483 0000777E 7305                <1>   	jnc	short fd_init_gnc_even
  1484                              <1> 	;shr	ax, 4
  1485                              <1> 	; 25/04/2022
  1486 00007780 C1E804              <1> 	shr	eax, 4
  1487                              <1> fd_init_gnc_clc_retn:
  1488 00007783 F8                  <1> 	clc
  1489 00007784 C3                  <1> 	retn
  1490                              <1> 
  1491                              <1> fd_init_gnc_even:
  1492 00007785 80E40F              <1> 	and	ah, 0Fh
  1493 00007788 C3                  <1> 	retn
  1494                              <1> 
  1495                              <1> fd_init_load_FAT_sectors0:
  1496 00007789 880D[C7840100]      <1> 	mov 	[FAT_BuffDrvName], cl
  1497                              <1> fd_init_load_FAT_sectors1:
  1498 0000778F C605[C6840100]00    <1> 	mov	byte [FAT_BuffValidData], 0
  1499 00007796 A3[CA840100]        <1> 	mov	[FAT_BuffSector], eax
  1500 0000779B 034660              <1> 	add	eax, [esi+LD_FATBegin]
  1501 0000779E BB001C0900          <1>  	mov	ebx, FAT_Buffer
  1502                              <1> 	;movzx	ecx, word [esi+LD_BPB+BPB_FATSz16]
  1503 000077A3 668B4E1C            <1> 	mov	cx, [esi+LD_BPB+BPB_FATSz16]
  1504                              <1> 	;sub	cx, [FAT_BuffSector]
  1505                              <1>         ; 25/07/2022
  1506 000077A7 2B0D[CA840100]      <1> 	sub	ecx, [FAT_BuffSector]
  1507                              <1> 	;sub	edx, edx
  1508 000077AD B203                <1> 	mov	dl, 3
  1509                              <1> 	; edx = 3 
  1510                              <1> 	;;cmp	ecx, 3
  1511                              <1> 	;cmp	cx, 3
  1512 000077AF 39D1                <1> 	cmp	ecx, edx ; 3
  1513 000077B1 7602                <1> 	jna	short fdinit_pass_fix_sector_count_3
  1514                              <1> 	;;mov	ecx, 3
  1515                              <1> 	;mov	ecx, 3
  1516 000077B3 89D1                <1> 	mov	ecx, edx ; 3
  1517                              <1> fdinit_pass_fix_sector_count_3:
  1518 000077B5 E880A80000          <1> 	call	chs_read
  1519 000077BA 730D                <1> 	jnc	short fd_init_FAT_sectors_no_load_error
  1520 000077BC C605[C6840100]00    <1> 	mov	byte [FAT_BuffValidData], 0
  1521                              <1> 		; Drv not ready or read Error !
  1522 000077C3 B80F000000          <1> 	mov	eax, ERR_DRV_NOT_RDY ; 15
  1523                              <1> 	;xor	edx, edx
  1524 000077C8 C3                  <1> 	retn
  1525                              <1> 
  1526                              <1> fd_init_FAT_sectors_no_load_error:
  1527 000077C9 C605[C6840100]01    <1> 	mov	byte [FAT_BuffValidData], 1
  1528 000077D0 A1[C2840100]        <1> 	mov	eax, [FAT_CurrentCluster]
  1529 000077D5 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 000077DA 89DE                <1> 	mov	esi, ebx
  1548 000077DC 81E600FF0000        <1> 	and	esi, 0FF00h ; esi = bh
  1549 000077E2 81C600010900        <1> 	add	esi, Logical_DOSDisks
  1550 000077E8 8A06                <1> 	mov     al, [esi+LD_Name]
  1551 000077EA 8A6603              <1> 	mov     ah, [esi+LD_FATType]
  1552 000077ED 80FC01              <1> 	cmp     ah, 1
  1553 000077F0 7210                <1> 	jb    	short loc_gfvn_dir_load_err
  1554 000077F2 3C41                <1> 	cmp 	al, 'A'
  1555 000077F4 720C                <1> 	jb      short loc_gfvn_dir_load_err
  1556 000077F6 80FC02              <1> 	cmp 	ah, 2 
  1557 000077F9 7708                <1> 	ja      short get_FAT32_root_cluster
  1558                              <1> 	
  1559 000077FB E8AA4C0000          <1> 	call    load_FAT_root_directory
  1560 00007800 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 00007802 C3                  <1> 	retn
  1565                              <1> 
  1566                              <1> get_FAT32_root_cluster:
  1567 00007803 8B4632              <1> 	mov	eax, [esi+LD_BPB+BPB_RootClus]
  1568 00007806 E81D4D0000          <1> 	call    load_FAT_sub_directory
  1569 0000780B 72F5                <1> 	jc	short loc_get_volume_name_retn
  1570                              <1> 
  1571                              <1> loc_get_volume_name:
  1572 0000780D BE00000800          <1>         mov     esi, Directory_Buffer
  1573                              <1> 	;xor	cx, cx ; 0
  1574                              <1> 	; 25/07/2022
  1575 00007812 31C9                <1> 	xor	ecx, ecx ; 0
  1576                              <1> check_root_volume_name:
  1577 00007814 8A06                <1> 	mov	al, [esi]
  1578 00007816 08C0                <1> 	or      al, al
  1579 00007818 74E8                <1> 	jz      short loc_get_volume_name_retn
  1580 0000781A 807E0B08            <1> 	cmp     byte [esi+0Bh], 08h
  1581 0000781E 74E2                <1> 	je      short loc_get_volume_name_retn
  1582 00007820 663B0D[DC840100]    <1> 	cmp     cx, [DirBuff_LastEntry]
  1583 00007827 7306                <1> 	jnb     short pass_check_root_volume_name
  1584                              <1> 	;inc	cx
  1585                              <1> 	; 25/07/2022
  1586 00007829 41                  <1> 	inc	ecx
  1587 0000782A 83C620              <1> 	add     esi, 32
  1588 0000782D 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 0000782F 803D[D8840100]03    <1> 	cmp	byte [DirBuff_FATType], 3
  1596 00007836 7230                <1> 	jb	short loc_get_volume_name_retn_xor
  1597                              <1> 
  1598 00007838 BB001C0900          <1> 	mov	ebx, FAT_Buffer
  1599 0000783D BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1600 00007842 31C0                <1> 	xor	eax, eax
  1601 00007844 8A25[D7840100]      <1> 	mov	ah, [DirBuff_DRV]
  1602 0000784A 80EC41              <1> 	sub	ah, 'A' 
  1603 0000784D 01C6                <1> 	add	esi, eax
  1604 0000784F A1[DE840100]        <1> 	mov	eax, [DirBuff_Cluster]
  1605 00007854 E8134B0000          <1> 	call	get_next_cluster
  1606 00007859 7305                <1> 	jnc 	short loc_gfvn_load_FAT32_dir_cluster
  1607                              <1> 
  1608 0000785B 83F801              <1> 	cmp     eax, 1
  1609 0000785E F5                  <1> 	cmc
  1610 0000785F C3                  <1> 	retn
  1611                              <1> 
  1612                              <1> loc_gfvn_load_FAT32_dir_cluster:
  1613 00007860 E8C34C0000          <1> 	call	load_FAT_sub_directory
  1614 00007865 73A6                <1> 	jnc	short loc_get_volume_name
  1615 00007867 C3                  <1> 	retn
  1616                              <1> 
  1617                              <1> loc_get_volume_name_retn_xor:
  1618 00007868 31C0                <1> 	xor 	eax, eax
  1619 0000786A 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 0000786B B416                <1> 	mov	ah, 16h
  1631 0000786D E853D7FFFF          <1>   	call	int13h
  1632 00007872 80FC06              <1> 	cmp	ah, 06h
  1633 00007875 7405                <1> 	je	short loc_gmc_status_retn
  1634 00007877 08E4                <1> 	or	ah, ah
  1635 00007879 7401                <1> 	jz	short loc_gmc_status_retn
  1636                              <1> loc_gmc_status_stc_retn:
  1637 0000787B F9                  <1> 	stc
  1638                              <1> loc_gmc_status_retn:
  1639 0000787C C3                  <1> 	retn
  3432                                  %include 'trdosk3.s' ; 06/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.10) - MAIN PROGRAM : trdosk3.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 25/07/2025  (Previous: 26/09/2024, TRDOS 386 v2.0.9)
     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 0000787D 31DB                <1> 	xor	ebx, ebx
    35 0000787F 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 00007881 BE00010900          <1> 	mov	esi, Logical_DOSDisks
    44 00007886 01DE                <1> 	add	esi, ebx
    45                              <1> loc_ccdrv_dos_drive_name_check:
    46 00007888 80FA02              <1> 	cmp	dl, 2
    47 0000788B 720E                <1> 	jb	short loc_ccdrv_dos_drive_name_check_ok
    48                              <1> 
    49 0000788D 8A06                <1> 	mov	al, [esi+LD_Name]
    50 0000788F 2C41                <1> 	sub	al, 'A'
    51 00007891 38D0                <1> 	cmp	al, dl
    52 00007893 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 00007895 29C0                <1> 	sub	eax, eax
    59 00007897 B00F                <1> 	mov	al, 15
    60                              <1> loc_change_current_drive_stc_retn:
    61 00007899 F9                  <1> 	stc
    62 0000789A C3                  <1> 	retn
    63                              <1> 
    64                              <1> loc_ccdrv_dos_drive_name_check_ok:
    65 0000789B 8A667E              <1> 	mov	ah, [esi+LD_MediaChanged]
    66 0000789E 80FC06              <1> 	cmp	ah, 6  ; VOLUME NAME CHECK/MOVE SIGN
    67 000078A1 7455                <1> 	je	short loc_ccdrv_get_FAT_volume_name_0
    68                              <1> 
    69 000078A3 80FA01              <1> 	cmp	dl, 1
    70 000078A6 777D                <1> 	ja	short loc_gmcs_init_drv_hd
    71                              <1> 
    72                              <1> loc_gmcs_init_drv_fd:
    73 000078A8 08E4                <1> 	or	ah, ah
    74                              <1> 	; AH = 1 is initialization sign (invalid_fd_parameter)
    75 000078AA 7517                <1> 	jnz	short loc_ccdrv_call_fd_init
    76                              <1> 
    77 000078AC E8BAFFFFFF          <1> 	call	get_media_change_status
    78 000078B1 72E2                <1> 	jc	short loc_ccdrv_drive_not_ready_err
    79                              <1> 
    80 000078B3 20E4                <1> 	and	ah, ah
    81 000078B5 7476                <1> 	jz	short loc_change_current_drv3
    82                              <1> 
    83 000078B7 80F406              <1> 	xor	ah, 6
    84 000078BA 75D9                <1> 	jnz	short loc_ccdrv_drive_not_ready_err
    85                              <1> 
    86                              <1> loc_ccdrv_call_fd_init_check_vol_id:
    87 000078BC E86D090000          <1> 	call	get_volume_serial_number
    88 000078C1 730D                <1> 	jnc	short loc_ccdrv_check_vol_serial
    89                              <1> 
    90                              <1> loc_ccdrv_call_fd_init:
    91 000078C3 E887FCFFFF          <1> 	call	floppy_drv_init
    92 000078C8 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 000078CA B80F000000          <1> 	mov	eax, 15 ; Drive not ready
    97 000078CF C3                  <1> 	retn
    98                              <1> 
    99                              <1> loc_ccdrv_check_vol_serial:
   100 000078D0 A3[A87D0100]        <1> 	mov	[Current_VolSerial], eax
   101                              <1> 	;mov	dl, bh
   102 000078D5 E875FCFFFF          <1> 	call	floppy_drv_init
   103 000078DA 72EE                <1> 	jc	short loc_ccdrv_fdinit_fail_retn
   104                              <1> 
   105 000078DC 3B05[A87D0100]      <1> 	cmp	eax, [Current_VolSerial]
   106 000078E2 7445                <1> 	je	short loc_change_current_drv2
   107                              <1> 
   108                              <1> loc_reset_drv_fd_current_dir:
   109 000078E4 31C0                <1> 	xor	eax, eax
   110 000078E6 88467F              <1>         mov	[esi+LD_CDirLevel], al
   111 000078E9 89F7                <1> 	mov	edi, esi
   112 000078EB 81C780000000        <1> 	add	edi, LD_CurrentDirectory
   113 000078F1 B920000000          <1> 	mov	ecx, 32
   114 000078F6 F3AB                <1> 	rep	stosd
   115                              <1> 
   116                              <1> loc_ccdrv_get_FAT_volume_name_0:
   117 000078F8 8A4603              <1> 	mov	al, [esi+LD_FATType]
   118 000078FB 08C0                <1> 	or	al, al
   119 000078FD 742A                <1> 	jz	short loc_change_current_drv2
   120                              <1> 
   121 000078FF 56                  <1> 	push	esi
   122 00007900 3C02                <1> 	cmp	al, 2
   123 00007902 7705                <1> 	ja	short loc_ccdrv_get_FAT32_vol_name
   124                              <1> 
   125                              <1> loc_ccdrv_get_FAT2_16_vol_name:
   126 00007904 83C631              <1> 	add	esi, LD_BPB + VolumeLabel
   127 00007907 EB03                <1> 	jmp	short loc_ccdrv_get_FAT_volume_name_1
   128                              <1> 
   129                              <1> loc_ccdrv_get_FAT32_vol_name:
   130 00007909 83C64D              <1> 	add	esi, LD_BPB + FAT32_VolLab
   131                              <1> loc_ccdrv_get_FAT_volume_name_1:
   132 0000790C 53                  <1> 	push	ebx
   133 0000790D 56                  <1> 	push	esi
   134 0000790E E8C7FEFFFF          <1> 	call	get_FAT_volume_name
   135 00007913 5F                  <1> 	pop	edi
   136 00007914 5B                  <1> 	pop	ebx
   137                              <1> 	; BL = 0
   138 00007915 720B                <1> 	jc	short loc_change_current_drv1
   139 00007917 20C0                <1> 	and	al, al
   140 00007919 7407                <1> 	jz	short loc_change_current_drv1
   141                              <1> 
   142                              <1> loc_ccdrv_move_FAT_volume_name:
   143 0000791B B90B000000          <1> 	mov	ecx, 11
   144 00007920 F3A4                <1> 	rep	movsb
   145                              <1> 
   146                              <1> loc_change_current_drv1:
   147 00007922 5E                  <1> 	pop	esi
   148 00007923 EB04                <1> 	jmp	short loc_change_current_drv2
   149                              <1> 
   150                              <1> loc_gmcs_init_drv_hd:
   151 00007925 08E4                <1> 	or	ah, ah
   152 00007927 7404                <1> 	jz	short loc_change_current_drv3
   153                              <1> 	; BL = 0, BH = Logical DOS drive number
   154                              <1> loc_change_current_drv2:
   155 00007929 C6467E00            <1> 	mov	byte [esi+LD_MediaChanged], 0
   156                              <1> loc_change_current_drv3:
   157 0000792D 883D[B27D0100]      <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 00007933 8A4603              <1> 	mov	al, [esi+LD_FATType]
   177 00007936 A2[B17D0100]        <1> 	mov	[Current_FATType], al
   178                              <1> 
   179 0000793B 8A26                <1> 	mov	ah, [esi+LD_Name]
   180 0000793D 8825[B37D0100]      <1> 	mov	[Current_Dir_Drv], ah
   181                              <1> 
   182 00007943 20C0                <1> 	and	al, al
   183 00007945 741D                <1> 	jz	short loc_restore_FS_current_directory
   184                              <1> 
   185                              <1> loc_restore_FAT_current_directory:
   186 00007947 8A667F              <1> 	mov	ah, [esi+LD_CDirLevel]
   187 0000794A 8825[B07D0100]      <1> 	mov	[Current_Dir_Level], ah
   188 00007950 08E4                <1> 	or	ah, ah
   189 00007952 7415                <1>         jz	short loc_ccdrv_reset_cdir_FAT_12_16_32_fcluster
   190                              <1> 
   191 00007954 0FB6D4              <1> 	movzx	edx, ah
   192 00007957 C0E204              <1> 	shl	dl, 4 ; * 16
   193 0000795A 01F2                <1>         add	edx, esi
   194 0000795C 8B828C000000        <1> 	mov	eax, [edx+LD_CurrentDirectory+12]
   195 00007962 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 00007964 E9F94B0000          <1> 	jmp	load_current_FS_directory
   202                              <1> 
   203                              <1> loc_ccdrv_reset_cdir_FAT_12_16_32_fcluster:
   204 00007969 3C03                <1> 	cmp	al, 3
   205 0000796B 7205                <1> 	jb	short loc_ccdrv_reset_cdir_FAT_12_16_fcluster
   206                              <1> loc_ccdrv_reset_cdir_FAT32_fcluster:
   207 0000796D 8B4632              <1> 	mov	eax, [esi+LD_BPB+FAT32_RootFClust]
   208 00007970 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 00007972 31C0                <1> 	xor	eax, eax
   213                              <1> 	;xor	edx, edx
   214                              <1> loc_ccdrv_check_rootdir_sign:
   215 00007974 80BE8000000000      <1> 	cmp	byte [esi+LD_CurrentDirectory], 0
   216 0000797B 7510                <1> 	jne	short loc_ccdrv_reset_cdir_FAT_fcluster
   217                              <1> loc_ccdrv_set_rootdir_FAT_fcluster:
   218 0000797D 89868C000000        <1>         mov     [esi+LD_CurrentDirectory+12], eax
   219 00007983 C78680000000524F4F- <1> 	mov	dword [esi+LD_CurrentDirectory], 'ROOT'
   219 0000798C 54                  <1>
   220                              <1> 
   221                              <1> loc_ccdrv_reset_cdir_FAT_fcluster:
   222 0000798D A3[AC7D0100]        <1> 	mov	[Current_Dir_FCluster], eax
   223                              <1> 
   224 00007992 BF[10850100]        <1> 	mov	edi, PATH_Array
   225 00007997 89F2                <1> 	mov	edx, esi
   226 00007999 81C680000000        <1> 	add	esi, LD_CurrentDirectory
   227 0000799F B920000000          <1> 	mov	ecx, 32
   228 000079A4 F3A5                <1> 	rep	movsd
   229                              <1> 
   230 000079A6 E8F92B0000          <1> 	call	change_prompt_dir_string
   231                              <1> 
   232 000079AB 89D6                <1> 	mov	esi, edx
   233                              <1> 
   234 000079AD 29C0                <1>         sub	eax, eax
   235                              <1>        ;sub	edx, edx
   236 000079AF BF[B37D0100]        <1> 	mov	edi, Current_Dir_Drv
   237                              <1> 
   238 000079B4 A2[CF340100]        <1> 	mov	[Restore_CDIR], al ; 0
   239 000079B9 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 000079BA C705[78890100]-     <1> 	mov	dword [mainprog_return_addr], return_from_cmd_interpreter
   252 000079C0 [6C7A0000]          <1>
   253                              <1> 
   254                              <1> loc_TRDOS_prompt:
   255 000079C4 BF[B27E0100]        <1> 	mov	edi, TextBuffer
   256 000079C9 C6075B              <1> 	mov	byte [edi], "["
   257 000079CC 47                  <1> 	inc	edi
   258 000079CD BE[2B350100]        <1> 	mov	esi, TRDOSPromptLabel
   259                              <1> get_next_prompt_label_char:
   260 000079D2 803E20              <1> 	cmp	byte [esi], 20h
   261 000079D5 7203                <1> 	jb	short pass_prompt_label
   262 000079D7 A4                  <1> 	movsb
   263 000079D8 EBF8                <1> 	jmp	short get_next_prompt_label_char
   264                              <1> pass_prompt_label:
   265 000079DA C6075D              <1> 	mov	byte [edi], "]"
   266 000079DD 47                  <1> 	inc	edi
   267 000079DE C60720              <1> 	mov	byte [edi], 20h
   268 000079E1 47                  <1> 	inc	edi
   269 000079E2 BE[B37D0100]        <1> 	mov	esi, Current_Dir_Drv
   270 000079E7 66A5                <1> 	movsw
   271 000079E9 A4                  <1> 	movsb
   272                              <1> loc_prompt_current_directory:
   273 000079EA 803E20              <1> 	cmp	byte [esi], 20h
   274 000079ED 7203                <1> 	jb	short pass_prompt_current_directory
   275 000079EF A4                  <1> 	movsb
   276 000079F0 EBF8                <1> 	jmp	short loc_prompt_current_directory
   277                              <1> pass_prompt_current_directory:
   278 000079F2 C6073E              <1> 	mov	byte [edi], '>'
   279 000079F5 47                  <1> 	inc	edi
   280 000079F6 C60700              <1> 	mov	byte [edi], 0
   281 000079F9 BE[B27E0100]        <1> 	mov	esi, TextBuffer
   282 000079FE E867F3FFFF          <1> 	call	print_msg
   283                              <1> 
   284                              <1> 	;sub	bh, bh ; video page = 0
   285                              <1> 	;call	get_cpos ; get cursor position
   286 00007A03 668B15[0E7D0100]    <1> 	mov	dx, [CURSOR_POSN] ; video page 0
   287 00007A0A 8815[127E0100]      <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 00007A10 E8AB000000          <1> 	call	rw_char
   307                              <1> loc_move_command:
   308 00007A15 BE[627E0100]        <1> 	mov	esi, CommandBuffer
   309 00007A1A 89F7                <1> 	mov	edi, esi
   310 00007A1C 31C9                <1> 	xor	ecx, ecx
   311                              <1> first_command_char:
   312 00007A1E AC                  <1> 	lodsb
   313 00007A1F 3C20                <1> 	cmp	al, 20h
   314 00007A21 770C                <1> 	ja	short pass_space_control
   315 00007A23 723F                <1> 	jb	short loc_move_cmd_arguments_ok
   316 00007A25 81FE[B17E0100]      <1> 	cmp	esi, CommandBuffer + 79
   317 00007A2B 72F1                <1> 	jb	short first_command_char
   318 00007A2D EB35                <1> 	jmp	short loc_move_cmd_arguments_ok
   319                              <1> 
   320                              <1> 	; 26/07/2022
   321                              <1> pass_space_control:
   322 00007A2F 3C61                <1> 	cmp	al, 61h
   323 00007A31 7206                <1> 	jb	short pass_capitalize
   324 00007A33 3C7A                <1> 	cmp	al, 7Ah
   325 00007A35 7702                <1> 	ja	short pass_capitalize
   326 00007A37 24DF                <1> 	and	al, 0DFh
   327                              <1> pass_capitalize:
   328 00007A39 AA                  <1> 	stosb   
   329 00007A3A FEC1                <1> 	inc     cl
   330 00007A3C 81FE[B17E0100]      <1> 	cmp     esi, CommandBuffer + 79
   331                              <1> 	;jb	short next_command_char
   332                              <1> 	; 26/07/2022
   333 00007A42 7320                <1> 	jnb	short loc_move_cmd_arguments_ok
   334                              <1> 
   335                              <1> next_command_char:
   336 00007A44 AC                  <1> 	lodsb
   337 00007A45 3C20                <1> 	cmp	al, 20h
   338 00007A47 77E6                <1> 	ja	short pass_space_control
   339 00007A49 7219                <1> 	jb	short loc_move_cmd_arguments_ok
   340                              <1> 
   341                              <1> loc_1st_cmd_arg: ; 30/01/2016
   342 00007A4B AC                  <1> 	lodsb
   343 00007A4C 3C20                <1> 	cmp	al, 20h
   344 00007A4E 74FB                <1> 	je	short loc_1st_cmd_arg
   345 00007A50 7212                <1> 	jb	short loc_move_cmd_arguments_ok
   346                              <1> 
   347 00007A52 C60700              <1>         mov     byte [edi], 0
   348 00007A55 47                  <1> 	inc	edi
   349                              <1> 
   350                              <1> loc_move_cmd_arguments:
   351 00007A56 AA                  <1> 	stosb
   352 00007A57 81FE[B17E0100]      <1> 	cmp	esi, CommandBuffer + 79
   353 00007A5D 7305                <1> 	jnb	short loc_move_cmd_arguments_ok
   354 00007A5F AC                  <1>         lodsb
   355 00007A60 3C20                <1> 	cmp	al, 20h
   356 00007A62 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 00007A64 C60700              <1>         mov     byte [edi], 0
   375                              <1> 
   376                              <1> call_command_interpreter:
   377 00007A67 E8FD070000          <1> 	call    command_interpreter
   378                              <1> 
   379                              <1> return_from_cmd_interpreter:
   380 00007A6C B950000000          <1>         mov	ecx, 80
   381                              <1> 	;mov	cx, 80
   382 00007A71 BF[627E0100]        <1> 	mov	edi, CommandBuffer
   383 00007A76 30C0                <1> 	xor	al, al
   384 00007A78 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 00007A7A 803D[DE670000]03    <1> 	cmp	byte [CRT_MODE], 3 ; 80*25 color
   390 00007A81 7419                <1> 	je	short pass_set_txt_mode
   391                              <1> 
   392 00007A83 E8B9A0FFFF          <1> 	call	set_txt_mode ; set vide mode to 03h
   393                              <1> 	; 07/01/2017
   394 00007A88 30C0                <1> 	xor	al, al
   395                              <1> 
   396                              <1> loc_check_active_page:
   397                              <1> 	;xor	al, al
   398 00007A8A 3805[1E7D0100]      <1> 	cmp	[ACTIVE_PAGE], al ; 0
   399                              <1>         ;je	loc_TRDOS_prompt
   400                              <1> 	; 26/07/2022
   401 00007A90 7405                <1> 	je	short loc_prompt_again
   402                              <1> 
   403                              <1> 	; AL = 0 = video page 0
   404 00007A92 E8D2A4FFFF          <1> 	call	set_active_page
   405                              <1> loc_prompt_again: ; 26/07/2022
   406 00007A97 E928FFFFFF          <1>         jmp     loc_TRDOS_prompt ; infinitive loop
   407                              <1> 
   408                              <1> pass_set_txt_mode:
   409 00007A9C BE[5B3F0100]        <1> 	mov	esi, nextline
   410 00007AA1 E8C4F2FFFF          <1> 	call	print_msg
   411 00007AA6 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 00007AA8 80FC4B              <1> 	cmp	ah, 4Bh
   417 00007AAB 7426                <1> 	je	short loc_back
   418 00007AAD 80FC53              <1> 	cmp	ah, 53h
   419 00007AB0 7421                <1> 	je      short loc_back
   420 00007AB2 80FC4D              <1> 	cmp	ah, 4Dh
   421 00007AB5 7509                <1> 	jne	short readnextchar
   422 00007AB7 80FA4F              <1> 	cmp	dl, 79
   423 00007ABA 7304                <1> 	jnb	short readnextchar
   424 00007ABC FEC2                <1> 	inc	dl
   425 00007ABE 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 00007AC0 30E4                <1> 	xor     ah, ah
   442 00007AC2 E85594FFFF          <1> 	call	int16h
   443 00007AC7 20C0                <1> 	and	al, al
   444 00007AC9 74DD                <1> 	jz	short loc_arrow
   445 00007ACB 3CE0                <1> 	cmp	al, 0E0h
   446 00007ACD 74D9                <1> 	je	short loc_arrow
   447 00007ACF 3C08                <1> 	cmp	al, 08h
   448 00007AD1 752A                <1> 	jne	short char_return
   449                              <1> loc_back:
   450 00007AD3 3A15[127E0100]      <1> 	cmp	dl, [CursorColumn]
   451 00007AD9 76E5                <1> 	jna     short readnextchar
   452                              <1> prev_column:
   453 00007ADB FECA                <1> 	dec	dl
   454                              <1> set_cursor_pos:
   455                              <1> 	;push	dx
   456 00007ADD 52                  <1> 	push	edx ; 29/12/2017
   457                              <1> 	;xor	bh, bh ; 0 = video page 0
   458                              <1> 	; DH = Row, DL = Column
   459 00007ADE E84AA8FFFF          <1> 	call	_set_cpos ; 17/01/2016
   460 00007AE3 5A                  <1>         pop	edx ; 29/12/2017
   461                              <1> 	;pop	dx
   462                              <1> 	;movzx	ebx, dl
   463 00007AE4 88D3                <1> 	mov	bl, dl
   464 00007AE6 2A1D[127E0100]      <1> 	sub	bl, [CursorColumn]
   465 00007AEC B020                <1> 	mov	al, 20h
   466 00007AEE 8883[627E0100]      <1> 	mov	[CommandBuffer+ebx], al
   467                              <1> 	;sub	bh, bh ; video page 0
   468                              <1> 	;mov	cx, 1
   469 00007AF4 B307                <1> 	mov	bl, 7 ; color attribute
   470                              <1> 	; bh = 0 ; 26/07/2022
   471 00007AF6 E819A7FFFF          <1> 	call	_write_c_current ; 17/01/2016
   472                              <1> 	;mov	dx, [CURSOR_POSN]
   473 00007AFB 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 00007AFD 0FB6DA              <1> 	movzx	ebx, dl
   490 00007B00 2A1D[127E0100]      <1> 	sub	bl, [CursorColumn]
   491 00007B06 3C20                <1> 	cmp	al, 20h
   492 00007B08 721D                <1> 	jb	short loc_escape
   493 00007B0A 8883[627E0100]      <1> 	mov	[CommandBuffer+ebx], al
   494 00007B10 80FA4F              <1> 	cmp	dl, 79
   495 00007B13 73AB                <1> 	jnb	short readnextchar
   496 00007B15 66BB0700            <1> 	mov	bx, 7 ; color attribute
   497 00007B19 E877A7FFFF          <1> 	call	_write_tty
   498 00007B1E 668B15[0E7D0100]    <1> 	mov	dx, [CURSOR_POSN] ; video page 0
   499 00007B25 EB99                <1>         jmp	short readnextchar ; 26/07/2022
   500                              <1> 
   501                              <1> loc_escape:
   502 00007B27 3C1B                <1> 	cmp	al, 1Bh
   503 00007B29 7414                <1> 	je	short rw_char_retn
   504                              <1> 	;
   505 00007B2B 3C0D                <1> 	cmp	al, 0Dh ; CR
   506 00007B2D 7591                <1>         jne	short readnextchar ; 26/07/2022
   507                              <1> 
   508                              <1> 	; 13/05/2016
   509 00007B2F 66BB0700            <1> 	mov	bx, 7 ; attribute/color (bl)
   510                              <1> 		      ; video page 0 (bh=0)
   511 00007B33 E85DA7FFFF          <1> 	call	_write_tty
   512                              <1> 	;mov	bx, 7  ; attribute/color
   513                              <1> 		      ; video page 0 (bh=0)
   514 00007B38 B00A                <1> 	mov	al, 0Ah ; LF
   515 00007B3A E856A7FFFF          <1> 	call	_write_tty
   516                              <1> rw_char_retn:
   517 00007B3F 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 00007B40 E831E8FFFF          <1> 	call	RTC_40	; GET RTC DATE
   527                              <1> 
   528 00007B45 88D0                <1> 	mov	al, dl
   529 00007B47 E8C393FFFF          <1>   	call	bcd_to_ascii
   530 00007B4C 66A3[17360100]      <1> 	mov	[Day], ax
   531                              <1> 
   532 00007B52 88F0                <1> 	mov	al, dh
   533 00007B54 E8B693FFFF          <1>   	call	bcd_to_ascii
   534 00007B59 66A3[1A360100]      <1> 	mov	[Month], ax
   535                              <1> 
   536 00007B5F 88E8                <1> 	mov	al, ch
   537 00007B61 E8A993FFFF          <1>   	call	bcd_to_ascii
   538 00007B66 66A3[1D360100]      <1> 	mov	[Century], ax
   539                              <1> 
   540 00007B6C 88C8                <1> 	mov	al, cl
   541 00007B6E E89C93FFFF          <1>   	call	bcd_to_ascii
   542 00007B73 66A3[1F360100]      <1> 	mov	[Year], ax
   543                              <1> 
   544 00007B79 BE[07360100]        <1> 	mov	esi, Msg_Show_Date
   545                              <1> 	;call	print_msg
   546                              <1> 	;retn
   547                              <1> 	; 26/07/2022
   548 00007B7E E9E7F1FFFF          <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 00007B83 BE[EB350100]        <1> 	mov	esi, Msg_Enter_Date
   557 00007B88 E8DDF1FFFF          <1> 	call	print_msg
   558                              <1> 
   559                              <1> loc_enter_day_1:
   560 00007B8D 30E4                <1> 	xor     ah, ah
   561 00007B8F E88893FFFF          <1> 	call	int16h
   562                              <1> 	; AL = ASCII Code of the Character
   563 00007B94 3C0D                <1> 	cmp	al, 13
   564                              <1> 	;je	loc_set_date_retn
   565                              <1> 	; 26/07/2022
   566 00007B96 7404                <1> 	je	short set_date_0
   567 00007B98 3C1B                <1> 	cmp	al, 27
   568                              <1> 	;je	loc_set_date_retn
   569                              <1> 	; 26/07/2022
   570 00007B9A 7511                <1> 	jne	short set_date_1
   571                              <1> 
   572                              <1> set_date_0:
   573                              <1> ;loc_set_date_retn:
   574 00007B9C BE[5B3F0100]        <1> 	mov	esi, nextline
   575                              <1> 	;call	print_msg
   576                              <1> 	;retn
   577                              <1> 	; 26/07/2022
   578 00007BA1 E9C4F1FFFF          <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 00007BA6 E8D4A7FFFF          <1> 	call	beeper ; BEEP !
   584 00007BAB EBE0                <1> 	jmp	short loc_enter_day_1
   585                              <1> 
   586                              <1> 	; 26/07/2022
   587                              <1> set_date_1:
   588 00007BAD A2[17360100]        <1> 	mov	[Day], al
   589 00007BB2 3C30                <1> 	cmp	al, '0'
   590 00007BB4 72F0                <1> 	jb	short loc_set_date_stc_0
   591 00007BB6 3C33                <1> 	cmp	al, '3'
   592 00007BB8 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 00007BBA B307                <1> 	mov	bl, 7
   597 00007BBC E8D4A6FFFF          <1> 	call	_write_tty
   598                              <1> loc_enter_day_2:
   599 00007BC1 30E4                <1> 	xor     ah, ah
   600 00007BC3 E85493FFFF          <1> 	call	int16h
   601                              <1> 	; AL = ASCII Code of the Character
   602 00007BC8 3C1B                <1> 	cmp	al, 27
   603                              <1>         ;je	loc_set_date_retn
   604                              <1> 	; 26/07/2022
   605 00007BCA 74D0                <1> 	je	short set_date_0
   606 00007BCC A2[18360100]        <1> 	mov	[Day+1], al
   607 00007BD1 3C30                <1> 	cmp	al, '0'
   608 00007BD3 7211                <1>         jb      short loc_set_date_stc_1
   609 00007BD5 3C39                <1> 	cmp	al, '9'
   610 00007BD7 770D                <1>         ja      short loc_set_date_stc_1
   611 00007BD9 803D[17360100]33    <1> 	cmp	byte [Day], '3'
   612 00007BE0 7219                <1> 	jb	short pass_set_day_31
   613 00007BE2 3C31                <1> 	cmp	al, '1'
   614                              <1>         ;ja	loc_set_date_stc_1
   615                              <1> 	; 26/07/2022
   616 00007BE4 7615                <1> 	jna	short pass_set_day_31
   617                              <1> 
   618                              <1> 	; 26/07/2022
   619                              <1> loc_set_date_stc_1:
   620 00007BE6 E8E4010000          <1> 	call	check_for_backspace
   621 00007BEB 7407                <1> 	je	short loc_set_date_bs_1
   622                              <1> 	;xor	bh, bh ; video page 0
   623 00007BED E88DA7FFFF          <1> 	call	beeper ; BEEP !
   624 00007BF2 EBCD                <1> 	jmp	short loc_enter_day_2
   625                              <1> loc_set_date_bs_1:
   626 00007BF4 E8C4010000          <1> 	call	write_backspace
   627 00007BF9 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 00007BFB B307                <1> 	mov	bl, 7
   634 00007BFD E893A6FFFF          <1> 	call	_write_tty
   635                              <1> loc_enter_separator_1:
   636 00007C02 28E4                <1> 	sub     ah, ah ; 0
   637 00007C04 E81393FFFF          <1> 	call	int16h
   638                              <1> 	; AL = ASCII Code of the Character
   639 00007C09 3C1B                <1> 	cmp	al, 27
   640                              <1>         ;je	loc_set_date_retn
   641                              <1> 	; 26/07/2022
   642 00007C0B 748F                <1> 	je	short set_date_0
   643 00007C0D 3C2D                <1> 	cmp	al, '-'
   644 00007C0F 7443                <1> 	je	short pass_set_date_separator_1
   645 00007C11 3C2F                <1> 	cmp	al, '/'
   646                              <1> 	;jne	loc_set_date_stc_2
   647                              <1> 	; 26/07/2022
   648 00007C13 743F                <1> 	je	short pass_set_date_separator_1
   649                              <1> 
   650                              <1> 	; 26/07/2022
   651                              <1> loc_set_date_stc_2:
   652 00007C15 E8B5010000          <1> 	call	check_for_backspace
   653 00007C1A 7407                <1> 	je	short loc_set_date_bs_2
   654                              <1> 	;xor	bh, bh ; video page 0
   655 00007C1C E85EA7FFFF          <1> 	call	beeper ; BEEP !
   656 00007C21 EBDF                <1> 	jmp	short loc_enter_separator_1
   657                              <1> loc_set_date_bs_2:
   658 00007C23 E895010000          <1> 	call	write_backspace
   659 00007C28 EB97                <1> 	jmp	short loc_enter_day_2
   660                              <1> 
   661                              <1> 	; 26/07/2022
   662                              <1> loc_set_date_stc_3:
   663 00007C2A E8A0010000          <1> 	call	check_for_backspace
   664 00007C2F 7407                <1> 	je	short loc_set_date_bs_3
   665                              <1> 	;xor	bh, bh ; video page 0
   666 00007C31 E849A7FFFF          <1> 	call	beeper ; BEEP !
   667 00007C36 EB23                <1> 	jmp	short loc_enter_month_1
   668                              <1> loc_set_date_bs_3:
   669 00007C38 E880010000          <1> 	call	write_backspace
   670 00007C3D EBC3                <1> 	jmp	short loc_enter_separator_1
   671                              <1> 
   672                              <1> 	; 26/07/2022
   673                              <1> loc_set_date_stc_4:
   674 00007C3F E88B010000          <1> 	call	check_for_backspace
   675 00007C44 7407                <1> 	je	short loc_set_date_bs_4
   676                              <1> 	;xor	bh, bh ; video page 0
   677 00007C46 E834A7FFFF          <1> 	call	beeper ; BEEP !
   678 00007C4B EB2D                <1> 	jmp	short loc_enter_month_2
   679                              <1> loc_set_date_bs_4:
   680 00007C4D E86B010000          <1> 	call	write_backspace
   681 00007C52 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 00007C54 B307                <1> 	mov	bl, 7
   688 00007C56 E83AA6FFFF          <1> 	call	_write_tty
   689                              <1> loc_enter_month_1:
   690 00007C5B 30E4                <1> 	xor     ah, ah ; 0
   691 00007C5D E8BA92FFFF          <1> 	call	int16h
   692                              <1> 	; AL = ASCII Code of the Character
   693 00007C62 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 00007C64 741F                <1> 	je	short jmp_loc_set_date_ok
   699 00007C66 A2[1A360100]        <1> 	mov	[Month], al
   700 00007C6B 3C30                <1> 	cmp	al, '0'
   701 00007C6D 72BB                <1>         jb      short loc_set_date_stc_3
   702 00007C6F 3C31                <1> 	cmp	al, '1'
   703 00007C71 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 00007C73 B307                <1> 	mov	bl, 7
   708 00007C75 E81BA6FFFF          <1> 	call	_write_tty
   709                              <1> loc_enter_month_2:
   710 00007C7A 30E4                <1> 	xor     ah, ah
   711 00007C7C E89B92FFFF          <1> 	call	int16h
   712                              <1> 	; AL = ASCII Code of the Character
   713 00007C81 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 00007C83 7505                <1> 	jne	short loc_enter_month_3
   719                              <1> jmp_loc_set_date_ok:
   720 00007C85 E996000000          <1> 	jmp	loc_set_date_ok
   721                              <1> loc_enter_month_3:
   722 00007C8A A2[1B360100]        <1> 	mov	[Month+1], al
   723 00007C8F 3C30                <1> 	cmp	al, '0'
   724 00007C91 72AC                <1>         jb	short loc_set_date_stc_4
   725 00007C93 3C39                <1> 	cmp	al, '9'
   726 00007C95 77A8                <1>         ja	short loc_set_date_stc_4
   727 00007C97 803D[1A360100]31    <1> 	cmp	byte [Month], '1'
   728 00007C9E 7204                <1> 	jb	short pass_set_month_12
   729 00007CA0 3C32                <1> 	cmp	al, '2'
   730 00007CA2 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 00007CA4 B307                <1> 	mov	bl, 7
   736 00007CA6 E8EAA5FFFF          <1> 	call	_write_tty
   737                              <1> loc_enter_separator_2:
   738 00007CAB 28E4                <1> 	sub     ah, ah
   739 00007CAD E86A92FFFF          <1> 	call	int16h
   740                              <1> 	; AL = ASCII Code of the Character
   741 00007CB2 3C1B                <1> 	cmp	al, 27
   742                              <1>         ;je	loc_set_date_retn
   743                              <1> 	; 26/07/2022
   744 00007CB4 746A                <1> 	je	short loc_set_date_ok
   745 00007CB6 3C2D                <1> 	cmp	al, '-'
   746 00007CB8 7404                <1> 	je	short pass_set_date_separator_2
   747 00007CBA 3C2F                <1> 	cmp	al, '/'
   748 00007CBC 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 00007CBE B307                <1> 	mov	bl, 7
   754 00007CC0 E8D0A5FFFF          <1> 	call	_write_tty
   755                              <1> loc_enter_year_1:
   756 00007CC5 30E4                <1> 	xor    ah, ah
   757 00007CC7 E85092FFFF          <1> 	call	int16h
   758                              <1> 	; AL = ASCII Code of the Character
   759 00007CCC 3C1B                <1> 	cmp	al, 27
   760                              <1>         ;je	loc_set_date_retn
   761                              <1> 	; 26/07/2022
   762 00007CCE 7450                <1> 	je	short loc_set_date_ok
   763 00007CD0 A2[1F360100]        <1> 	mov	[Year], al
   764 00007CD5 3C30                <1> 	cmp	al, '0'
   765 00007CD7 726C                <1>         jb	short loc_set_date_stc_6
   766 00007CD9 3C39                <1> 	cmp	al, '9'
   767 00007CDB 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 00007CDD B307                <1> 	mov	bl, 7
   772 00007CDF E8B1A5FFFF          <1> 	call	_write_tty
   773                              <1> loc_enter_year_2:
   774 00007CE4 30E4                <1> 	xor	ah, ah
   775 00007CE6 E83192FFFF          <1> 	call	int16h
   776                              <1> 	; AL = ASCII Code of the Character
   777 00007CEB 3C1B                <1> 	cmp	al, 27
   778                              <1> 	;je	short loc_set_date_retn
   779                              <1> 	; 26/07/2022
   780 00007CED 7431                <1> 	je	short loc_set_date_ok
   781 00007CEF A2[20360100]        <1> 	mov	byte [Year+1], al
   782 00007CF4 3C30                <1> 	cmp	al, '0'
   783 00007CF6 7268                <1>         jb 	short loc_set_date_stc_7
   784 00007CF8 3C39                <1> 	cmp	al, '9'
   785 00007CFA 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 00007CFC B307                <1> 	mov	bl, 7
   790 00007CFE E892A5FFFF          <1> 	call	_write_tty
   791                              <1> loc_set_date_get_lchar_again:
   792 00007D03 28E4                <1> 	sub	ah, ah ; 0
   793 00007D05 E81292FFFF          <1> 	call	int16h
   794                              <1> 	; AL = ASCII Code of the Character
   795 00007D0A 3C0D                <1> 	cmp	al, 13 ; ENTER key
   796 00007D0C 746D                <1> 	je	short loc_set_date_progress
   797 00007D0E 3C1B                <1> 	cmp	al, 27 ; ESC key
   798                              <1> 	;je	short loc_set_date_retn
   799                              <1> 	; 26/07/2022
   800 00007D10 740E                <1> 	je	short loc_set_date_ok
   801                              <1> 	;
   802 00007D12 E8B8000000          <1> 	call	check_for_backspace
   803 00007D17 75EA                <1> 	jne	short loc_set_date_get_lchar_again
   804                              <1> 
   805                              <1> loc_set_date_bs_8:
   806 00007D19 E89F000000          <1> 	call	write_backspace
   807 00007D1E EBC4                <1> 	jmp	short loc_enter_year_2
   808                              <1> 
   809                              <1> loc_set_date_ok:
   810                              <1> ;loc_set_date_retn:
   811 00007D20 BE[5B3F0100]        <1> 	mov	esi, nextline
   812                              <1> 	;call	print_msg
   813                              <1> 	;retn
   814                              <1> 	; 26/07/2022
   815 00007D25 E940F0FFFF          <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 00007D2A E8A0000000          <1> 	call	check_for_backspace
   862 00007D2F 740A                <1> 	je	short loc_set_date_bs_5
   863                              <1> 	;xor	bh, bh ; video page 0
   864 00007D31 E849A6FFFF          <1> 	call	beeper ; BEEP !
   865 00007D36 E970FFFFFF          <1> 	jmp	loc_enter_separator_2
   866                              <1> loc_set_date_bs_5:
   867 00007D3B E87D000000          <1> 	call	write_backspace
   868 00007D40 E935FFFFFF          <1> 	jmp	loc_enter_month_2
   869                              <1> loc_set_date_stc_6:
   870 00007D45 E885000000          <1> 	call	check_for_backspace
   871 00007D4A 740A                <1>         je      short loc_set_date_bs_6
   872                              <1> 	;xor	bh, bh ; video page 0
   873 00007D4C E82EA6FFFF          <1> 	call	beeper ; BEEP !
   874 00007D51 E96FFFFFFF          <1> 	jmp	loc_enter_year_1
   875                              <1> loc_set_date_bs_6:
   876 00007D56 E862000000          <1> 	call	write_backspace
   877 00007D5B E94BFFFFFF          <1> 	jmp	loc_enter_separator_2
   878                              <1> loc_set_date_stc_7:
   879 00007D60 E86A000000          <1> 	call	check_for_backspace
   880 00007D65 740A                <1> 	je	short loc_set_date_bs_7
   881                              <1> 	;xor	bh, bh ; video page 0
   882 00007D67 E813A6FFFF          <1> 	call	beeper ; BEEP !
   883 00007D6C E973FFFFFF          <1> 	jmp	loc_enter_year_2
   884                              <1> loc_set_date_bs_7:
   885 00007D71 E847000000          <1> 	call	write_backspace
   886 00007D76 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 00007D7B E8F6E5FFFF          <1> 	call	RTC_40	; GET RTC DATE
   893                              <1> 	; CH = century (in BCD)
   894                              <1> 
   895 00007D80 66A1[1F360100]      <1> 	mov	ax, [Year]
   896 00007D86 662D3030            <1> 	sub	ax, '00'
   897 00007D8A C0E004              <1> 	shl	al, 4 ; * 16
   898 00007D8D 88C1                <1> 	mov	cl, al
   899 00007D8F 00E1                <1> 	add	cl, ah
   900 00007D91 66A1[1A360100]      <1> 	mov	ax, [Month]
   901 00007D97 662D3030            <1> 	sub	ax, '00'
   902 00007D9B C0E004              <1> 	shl	al, 4 ; * 16
   903 00007D9E 88C6                <1> 	mov	dh, al
   904 00007DA0 00E6                <1> 	add	dh, ah
   905 00007DA2 66A1[17360100]      <1> 	mov	ax, [Day]
   906 00007DA8 662D3030            <1> 	sub	ax, '00'
   907 00007DAC C0E004              <1> 	shl	al, 4 ; * 16
   908 00007DAF 88C2                <1> 	mov	dl, al
   909 00007DB1 00E2                <1> 	add	dl, ah
   910                              <1> 
   911                              <1> 	;mov	ah, 05h
   912                              <1> 	;call	int1Ah
   913 00007DB3 E8E4E5FFFF          <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 00007DB8 E963FFFFFF          <1> 	jmp	loc_set_date_ok 
   924                              <1> 
   925                              <1> write_backspace:
   926                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
   927 00007DBD B008                <1> 	mov	al, 08h ; BACKSPACE
   928                              <1> 	; 13/05/2016
   929 00007DBF 66BB0700            <1> 	mov	bx, 7 ; bl = attribute/color
   930                              <1> 		      ; bh = video page = 0
   931 00007DC3 E8CDA4FFFF          <1> 	call	_write_tty
   932 00007DC8 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 00007DCA E945A4FFFF          <1> 	jmp	_write_c_current
   937                              <1> 
   938                              <1> check_for_backspace:
   939                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
   940 00007DCF 663D080E            <1> 	cmp	ax, 0E08h
   941 00007DD3 7410                <1> 	je	short cfbs_retn
   942 00007DD5 663DE04B            <1> 	cmp	ax, 4BE0h
   943 00007DD9 740A                <1> 	je	short cfbs_retn
   944 00007DDB 663D004B            <1> 	cmp	ax, 4B00h
   945 00007DDF 7404                <1> 	je	short cfbs_retn
   946 00007DE1 663DE053            <1> 	cmp	ax, 53E0h
   947                              <1> cfbs_retn:
   948 00007DE5 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 00007DE6 E820E5FFFF          <1> 	call	RTC_20	; GET RTC TIME
   958                              <1> 
   959 00007DEB 88E8                <1> 	mov	al, ch
   960 00007DED E81D91FFFF          <1> 	call	bcd_to_ascii
   961 00007DF2 66A3[45360100]      <1> 	mov	[Hour], ax
   962                              <1> 
   963 00007DF8 88C8                <1> 	mov	al, cl
   964 00007DFA E81091FFFF          <1> 	call	bcd_to_ascii
   965 00007DFF 66A3[48360100]      <1> 	mov	[Minute], ax
   966                              <1> 
   967 00007E05 88F0                <1> 	mov	al, dh
   968 00007E07 E80391FFFF          <1> 	call	bcd_to_ascii
   969 00007E0C 66A3[4B360100]      <1> 	mov	[Second], ax
   970                              <1> 
   971 00007E12 BE[35360100]        <1> 	mov	esi, Msg_Show_Time
   972                              <1> 	;call	print_msg
   973                              <1> 	;retn
   974                              <1> 	; 26/07/2022
   975 00007E17 E94EEFFFFF          <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 00007E1C BE[24360100]        <1> 	mov 	esi, Msg_Enter_Time
   984 00007E21 E844EFFFFF          <1> 	call	print_msg
   985                              <1> 
   986                              <1> loc_enter_hour_1:
   987 00007E26 30E4                <1> 	xor     ah, ah
   988 00007E28 E8EF90FFFF          <1> 	call	int16h
   989                              <1> 	; AL = ASCII Code of the Character
   990 00007E2D 3C0D                <1> 	cmp	al, 13 ; ENTER key
   991 00007E2F 742D                <1>         je	short loc_set_time_retn
   992 00007E31 3C1B                <1> 	cmp	al, 27 ; ESC key
   993 00007E33 7429                <1>         je	short loc_set_time_retn
   994                              <1> set_time_0:
   995 00007E35 A2[45360100]        <1> 	mov	[Hour], al
   996 00007E3A 3C30                <1> 	cmp	al, '0'
   997 00007E3C 7204                <1>         jb	short loc_set_time_stc_0
   998 00007E3E 3C32                <1> 	cmp	al, '2'
   999                              <1>  	;ja	loc_set_time_stc_0
  1000                              <1> 	; 26/07/2022
  1001 00007E40 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 00007E42 E838A5FFFF          <1> 	call	beeper ; BEEP !
  1007 00007E47 EBDD                <1> 	jmp	short loc_enter_hour_1
  1008                              <1> 
  1009                              <1> loc_set_time_stc_1:
  1010 00007E49 E881FFFFFF          <1> 	call	check_for_backspace
  1011 00007E4E 7407                <1> 	je	short loc_set_time_bs_1
  1012                              <1> 	;xor	bh, bh ; video page 0
  1013 00007E50 E82AA5FFFF          <1> 	call	beeper ; BEEP !
  1014 00007E55 EB18                <1> 	jmp	short loc_enter_hour_2
  1015                              <1> loc_set_time_bs_1:
  1016 00007E57 E861FFFFFF          <1> 	call	write_backspace
  1017 00007E5C EBC8                <1> 	jmp	short loc_enter_hour_1
  1018                              <1> 
  1019                              <1> 	; 26/07/2022
  1020                              <1> loc_set_time_retn:
  1021 00007E5E BE[5B3F0100]        <1> 	mov 	esi, nextline
  1022                              <1> 	;call	print_msg
  1023                              <1> 	;retn
  1024 00007E63 E902EFFFFF          <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 00007E68 B307                <1> 	mov	bl, 7
  1031 00007E6A E826A4FFFF          <1> 	call	_write_tty
  1032                              <1> loc_enter_hour_2:
  1033 00007E6F 30E4                <1> 	xor     ah, ah
  1034 00007E71 E8A690FFFF          <1> 	call	int16h
  1035                              <1> 	; AL = ASCII Code of the Character
  1036 00007E76 3C1B                <1> 	cmp	al, 27
  1037 00007E78 74E4                <1> 	je	short loc_set_time_retn
  1038 00007E7A A2[46360100]        <1> 	mov	[Hour+1], al
  1039 00007E7F 3C30                <1> 	cmp	al, '0'
  1040 00007E81 72C6                <1> 	jb	short loc_set_time_stc_1
  1041 00007E83 3C39                <1> 	cmp	al, '9'
  1042 00007E85 77C2                <1> 	ja	short loc_set_time_stc_1
  1043 00007E87 803D[45360100]32    <1>         cmp     byte [Hour], '2'
  1044 00007E8E 7204                <1> 	jb	short pass_set_time_24
  1045 00007E90 3C34                <1> 	cmp	al, '4'
  1046 00007E92 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 00007E94 B307                <1> 	mov	bl, 7
  1052 00007E96 E8FAA3FFFF          <1> 	call	_write_tty
  1053                              <1> loc_enter_time_separator_1:
  1054 00007E9B 28E4                <1> 	sub    ah, ah ; 0
  1055 00007E9D E87A90FFFF          <1> 	call	int16h
  1056                              <1> 	; AL = ASCII Code of the Character
  1057 00007EA2 3C1B                <1> 	cmp	al, 27
  1058 00007EA4 74B8                <1> 	je	short loc_set_time_retn
  1059 00007EA6 3C3A                <1> 	cmp	al, ':'
  1060                              <1> 	;jne	loc_set_time_stc_2
  1061                              <1> 	; 26/07/2022
  1062 00007EA8 7415                <1> 	je	short set_time_2
  1063                              <1> 
  1064                              <1> 	; 26/07/2022
  1065                              <1> loc_set_time_stc_2:
  1066 00007EAA E820FFFFFF          <1> 	call	check_for_backspace
  1067 00007EAF 7407                <1> 	je	short loc_set_time_bs_2
  1068                              <1> 	;xor	bh, bh ; video page 0
  1069 00007EB1 E8C9A4FFFF          <1> 	call	beeper ; BEEP !
  1070 00007EB6 EBE3                <1> 	jmp	short loc_enter_time_separator_1
  1071                              <1> loc_set_time_bs_2:
  1072 00007EB8 E800FFFFFF          <1> 	call	write_backspace
  1073 00007EBD 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 00007EBF B307                <1> 	mov	bl, 7
  1080 00007EC1 E8CFA3FFFF          <1> 	call	_write_tty
  1081                              <1> loc_enter_minute_1:
  1082 00007EC6 30E4                <1> 	xor     ah, ah
  1083 00007EC8 E84F90FFFF          <1> 	call	int16h
  1084                              <1> 	; AL = ASCII Code of the Character
  1085 00007ECD 3C1B                <1> 	cmp	al, 27
  1086 00007ECF 748D                <1> 	je	short loc_set_time_retn
  1087 00007ED1 A2[48360100]        <1> 	mov	[Minute], al
  1088 00007ED6 3C30                <1> 	cmp	al, '0'
  1089 00007ED8 7204                <1> 	jb	short loc_set_time_stc_3
  1090 00007EDA 3C35                <1> 	cmp	al, '5'
  1091                              <1> 	;ja	loc_set_time_stc_3
  1092                              <1> 	; 26/07/2022
  1093 00007EDC 7615                <1> 	jna	short set_time_3
  1094                              <1> 
  1095                              <1> 	; 26/07/2022
  1096                              <1> loc_set_time_stc_3:
  1097 00007EDE E8ECFEFFFF          <1> 	call	check_for_backspace
  1098 00007EE3 7407                <1> 	je	short loc_set_time_bs_3
  1099                              <1> 	;xor	bh, bh ; video page 0
  1100 00007EE5 E895A4FFFF          <1> 	call	beeper ; BEEP !6
  1101 00007EEA EBDA                <1> 	jmp	short loc_enter_minute_1
  1102                              <1> loc_set_time_bs_3:
  1103 00007EEC E8CCFEFFFF          <1> 	call	write_backspace
  1104 00007EF1 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 00007EF3 B307                <1> 	mov	bl, 7
  1111 00007EF5 E89BA3FFFF          <1> 	call	_write_tty
  1112                              <1> loc_enter_minute_2:
  1113 00007EFA 30E4                <1> 	xor     ah, ah
  1114 00007EFC E81B90FFFF          <1> 	call	int16h
  1115                              <1> 	; AL = ASCII Code of the Character
  1116 00007F01 3C1B                <1> 	cmp	al, 27
  1117                              <1> 	;je	short loc_set_time_retn
  1118                              <1> 	; 07/08/2022
  1119 00007F03 7505                <1> 	jne	short loc_enter_minute_3
  1120 00007F05 E954FFFFFF          <1> 	jmp	loc_set_time_retn
  1121                              <1> loc_enter_minute_3:
  1122 00007F0A A2[49360100]        <1> 	mov	[Minute+1], al
  1123 00007F0F 3C30                <1> 	cmp	al, '0'
  1124 00007F11 7204                <1> 	jb	short loc_set_time_stc_4
  1125 00007F13 3C39                <1> 	cmp	al, '9'
  1126                              <1> 	;ja	loc_set_time_stc_4
  1127                              <1> 	; 26/07/2022
  1128 00007F15 7615                <1> 	jna	short set_time_4
  1129                              <1> 
  1130                              <1> 	; 26/07/2022
  1131                              <1> loc_set_time_stc_4:
  1132 00007F17 E8B3FEFFFF          <1> 	call	check_for_backspace
  1133 00007F1C 7407                <1> 	je	short loc_set_time_bs_4
  1134                              <1> 	;xor	bh, bh ; video page 0
  1135 00007F1E E85CA4FFFF          <1> 	call	beeper ; BEEP !
  1136 00007F23 EBD5                <1> 	jmp	short loc_enter_minute_2
  1137                              <1> loc_set_time_bs_4:
  1138 00007F25 E893FEFFFF          <1> 	call	write_backspace
  1139 00007F2A 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 00007F2C B307                <1> 	mov	bl, 7
  1146 00007F2E E862A3FFFF          <1> 	call	_write_tty
  1147                              <1> loc_enter_time_separator_2:
  1148 00007F33 66C705[4B360100]30- <1> 	mov	word [Second], 3030h
  1148 00007F3B 30                  <1>
  1149 00007F3C 28E4                <1> 	sub     ah, ah
  1150 00007F3E E8D98FFFFF          <1> 	call	int16h
  1151                              <1> 	; AL = ASCII Code of the Character
  1152 00007F43 3C0D                <1> 	cmp	al, 13
  1153                              <1>         ;je	short loc_set_time_progress
  1154                              <1> 	; 07/08/2022
  1155 00007F45 7505                <1> 	jne	short loc_enter_time_separator_3
  1156                              <1> jmp_loc_set_time_progress:
  1157 00007F47 E9D4000000          <1> 	jmp	loc_set_time_progress
  1158                              <1> loc_enter_time_separator_3:
  1159 00007F4C 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 00007F4E 7505                <1> 	jne	short loc_enter_time_separator_4
  1165 00007F50 E982000000          <1> 	jmp	loc_set_time_ok
  1166                              <1> loc_enter_time_separator_4:
  1167 00007F55 3C3A                <1> 	cmp	al, ':'
  1168 00007F57 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 00007F59 B307                <1> 	mov	bl, 7
  1174 00007F5B E835A3FFFF          <1> 	call	_write_tty
  1175                              <1> loc_enter_second_1:
  1176 00007F60 30E4                <1> 	xor     ah, ah
  1177 00007F62 E8B58FFFFF          <1> 	call	int16h
  1178                              <1> 	; AL = ASCII Code of the Character
  1179 00007F67 3C0D                <1> 	cmp	al, 13
  1180                              <1> 	;je	short loc_set_time_progress
  1181                              <1> 	; 07/08/2022
  1182 00007F69 74DC                <1> 	je	short jmp_loc_set_time_progress
  1183 00007F6B 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 00007F6D 7502                <1> 	jne	short loc_enter_second_2
  1189 00007F6F EB66                <1> 	jmp	loc_set_time_ok
  1190                              <1> loc_enter_second_2:
  1191 00007F71 A2[4B360100]        <1> 	mov	[Second], al
  1192 00007F76 3C30                <1> 	cmp	al, '0'
  1193 00007F78 7267                <1> 	jb	short loc_set_time_stc_6
  1194 00007F7A 3C35                <1> 	cmp	al, '5'
  1195 00007F7C 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 00007F7E B307                <1> 	mov	bl, 7
  1200 00007F80 E810A3FFFF          <1> 	call	_write_tty
  1201                              <1> loc_enter_second_3:
  1202 00007F85 30E4                <1> 	xor     ah, ah
  1203 00007F87 E8908FFFFF          <1> 	call	int16h
  1204                              <1> 	; AL = ASCII Code of the Character
  1205 00007F8C 3C1B                <1> 	cmp	al, 27
  1206                              <1> 	;je	short loc_set_time_retn
  1207                              <1> 	; 26/07/2022
  1208 00007F8E 7447                <1> 	je	short loc_set_time_ok
  1209 00007F90 3C30                <1> 	cmp	al, '0'
  1210 00007F92 7271                <1>         jb	short loc_set_time_stc_7
  1211 00007F94 3C39                <1> 	cmp	al, '9'
  1212 00007F96 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 00007F98 B307                <1> 	mov	bl, 7
  1217 00007F9A E8F6A2FFFF          <1> 	call	_write_tty
  1218                              <1> loc_set_time_get_lchar_again:
  1219 00007F9F 28E4                <1> 	sub	ah, ah ; 0
  1220 00007FA1 E8768FFFFF          <1> 	call	int16h
  1221                              <1> 	; AL = ASCII Code of the Character
  1222 00007FA6 3C0D                <1> 	cmp	al, 13
  1223 00007FA8 7476                <1> 	je	short loc_set_time_progress
  1224 00007FAA 3C1B                <1> 	cmp	al, 27
  1225                              <1> 	;je	short loc_set_time_retn
  1226                              <1> 	; 07/08/2022
  1227 00007FAC 7429                <1> 	je	short loc_set_time_ok
  1228                              <1> 	;
  1229 00007FAE E81CFEFFFF          <1> 	call	check_for_backspace
  1230 00007FB3 75EA                <1> 	jne	short loc_set_time_get_lchar_again
  1231                              <1> 
  1232                              <1> loc_set_time_bs_8:
  1233 00007FB5 E803FEFFFF          <1> 	call	write_backspace
  1234 00007FBA 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 00007FBC E80EFEFFFF          <1> 	call	check_for_backspace
  1288 00007FC1 740A                <1> 	je	short loc_set_time_bs_5
  1289                              <1> 	;xor	bh, bh ; video page 0
  1290 00007FC3 E8B7A3FFFF          <1> 	call	beeper ; BEEP !
  1291 00007FC8 E966FFFFFF          <1> 	jmp	loc_enter_time_separator_2
  1292                              <1> loc_set_time_bs_5:
  1293 00007FCD E8EBFDFFFF          <1> 	call	write_backspace
  1294 00007FD2 E923FFFFFF          <1> 	jmp	loc_enter_minute_2
  1295                              <1> 
  1296                              <1> 	; 26/07/2022
  1297                              <1> loc_set_time_ok:
  1298 00007FD7 BE[5B3F0100]        <1> 	mov 	esi, nextline
  1299                              <1> 	;call	print_msg
  1300                              <1> 	;retn
  1301 00007FDC E989EDFFFF          <1> 	jmp	print_msg
  1302                              <1> 
  1303                              <1> 	; 07/08/2022
  1304                              <1> loc_set_time_stc_6:
  1305 00007FE1 E8E9FDFFFF          <1> 	call	check_for_backspace
  1306 00007FE6 7413                <1> 	je	short loc_set_time_bs_6
  1307                              <1> 	;xor	bh, bh ; video page 0
  1308 00007FE8 E892A3FFFF          <1> 	call	beeper ; BEEP !
  1309 00007FED 66C705[4B360100]30- <1> 	mov	word [Second], 3030h
  1309 00007FF5 30                  <1>
  1310 00007FF6 E965FFFFFF          <1> 	jmp	loc_enter_second_1
  1311                              <1> loc_set_time_bs_6:
  1312 00007FFB E8BDFDFFFF          <1> 	call	write_backspace
  1313 00008000 E92EFFFFFF          <1> 	jmp	loc_enter_time_separator_2
  1314                              <1> loc_set_time_stc_7:
  1315 00008005 E8C5FDFFFF          <1> 	call	check_for_backspace
  1316 0000800A 740A                <1> 	je	short loc_set_time_bs_7
  1317                              <1> 	;xor	bh, bh ; video page 0
  1318 0000800C E86EA3FFFF          <1> 	call	beeper ; BEEP !
  1319 00008011 E96FFFFFFF          <1> 	jmp	loc_enter_second_3
  1320                              <1> loc_set_time_bs_7:
  1321 00008016 E8A2FDFFFF          <1> 	call	write_backspace
  1322 0000801B 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 00008020 E8E6E2FFFF          <1> 	call	RTC_20	; GET RTC TIME
  1329                              <1> 	;DL = Daylight Savings Enable option (0-1)
  1330                              <1> 
  1331 00008025 66A1[45360100]      <1> 	mov	ax, [Hour]
  1332 0000802B 662D3030            <1> 	sub	ax, '00'
  1333 0000802F C0E004              <1> 	shl	al, 4 ; * 16
  1334 00008032 88C5                <1> 	mov	ch, al
  1335 00008034 00E5                <1> 	add	ch, ah
  1336 00008036 66A1[48360100]      <1> 	mov	ax, [Minute]
  1337 0000803C 662D3030            <1> 	sub	ax, '00'
  1338 00008040 C0E004              <1> 	shl	al, 4 ; * 16
  1339 00008043 88C1                <1> 	mov	cl, al
  1340 00008045 00E1                <1> 	add	cl, ah
  1341 00008047 66A1[4B360100]      <1> 	mov	ax, [Second]
  1342 0000804D 662D3030            <1> 	sub	ax, '00'
  1343 00008051 C0E004              <1> 	shl	al, 4 ; * 16
  1344 00008054 88C6                <1> 	mov	dh, al
  1345 00008056 00E6                <1> 	add	dh, ah
  1346                              <1> 
  1347                              <1> 	;mov	ah, 03h
  1348                              <1> 	;call	int1Ah
  1349 00008058 E8DCE2FFFF          <1> 	call	RTC_30	; SET RTC TIME
  1350                              <1> 
  1351                              <1> 	; 26/07/2022
  1352 0000805D 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 00008062 88C4                <1> 	mov	ah, al
  1371 00008064 28C0                <1> 	sub	al, al
  1372 00008066 0FB7F0              <1> 	movzx	esi, ax	
  1373 00008069 81C600010900        <1> 	add	esi, Logical_DOSDisks
  1374 0000806F 8A06                <1> 	mov	al, [esi]
  1375 00008071 3C41                <1> 	cmp	al, 'A'  
  1376 00008073 7304                <1> 	jnb	short loc_pvi_set_vol_name
  1377 00008075 8A6604              <1> 	mov	ah, [esi+LD_FSType]
  1378 00008078 C3                  <1> 	retn
  1379                              <1> 
  1380                              <1> loc_pvi_set_vol_name:
  1381 00008079 A2[7F360100]        <1> 	mov	[Vol_Drv_Name], al
  1382 0000807E 56                  <1> 	push	esi
  1383 0000807F E858010000          <1> 	call	move_volume_name_and_serial_no ;;;
  1384 00008084 7302                <1> 	jnc	short loc_pvi_mvn_ok
  1385 00008086 5E                  <1> 	pop	esi
  1386 00008087 C3                  <1> 	retn
  1387                              <1> 
  1388                              <1> loc_pvi_mvn_ok:
  1389 00008088 8B3424              <1> 	mov	esi, [esp]
  1390 0000808B 807E04A1            <1> 	cmp	byte [esi+LD_FSType], 0A1h
  1391 0000808F 7509                <1> 	jne	short loc_pvi_fat_vol_size
  1392 00008091 8B4670              <1> 	mov	eax, [esi+LD_FS_VolumeSize]
  1393 00008094 0FB75E11            <1> 	movzx	ebx, word [esi+LD_FS_BytesPerSec]
  1394 00008098 EB07                <1> 	jmp	short loc_vol_size_mul32
  1395                              <1> loc_pvi_fat_vol_size:
  1396 0000809A 8B4670              <1> 	mov	eax, [esi+LD_TotalSectors]
  1397 0000809D 0FB75E11            <1> 	movzx	ebx, word [esi+LD_BPB+BPB_BytsPerSec]
  1398                              <1> loc_vol_size_mul32:
  1399 000080A1 F7E3                <1> 	mul	ebx
  1400 000080A3 09D2                <1> 	or	edx, edx
  1401 000080A5 7507                <1> 	jnz	short loc_vol_size_in_kbytes
  1402                              <1> loc_vol_size_in_bytes:
  1403 000080A7 B9[5D360100]        <1> 	mov	ecx, VolSize_Bytes
  1404 000080AC EB0D                <1> 	jmp	short loc_write_vol_size_str
  1405                              <1> loc_vol_size_in_kbytes:
  1406 000080AE 66BB0004            <1> 	mov	bx, 1024
  1407 000080B2 F7F3                <1> 	div	ebx
  1408 000080B4 B9[50360100]        <1> 	mov 	ecx, VolSize_KiloBytes
  1409 000080B9 31D2                <1> 	xor	edx, edx ; 0
  1410                              <1> loc_write_vol_size_str:
  1411 000080BB 890D[E8840100]      <1> 	mov	[VolSize_Unit1], ecx
  1412                              <1> 	;
  1413 000080C1 BF[FE840100]        <1> 	mov	edi, Vol_Tot_Sec_Str_End
  1414                              <1>         ;mov	byte [edi], 0
  1415 000080C6 B90A000000          <1> 	mov	ecx, 10
  1416                              <1> loc_write_vol_size_chr:
  1417 000080CB F7F1                <1> 	div	ecx
  1418 000080CD 80C230              <1> 	add	dl, '0'
  1419 000080D0 4F                  <1> 	dec	edi
  1420 000080D1 8817                <1> 	mov	[edi], dl
  1421 000080D3 85C0                <1> 	test	eax, eax
  1422 000080D5 7404                <1> 	jz	short loc_write_vol_size_str_ok
  1423 000080D7 28D2                <1> 	sub	dl, dl ; 0
  1424 000080D9 EBF0                <1> 	jmp	short loc_write_vol_size_chr
  1425                              <1> 
  1426                              <1> loc_write_vol_size_str_ok:
  1427 000080DB 893D[F0840100]      <1> 	mov	[Vol_Tot_Sec_Str_Start], edi
  1428                              <1> 	;
  1429 000080E1 BF[68360100]        <1> 	mov	edi, Vol_FS_Name
  1430 000080E6 8A4E03              <1> 	mov	cl, [esi+LD_FATType]
  1431 000080E9 20C9                <1> 	and	cl, cl ; 0 ?
  1432 000080EB 7515                <1> 	jnz	short loc_write_vol_FAT_str_1
  1433 000080ED 66C7075452          <1> 	mov	word [edi], 'TR'
  1434 000080F2 C7470420465331      <1> 	mov	dword [edi+4], ' FS1'
  1435                              <1> 	;movzx	ebx, word [esi+LD_FS_BytesPerSec]
  1436 000080F9 668B5E11            <1> 	mov	bx, [esi+LD_FS_BytesPerSec]
  1437 000080FD 8B4674              <1> 	mov	eax, [esi+LD_FS_FreeSectors]
  1438 00008100 EB36                <1> 	jmp	short loc_vol_freespace_mul32
  1439                              <1> 
  1440                              <1> loc_write_vol_FAT_str_1:
  1441 00008102 66B83332            <1> 	mov	ax, '32' ; FAT32
  1442 00008106 80F902              <1> 	cmp	cl, 2 ; [esi+LD_FATType]
  1443 00008109 7708                <1> 	ja	short loc_write_vol_FAT_str_2
  1444 0000810B 66B83132            <1> 	mov	ax, '12' ; FAT12
  1445 0000810F 7202                <1> 	jb	short loc_write_vol_FAT_str_2
  1446 00008111 B436                <1> 	mov	ah, '6'  ; FAT16
  1447                              <1> loc_write_vol_FAT_str_2:
  1448 00008113 C70746415420        <1> 	mov	dword [edi], 'FAT '
  1449 00008119 66894704            <1> 	mov	word [edi+4], ax
  1450                              <1> 	;
  1451                              <1> 	;movzx	ebx, word [esi+LD_BPB+BPB_BytsPerSec]
  1452 0000811D 668B5E11            <1> 	mov	bx, [esi+LD_BPB+BPB_BytsPerSec]
  1453 00008121 8B4674              <1> 	mov	eax, [esi+LD_FreeSectors]
  1454                              <1> 
  1455                              <1> loc_vol_freespace_recalc0:
  1456                              <1> 	; 01/03/2016
  1457 00008124 83F8FF              <1> 	cmp	eax, 0FFFFFFFFh
  1458 00008127 720F                <1> 	jb	short loc_vol_freespace_mul32
  1459                              <1> 	;inc	eax ; 0
  1460 00008129 20C9                <1> 	and	cl, cl ; byte [esi+LD_FATType]
  1461 0000812B 740B                <1> 	jz	short loc_vol_freespace_mul32
  1462 0000812D 53                  <1> 	push	ebx
  1463 0000812E 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate free sectors
  1464 00008132 E829480000          <1> 	call	calculate_fat_freespace
  1465 00008137 5B                  <1> 	pop	ebx
  1466                              <1> 
  1467                              <1> loc_vol_freespace_mul32:
  1468 00008138 F7E3                <1> 	mul	ebx
  1469 0000813A 09D2                <1> 	or	edx, edx
  1470 0000813C 7507                <1> 	jnz	short loc_vol_fspace_in_kbytes
  1471                              <1> loc_vol_fspace_in_bytes:
  1472 0000813E B9[5D360100]        <1> 	mov	ecx, VolSize_Bytes
  1473 00008143 EB0D                <1> 	jmp	short loc_write_vol_fspace_str
  1474                              <1> loc_vol_fspace_in_kbytes:
  1475 00008145 66BB0004            <1> 	mov	bx, 1024
  1476 00008149 F7F3                <1> 	div	ebx
  1477 0000814B B9[50360100]        <1> 	mov 	ecx, VolSize_KiloBytes
  1478 00008150 31D2                <1> 	xor	edx, edx ; 0
  1479                              <1> loc_write_vol_fspace_str:
  1480 00008152 890D[EC840100]      <1> 	mov	[VolSize_Unit2], ecx
  1481                              <1> 	;
  1482 00008158 BF[0E850100]        <1> 	mov	edi, Vol_Free_Sectors_Str_End
  1483                              <1>         ;mov	byte [edi], 0
  1484 0000815D B90A000000          <1> 	mov	ecx, 10
  1485                              <1> loc_write_vol_fspace_chr:
  1486 00008162 F7F1                <1> 	div	ecx
  1487 00008164 80C230              <1> 	add	dl, '0'
  1488 00008167 4F                  <1> 	dec	edi
  1489 00008168 8817                <1> 	mov	[edi], dl
  1490 0000816A 85C0                <1> 	test	eax, eax
  1491 0000816C 7404                <1> 	jz	short loc_write_vol_fspace_str_ok
  1492 0000816E 28D2                <1> 	sub	dl, dl ; 0
  1493 00008170 EBF0                <1> 	jmp	short loc_write_vol_fspace_chr
  1494                              <1> 
  1495                              <1> loc_write_vol_fspace_str_ok:
  1496 00008172 893D[00850100]      <1> 	mov	[Vol_Free_Sectors_Str_Start], edi
  1497                              <1> 	;
  1498 00008178 BE[66360100]        <1> 	mov	esi, Volume_in_drive
  1499 0000817D E8E8EBFFFF          <1> 	call	print_msg
  1500 00008182 BE[A6360100]        <1> 	mov	esi, Vol_Name
  1501 00008187 E8DEEBFFFF          <1> 	call	print_msg
  1502 0000818C BE[5B3F0100]        <1> 	mov	esi, nextline
  1503 00008191 E8D4EBFFFF          <1> 	call	print_msg
  1504                              <1> 	;
  1505 00008196 BE[07370100]        <1> 	mov	esi, Vol_Total_Sector_Header
  1506 0000819B E8CAEBFFFF          <1> 	call	print_msg
  1507 000081A0 8B35[F0840100]      <1> 	mov	esi, [Vol_Tot_Sec_Str_Start]
  1508 000081A6 E8BFEBFFFF          <1> 	call	print_msg
  1509 000081AB 8B35[E8840100]      <1> 	mov	esi, [VolSize_Unit1]
  1510 000081B1 E8B4EBFFFF          <1> 	call	print_msg
  1511                              <1> 	;
  1512 000081B6 BE[18370100]        <1> 	mov	esi, Vol_Free_Sectors_Header
  1513 000081BB E8AAEBFFFF          <1> 	call	print_msg
  1514 000081C0 8B35[00850100]      <1> 	mov	esi, [Vol_Free_Sectors_Str_Start]
  1515 000081C6 E89FEBFFFF          <1> 	call	print_msg
  1516 000081CB 8B35[EC840100]      <1> 	mov	esi, [VolSize_Unit2]
  1517 000081D1 E894EBFFFF          <1> 	call	print_msg
  1518                              <1> 	;
  1519 000081D6 5E                  <1> 	pop	esi
  1520                              <1> 
  1521                              <1> 	;mov	ah, [esi+LD_FSType]
  1522                              <1> 	;mov	al, [esi+LD_FATType]
  1523 000081D7 668B4603            <1> 	mov	ax, [esi+LD_FATType]
  1524                              <1> 
  1525 000081DB 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 000081DC 31C9                <1> 	xor	ecx, ecx
  1545                              <1> 
  1546 000081DE BF[A6360100]        <1> 	mov 	edi, Vol_Name
  1547                              <1> 
  1548                              <1> 	;mov	ah, [esi+LD_FSType]
  1549                              <1> 	;mov	al, [esi+LD_FATType]
  1550 000081E3 668B4603            <1> 	mov	ax, [esi+LD_FATType]
  1551 000081E7 80FCA1              <1> 	cmp	ah, 0A1h
  1552 000081EA 7418                <1> 	je	short mvn_2
  1553 000081EC 08E4                <1> 	or	ah, ah
  1554 000081EE 7404                <1> 	jz	short mvn_0
  1555 000081F0 08C0                <1> 	or	al, al
  1556 000081F2 7504                <1> 	jnz	short mvn_1
  1557                              <1> mvn_0:
  1558 000081F4 8A06                <1> 	mov	al, [esi]
  1559 000081F6 F9                  <1> 	stc
  1560 000081F7 C3                  <1> 	retn
  1561                              <1> mvn_1:
  1562 000081F8 3C02                <1> 	cmp	al, 2
  1563 000081FA 7714                <1> 	ja	short mvn_3 
  1564                              <1> 	;or	al, al
  1565                              <1> 	;jz	short mvn_2
  1566 000081FC 8B462D              <1> 	mov	eax, [esi+LD_BPB+VolumeID]
  1567 000081FF 83C631              <1> 	add	esi, LD_BPB+VolumeLabel
  1568 00008202 EB12                <1> 	jmp	short mvn_4
  1569                              <1> mvn_2:
  1570 00008204 8B4628              <1> 	mov	eax, [esi+LD_FS_VolumeSerial]
  1571 00008207 83C62C              <1> 	add	esi, LD_FS_VolumeName
  1572                              <1> 	;mov	ecx, 16
  1573                              <1> 	; 26/07/2022
  1574 0000820A B110                <1> 	mov	cl, 16
  1575 0000820C F3A5                <1> 	rep	movsd
  1576 0000820E EB0D                <1> 	jmp	short mvn_5
  1577                              <1> mvn_3:
  1578 00008210 8B4649              <1> 	mov	eax, [esi+LD_BPB+FAT32_VolID]
  1579 00008213 83C64D              <1> 	add	esi, LD_BPB+FAT32_VolLab
  1580                              <1> mvn_4:
  1581                              <1> 	;mov	ecx, 11
  1582                              <1> 	; 26/07/2022
  1583 00008216 B10B                <1> 	mov	cl, 11
  1584 00008218 F3A4                <1> 	rep	movsb
  1585 0000821A C60700              <1> 	mov	byte [edi], 0
  1586                              <1> mvn_5:
  1587                              <1> 	;mov	[Current_VolSerial], eax
  1588 0000821D E893BFFFFF          <1> 	call	dwordtohex
  1589 00008222 8915[FB360100]      <1> 	mov	[Vol_Serial1], edx
  1590 00008228 A3[00370100]        <1> 	mov	[Vol_Serial2], eax
  1591                              <1> 	; ecx = 0
  1592 0000822D 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 0000822E 31DB                <1> 	xor	ebx, ebx
  1605 00008230 88D7                <1> 	mov	bh, dl
  1606 00008232 3815[CE340100]      <1> 	cmp	[Last_DOS_DiskNo], dl
  1607 00008238 7304                <1> 	jnb	short loc_gvsn_start
  1608                              <1> loc_gvsn_stc_retn:
  1609 0000823A 31C0                <1> 	xor	eax, eax
  1610 0000823C F9                  <1> 	stc
  1611 0000823D C3                  <1>         retn
  1612                              <1> loc_gvsn_start:
  1613 0000823E 56                  <1> 	push	esi
  1614 0000823F BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1615 00008244 01DE                <1> 	add	esi, ebx
  1616 00008246 8A5E03              <1> 	mov	bl, [esi+LD_FATType]
  1617 00008249 20DB                <1> 	and	bl, bl
  1618 0000824B 740F                <1> 	jz	short loc_gvsn_fs
  1619 0000824D 80FB02              <1> 	cmp	bl, 2
  1620 00008250 7705                <1> 	ja	short loc_gvsn_fat32
  1621                              <1> loc_gvsn_fat:
  1622 00008252 83C62D              <1> 	add	esi, LD_BPB + VolumeID
  1623 00008255 EB0E                <1> 	jmp	short loc_gvsn_return
  1624                              <1> loc_gvsn_fat32:
  1625 00008257 83C649              <1> 	add	esi, LD_BPB + FAT32_VolID
  1626 0000825A EB09                <1> 	jmp	short loc_gvsn_return 
  1627                              <1> loc_gvsn_fs:
  1628 0000825C 807E04A1            <1> 	cmp	byte [esi+LD_FSType], 0A1h
  1629 00008260 75D8                <1> 	jne	short loc_gvsn_stc_retn 
  1630 00008262 83C628              <1> 	add	esi, LD_FS_VolumeSerial
  1631                              <1> loc_gvsn_return:
  1632 00008265 8B06                <1> 	mov	eax, [esi]
  1633 00008267 5E                  <1> 	pop	esi
  1634 00008268 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 00008269 C605[A0850100]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 00008270 80F903              <1> 	cmp	cl, 3
  1665 00008273 777C                <1> 	ja	short c_4
  1666 00008275 7405                <1> 	je	short c_3
  1667 00008277 E9D2010000          <1> 	jmp	c_2
  1668                              <1> c_3:
  1669                              <1> cmp_cmd_dir:
  1670 0000827C BF[37350100]        <1> 	mov	edi, Cmd_Dir
  1671 00008281 E8D1030000          <1> 	call	cmp_cmd	
  1672                              <1> 	;jnc	print_directory_list
  1673                              <1> 	; 26/07/2022
  1674 00008286 7205                <1> 	jc	short cmp_cmd_cls
  1675 00008288 E97D040000          <1> 	jmp	print_directory_list
  1676                              <1> 
  1677                              <1> cmp_cmd_cls:
  1678 0000828D B103                <1> 	mov	cl, 3
  1679 0000828F BF[73350100]        <1> 	mov	edi, Cmd_Cls
  1680 00008294 E8BE030000          <1> 	call	cmp_cmd	
  1681                              <1>         ;jnc	clear_screen
  1682                              <1> 	; 26/07/2022
  1683 00008299 7205                <1> 	jc	short cmp_cmd_ver
  1684 0000829B E9E0EAFFFF          <1> 	jmp	clear_screen
  1685                              <1> 
  1686                              <1> cmp_cmd_ver:
  1687 000082A0 B103                <1> 	mov	cl, 3
  1688 000082A2 BF[41350100]        <1> 	mov	edi, Cmd_Ver
  1689 000082A7 E8AB030000          <1> 	call	cmp_cmd
  1690 000082AC 720A                <1> 	jc	short cmp_cmd_mem
  1691                              <1> 
  1692 000082AE BE[D6340100]        <1> 	mov	esi, mainprog_Version
  1693                              <1> 	;call	print_msg
  1694 000082B3 E9B2EAFFFF          <1> 	jmp	print_msg
  1695                              <1> 	;retn
  1696                              <1> 
  1697                              <1> cmp_cmd_mem:
  1698 000082B8 B103                <1> 	mov	cl, 3
  1699 000082BA BF[A9350100]        <1> 	mov	edi, Cmd_Mem
  1700 000082BF E893030000          <1> 	call	cmp_cmd
  1701                              <1> 	;jnc	memory_info
  1702                              <1> 	; 26/07/2022
  1703 000082C4 7205                <1> 	jc	short cmp_cmd_del
  1704 000082C6 E917BEFFFF          <1> 	jmp	memory_info
  1705                              <1> 
  1706                              <1> cmp_cmd_del:
  1707 000082CB B103                <1> 	mov	cl, 3
  1708 000082CD BF[7C350100]        <1> 	mov	edi, Cmd_Del
  1709 000082D2 E880030000          <1> 	call	cmp_cmd
  1710                              <1>         ;jnc	delete_file
  1711                              <1> 	; 26/07/2022
  1712 000082D7 7205                <1> 	jc	short cmp_cmd_set
  1713 000082D9 E93D110000          <1> 	jmp	delete_file
  1714                              <1> 
  1715                              <1> cmp_cmd_set:
  1716 000082DE B103                <1> 	mov	cl, 3
  1717 000082E0 BF[6F350100]        <1> 	mov	edi, Cmd_Set
  1718 000082E5 E86D030000          <1> 	call	cmp_cmd
  1719                              <1> 	;jnc	set_get_env
  1720                              <1> 	; 26/07/2022
  1721 000082EA 720F                <1> 	jc	short cmp_cmd_run
  1722 000082EC E987190000          <1> 	jmp	set_get_env
  1723                              <1> 
  1724                              <1> 	; 07/08/2022
  1725                              <1> c_4:
  1726                              <1> 	; 26/07/2022
  1727 000082F1 80F904              <1> 	cmp	cl, 4
  1728 000082F4 741D                <1> 	je	short cmp_cmd_4
  1729 000082F6 E937020000          <1> 	jmp	c_6
  1730                              <1> 
  1731                              <1> cmp_cmd_run:
  1732 000082FB B103                <1> 	mov	cl, 3
  1733 000082FD BF[6B350100]        <1> 	mov	edi, Cmd_Run
  1734 00008302 E850030000          <1> 	call	cmp_cmd
  1735                              <1> 	; 07/05/2016
  1736                              <1>         ;jc	cmp_cmd_external
  1737                              <1> 	; 26/07/2022
  1738 00008307 7305                <1> 	jnc	short c3_run
  1739 00008309 E92C030000          <1> 	jmp	cmp_cmd_external
  1740                              <1> c3_run:
  1741 0000830E E9861F0000          <1> 	jmp	load_and_execute_file
  1742                              <1> 
  1743                              <1> cmp_cmd_4:
  1744                              <1> 	; 26/07/2022
  1745                              <1> cmp_cmd_exit:
  1746 00008313 BF[45350100]        <1> 	mov	edi, Cmd_Exit
  1747 00008318 E83A030000          <1> 	call	cmp_cmd
  1748 0000831D 7208                <1> 	jc	short cmp_cmd_date
  1749                              <1> 
  1750 0000831F C605[A0850100]01    <1>         mov     byte [Program_Exit], 1
  1751 00008326 C3                  <1>         retn
  1752                              <1> 
  1753                              <1> cmp_cmd_date:
  1754 00008327 B104                <1> 	mov	cl, 4
  1755 00008329 BF[61350100]        <1> 	mov	edi, Cmd_Date
  1756 0000832E E824030000          <1> 	call	cmp_cmd
  1757 00008333 720A                <1>         jc	short cmp_cmd_time
  1758                              <1> 	
  1759 00008335 E806F8FFFF          <1> 	call	show_date
  1760                              <1> 	;call	set_date
  1761                              <1> 	;retn
  1762                              <1> 	; 26/07/2022
  1763 0000833A E944F8FFFF          <1> 	jmp	set_date
  1764                              <1> 
  1765                              <1> cmp_cmd_time:
  1766 0000833F B104                <1> 	mov	cl, 4
  1767 00008341 BF[66350100]        <1> 	mov	edi, Cmd_Time
  1768 00008346 E80C030000          <1>    	call	cmp_cmd
  1769 0000834B 720A                <1> 	jc	short cmp_cmd_show
  1770                              <1> 
  1771 0000834D E894FAFFFF          <1> 	call	show_time
  1772                              <1> 	;call	set_time
  1773                              <1> 	;retn
  1774                              <1> 	; 26/07/2022
  1775 00008352 E9C5FAFFFF          <1> 	jmp	set_time
  1776                              <1> 
  1777                              <1> cmp_cmd_show:
  1778 00008357 B104                <1> 	mov	cl, 4
  1779 00008359 BF[77350100]        <1> 	mov	edi, Cmd_Show
  1780 0000835E E8F4020000          <1>    	call	cmp_cmd
  1781                              <1>         ;jnc	show_file
  1782                              <1> 	; 26/07/2022
  1783 00008363 7205                <1> 	jc	short cmp_cmd_echo
  1784 00008365 E985090000          <1> 	jmp	show_file
  1785                              <1> 
  1786                              <1> cmp_cmd_echo:
  1787 0000836A B104                <1> 	mov	cl, 4
  1788 0000836C BF[B3350100]        <1> 	mov	edi, Cmd_Echo
  1789 00008371 E8E1020000          <1>    	call	cmp_cmd
  1790 00008376 7224                <1> 	jc	short cmp_cmd_copy
  1791                              <1> 
  1792                              <1> 	; 22/11/2017
  1793                              <1> 	; AL = 0
  1794 00008378 803E20              <1> 	cmp	byte [esi], 20h
  1795 0000837B 7215                <1> 	jb	short cmd_echo_nextline
  1796                              <1> 	; 14/04/2016
  1797 0000837D 56                  <1> 	push	esi
  1798                              <1> cmd_echo_asciiz:
  1799                              <1> 	;inc	esi
  1800                              <1> 	;mov	al, [esi]
  1801                              <1> 	; 22/11/2017
  1802 0000837E AC                  <1> 	lodsb
  1803 0000837F 3C20                <1> 	cmp	al, 20h
  1804 00008381 73FB                <1> 	jnb	short cmd_echo_asciiz
  1805 00008383 4E                  <1> 	dec	esi
  1806 00008384 C60600              <1> 	mov	byte [esi], 0
  1807 00008387 5E                  <1> 	pop	esi
  1808 00008388 89F7                <1> 	mov	edi, esi
  1809 0000838A E8DBE9FFFF          <1> 	call	print_msg
  1810 0000838F C60700              <1> 	mov	byte [edi], 0
  1811                              <1> cmd_echo_nextline:
  1812 00008392 BE[C93F0100]        <1> 	mov	esi, NextLine
  1813                              <1> 	;call	print_msg
  1814                              <1> 	;retn
  1815 00008397 E9CEE9FFFF          <1> 	jmp	print_msg
  1816                              <1> 
  1817                              <1> cmp_cmd_copy:
  1818 0000839C B104                <1> 	mov	cl, 4
  1819 0000839E BF[9A350100]        <1> 	mov	edi, Cmd_Copy
  1820 000083A3 E8AF020000          <1>    	call	cmp_cmd
  1821                              <1> 	;jnc	copy_file
  1822                              <1> 	; 26/07/2022
  1823 000083A8 7205                <1> 	jc	short cmp_cmd_move
  1824 000083AA E92A170000          <1> 	jmp	copy_file
  1825                              <1> 
  1826                              <1> cmp_cmd_move:
  1827 000083AF B104                <1> 	mov	cl, 4
  1828 000083B1 BF[9F350100]        <1> 	mov	edi, Cmd_Move
  1829 000083B6 E89C020000          <1>    	call	cmp_cmd
  1830                              <1> 	;jnc	move_file
  1831                              <1> 	; 26/07/2022
  1832 000083BB 7205                <1> 	jc	short cmp_cmd_path
  1833 000083BD E9D5150000          <1> 	jmp	move_file
  1834                              <1> 
  1835                              <1> cmp_cmd_path:
  1836 000083C2 B104                <1> 	mov	cl, 4
  1837 000083C4 BF[A4350100]        <1> 	mov	edi, Cmd_Path
  1838 000083C9 E889020000          <1>    	call	cmp_cmd
  1839                              <1> 	;jnc	set_get_path
  1840                              <1> 	; 26/07/2022
  1841 000083CE 7205                <1> 	jc	short cmp_cmd_beep
  1842 000083D0 E92B190000          <1> 	jmp	set_get_path
  1843                              <1> 
  1844                              <1> cmp_cmd_beep:
  1845 000083D5 B104                <1> 	mov	cl, 4
  1846 000083D7 BF[D1350100]        <1> 	mov	edi, Cmd_Beep
  1847 000083DC E876020000          <1>    	call	cmp_cmd	
  1848 000083E1 720B                <1> 	jc	short cmp_cmd_find
  1849                              <1> 	; 13/05/2016
  1850 000083E3 8A3D[1E7D0100]      <1> 	mov	bh, [ptty] ; [ACTIVE_PAGE]
  1851 000083E9 E9919FFFFF          <1> 	jmp	beeper
  1852                              <1> 
  1853                              <1> cmp_cmd_find:
  1854 000083EE B104                <1> 	mov	cl, 4
  1855 000083F0 BF[AE350100]        <1> 	mov	edi, Cmd_Find
  1856 000083F5 E85D020000          <1>    	call	cmp_cmd	
  1857                              <1>         ;jc	cmp_cmd_external
  1858                              <1> 	; 26/07/2022
  1859 000083FA 7305                <1> 	jnc	short c4_find
  1860 000083FC E939020000          <1> 	jmp	cmp_cmd_external
  1861                              <1> c4_find:
  1862                              <1> 	;call	find_and_list_files
  1863 00008401 E99A210000          <1> 	jmp	find_and_list_files
  1864                              <1> 	;retn
  1865                              <1> 
  1866                              <1> c_1:
  1867 00008406 AD                  <1> 	lodsd
  1868                              <1> cmp_cmd_help:
  1869 00008407 3C3F                <1> 	cmp	al, '?'
  1870 00008409 751D                <1>         jne     short cmp_cmd_remark
  1871                              <1> 
  1872 0000840B BE[37350100]        <1> 	mov	esi, Command_List
  1873                              <1> cmd_help_next_w:
  1874 00008410 E855E9FFFF          <1> 	call	print_msg
  1875                              <1> 
  1876 00008415 803E20              <1> 	cmp	byte [esi], 20h ; 0
  1877 00008418 7233                <1> 	jb	short cmd_help_retn
  1878                              <1> 
  1879 0000841A 56                  <1> 	push	esi
  1880 0000841B BE[5B3F0100]        <1> 	mov	esi, nextline
  1881 00008420 E845E9FFFF          <1> 	call	print_msg
  1882 00008425 5E                  <1> 	pop	esi
  1883 00008426 EBE8                <1> 	jmp	short cmd_help_next_w
  1884                              <1> 
  1885                              <1> cmp_cmd_remark:
  1886 00008428 3C2A                <1> 	cmp	al, '*'
  1887                              <1> 	;jne	cmp_cmd_external
  1888                              <1> 	; 26/07/2022
  1889 0000842A 7405                <1> 	je	short cmp_cmd_rem
  1890 0000842C E909020000          <1> 	jmp	cmp_cmd_external
  1891                              <1> cmp_cmd_rem:
  1892 00008431 46                  <1> 	inc	esi
  1893 00008432 BF[147E0100]        <1> 	mov	edi, Remark
  1894 00008437 8A06                <1> 	mov	al, [esi]
  1895 00008439 3C20                <1> 	cmp	al, 20h
  1896 0000843B 7707                <1> 	ja	short cmd_remark_write
  1897 0000843D 89FE                <1> 	mov	esi, edi ; Remark
  1898 0000843F E926E9FFFF          <1> 	jmp	print_msg
  1899                              <1> 
  1900                              <1> cmd_remark_write:
  1901 00008444 AA                  <1> 	stosb
  1902 00008445 AC                  <1> 	lodsb
  1903 00008446 3C20                <1> 	cmp	al, 20h
  1904 00008448 73FA                <1> 	jnb	short cmd_remark_write
  1905 0000844A C60700              <1> 	mov	byte [edi], 0
  1906                              <1> 
  1907                              <1> cmd_help_retn:
  1908                              <1> cmd_remark_retn:
  1909                              <1> cd_retn:
  1910 0000844D C3                  <1> 	retn
  1911                              <1> c_2:
  1912                              <1> 	; 26/07/2022
  1913 0000844E BE[627E0100]        <1> 	mov	esi, CommandBuffer
  1914 00008453 80F902              <1> 	cmp	cl, 2
  1915                              <1> 	;ja	c_3
  1916                              <1> 	;mov	esi, CommandBuffer
  1917 00008456 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 00008458 66AD                <1> 	lodsw
  1923 0000845A 663D4344            <1> 	cmp	ax, 'CD'
  1924 0000845E 754E                <1> 	jne	short cmp_cmd_drive
  1925 00008460 46                  <1>         inc	esi
  1926                              <1> cd_0:
  1927 00008461 668B06              <1> 	mov	ax, [esi]
  1928 00008464 3C20                <1> 	cmp	al, 20h
  1929 00008466 76E5                <1> 	jna	short cd_retn
  1930                              <1> 	; 10/02/2016
  1931 00008468 80FC3A              <1> 	cmp	ah, ':'
  1932 0000846B 7504                <1> 	jne	short cd_1
  1933 0000846D 46                  <1> 	inc	esi
  1934 0000846E 46                  <1> 	inc	esi
  1935 0000846F 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 00008471 B4CD                <1> 	mov	ah, 0CDh ; mov byte [CD_COMMAND], 0CDh
  1945                              <1> 
  1946 00008473 E803220000          <1> 	call	change_current_directory
  1947                              <1> 	;jnc	change_prompt_dir_string
  1948                              <1> 	; 26/07/2022
  1949 00008478 7205                <1> 	jc	short cd_error_messages
  1950 0000847A E925210000          <1> 	jmp	change_prompt_dir_string
  1951                              <1> 
  1952                              <1> cd_error_messages:
  1953 0000847F 3C03                <1> 	cmp	al, 3
  1954 00008481 740C                <1> 	je	short cd_path_not_found
  1955                              <1> 	; 16/10/2016 (15h -> 15)
  1956 00008483 3C0F                <1> 	cmp	al, 15 ; drive not ready error
  1957 00008485 7453                <1> 	je	short cd_drive_not_ready
  1958 00008487 3C11                <1> 	cmp	al, 17 ; read error
  1959 00008489 744F                <1> 	je	short cd_drive_not_ready
  1960 0000848B 3C13                <1> 	cmp	al, 19 ; ; Bad directory/path name
  1961 0000848D 7460                <1> 	je	short cd_command_failed
  1962                              <1> 
  1963                              <1> cd_path_not_found:
  1964 0000848F 50                  <1> 	push	eax ; 29/12/2017
  1965                              <1> 	;push	ax
  1966 00008490 BE[DA370100]        <1> 	mov	esi, Msg_Dir_Not_Found
  1967 00008495 E8D0E8FFFF          <1> 	call	print_msg
  1968                              <1> 	;pop	ax
  1969 0000849A 58                  <1> 	pop	eax ; 29/12/2017
  1970 0000849B 3A25[B07D0100]      <1> 	cmp	ah, [Current_Dir_Level]
  1971                              <1>         ;jnb	change_prompt_dir_string
  1972                              <1> 	; 26/07/2022
  1973 000084A1 7306                <1> 	jnb	short cd_cpds
  1974 000084A3 8825[B07D0100]      <1> 	mov	[Current_Dir_Level], ah
  1975                              <1> cd_cpds:
  1976 000084A9 E9F6200000          <1>         jmp     change_prompt_dir_string
  1977                              <1> 
  1978                              <1> cmp_cmd_drive: ; change current drive
  1979                              <1> 	; C:, D:, E: etc.
  1980 000084AE 80FC3A              <1> 	cmp	ah, ':'
  1981                              <1> 	;jne	cmp_cmd_external
  1982                              <1> 	; 26/07/2022
  1983 000084B1 7405                <1> 	je	short cd_2
  1984                              <1> cmd_ext:
  1985 000084B3 E982010000          <1> 	jmp	cmp_cmd_external
  1986                              <1> 
  1987                              <1> cd_2:	; 'CD C:', 'CD D:' ...
  1988 000084B8 803E20              <1> 	cmp	byte [esi], 20h
  1989                              <1> 	;ja	loc_cmd_failed
  1990                              <1> 	; 26/07/2022
  1991 000084BB 7706                <1> 	ja	short cd_failed
  1992 000084BD 24DF                <1> 	and	al, 0DFh
  1993 000084BF 2C41                <1> 	sub	al, 'A'
  1994                              <1> 	;jc	loc_cmd_failed
  1995                              <1> 	; 26/07/2022
  1996 000084C1 7305                <1> 	jnc	short cd_3
  1997                              <1> cd_failed:
  1998 000084C3 E97C010000          <1> 	jmp	loc_cmd_failed
  1999                              <1> cd_3:
  2000 000084C8 3A05[CE340100]      <1>         cmp     al, [Last_DOS_DiskNo]
  2001 000084CE 770A                <1>         ja	short cd_drive_not_ready
  2002                              <1> 
  2003 000084D0 88C2                <1> 	mov	dl, al
  2004 000084D2 E8A6F3FFFF          <1> 	call 	change_current_drive
  2005 000084D7 7201                <1> 	jc	short cd_drive_not_ready
  2006 000084D9 C3                  <1> 	retn
  2007                              <1> 
  2008                              <1> cd_drive_not_ready:
  2009 000084DA BE[97370100]        <1> 	mov	esi, Msg_Not_Ready_Read_Err
  2010 000084DF E886E8FFFF          <1> 	call	print_msg
  2011                              <1> 
  2012                              <1> cd_fail_drive_restart:
  2013 000084E4 8A15[B27D0100]      <1> 	mov	dl, [Current_Drv]
  2014                              <1> 	;call 	change_current_drive
  2015 000084EA E98EF3FFFF          <1>         jmp     change_current_drive
  2016                              <1> 	;retn
  2017                              <1> 
  2018                              <1> cd_command_failed:
  2019 000084EF BE[78370100]        <1> 	mov	esi, Msg_Bad_Command
  2020 000084F4 E871E8FFFF          <1> 	call	print_msg
  2021 000084F9 EBE9                <1> 	jmp	short cd_fail_drive_restart
  2022                              <1> 
  2023                              <1> c_5:
  2024                              <1> cmp_cmd_mkdir:
  2025 000084FB BF[94350100]        <1> 	mov	edi, Cmd_Mkdir
  2026 00008500 E852010000          <1> 	call	cmp_cmd
  2027                              <1> 	;jnc	make_directory
  2028                              <1> 	; 26/07/2022
  2029 00008505 7205                <1> 	jc	short cmp_cmd_rmdir
  2030 00008507 E99B0A0000          <1> 	jmp	make_directory
  2031                              <1> 
  2032                              <1> cmp_cmd_rmdir:
  2033 0000850C B105                <1> 	mov	cl, 5
  2034 0000850E BF[8E350100]        <1> 	mov	edi, Cmd_Rmdir
  2035 00008513 E83F010000          <1> 	call	cmp_cmd
  2036                              <1> 	;jnc	delete_directory
  2037                              <1> 	; 26/07/2022
  2038 00008518 7205                <1> 	jc	short cmp_cmd_chdir
  2039 0000851A E9A40B0000          <1> 	jmp	delete_directory
  2040                              <1> 
  2041                              <1> cmp_cmd_chdir:
  2042 0000851F B105                <1> 	mov	cl, 5
  2043 00008521 BF[CB350100]        <1> 	mov	edi, Cmd_Chdir
  2044 00008526 E82C010000          <1> 	call	cmp_cmd
  2045                              <1> 	;jc	cmp_cmd_external
  2046                              <1> 	; 26/07/2022
  2047 0000852B 7286                <1> 	jc	short cmd_ext
  2048                              <1> 
  2049 0000852D E92FFFFFFF          <1> 	jmp	cd_0
  2050                              <1> 
  2051                              <1> c_6:
  2052 00008532 80F906              <1> 	cmp	cl, 6
  2053                              <1> 	;ja	c_8
  2054                              <1> 	; 26/07/2022
  2055 00008535 72C4                <1> 	jb	short c_5
  2056 00008537 7405                <1> 	je	short cmd_6
  2057 00008539 E9E4000000          <1> 	jmp	c_8
  2058                              <1> 
  2059                              <1> cmd_6:
  2060                              <1> cmp_cmd_prompt:
  2061 0000853E BF[4A350100]        <1> 	mov	edi, Cmd_Prompt
  2062 00008543 E80F010000          <1> 	call	cmp_cmd
  2063 00008548 722F                <1>         jc	short cmp_cmd_volume
  2064                              <1> get_prompt_name_fchar:
  2065 0000854A AC                  <1> 	lodsb
  2066 0000854B 3C20                <1> 	cmp	al, 20h
  2067 0000854D 74FB                <1> 	je	short get_prompt_name_fchar
  2068 0000854F 7713                <1> 	ja	short loc_change_prompt_label
  2069                              <1> default_command_prompt: ; 31/12/2017 ('sysprompt')
  2070 00008551 BE[2B350100]        <1> 	mov	esi, TRDOSPromptLabel
  2071 00008556 C7065452444F        <1> 	mov	dword [esi], "TRDO"
  2072 0000855C 66C746045300        <1>        	mov	word [esi+4], "S"
  2073                              <1> loc_cmd_prompt_return:
  2074 00008562 C3                  <1> 	retn
  2075                              <1> 
  2076                              <1> set_command_prompt: ; 31/12/2017 ('sysprompt')
  2077 00008563 AC                  <1> 	lodsb
  2078                              <1> loc_change_prompt_label:
  2079                              <1> 	;mov	cx, 11
  2080                              <1> 	; 26/07/2022
  2081 00008564 29C9                <1> 	sub	ecx, ecx
  2082 00008566 B10B                <1> 	mov	cl, 11
  2083 00008568 BF[2B350100]        <1> 	mov	edi, TRDOSPromptLabel
  2084                              <1> put_char_new_prompt_label:
  2085 0000856D AA                  <1> 	stosb
  2086 0000856E AC                  <1> 	lodsb
  2087 0000856F 3C20                <1> 	cmp	al, 20h
  2088 00008571 7202                <1> 	jb	short pass_put_new_prompt_label
  2089 00008573 E2F8                <1> 	loop	put_char_new_prompt_label
  2090                              <1> pass_put_new_prompt_label:
  2091 00008575 C60700              <1> 	mov	byte [edi], 0
  2092 00008578 C3                  <1> 	retn
  2093                              <1> 
  2094                              <1> cmp_cmd_volume:
  2095 00008579 B106                <1> 	mov	cl, 6
  2096 0000857B BF[51350100]        <1> 	mov	edi, Cmd_Volume
  2097 00008580 E8D2000000          <1> 	call	cmp_cmd
  2098 00008585 7259                <1>         jc	short cmp_cmd_attrib
  2099                              <1> 
  2100                              <1> cmd_vol1:
  2101 00008587 AC                  <1> 	lodsb
  2102 00008588 3C20                <1> 	cmp	al, 20h
  2103 0000858A 7707                <1> 	ja	short cmd_vol2
  2104 0000858C A0[B27D0100]        <1> 	mov	al, [Current_Drv]
  2105 00008591 EB41                <1> 	jmp	short cmd_vol4
  2106                              <1> cmd_vol2:
  2107 00008593 3C41                <1> 	cmp	al, 'A'
  2108                              <1> 	;jb	loc_cmd_failed
  2109                              <1> 	; 26/07/2022
  2110 00008595 722D                <1> 	jb	short cmd_vol_failed_1
  2111 00008597 3C7A                <1> 	cmp	al, 'z'
  2112                              <1> 	;ja	loc_cmd_failed
  2113                              <1> 	; 26/07/2022
  2114 00008599 7731                <1> 	ja	short cmd_vol_failed_2
  2115 0000859B 3C5A                <1> 	cmp	al, 'Z'
  2116 0000859D 7606                <1> 	jna	short cmd_vol3
  2117 0000859F 3C61                <1> 	cmp	al, 'a'
  2118                              <1>         ;jb	loc_cmd_failed
  2119                              <1> 	; 26/07/2022
  2120 000085A1 722B                <1> 	jb	short cmd_vol_failed_3
  2121 000085A3 24DF                <1> 	and	al, 0DFh
  2122                              <1> cmd_vol3:
  2123 000085A5 8A26                <1> 	mov	ah, [esi]
  2124 000085A7 80FC3A              <1> 	cmp	ah, ':'
  2125 000085AA 0F8594000000        <1>         jne     loc_cmd_failed
  2126 000085B0 2C41                <1> 	sub	al, 'A'
  2127 000085B2 3A05[CE340100]      <1>         cmp     al, [Last_DOS_DiskNo]
  2128 000085B8 761A                <1> 	jna	short cmd_vol4
  2129                              <1> 
  2130 000085BA BE[97370100]        <1> 	mov	esi, Msg_Not_Ready_Read_Err
  2131 000085BF E9A6E7FFFF          <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 000085C4 3C30                <1> 	cmp	al, '0'
  2138 000085C6 7204                <1> 	jb	short cmd_vol_failed_2
  2139 000085C8 3C39                <1> 	cmp	al, '9'
  2140 000085CA 76D9                <1> 	jna	short cmd_vol3
  2141                              <1> cmd_vol_failed_2:
  2142 000085CC EB76                <1> 	jmp	loc_cmd_failed
  2143                              <1> cmd_vol_failed_3:
  2144 000085CE 3C5F                <1> 	cmp	al, '_' ; underline ?
  2145 000085D0 74D3                <1> 	je	short cmd_vol3 ; is ok..
  2146 000085D2 EBF8                <1> 	jmp	short cmd_vol_failed_2
  2147                              <1> 
  2148                              <1> cmd_vol4:
  2149 000085D4 E889FAFFFF          <1> 	call	print_volume_info
  2150                              <1> 	;jc	cd_drive_not_ready
  2151                              <1> 	; 26/07/2022
  2152 000085D9 7339                <1> 	jnc	short cmd_vol5
  2153 000085DB E9FAFEFFFF          <1> 	jmp	cd_drive_not_ready
  2154                              <1> ;cmd_vol5:
  2155                              <1> ;	retn
  2156                              <1> 
  2157                              <1> cmp_cmd_attrib:
  2158 000085E0 B106                <1> 	mov	cl, 6
  2159 000085E2 BF[80350100]        <1> 	mov	edi, Cmd_Attrib
  2160 000085E7 E86B000000          <1> 	call	cmp_cmd
  2161                              <1> 	;jnc	set_file_attributes
  2162                              <1> 	; 26/07/2022
  2163 000085EC 7205                <1> 	jc	short cmp_cmd_rename
  2164 000085EE E9330F0000          <1> 	jmp	set_file_attributes
  2165                              <1> 
  2166                              <1> cmp_cmd_rename:
  2167 000085F3 B106                <1> 	mov	cl, 6
  2168 000085F5 BF[87350100]        <1> 	mov	edi, Cmd_Rename
  2169 000085FA E858000000          <1> 	call	cmp_cmd
  2170                              <1> 	;jnc	rename_file
  2171                              <1> 	; 26/07/2022
  2172 000085FF 7205                <1> 	jc	short cmp_cmd_device
  2173 00008601 E954110000          <1> 	jmp	rename_file
  2174                              <1> 
  2175                              <1> cmp_cmd_device:
  2176 00008606 B106                <1> 	mov	cl, 6
  2177 00008608 BF[BC350100]        <1> 	mov	edi, Cmd_Device
  2178 0000860D E845000000          <1> 	call	cmp_cmd
  2179 00008612 7226                <1> 	jc	short cmp_cmd_external
  2180                              <1> 	; 26/07/2022
  2181                              <1> cmd_vol5:
  2182                              <1> cmd_dev:
  2183 00008614 C3                  <1> 	retn
  2184                              <1> 
  2185                              <1> c_7:
  2186                              <1> cmp_cmd_devlist:
  2187 00008615 BF[C3350100]        <1> 	mov	edi, Cmd_DevList
  2188 0000861A E838000000          <1> 	call	cmp_cmd
  2189 0000861F 7219                <1>         jc	short cmp_cmd_external
  2190                              <1> 
  2191                              <1> loc_cmd_return:
  2192 00008621 C3                  <1> 	retn
  2193                              <1> 
  2194                              <1> c_8:
  2195 00008622 80F908              <1>         cmp	cl, 8
  2196 00008625 7713                <1> 	ja	short cmp_cmd_external
  2197 00008627 72EC                <1> 	jb	short c_7
  2198                              <1> 
  2199                              <1> cmp_cmd_longname:
  2200 00008629 BF[58350100]        <1> 	mov	edi, Cmd_LongName
  2201 0000862E E824000000          <1> 	call	cmp_cmd
  2202                              <1> 	;jnc	get_and_print_longname
  2203                              <1> 	; 26/07/2022
  2204 00008633 7205                <1> 	jc	short cmp_cmd_external
  2205 00008635 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 0000863A BE[627E0100]        <1> 	mov	esi, CommandBuffer
  2211 0000863F E9551C0000          <1> 	jmp	loc_run_check_filename
  2212                              <1> 
  2213                              <1> loc_cmd_failed:
  2214 00008644 803D[627E0100]20    <1> 	cmp	byte [CommandBuffer], 20h
  2215 0000864B 76D4                <1> 	jna	short loc_cmd_return
  2216 0000864D BE[78370100]        <1> 	mov	esi, Msg_Bad_Command
  2217                              <1> ;	call	print_msg
  2218                              <1> ;loc_cmd_return:
  2219                              <1> ;	retn
  2220 00008652 E913E7FFFF          <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 00008657 BE[627E0100]        <1>         mov	esi, CommandBuffer
  2226                              <1>         ; edi = internal command word (ASCIIZ)
  2227                              <1> 	; ecx = command length (<=8)
  2228                              <1> cmp_cmd_1:
  2229 0000865C AC                  <1> 	lodsb
  2230 0000865D AE                  <1> 	scasb
  2231 0000865E 750D                <1> 	jne	short cmp_cmd_3
  2232 00008660 E2FA                <1> 	loop	cmp_cmd_1
  2233 00008662 AC                  <1>  	lodsb
  2234 00008663 3C20                <1> 	cmp	al, 20h
  2235 00008665 7703                <1> 	ja	short cmp_cmd_2
  2236 00008667 30C0                <1> 	xor	al, al
  2237                              <1> 	; ZF = 1 -> internal command word matches
  2238 00008669 C3                  <1> 	retn
  2239                              <1> cmp_cmd_2:
  2240                              <1> 	; ZF = 0 (CF = 0) -> external command word
  2241 0000866A 58                  <1> 	pop	eax ; no return to the caller from here 
  2242 0000866B EBCD                <1> 	jmp	short cmp_cmd_external ; 26/07/2022
  2243                              <1> cmp_cmd_3:
  2244 0000866D F9                  <1> 	stc
  2245                              <1> 	; CF = 1 -> internal command word does not match
  2246 0000866E 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 0000866F 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 00008674 3C01                <1> 	cmp	al, 1 ; Bad command or file name
  2261 00008676 74CC                <1> 	je	short loc_cmd_failed ; 26/07/2022
  2262                              <1> loc_run_dir_not_found:
  2263 00008678 3C03                <1> 	cmp	al, 3
  2264 0000867A 750A                <1> 	jne	short loc_run_file_notfound_msg
  2265                              <1> 	; Path not found (MS-DOS Error Code = 3)
  2266 0000867C BE[DA370100]        <1> 	mov	esi, Msg_Dir_Not_Found
  2267 00008681 E9E4E6FFFF          <1> 	jmp	print_msg
  2268                              <1> 
  2269                              <1> loc_run_file_notfound_msg:
  2270 00008686 3C02                <1> 	cmp	al, 2 ; File not found
  2271 00008688 750A                <1> 	jne	short loc_run_file_drv_read_err
  2272                              <1> 
  2273                              <1> loc_print_file_notfound_msg:
  2274 0000868A BE[F1370100]        <1>         mov     esi, Msg_File_Not_Found
  2275                              <1> 	;call	proc_printmsg
  2276                              <1> 	;retn
  2277 0000868F E9D6E6FFFF          <1> 	jmp	print_msg
  2278                              <1> 
  2279                              <1> loc_run_file_drv_read_err:
  2280                              <1> 	; Err: 17 (Read fault)
  2281 00008694 3C11                <1> 	cmp	al, 17 ; Drive not ready or read error
  2282 00008696 7404                <1> 	je	short loc_run_file_print_drv_read_err
  2283                              <1> 	;
  2284 00008698 3C0F                <1> 	cmp	al, 15 ; Drive not ready (or read error)
  2285 0000869A 750A                <1> 	jne	short loc_run_file_toobig
  2286                              <1> 
  2287                              <1> loc_run_file_print_drv_read_err:
  2288 0000869C BE[97370100]        <1> 	mov	esi, Msg_Not_Ready_Read_Err
  2289 000086A1 E9C4E6FFFF          <1> 	jmp	print_msg
  2290                              <1> 
  2291                              <1> loc_run_file_toobig:
  2292 000086A6 3C08                <1> 	cmp	al, 8 ; Not enough free memory to load&run file
  2293 000086A8 750A                <1> 	jne	short loc_run_file_perm_denied
  2294 000086AA BE[3C380100]        <1> 	mov	esi, Msg_Insufficient_Memory
  2295 000086AF E9B6E6FFFF          <1> 	jmp	print_msg
  2296                              <1> 
  2297                              <1> loc_run_file_perm_denied:
  2298                              <1> 	; 29/12/2017
  2299 000086B4 3C0B                <1> 	cmp	al, ERR_PERM_DENIED ; 11 ; Permission denied
  2300 000086B6 750A                <1> 	jne	short loc_run_misc_error
  2301 000086B8 BE[D0390100]        <1> 	mov	esi, Msg_Permission_Denied
  2302 000086BD E9A8E6FFFF          <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 000086C2 E8AEBAFFFF          <1> 	call	bytetohex
  2309 000086C7 66A3[70380100]      <1>         mov     [error_code_hex], ax
  2310                              <1> 
  2311 000086CD BE[53380100]        <1> 	mov	esi, Msg_Error_Code 
  2312                              <1> 	;call	print_msg 
  2313                              <1> 	;retn
  2314 000086D2 E993E6FFFF          <1> 	jmp	print_msg
  2315                              <1> 
  2316                              <1> restore_cdir_after_cmd_fail:
  2317                              <1> 	; 15/02/2016 (TRDOS 386 = TRDOS v2.0)
  2318 000086D7 50                  <1> 	push	eax
  2319 000086D8 8A3D[0F850100]      <1> 	mov	bh, [RUN_CDRV] ; it is set at the beginning
  2320                              <1> 				; of the 'run' command.
  2321 000086DE 3A3D[B27D0100]      <1> 	cmp	bh, [Current_Drv]
  2322 000086E4 7409                <1> 	je	short loc_run_restore_cdir
  2323 000086E6 88FA                <1> 	mov	dl, bh
  2324 000086E8 E890F1FFFF          <1> 	call	change_current_drive 
  2325 000086ED EB19                <1> 	jmp	short loc_run_err_pass_restore_cdir
  2326                              <1> 
  2327                              <1> loc_run_restore_cdir:
  2328 000086EF 803D[CF340100]00    <1> 	cmp	byte [Restore_CDIR], 0
  2329 000086F6 7610                <1> 	jna	short loc_run_err_pass_restore_cdir
  2330 000086F8 30DB                <1> 	xor	bl, bl
  2331 000086FA 0FB7F3              <1> 	movzx	esi, bx
  2332 000086FD 81C600010900        <1> 	add	esi, Logical_DOSDisks
  2333 00008703 E82BF2FFFF          <1> 	call	restore_current_directory
  2334                              <1> 
  2335                              <1> loc_run_err_pass_restore_cdir:
  2336 00008708 58                  <1> 	pop	eax
  2337 00008709 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 0000870A 66C705[50860100]00- <1> 	mov	word [AttributesMask], 0800h ; ..except volume names..
  2347 00008712 08                  <1>
  2348 00008713 A0[B27D0100]        <1> 	mov	al, [Current_Drv]
  2349 00008718 A2[0F850100]        <1> 	mov	[RUN_CDRV], al
  2350                              <1> 	; 02/12/2023
  2351 0000871D 3C02                <1> 	cmp	al, 2
  2352 0000871F 733A                <1> 	jnb	short get_dfname_fchar
  2353 00008721 A0[717D0100]        <1> 	mov	al, [TIMER_LOW+1]
  2354 00008726 D0E8                <1> 	shr	al, 1	; 512/18.2 (>= 28 seconds)
  2355 00008728 8605[D6840100]      <1> 	xchg	al, [P_TIMER]  ; 28 seconds
  2356 0000872E 3A05[D6840100]      <1> 	cmp	al, [P_TIMER]
  2357 00008734 7425                <1> 	je	short get_dfname_fchar
  2358 00008736 E830F1FFFF          <1> 	call	get_media_change_status
  2359 0000873B 7205                <1> 	jc	short pdl_chdrv
  2360 0000873D 80FC06              <1> 	cmp	ah, 6
  2361 00008740 7519                <1> 	jne	short get_dfname_fchar
  2362                              <1> pdl_chdrv:
  2363 00008742 56                  <1> 	push	esi
  2364 00008743 8A15[0F850100]      <1> 	mov	dl, [RUN_CDRV]
  2365 00008749 E82FF1FFFF          <1> 	call	change_current_drive
  2366 0000874E 5E                  <1> 	pop	esi
  2367 0000874F 730A                <1> 	jnc	short get_dfname_fchar
  2368 00008751 BE[97370100]        <1> 	mov	esi, Msg_Not_Ready_Read_Err
  2369                              <1> 	;call	print_msg
  2370                              <1> 	;retn
  2371 00008756 E90FE6FFFF          <1> 	jmp	print_msg
  2372                              <1> 
  2373                              <1> get_dfname_fchar:
  2374 0000875B AC                  <1> 	lodsb
  2375 0000875C 3C20                <1> 	cmp	al, 20h
  2376 0000875E 74FB                <1> 	je	short get_dfname_fchar
  2377                              <1> 	;jb	loc_print_dir_call_all
  2378                              <1> 	; 02/12/2023
  2379 00008760 7705                <1> 	ja	short get_dfname_fchar_2
  2380 00008762 E9E0000000          <1> 	jmp	loc_print_dir_call_all
  2381                              <1> get_dfname_fchar_2:
  2382 00008767 3C2D                <1> 	cmp	al, '-'
  2383 00008769 753C                <1> 	jne	short loc_print_dir_call_flt
  2384                              <1> get_next_attr_char:
  2385 0000876B AC                  <1> 	lodsb
  2386 0000876C 3C20                <1> 	cmp	al, 20h
  2387 0000876E 74FB                <1> 	je	short get_next_attr_char
  2388                              <1> 	;jb	loc_cmd_failed
  2389                              <1> 	; 27/07/2022
  2390 00008770 7305                <1> 	jnb	short pdl_1
  2391                              <1> pdl_0:
  2392 00008772 E9CDFEFFFF          <1> 	jmp	loc_cmd_failed
  2393                              <1> pdl_1:
  2394 00008777 24DF                <1> 	and	al, 0DFh
  2395 00008779 3C44                <1> 	cmp	al, 'D' ; directories only ?
  2396 0000877B 750E                <1> 	jne	short pass_only_directories
  2397 0000877D AC                  <1> 	lodsb
  2398 0000877E 3C20                <1> 	cmp	al, 20h
  2399                              <1> 	;ja	loc_cmd_failed
  2400                              <1> 	; 27/07/2022
  2401 00008780 77F0                <1> 	ja	short pdl_0
  2402 00008782 800D[50860100]10    <1> 	or	byte [AttributesMask], 10h ; ..directory..
  2403 00008789 EB10                <1> 	jmp	short get_dfname_fchar_attr
  2404                              <1> pass_only_directories:
  2405 0000878B 3C46                <1> 	cmp	al, 'F'	; files only ?
  2406 0000878D 7530                <1> 	jne	short check_attr_s ; 27/07/2022
  2407 0000878F AC                  <1> 	lodsb
  2408 00008790 3C20                <1> 	cmp	al, 20h
  2409                              <1> 	;ja	loc_cmd_failed
  2410                              <1> 	; 27/07/2022
  2411 00008792 77DE                <1> 	ja	short pdl_0
  2412 00008794 800D[51860100]10    <1> 	or	byte [AttributesMask+1], 10h ; ..except directories..
  2413                              <1> get_dfname_fchar_attr:
  2414 0000879B AC                  <1> 	lodsb
  2415 0000879C 3C20                <1> 	cmp	al, 20h
  2416 0000879E 74FB                <1> 	je	short get_dfname_fchar_attr
  2417                              <1> 	;jb	short loc_print_dir_call_all
  2418                              <1> 	; 07/08/2022
  2419 000087A0 7305                <1> 	jnb	short loc_print_dir_call_flt
  2420 000087A2 E9A0000000          <1> 	jmp	loc_print_dir_call_all
  2421                              <1> loc_print_dir_call_flt:
  2422 000087A7 4E                  <1> 	dec	esi
  2423 000087A8 BF[52860100]        <1> 	mov	edi, FindFile_Drv
  2424 000087AD E8B3240000          <1> 	call	parse_path_name
  2425 000087B2 7352                <1>  	jnc	short loc_print_dir_change_drv_1
  2426 000087B4 3C01                <1> 	cmp	al, 1
  2427                              <1> 	;ja	loc_run_cmd_failed
  2428                              <1> 	; 27/07/2022
  2429 000087B6 764E                <1> 	jna	short loc_print_dir_change_drv_1
  2430                              <1> pdl_2:
  2431 000087B8 E9B2FEFFFF          <1> 	jmp	loc_run_cmd_failed
  2432                              <1> 
  2433                              <1> 	; 27/07/2022
  2434                              <1> check_attr_s_cap:
  2435 000087BD 24DF                <1> 	and	al, 0DFh
  2436                              <1> check_attr_s:
  2437 000087BF 3C53                <1> 	cmp	al, 'S'
  2438 000087C1 7510                <1> 	jne	short pass_attr_s
  2439 000087C3 800D[50860100]04    <1> 	or	byte [AttributesMask], 4 ; system
  2440 000087CA AC                  <1> 	lodsb
  2441 000087CB 3C20                <1> 	cmp	al, 20h
  2442 000087CD 74CC                <1> 	je	short get_dfname_fchar_attr
  2443 000087CF 7276                <1> 	jb	short loc_print_dir_call_all
  2444 000087D1 24DF                <1> 	and	al, 0DFh
  2445                              <1> pass_attr_s:
  2446 000087D3 3C48                <1> 	cmp	al, 'H'
  2447 000087D5 7510                <1> 	jne	short pass_attr_h
  2448 000087D7 800D[50860100]02    <1> 	or	byte [AttributesMask], 2 ; hidden
  2449                              <1> pass_attr_shr:
  2450 000087DE AC                  <1> 	lodsb
  2451 000087DF 3C20                <1> 	cmp	al, 20h
  2452 000087E1 74B8                <1> 	je	short get_dfname_fchar_attr
  2453 000087E3 7262                <1> 	jb	short loc_print_dir_call_all
  2454 000087E5 EBD6                <1> 	jmp	short check_attr_s_cap
  2455                              <1> pass_attr_h:
  2456 000087E7 3C52                <1> 	cmp	al, 'R'
  2457 000087E9 7509                <1> 	jne	short pass_attr_r
  2458 000087EB 800D[50860100]01    <1> 	or	byte [AttributesMask], 1 ; read only
  2459 000087F2 EBEA                <1> 	jmp	short pass_attr_shr
  2460                              <1> pass_attr_r:
  2461 000087F4 3C41                <1> 	cmp	al, 'A'
  2462                              <1> 	;jne	loc_cmd_failed
  2463                              <1> 	; 27/07/2022
  2464 000087F6 7405                <1> 	je	short pass_attr_a
  2465 000087F8 E947FEFFFF          <1> 	jmp	loc_cmd_failed
  2466                              <1> pass_attr_a:
  2467 000087FD 800D[50860100]20    <1> 	or	byte [AttributesMask], 20h ; archive
  2468 00008804 EBD8                <1> 	jmp	short pass_attr_shr
  2469                              <1> 
  2470                              <1> 	; 07/08/2022
  2471                              <1> loc_print_dir_change_drv_1:
  2472 00008806 8A15[52860100]      <1> 	mov	dl, [FindFile_Drv]
  2473                              <1> loc_print_dir_change_drv_2:
  2474 0000880C 3A15[0F850100]      <1> 	cmp	dl, [RUN_CDRV]
  2475 00008812 7407                <1> 	je	short loc_print_dir_change_directory 
  2476 00008814 E864F0FFFF          <1> 	call	change_current_drive
  2477                              <1>         ;jc	loc_run_cmd_failed
  2478                              <1> 	; 27/07/2022
  2479 00008819 729D                <1> 	jc	short pdl_2
  2480                              <1> loc_print_dir_change_directory:
  2481 0000881B 803D[53860100]20    <1> 	cmp	byte [FindFile_Directory], 20h ; 0 or 20h ?
  2482 00008822 7619                <1> 	jna	short pass_print_dir_change_directory
  2483                              <1> 
  2484 00008824 FE05[CF340100]      <1> 	inc	byte [Restore_CDIR]
  2485 0000882A BE[53860100]        <1> 	mov	esi, FindFile_Directory
  2486 0000882F 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  2487 00008831 E8451E0000          <1> 	call	change_current_directory
  2488                              <1>         ;jc	loc_run_cmd_failed
  2489                              <1> 	; 27/07/2022
  2490 00008836 7280                <1> 	jc	short pdl_2
  2491                              <1> 
  2492                              <1> loc_print_dir_change_prompt_dir_string:
  2493 00008838 E8671D0000          <1> 	call	change_prompt_dir_string
  2494                              <1> 
  2495                              <1> pass_print_dir_change_directory:
  2496 0000883D BE[94860100]        <1> 	mov	esi, FindFile_Name
  2497 00008842 803E20              <1> 	cmp	byte [esi], 20h ; ; 0 or 20h ?
  2498 00008845 7706                <1> 	ja	short loc_print_dir_call
  2499                              <1> 
  2500                              <1> loc_print_dir_call_all:
  2501 00008847 C7062A2E2A00        <1> 	mov	dword [esi], '*.*'
  2502                              <1> loc_print_dir_call:
  2503 0000884D E82D000000          <1> 	call	print_directory
  2504                              <1> 
  2505 00008852 8A15[0F850100]      <1> 	mov	dl, [RUN_CDRV]  ; it is set at the beginning
  2506 00008858 3A15[B27D0100]      <1> 	cmp	dl, [Current_Drv]
  2507 0000885E 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 00008860 E918F0FFFF          <1> 	jmp	change_current_drive
  2512                              <1> 
  2513                              <1> loc_print_dir_call_restore_cdir_retn:
  2514 00008865 803D[CF340100]00    <1> 	cmp	byte [Restore_CDIR], 0
  2515 0000886C 7610                <1> 	jna	short pass_print_dir_call_restore_cdir_retn
  2516                              <1> 
  2517 0000886E BE00010900          <1> 	mov	esi, Logical_DOSDisks
  2518 00008873 31C0                <1> 	xor	eax, eax
  2519 00008875 88D4                <1> 	mov	ah, dl
  2520 00008877 01C6                <1> 	add	esi, eax
  2521                              <1> 
  2522                              <1> 	;call	restore_current_directory
  2523                              <1> 	; 27/07/2022
  2524 00008879 E9B5F0FFFF          <1> 	jmp	restore_current_directory
  2525                              <1> 
  2526                              <1> pass_print_dir_call_restore_cdir_retn:
  2527 0000887E 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 0000887F 56                  <1> 	push	esi
  2542                              <1> 
  2543 00008880 29C0                <1> 	sub	eax, eax
  2544                              <1> 
  2545 00008882 66A3[DC860100]      <1> 	mov	[Dir_Count], ax ; 0
  2546 00008888 66A3[DA860100]      <1> 	mov 	[File_Count], ax ; 0
  2547 0000888E A3[DE860100]        <1> 	mov 	[Total_FSize], eax ; 0
  2548                              <1> 
  2549 00008893 E8E8E4FFFF          <1> 	call    clear_screen
  2550                              <1> 
  2551 00008898 31C9                <1> 	xor	ecx, ecx
  2552 0000889A 8A2D[B27D0100]      <1> 	mov     ch, [Current_Drv] ; DirBuff_Drv - 'A'
  2553 000088A0 A0[B37D0100]        <1> 	mov     al, [Current_Dir_Drv]
  2554 000088A5 A2[95360100]        <1> 	mov     [Dir_Drive_Name], al
  2555 000088AA BE00010900          <1> 	mov	esi, Logical_DOSDisks
  2556 000088AF 01CE                <1> 	add	esi, ecx
  2557                              <1> 
  2558 000088B1 E826F9FFFF          <1> 	call	move_volume_name_and_serial_no
  2559 000088B6 730C                <1> 	jnc	short print_dir_strlen_check
  2560                              <1> 
  2561 000088B8 5E                  <1> 	pop	esi
  2562 000088B9 8A3D[1E7D0100]      <1> 	mov	bh, [ptty] ; [ACTIVE_PAGE]
  2563                              <1> 	;call	beeper
  2564                              <1> 	;retn
  2565 000088BF E9BB9AFFFF          <1> 	jmp	beeper  ; beep ! and return
  2566                              <1> 
  2567                              <1> print_dir_strlen_check:
  2568 000088C4 BE[B57D0100]        <1> 	mov	esi, Current_Dir_Root
  2569 000088C9 BF[32370100]        <1> 	mov	edi, Dir_Str_Root
  2570                              <1> 
  2571                              <1> 	;xor	ecx, ecx
  2572 000088CE 8A0D[117E0100]      <1>         mov     cl, [Current_Dir_StrLen]
  2573 000088D4 FEC1                <1> 	inc	cl
  2574 000088D6 80F940              <1> 	cmp	cl, 64
  2575 000088D9 760D                <1> 	jna	short pass_print_dir_strlen_shorting
  2576 000088DB 46                  <1> 	inc	esi
  2577 000088DC 01CE                <1> 	add	esi, ecx
  2578 000088DE 83EE40              <1> 	sub	esi, 64
  2579 000088E1 47                  <1> 	inc	edi
  2580 000088E2 B82E2E2E20          <1> 	mov	eax, '... '
  2581 000088E7 AB                  <1> 	stosd
  2582                              <1> 
  2583                              <1> pass_print_dir_strlen_shorting:
  2584 000088E8 F3A4                <1> 	rep	movsb
  2585                              <1> 
  2586 000088EA BE[88360100]        <1> 	mov	esi, Dir_Drive_Str
  2587 000088EF E876E4FFFF          <1> 	call	print_msg
  2588                              <1> 
  2589 000088F4 BE[E7360100]        <1> 	mov	esi, Vol_Serial_Header
  2590 000088F9 E86CE4FFFF          <1> 	call	print_msg
  2591                              <1> 
  2592 000088FE BE[27370100]        <1> 	mov	esi, Dir_Str_Header
  2593 00008903 E862E4FFFF          <1> 	call	print_msg
  2594                              <1> 
  2595 00008908 BE[593F0100]        <1> 	mov	esi, next2line
  2596 0000890D E858E4FFFF          <1> 	call	print_msg
  2597                              <1> 
  2598                              <1> loc_print_dir_first_file:
  2599 00008912 C605[F1860100]10    <1> 	mov	byte [PrintDir_RowCounter], 16
  2600 00008919 66A1[50860100]      <1> 	mov	ax, [AttributesMask]
  2601 0000891F 5E                  <1> 	pop	esi
  2602                              <1> 
  2603 00008920 E845020000          <1> 	call	find_first_file
  2604                              <1> 	;jc	loc_dir_ok
  2605                              <1> 	; 27/07/2022
  2606 00008925 7305                <1> 	jnc	short loc_dfname_use_this
  2607 00008927 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 0000892C F6C310              <1> 	test	bl, 10h  ; Is it a directory?
  2612 0000892F 741B                <1> 	jz	short loc_not_dir
  2613                              <1> 
  2614 00008931 66FF05[DC860100]    <1> 	inc	word [Dir_Count]
  2615 00008938 89F2                <1> 	mov	edx, esi 	; FindFile_DirEntry address
  2616 0000893A BE[76380100]        <1>  	mov	esi, Type_Dir	; '<DIR>     '
  2617 0000893F BF[8D380100]        <1> 	mov	edi, Dir_Or_FileSize
  2618                              <1> 	; move 10 bytes
  2619 00008944 A5                  <1> 	movsd
  2620 00008945 A5                  <1> 	movsd
  2621 00008946 66A5                <1> 	movsw
  2622 00008948 89D6                <1> 	mov	esi, edx
  2623 0000894A EB36                <1> 	jmp     short loc_dir_attribute
  2624                              <1> 
  2625                              <1> loc_not_dir:
  2626 0000894C 66FF05[DA860100]    <1> 	inc	word [File_Count]
  2627 00008953 0105[DE860100]      <1> 	add	[Total_FSize], eax
  2628                              <1> 
  2629 00008959 B90A000000          <1> 	mov	ecx, 10  ; 32 bit divisor
  2630 0000895E 89CF                <1> 	mov	edi, ecx
  2631 00008960 81C7[8D380100]      <1> 	add	edi, Dir_Or_FileSize
  2632                              <1> loc_dir_rdivide:
  2633 00008966 29D2                <1> 	sub	edx, edx
  2634 00008968 F7F1                <1> 	div	ecx 	 ; remainder in dl (< 10)
  2635 0000896A 80C230              <1> 	add     dl, '0'	 ; to make visible (ascii)
  2636 0000896D 4F                  <1> 	dec	edi
  2637 0000896E 8817                <1> 	mov     [edi], dl
  2638 00008970 21C0                <1> 	and	eax, eax
  2639 00008972 75F2                <1> 	jnz	short loc_dir_rdivide
  2640                              <1> 
  2641                              <1> loc_dir_fill_space:
  2642 00008974 81FF[8D380100]      <1> 	cmp     edi, Dir_Or_FileSize
  2643 0000897A 7606                <1> 	jna     short loc_dir_attribute
  2644 0000897C 4F                  <1> 	dec     edi
  2645 0000897D C60720              <1> 	mov     byte [edi], 20h
  2646 00008980 EBF2                <1> 	jmp     short loc_dir_fill_space
  2647                              <1> 
  2648                              <1> loc_dir_attribute:
  2649 00008982 C705[98380100]2020- <1> 	mov	dword [File_Attribute], 20202020h
  2649 0000898A 2020                <1>
  2650                              <1> 
  2651 0000898C 80FB20              <1> 	cmp	bl, 20h  ; Is it an archive file?
  2652 0000898F 7207                <1> 	jb	short loc_dir_pass_arch
  2653 00008991 C605[9B380100]41    <1> 	mov	byte [File_Attribute+3], 'A'
  2654                              <1> 
  2655                              <1> loc_dir_pass_arch:
  2656 00008998 80E307              <1> 	and	bl, 7
  2657 0000899B 7428                <1> 	jz	short loc_dir_file_name
  2658 0000899D 88DF                <1> 	mov	bh, bl
  2659 0000899F 80E303              <1> 	and	bl, 3
  2660 000089A2 38DF                <1> 	cmp	bh, bl
  2661 000089A4 7607                <1> 	jna	short loc_dir_pass_s
  2662 000089A6 C605[98380100]53    <1> 	mov	byte [File_Attribute], 'S'
  2663                              <1> 
  2664                              <1> loc_dir_pass_s:
  2665 000089AD 80E302              <1> 	and     bl,2
  2666 000089B0 7407                <1> 	jz      short loc_dir_pass_h
  2667 000089B2 C605[99380100]48    <1> 	mov     byte [File_Attribute+1], 'H'
  2668                              <1> loc_dir_pass_h:
  2669 000089B9 80E701              <1> 	and     bh,1
  2670 000089BC 7407                <1> 	jz      short loc_dir_file_name
  2671 000089BE C605[9A380100]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 000089C5 8B5E16              <1> 	mov	ebx, [esi+16h]
  2676 000089C8 89F1                <1> 	mov	ecx, esi ; FindFile_DirEntry address
  2677 000089CA BF[80380100]        <1> 	mov     edi, File_Name
  2678                              <1> 	; move 8 bytes
  2679 000089CF A5                  <1> 	movsd
  2680 000089D0 A5                  <1> 	movsd
  2681 000089D1 C60720              <1> 	mov	byte [edi], 20h
  2682 000089D4 47                  <1> 	inc	edi
  2683                              <1> 	; move 3 bytes
  2684 000089D5 66A5                <1> 	movsw
  2685 000089D7 A4                  <1> 	movsb
  2686 000089D8 89CE                <1> 	mov	esi, ecx
  2687                              <1> 
  2688                              <1> Dir_Time_start:
  2689                              <1> 	;mov	ax, dx		; Time
  2690 000089DA 6689D8              <1> 	mov	ax, bx
  2691 000089DD 66C1E805            <1> 	shr	ax, 5		; shift right 5 times
  2692 000089E1 6683E03F            <1> 	and	ax, 0000111111b	; Minute Mask
  2693 000089E5 D40A                <1> 	aam			; Q([AL]/10)->AH
  2694                              <1> 				; R([AL]/10)->AL
  2695                              <1> 				; [AL]+[AH]= Minute as BCD
  2696 000089E7 660D3030            <1> 	or	ax, '00'	; Convert to ASCII
  2697 000089EB 86E0                <1> 	xchg	ah, al
  2698 000089ED 66A3[AB380100]      <1> 	mov	[File_Minute], ax
  2699                              <1> 
  2700                              <1> 	;mov	al, dh
  2701 000089F3 88F8                <1> 	mov	al, bh
  2702 000089F5 C0E803              <1> 	shr	al, 3		; shift right 3 times
  2703 000089F8 D40A                <1> 	aam			; [AL]+[AH]= Hours as BCD
  2704 000089FA 660D3030            <1> 	or	ax, '00'
  2705 000089FE 86E0                <1> 	xchg	ah, al
  2706 00008A00 66A3[A8380100]      <1> 	mov     [File_Hour], ax
  2707                              <1> 
  2708 00008A06 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 00008A09 89D8                <1> 	mov	eax, ebx
  2714 00008A0B 6683E01F            <1> 	and	ax, 00011111b	; Day Mask
  2715 00008A0F D40A                <1> 	aam			; Q([AL]/10)->AH
  2716                              <1> 				; R([AL]/10)->AL
  2717                              <1> 				; [AL]+[AH]= Day as BCD
  2718 00008A11 660D3030            <1> 	or	ax, '00'	; Convert to ASCII
  2719 00008A15 86C4                <1> 	xchg	al, ah
  2720                              <1> 
  2721 00008A17 66A3[9D380100]      <1> 	mov	[File_Day], ax
  2722                              <1> 
  2723                              <1> 	;mov	ax, bx
  2724                              <1> 	; 27/07/2022
  2725 00008A1D 89D8                <1> 	mov	eax, ebx
  2726                              <1> 	;shr	ax, 5		; shift right 5 times
  2727 00008A1F C1E805              <1> 	shr	eax, 5
  2728 00008A22 6683E00F            <1> 	and	ax, 00001111b	; Month Mask
  2729 00008A26 D40A                <1> 	aam
  2730 00008A28 660D3030            <1> 	or	ax, '00'
  2731 00008A2C 86E0                <1> 	xchg	ah, al
  2732 00008A2E 66A3[A0380100]      <1> 	mov	[File_Month], ax
  2733                              <1> 
  2734                              <1> 	;mov	ax, bx
  2735                              <1> 	; 27/07/2022
  2736 00008A34 89D8                <1> 	mov	eax, ebx
  2737                              <1> 	;shr	ax, 9
  2738 00008A36 C1E809              <1> 	shr	eax, 9
  2739 00008A39 6683E07F            <1> 	and	ax, 01111111b	; Result = Year - 1980
  2740 00008A3D 6605BC07            <1> 	add	ax, 1980
  2741                              <1> 
  2742 00008A41 B10A                <1> 	mov	cl, 10
  2743 00008A43 F6F1                <1> 	div	cl		; Q -> AL, R -> AH 
  2744 00008A45 80CC30              <1> 	or	ah, '0'
  2745 00008A48 8825[A6380100]      <1> 	mov	[File_Year+3], ah
  2746 00008A4E D40A                <1> 	aam
  2747 00008A50 86E0                <1> 	xchg	ah, al
  2748 00008A52 80CC30              <1> 	or	ah, '0'	  ; Convert to ASCII
  2749 00008A55 8825[A5380100]      <1> 	mov	[File_Year+2], ah
  2750 00008A5B D40A                <1> 	aam
  2751 00008A5D 86C4                <1> 	xchg	al, ah
  2752 00008A5F 660D3030            <1> 	or	ax, '00'
  2753 00008A63 66A3[A3380100]      <1> 	mov	[File_Year], ax
  2754                              <1> 
  2755                              <1> loc_show_line:
  2756 00008A69 56                  <1> 	push	esi
  2757 00008A6A BE[80380100]        <1> 	mov     esi, File_Name
  2758 00008A6F E8F6E2FFFF          <1> 	call	print_msg
  2759 00008A74 BE[5B3F0100]        <1> 	mov	esi, nextline
  2760 00008A79 E8ECE2FFFF          <1> 	call	print_msg
  2761 00008A7E 5E                  <1> 	pop	esi
  2762                              <1> 
  2763 00008A7F FE0D[F1860100]      <1> 	dec	byte [PrintDir_RowCounter]
  2764 00008A85 740C                <1> 	jz	short pause_dir_scroll ; 27/07/2022
  2765                              <1> 
  2766                              <1> loc_next_entry:
  2767 00008A87 E88B010000          <1> 	call	find_next_file
  2768                              <1> 	;jnc	loc_dfname_use_this
  2769                              <1> 	; 27/07/2022
  2770 00008A8C 7219                <1> 	jc	short loc_dir_ok
  2771 00008A8E E999FEFFFF          <1> 	jmp	loc_dfname_use_this
  2772                              <1> 
  2773                              <1> 	; 27/07/2022
  2774                              <1> pause_dir_scroll:
  2775 00008A93 28E4                <1> 	sub	ah, ah
  2776 00008A95 E88284FFFF          <1> 	call	int16h
  2777 00008A9A 3C1B                <1> 	cmp	al, 1Bh
  2778 00008A9C 7409                <1> 	je	short loc_dir_ok
  2779 00008A9E C605[F1860100]10    <1> 	mov	byte [PrintDir_RowCounter], 16 ; Reset counter
  2780 00008AA5 EBE0                <1>         jmp     short loc_next_entry
  2781                              <1> 
  2782                              <1> loc_dir_ok:
  2783 00008AA7 B90A000000          <1> 	mov     ecx, 10
  2784                              <1> 	;mov	ax, [Dir_Count]
  2785                              <1> 	; 27/07/2022
  2786 00008AAC 0FB705[DC860100]    <1> 	movzx	eax, word [Dir_Count]
  2787 00008AB3 BF[C1380100]        <1> 	mov	edi, Decimal_Dir_Count
  2788                              <1> 	;cmp	ax, cx ; 10
  2789                              <1> 	; 27/07/2022
  2790 00008AB8 39C8                <1> 	cmp	eax, ecx
  2791 00008ABA 7216                <1> 	jb	short pass_ddc
  2792 00008ABC 47                  <1> 	inc	edi
  2793 00008ABD 6683F864            <1> 	cmp	ax, 100
  2794 00008AC1 720F                <1> 	jb	short pass_ddc
  2795 00008AC3 47                  <1> 	inc	edi
  2796 00008AC4 663DE803            <1> 	cmp	ax, 1000
  2797 00008AC8 7208                <1> 	jb	short pass_ddc
  2798 00008ACA 47                  <1> 	inc	edi
  2799 00008ACB 663D1027            <1> 	cmp	ax, 10000
  2800 00008ACF 7201                <1> 	jb	short pass_ddc
  2801 00008AD1 47                  <1> 	inc	edi
  2802                              <1> pass_ddc:
  2803 00008AD2 886F01              <1> 	mov     [edi+1], ch ; 0
  2804                              <1> loc_ddc_rediv:
  2805 00008AD5 31D2                <1> 	xor     edx, edx
  2806                              <1> 	;div	cx  ; 10
  2807                              <1> 	; 27/07/2022
  2808 00008AD7 F7F1                <1> 	div	ecx
  2809 00008AD9 80C230              <1> 	add     dl, '0'
  2810 00008ADC 8817                <1> 	mov     [edi], dl
  2811 00008ADE 4F                  <1> 	dec     edi
  2812                              <1> 	;or	ax, ax
  2813                              <1> 	; 27/07/2022
  2814 00008ADF 09C0                <1> 	or	eax, eax
  2815 00008AE1 75F2                <1> 	jnz	short loc_ddc_rediv
  2816                              <1> 
  2817 00008AE3 66A1[DA860100]      <1> 	mov     ax, [File_Count]
  2818 00008AE9 BF[B0380100]        <1> 	mov     edi, Decimal_File_Count
  2819                              <1> 	;cmp	ax, cx ; 10
  2820                              <1> 	; 27/07/2022
  2821 00008AEE 39C8                <1> 	cmp	eax, ecx ; 10
  2822 00008AF0 7216                <1> 	jb      short pass_dfc
  2823 00008AF2 47                  <1> 	inc     edi
  2824 00008AF3 6683F864            <1> 	cmp     ax, 100
  2825 00008AF7 720F                <1> 	jb      short pass_dfc
  2826 00008AF9 47                  <1> 	inc     edi
  2827 00008AFA 663DE803            <1> 	cmp     ax, 1000
  2828 00008AFE 7208                <1> 	jb      short pass_dfc
  2829 00008B00 47                  <1> 	inc     edi
  2830 00008B01 663D1027            <1> 	cmp     ax, 10000
  2831 00008B05 7201                <1> 	jb      short pass_dfc
  2832 00008B07 47                  <1> 	inc     edi
  2833                              <1> pass_dfc:
  2834                              <1> 	;mov    cx, 10
  2835 00008B08 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 00008B0B 31D2                <1> 	xor	edx, edx
  2842 00008B0D F7F1                <1> 	div	ecx
  2843 00008B0F 80C230              <1> 	add	dl, '0'
  2844 00008B12 8817                <1> 	mov	[edi], dl
  2845 00008B14 4F                  <1> 	dec	edi
  2846                              <1> 	;or	ax, ax
  2847                              <1> 	; 27/07/2022
  2848 00008B15 09C0                <1> 	or	eax, eax
  2849 00008B17 75F2                <1> 	jnz	short loc_dfc_rediv
  2850                              <1> 
  2851 00008B19 BF[F0860100]        <1> 	mov     edi, TFS_Dec_End
  2852                              <1>         ;mov    byte [edi], 0
  2853 00008B1E A1[DE860100]        <1> 	mov     eax, [Total_FSize]
  2854                              <1> 	;mov    ecx, 10
  2855                              <1> rediv_tfs_hex:
  2856 00008B23 29D2                <1> 	sub	edx, edx ; 27/07/2022
  2857                              <1> 	;sub	dl, dl
  2858 00008B25 F7F1                <1> 	div	ecx
  2859 00008B27 80C230              <1> 	add	dl, '0'
  2860 00008B2A 4F                  <1> 	dec     edi
  2861 00008B2B 8817                <1> 	mov     [edi], dl
  2862 00008B2D 21C0                <1> 	and	eax, eax
  2863 00008B2F 75F2                <1> 	jnz	short rediv_tfs_hex
  2864                              <1> 
  2865 00008B31 893D[E2860100]      <1> 	mov	[TFS_Dec_Begin], edi
  2866 00008B37 BE[AE380100]        <1> 	mov	esi, Decimal_File_Count_Header
  2867 00008B3C E829E2FFFF          <1> 	call	print_msg
  2868 00008B41 BE[B6380100]        <1> 	mov	esi, str_files
  2869 00008B46 E81FE2FFFF          <1> 	call	print_msg
  2870 00008B4B BE[C7380100]        <1> 	mov	esi, str_dirs
  2871 00008B50 E815E2FFFF          <1> 	call	print_msg
  2872 00008B55 8B35[E2860100]      <1> 	mov	esi, [TFS_Dec_Begin]
  2873 00008B5B E80AE2FFFF          <1> 	call	print_msg
  2874 00008B60 BE[D8380100]        <1> 	mov	esi, str_bytes
  2875                              <1> 	;call	print_msg
  2876                              <1> 	;retn
  2877                              <1> 	; 27/07/2022
  2878 00008B65 E900E2FFFF          <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 00008B6A 66A3[A2860100]      <1> 	mov	[FindFile_AttributesMask], ax
  2914 00008B70 BF[A4860100]        <1> 	mov	edi, FindFile_DirEntry ; TR-DOS Fullfilename formatted buffer
  2915 00008B75 31C0                <1> 	xor	eax, eax
  2916                              <1> 	;mov	ecx, 11
  2917                              <1> 	; 28/07/2022
  2918 00008B77 31C9                <1> 	xor	ecx, ecx
  2919 00008B79 B10B                <1> 	mov	cl, 11
  2920 00008B7B F3AB                <1> 	rep	stosd	; 44 bytes
  2921                              <1> 	;stosw		; +2 bytes
  2922                              <1> 
  2923 00008B7D BF[94860100]        <1> 	mov	edi, FindFile_Name ; FFF structure, offset 66
  2924 00008B82 39FE                <1> 	cmp	esi, edi
  2925 00008B84 7408                <1> 	je	short loc_fff_mfn_ok
  2926 00008B86 89FA                <1> 	mov	edx, edi
  2927                              <1> 	; move 13 bytes
  2928 00008B88 A5                  <1> 	movsd
  2929 00008B89 A5                  <1> 	movsd
  2930 00008B8A A5                  <1> 	movsd
  2931 00008B8B AA                  <1> 	stosb
  2932 00008B8C 89D6                <1> 	mov	esi, edx
  2933                              <1> loc_fff_mfn_ok:
  2934 00008B8E BF[43860100]        <1> 	mov	edi, Dir_Entry_Name ; Dir Entry Format File Name
  2935 00008B93 E803200000          <1> 	call	convert_file_name
  2936 00008B98 89FE                <1> 	mov	esi, edi ; offset Dir_Entry_Name
  2937                              <1> 
  2938 00008B9A 66A1[A2860100]      <1> 	mov	ax, [FindFile_AttributesMask]
  2939                              <1> 	;xor	ecx, ecx
  2940 00008BA0 30C9                <1> 	xor	cl, cl
  2941 00008BA2 E8271D0000          <1> 	call	locate_current_dir_file
  2942 00008BA7 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 00008BA9 30ED                <1> 	xor	ch, ch
  2948 00008BAB 80F60F              <1> 	xor	dh, 0Fh
  2949 00008BAE 7408                <1> 	jz	short loc_fff_longname_yes
  2950 00008BB0 882D[A1860100]      <1> 	mov	[FindFile_LongNameYes], ch ; 0
  2951 00008BB6 EB0C                <1> 	jmp	short loc_fff_longname_no
  2952                              <1> 
  2953                              <1> loc_fff_longname_yes:
  2954                              <1> 	;inc	byte [FindFile_LongNameYes]
  2955 00008BB8 8A0D[AE850100]      <1> 	mov	cl, [LFN_EntryLength]
  2956 00008BBE 880D[A1860100]      <1> 	mov	[FindFile_LongNameEntryLength], cl ; FindFile_LongNameYes
  2957                              <1> 
  2958                              <1> loc_fff_longname_no:
  2959                              <1> 	;mov	bx, [DirBuff_CurrentEntry]
  2960 00008BC4 66891D[CC860100]    <1> 	mov	[FindFile_DirEntryNumber], bx
  2961                              <1> 	;mov	dx, ax ; Ambiguous Filename chars used sign > 0
  2962                              <1> 	; 28/07/2022
  2963 00008BCB 89C2                <1> 	mov	edx, eax
  2964                              <1> 
  2965 00008BCD A0[B27D0100]        <1> 	mov	al, [Current_Drv]
  2966 00008BD2 A2[52860100]        <1> 	mov	[FindFile_Drv], al
  2967                              <1> 
  2968 00008BD7 A1[AC7D0100]        <1> 	mov	eax, [Current_Dir_FCluster]
  2969 00008BDC A3[C4860100]        <1> 	mov	[FindFile_DirFirstCluster], eax
  2970                              <1> 
  2971 00008BE1 A1[DE840100]        <1> 	mov	eax, [DirBuff_Cluster]
  2972 00008BE6 A3[C8860100]        <1> 	mov	[FindFile_DirCluster], eax
  2973                              <1> 
  2974 00008BEB 66FF05[CE860100]    <1> 	inc	word [FindFile_MatchCounter]
  2975                              <1> 
  2976 00008BF2 89FB                <1> 	mov	ebx, edi
  2977 00008BF4 89FE                <1> 	mov	esi, edi
  2978 00008BF6 BF[A4860100]        <1> 	mov	edi, FindFile_DirEntry
  2979 00008BFB 89F8                <1> 	mov	eax, edi
  2980 00008BFD B108                <1> 	mov	cl, 8
  2981 00008BFF F3A5                <1> 	rep	movsd
  2982 00008C01 89C6                <1> 	mov	esi, eax
  2983 00008C03 89DF                <1> 	mov	edi, ebx
  2984                              <1> 
  2985 00008C05 A1[C0860100]        <1> 	mov	eax, [FindFile_DirEntry+28] ; File Size
  2986                              <1> 
  2987 00008C0A 8A1D[AF860100]      <1> 	mov	bl, [FindFile_DirEntry+11] ; File Attributes
  2988 00008C10 8A3D[A1860100]      <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 00008C16 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 00008C17 66833D[CE860100]00  <1> 	cmp	word [FindFile_MatchCounter], 0
  3021 00008C1F 7707                <1> 	ja	short loc_start_search_next_file
  3022                              <1> 
  3023                              <1> loc_fnf_stc_retn:
  3024 00008C21 F9                  <1> 	stc
  3025                              <1> loc_fnf_ax12h_retn:
  3026 00008C22 B80C000000          <1> 	mov	eax, 12 ; No More files
  3027                              <1> ;loc_fnf_retn:
  3028 00008C27 C3                  <1> 	retn
  3029                              <1> 
  3030                              <1> loc_start_search_next_file:
  3031 00008C28 668B1D[CC860100]    <1> 	mov	bx, [FindFile_DirEntryNumber]
  3032                              <1> 	;inc	bx
  3033                              <1> 	; 28/07/2022
  3034 00008C2F 43                  <1> 	inc	ebx
  3035 00008C30 663B1D[DC840100]    <1> 	cmp	bx, [DirBuff_LastEntry]
  3036 00008C37 7719                <1> 	ja	short loc_cont_search_next_file
  3037                              <1> 
  3038                              <1> loc_fnf_search:
  3039 00008C39 BE[43860100]        <1> 	mov	esi, Dir_Entry_Name
  3040 00008C3E 66A1[A2860100]      <1> 	mov	ax, [FindFile_AttributesMask]
  3041                              <1> 	;xor	cx, cx
  3042                              <1> 	; 28/07/2022
  3043 00008C44 31C9                <1> 	xor	ecx, ecx
  3044 00008C46 E87F1D0000          <1> 	call	find_directory_entry
  3045                              <1> 	;jnc	loc_fff_fnf_ln_check
  3046                              <1> 	; 28/07/2022
  3047 00008C4B 7205                <1> 	jc	short loc_cont_search_next_file
  3048 00008C4D E957FFFFFF          <1> 	jmp	loc_fff_fnf_ln_check
  3049                              <1> 
  3050                              <1> loc_cont_search_next_file:
  3051 00008C52 31DB                <1> 	xor	ebx, ebx
  3052 00008C54 8A3D[B27D0100]      <1> 	mov	bh, [Current_Drv]
  3053 00008C5A BE00010900          <1> 	mov	esi, Logical_DOSDisks
  3054 00008C5F 01DE                <1> 	add	esi, ebx
  3055                              <1> 
  3056 00008C61 803D[B07D0100]00    <1> 	cmp	byte [Current_Dir_Level], 0
  3057 00008C68 7608                <1> 	jna	short loc_fnf_check_FAT_type
  3058 00008C6A 807E0301            <1> 	cmp	byte [esi+LD_FATType], 1
  3059 00008C6E 72B2                <1> 	jb	short loc_fnf_ax12h_retn
  3060 00008C70 EB06                <1> 	jmp	short loc_fnf_check_next_cluster
  3061                              <1> 
  3062                              <1> loc_fnf_check_FAT_type:
  3063 00008C72 807E0303            <1> 	cmp	byte [esi+LD_FATType], 3
  3064 00008C76 72AA                <1> 	jb	short loc_fnf_ax12h_retn
  3065                              <1> 
  3066                              <1> loc_fnf_check_next_cluster:
  3067 00008C78 A1[DE840100]        <1> 	mov	eax, [DirBuff_Cluster]
  3068 00008C7D E8EA360000          <1> 	call	get_next_cluster
  3069 00008C82 7306                <1> 	jnc	short loc_fnf_load_next_dir_cluster
  3070 00008C84 09C0                <1> 	or	eax, eax
  3071 00008C86 7499                <1> 	jz	short loc_fnf_stc_retn
  3072                              <1> 	;mov	eax, 17 ;Drive not ready or read error
  3073 00008C88 F5                  <1>  	cmc	;stc
  3074                              <1> loc_fnf_retn:
  3075 00008C89 C3                  <1> 	retn
  3076                              <1> 
  3077                              <1> loc_fnf_load_next_dir_cluster:
  3078 00008C8A E899380000          <1> 	call	load_FAT_sub_directory
  3079 00008C8F 72F8                <1> 	jc	short loc_fnf_retn
  3080                              <1> 	;xor	bx, bx
  3081                              <1> 	; 28/07/2022
  3082 00008C91 31DB                <1> 	xor	ebx, ebx
  3083 00008C93 66891D[CC860100]    <1> 	mov	[FindFile_DirEntryNumber], bx
  3084 00008C9A 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 00008C9C 803E20              <1> 	cmp	byte [esi], 20h
  3094 00008C9F 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 00008CA1 C3                  <1> 	retn
  3100                              <1> loc_find_longname:
  3101 00008CA2 E85C200000          <1> 	call	find_longname
  3102 00008CA7 731D                <1> 	jnc	short loc_print_longname
  3103                              <1> 
  3104 00008CA9 08C0                <1> 	or	al, al
  3105 00008CAB 7412                <1> 	jz	short loc_longname_not_found
  3106                              <1> 
  3107                              <1> 	; 16/10/2016 (15h -> 15, 17)
  3108 00008CAD 3C0F                <1> 	cmp	al, 15
  3109                              <1> 	;je	cd_drive_not_ready ; drive not ready
  3110                              <1> 	; 28/07/2022
  3111 00008CAF 7505                <1> 	jne	short loc_fln_err2
  3112                              <1> loc_fln_err1:
  3113 00008CB1 E924F8FFFF          <1> 	jmp	cd_drive_not_ready
  3114                              <1> loc_fln_err2:
  3115                              <1> 				   ; or
  3116 00008CB6 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 00008CB8 BE[03380100]        <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 00008CBD EB2B                <1> 	jmp	short loc_lfn_err3
  3128                              <1> 
  3129                              <1> loc_longname_not_found:
  3130 00008CBF BE[22380100]        <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 00008CC4 EB24                <1> 	jmp	short loc_lfn_err3
  3136                              <1> 
  3137                              <1> loc_print_longname:
  3138                              <1> 	;mov	esi, LongFileName
  3139 00008CC6 BF[B27E0100]        <1> 	mov	edi, TextBuffer
  3140 00008CCB 57                  <1> 	push	edi 
  3141 00008CCC 3C00                <1> 	cmp	al, 0
  3142 00008CCE 7708                <1> 	ja	short loc_print_longname_1
  3143                              <1> loc_print_FS_longname: ; Singlix FS (64 byte ASCIIZ file name)
  3144 00008CD0 AC                  <1> 	lodsb
  3145 00008CD1 AA                  <1> 	stosb
  3146 00008CD2 08C0                <1> 	or	al, al
  3147 00008CD4 75FA                <1> 	jnz	short loc_print_FS_longname
  3148 00008CD6 EB07                <1> 	jmp	short loc_print_longname_2
  3149                              <1> 	;
  3150                              <1> loc_print_longname_1: ; MS Windows long name (UNICODE chars)
  3151 00008CD8 66AD                <1> 	lodsw
  3152 00008CDA AA                  <1> 	stosb
  3153 00008CDB 08C0                <1> 	or	al, al
  3154 00008CDD 75F9                <1> 	jnz	short loc_print_longname_1
  3155                              <1> 	;
  3156                              <1> loc_print_longname_2:
  3157 00008CDF 5E                  <1> 	pop	esi
  3158 00008CE0 E885E0FFFF          <1> 	call	print_msg
  3159 00008CE5 BE[5B3F0100]        <1>   	mov	esi, nextline
  3160                              <1> loc_lfn_err3:
  3161                              <1> 	;call	print_msg
  3162                              <1> 	;retn
  3163 00008CEA E97BE0FFFF          <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 00008CEF BF[52860100]        <1> 	mov	edi, FindFile_Drv
  3176 00008CF4 E86C1F0000          <1> 	call	parse_path_name
  3177                              <1> 	;jc	loc_cmd_failed
  3178                              <1> 	; 28/07/2022
  3179 00008CF9 7305                <1> 	jnc	short loc_show_check_filename_exists
  3180                              <1> show_file_err1:
  3181 00008CFB E944F9FFFF          <1> 	jmp	loc_cmd_failed
  3182                              <1> 
  3183                              <1> loc_show_check_filename_exists:
  3184 00008D00 BE[94860100]        <1> 	mov	esi, FindFile_Name
  3185 00008D05 803E20              <1> 	cmp	byte [esi], 20h
  3186                              <1> 	;jna	loc_cmd_failed
  3187                              <1> 	; 28/07/2022
  3188 00008D08 76F1                <1> 	jna	short show_file_err1
  3189                              <1> 
  3190                              <1> 	; 15/02/2016 (invalid file name check)
  3191 00008D0A E800020000          <1> 	call	check_filename
  3192 00008D0F 730A                <1> 	jnc	short loc_show_change_drv
  3193                              <1> 
  3194 00008D11 BE[EE380100]        <1> 	mov	esi, Msg_invalid_name_chars
  3195 00008D16 E94FE0FFFF          <1> 	jmp	print_msg
  3196                              <1> 
  3197                              <1> loc_show_change_drv:
  3198 00008D1B 8A35[B27D0100]      <1> 	mov	dh, [Current_Drv]
  3199 00008D21 8835[0F850100]      <1> 	mov	[RUN_CDRV], dh
  3200 00008D27 8A15[52860100]      <1> 	mov	dl, [FindFile_Drv]
  3201 00008D2D 38F2                <1> 	cmp	dl, dh
  3202 00008D2F 740C                <1> 	je	short loc_show_change_directory
  3203 00008D31 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 00008D36 7305                <1> 	jnc	short loc_show_change_directory
  3208                              <1> show_file_err2:
  3209 00008D38 E932F9FFFF          <1> 	jmp	loc_run_cmd_failed
  3210                              <1> 
  3211                              <1> loc_show_change_directory:
  3212 00008D3D 803D[53860100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  3213 00008D44 7614                <1> 	jna	short loc_findload_showfile
  3214                              <1> 
  3215 00008D46 FE05[CF340100]      <1> 	inc	byte [Restore_CDIR]
  3216 00008D4C BE[53860100]        <1> 	mov	esi, FindFile_Directory
  3217 00008D51 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0
  3218 00008D53 E823190000          <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 00008D58 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 00008D5A BE[94860100]        <1> 	mov	esi, FindFile_Name
  3230 00008D5F BF[43860100]        <1> 	mov	edi, Dir_Entry_Name ; Dir Entry Format File Name
  3231 00008D64 E8321E0000          <1> 	call	convert_file_name
  3232 00008D69 89FE                <1> 	mov	esi, edi ; offset Dir_Entry_Name
  3233                              <1> 
  3234 00008D6B 28C0                <1> 	sub	al, al	; Attrib AND mask = 0
  3235                              <1> 	; Directory attribute : 10h
  3236                              <1> 	; Volume name attribute: 8h
  3237 00008D6D B418                <1> 	mov	ah, 00011000b ; 18h (Attrib NAND, AND --> zero mask)
  3238                              <1> 	;
  3239                              <1> 	;xor	cx, cx
  3240                              <1> 	; 28/07/2022
  3241 00008D6F 31C9                <1> 	xor	ecx, ecx
  3242 00008D71 E8581B0000          <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 00008D76 72C0                <1> 	jc	short show_file_err2
  3247                              <1> 
  3248                              <1> loc_show_load_file:
  3249                              <1> 	; EDI = Directory Entry
  3250 00008D78 668B4714            <1> 	mov	ax, [edi+DirEntry_FstClusHI] ; First Cluster High Word
  3251 00008D7C C1E010              <1> 	shl	eax, 16
  3252 00008D7F 668B471A            <1> 	mov	ax, [edi+DirEntry_FstClusLO] ; First Cluster Low Word
  3253 00008D83 A3[FC860100]        <1> 	mov	[Show_Cluster], eax
  3254 00008D88 8B471C              <1> 	mov	eax, [edi+DirEntry_FileSize] ; File Size
  3255 00008D8B 21C0                <1> 	and	eax, eax ; Empty file !
  3256                              <1> 	;jz	end_of_show_file
  3257                              <1> 	; 28/07/2022
  3258 00008D8D 7505                <1> 	jnz	short loc_show_load_file_set_size
  3259 00008D8F E904010000          <1> 	jmp	end_of_show_file 
  3260                              <1> 
  3261                              <1> loc_show_load_file_set_size: ; 28/07/2022
  3262 00008D94 A3[00870100]        <1> 	mov	[Show_FileSize], eax
  3263 00008D99 31C0                <1> 	xor	eax, eax
  3264 00008D9B A3[04870100]        <1> 	mov	[Show_FilePointer], eax ; 0
  3265 00008DA0 66A3[08870100]      <1> 	mov	[Show_ClusterPointer], ax ; 0
  3266 00008DA6 29DB                <1> 	sub	ebx, ebx
  3267 00008DA8 8A3D[B27D0100]      <1> 	mov	bh, [Current_Drv]
  3268 00008DAE BE00010900          <1> 	mov	esi, Logical_DOSDisks
  3269 00008DB3 01DE                <1> 	add	esi, ebx
  3270 00008DB5 8935[F8860100]      <1> 	mov	[Show_LDDDT], esi ; Logical DOS Drv Description Table addr
  3271                              <1> 
  3272 00008DBB 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  3273 00008DBF 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 00008DC1 8B15[FC860100]      <1> 	mov	edx, [Show_Cluster] ; Compatibility dir. buffer value (FDT)
  3277 00008DC7 8915[F4860100]      <1> 	mov	[Show_FDT], edx
  3278 00008DCD 31C0                <1> 	xor	eax, eax
  3279 00008DCF A3[FC860100]        <1> 	mov	[Show_Cluster], eax ; Sector index  = 0
  3280                              <1> 				    ; (next time it will be 1)
  3281                              <1> loc_show_calculate_cluster_size:
  3282 00008DD4 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 00008DD8 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 00008DDB 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 00008DDD 66A3[0A870100]      <1> 	mov	[Show_ClusterSize], ax
  3291                              <1> 
  3292                              <1> loc_start_show_file:
  3293 00008DE3 BE[5B3F0100]        <1> 	mov	esi, nextline
  3294 00008DE8 E87DDFFFFF          <1> 	call	print_msg
  3295                              <1> 
  3296 00008DED A1[FC860100]        <1> 	mov	eax, [Show_Cluster]
  3297 00008DF2 C605[0C870100]17    <1> 	mov	byte [Show_RowCount], 23
  3298                              <1> 
  3299                              <1> 	; 17/02/2016
  3300 00008DF9 8B35[F8860100]      <1> 	mov	esi, [Show_LDDDT]
  3301                              <1> 
  3302                              <1> 	; 07/08/2022
  3303                              <1> loc_show_next_cluster:
  3304                              <1> 	; 15/02/2016
  3305 00008DFF BB00000700          <1> 	mov	ebx, Cluster_Buffer ; 70000h (for current TRDOS 386 version)
  3306                              <1> 	; ESI = Logical DOS drv description table address
  3307 00008E04 E85A370000          <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 00008E09 7305                <1> 	jnc	short loc_show_nc_rc_ok
  3312 00008E0B E95FF8FFFF          <1> 	jmp	loc_run_cmd_failed
  3313                              <1> loc_show_nc_rc_ok:
  3314 00008E10 31DB                <1> 	xor 	ebx, ebx
  3315                              <1> loc_show_next_byte:
  3316 00008E12 803D[0C870100]00    <1> 	cmp	byte [Show_RowCount], 0
  3317 00008E19 7512                <1> 	jne	short pass_show_wait_for_key
  3318 00008E1B 30E4                <1> 	xor	ah, ah
  3319 00008E1D E8FA80FFFF          <1> 	call	int16h
  3320 00008E22 3C1B                <1> 	cmp	al, 1Bh
  3321                              <1> 	;jne	short pass_exit_show
  3322                              <1> 	; 28/07/2022
  3323 00008E24 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 00008E26 C605[0C870100]14    <1> 	mov	byte [Show_RowCount], 20
  3333                              <1> pass_show_wait_for_key:
  3334 00008E2D 81C300000700        <1> 	add	ebx, Cluster_Buffer
  3335 00008E33 8A03                <1> 	mov	al, [ebx]
  3336 00008E35 3C0D                <1> 	cmp	al, 0Dh
  3337                              <1>  	;jne	loc_show_check_tab_space
  3338                              <1> 	; 28/07/2022
  3339 00008E37 740B                <1> 	je	short loc_show_dec_row_count
  3340 00008E39 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 00008E3E 21DB                <1> 	and	ebx, ebx
  3347 00008E40 75D0                <1> 	jnz	short loc_show_next_byte
  3348 00008E42 EBBB                <1> 	jmp     short loc_show_next_cluster
  3349                              <1> 
  3350                              <1> loc_show_dec_row_count:	; 28/07/2022
  3351 00008E44 FE0D[0C870100]      <1> 	dec	byte [Show_RowCount]
  3352                              <1> pass_show_dec_rowcount:
  3353 00008E4A B307                <1> 	mov	bl, 7 ; (light gray character color, black background)
  3354 00008E4C 8A3D[1E7D0100]      <1> 	mov	bh, [ACTIVE_PAGE] ; [ptty]
  3355 00008E52 E83E94FFFF          <1> 	call	_write_tty
  3356                              <1> loc_show_check_eof:
  3357 00008E57 FF05[04870100]      <1> 	inc	dword [Show_FilePointer]
  3358 00008E5D A1[04870100]        <1> 	mov	eax, [Show_FilePointer]
  3359 00008E62 3B05[00870100]      <1> 	cmp	eax, [Show_FileSize]
  3360 00008E68 732E                <1> 	jnb	short end_of_show_file
  3361 00008E6A 66FF05[08870100]    <1> 	inc	word [Show_ClusterPointer]
  3362 00008E71 0FB71D[08870100]    <1> 	movzx	ebx, word [Show_ClusterPointer]
  3363                              <1> 
  3364                              <1> 	; 17/02/2016
  3365                              <1> 	; (sector boundary -9 bits- check, 512 = 0)
  3366 00008E78 66F7C3FF01          <1>         test    bx, 1FFh ; 1 to 511
  3367 00008E7D 7593                <1> 	jnz	short loc_show_next_byte
  3368                              <1> 
  3369                              <1> 	; 16/02/2016
  3370 00008E7F 8B35[F8860100]      <1> 	mov	esi, [Show_LDDDT]
  3371                              <1> 	;
  3372 00008E85 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  3373 00008E89 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 00008E8B A1[FC860100]        <1> 	mov	eax, [Show_Cluster]
  3378 00008E90 40                  <1> 	inc	eax
  3379 00008E91 A3[FC860100]        <1> 	mov	[Show_Cluster], eax
  3380                              <1> 
  3381                              <1> 	; 07/08/2022
  3382 00008E96 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 00008E98 BE[5B3F0100]        <1> 	mov	esi, nextline
  3388 00008E9D E8C8DEFFFF          <1> 	call	print_msg
  3389 00008EA2 E9D7000000          <1> 	jmp	loc_file_rw_restore_retn
  3390                              <1> 
  3391                              <1> loc_show_check_fat_cluster_size:
  3392                              <1> 	; 17/02/2016
  3393 00008EA7 663B1D[0A870100]    <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 00008EAE 7305                <1> 	jnb	short loc_show_file_cluster_ok
  3397 00008EB0 E95DFFFFFF          <1> 	jmp	loc_show_next_byte
  3398                              <1> 
  3399                              <1> loc_show_file_cluster_ok:
  3400 00008EB5 66C705[08870100]00- <1> 	mov	word [Show_ClusterPointer], 0
  3400 00008EBD 00                  <1>
  3401                              <1> 
  3402 00008EBE A1[FC860100]        <1> 	mov	eax, [Show_Cluster]
  3403                              <1> 	;mov	esi, [Show_LDDDT]
  3404                              <1> loc_show_get_next_cluster:
  3405 00008EC3 E8A4340000          <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 00008EC8 733B                <1> 	jnc	short loc_show_update_ccluster
  3410 00008ECA E9A0F7FFFF          <1> 	jmp	loc_run_cmd_failed
  3411                              <1> 
  3412                              <1> loc_show_check_tab_space:
  3413 00008ECF 3C09                <1> 	cmp	al, 09h
  3414                              <1> 	;jne	short pass_show_dec_rowcount ; 28/07/2022
  3415                              <1> 	; 07/08/2022
  3416 00008ED1 7405                <1> 	je	short loc_show_put_tab_space
  3417 00008ED3 E972FFFFFF          <1> 	jmp	pass_show_dec_rowcount
  3418                              <1> loc_show_put_tab_space:
  3419 00008ED8 8A3D[1E7D0100]      <1> 	mov	bh, [ACTIVE_PAGE] ; [ptty]
  3420 00008EDE E85090FFFF          <1> 	call	get_cpos
  3421                              <1> 	; dl = cursor column
  3422 00008EE3 80E207              <1> 	and	dl, 7 ; 18/02/2016
  3423                              <1> 	;shr	bh, 1 ; [ACTIVE_PAGE]
  3424 00008EE6 8A3D[1E7D0100]      <1> 	mov	bh, [ACTIVE_PAGE]
  3425 00008EEC B307                <1> 	mov	bl, 7 ; color attribute
  3426                              <1> loc_show_put_space_chars:
  3427 00008EEE 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 00008EF0 52                  <1> 	push	edx ; 29/12/2017
  3432 00008EF1 E89F93FFFF          <1> 	call	_write_tty
  3433 00008EF6 5A                  <1> 	pop	edx ; 29/12/2017
  3434                              <1> 	;pop	dx
  3435                              <1> 	; 18/02/2016
  3436 00008EF7 80FA07              <1> 	cmp	dl, 7
  3437                              <1> 	;jnb	short loc_show_check_eof ; 28/07/2022
  3438                              <1> 	; 07/08/2022
  3439 00008EFA 7205                <1> 	jb	short loc_show_next_tab_space
  3440 00008EFC E956FFFFFF          <1> 	jmp	loc_show_check_eof
  3441                              <1> loc_show_next_tab_space:
  3442 00008F01 FEC2                <1> 	inc	dl
  3443 00008F03 EBE9                <1> 	jmp	short loc_show_put_space_chars
  3444                              <1> 
  3445                              <1> loc_show_update_ccluster:
  3446 00008F05 A3[FC860100]        <1> 	mov	[Show_Cluster], eax
  3447 00008F0A 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 00008F0F 56                  <1> 	push	esi
  3485                              <1> 
  3486 00008F10 BF[D7350100]        <1>         mov     edi, invalid_fname_chars
  3487 00008F15 AC                  <1> 	lodsb
  3488                              <1> check_filename_next_char:
  3489 00008F16 B914000000          <1> 	mov	ecx, sizeInvFnChars
  3490 00008F1B BF[D7350100]        <1> 	mov	edi, invalid_fname_chars
  3491                              <1> loc_scan_invalid_filename_char:
  3492 00008F20 AE                  <1> 	scasb
  3493 00008F21 741E                <1> 	je	short loc_invalid_filename_stc
  3494 00008F23 E2FB                <1> 	loop	loc_scan_invalid_filename_char
  3495 00008F25 AC                  <1> 	lodsb
  3496 00008F26 3C1F                <1> 	cmp	al, 1Fh  ; 20h and above
  3497 00008F28 77EC                <1> 	ja	short check_filename_next_char
  3498                              <1> 
  3499                              <1> check_filename_dot:
  3500 00008F2A 8B3424              <1> 	mov	esi, [esp]
  3501                              <1> 
  3502 00008F2D B421                <1> 	mov	ah, 21h
  3503                              <1> 	;mov	ecx, 8
  3504                              <1> 	; 28/07/2022
  3505 00008F2F 29C9                <1> 	sub	ecx, ecx
  3506 00008F31 B108                <1> 	mov	cl, 8
  3507                              <1> loc_check_filename_next_char:
  3508 00008F33 AC                  <1> 	lodsb
  3509 00008F34 3C2E                <1> 	cmp	al, 2Eh
  3510 00008F36 7511                <1> 	jne	short pass_check_fn_dot_check
  3511                              <1> loc_check_filename_ext_0:
  3512 00008F38 AC                  <1> 	lodsb
  3513 00008F39 38E0                <1> 	cmp	al, ah ; 21h
  3514 00008F3B 7205                <1> 	jb	short loc_invalid_filename
  3515 00008F3D 3C2E                <1> 	cmp	al, 2Eh
  3516 00008F3F 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 00008F41 F9                  <1> 	stc
  3521                              <1> loc_invalid_filename:
  3522                              <1> 	; 10/10/2016 (0Bh -> 26)
  3523 00008F42 B81A000000          <1> 	mov	eax, ERR_INV_FILE_NAME ; (=26)
  3524                              <1> 	; Invalid file name chars
  3525                              <1> loc_check_fn_rtn:
  3526 00008F47 5E                  <1> 	pop	esi
  3527 00008F48 C3                  <1> 	retn
  3528                              <1> 
  3529                              <1> pass_check_fn_dot_check:
  3530 00008F49 38E0                <1> 	cmp	al, ah ; 21h
  3531 00008F4B 7224                <1> 	jb	short loc_check_fn_clc_rtn
  3532 00008F4D E2E4                <1> 	loop	loc_check_filename_next_char
  3533 00008F4F AC                  <1> 	lodsb
  3534 00008F50 38E0                <1> 	cmp	al, ah ; 21h
  3535 00008F52 721D                <1> 	jb	short loc_check_fn_clc_rtn
  3536 00008F54 3C2E                <1> 	cmp	al, 2Eh
  3537 00008F56 75E9                <1> 	jne	short loc_check_fn_stc_rtn
  3538 00008F58 EBDE                <1> 	jmp	short loc_check_filename_ext_0
  3539                              <1> 
  3540                              <1> loc_check_filename_ext_1:
  3541 00008F5A AC                  <1> 	lodsb
  3542 00008F5B 38E0                <1> 	cmp	al, ah ; 21h
  3543 00008F5D 7212                <1> 	jb	short loc_check_fn_clc_rtn
  3544 00008F5F 3C2E                <1> 	cmp	al, 2Eh
  3545 00008F61 74DE                <1> 	je	short loc_check_fn_stc_rtn
  3546 00008F63 AC                  <1> 	lodsb
  3547 00008F64 38E0                <1> 	cmp	al, ah ; 21h
  3548 00008F66 7209                <1> 	jb	short loc_check_fn_clc_rtn
  3549 00008F68 3C2E                <1> 	cmp	al, 2Eh
  3550 00008F6A 74D5                <1> 	je	short loc_check_fn_stc_rtn
  3551 00008F6C AC                  <1> 	lodsb
  3552 00008F6D 38E0                <1> 	cmp	al, ah ; 21h
  3553 00008F6F 73D0                <1> 	jnb	short loc_check_fn_stc_rtn
  3554                              <1> 
  3555                              <1> loc_check_fn_clc_rtn:
  3556 00008F71 5E                  <1> 	pop	esi
  3557 00008F72 F8                  <1> 	clc
  3558 00008F73 C3                  <1> 	retn
  3559                              <1> 
  3560                              <1> loc_print_deleted_message:
  3561 00008F74 BE[C3390100]        <1> 	mov	esi, Msg_Deleted
  3562 00008F79 E8ECDDFFFF          <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 00008F7E 9C                  <1> 	pushf
  3571 00008F7F E853F7FFFF          <1> 	call	restore_cdir_after_cmd_fail
  3572 00008F84 9D                  <1> 	popf
  3573 00008F85 720D                <1> 	jc	short loc_file_rw_check_write_fault
  3574 00008F87 C3                  <1> 	retn
  3575                              <1> 
  3576                              <1> loc_permission_denied:
  3577                              <1> 	; 27/02/2016
  3578 00008F88 BE[D0390100]        <1> 	mov	esi, Msg_Permission_Denied
  3579 00008F8D E8D8DDFFFF          <1> 	call	print_msg
  3580 00008F92 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 00008F94 3C12                <1>         cmp	al, 18 ; 05/11/2016
  3585                              <1> 	;jne	loc_run_cmd_failed_cmp_al
  3586                              <1> 	; 28/07/2022
  3587 00008F96 7405                <1> 	je	short loc_file_rw_fault
  3588 00008F98 E9D7F6FFFF          <1> 	jmp	loc_run_cmd_failed_cmp_al
  3589                              <1> 
  3590                              <1> loc_file_rw_fault:
  3591 00008F9D BE[B8370100]        <1> 	mov	esi, Msg_Not_Ready_Write_Err
  3592                              <1> 	;call	print_msg
  3593                              <1> 	;retn
  3594 00008FA2 E9C3DDFFFF          <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 00008FA7 803E20              <1> 	cmp	byte [esi], 20h
  3607 00008FAA 7701                <1>         ja	short loc_mkdir_parse_path_name
  3608                              <1> 
  3609                              <1> loc_mkdir_nodirname_retn:
  3610 00008FAC C3                  <1> 	retn
  3611                              <1> 
  3612                              <1> loc_mkdir_parse_path_name:
  3613 00008FAD BF[52860100]        <1> 	mov	edi, FindFile_Drv
  3614 00008FB2 E8AE1C0000          <1>         call    parse_path_name
  3615                              <1> 	;jc	loc_cmd_failed
  3616                              <1> 	; 28/07/2022
  3617 00008FB7 7305                <1> 	jnc	short loc_mkdir_check_dirname_exists
  3618                              <1> loc_mkdir_cmd_failed:
  3619 00008FB9 E986F6FFFF          <1> 	jmp	loc_cmd_failed
  3620                              <1> 
  3621                              <1> loc_mkdir_check_dirname_exists:
  3622 00008FBE BE[94860100]        <1> 	mov	esi, FindFile_Name
  3623 00008FC3 803E20              <1> 	cmp	byte [esi], 20h
  3624                              <1> 	;jna	loc_cmd_failed
  3625                              <1> 	; 28/07/2022
  3626 00008FC6 76F1                <1> 	jna	short loc_mkdir_cmd_failed
  3627 00008FC8 8935[10870100]      <1> 	mov	[DelFile_FNPointer], esi
  3628 00008FCE E83CFFFFFF          <1> 	call	check_filename
  3629 00008FD3 725B                <1> 	jc	short loc_mkdir_invalid_dir_name_chars
  3630                              <1> 
  3631                              <1> loc_mkdir_drv:
  3632 00008FD5 8A35[B27D0100]      <1> 	mov	dh, [Current_Drv]
  3633 00008FDB 8835[0F850100]      <1> 	mov	[RUN_CDRV], dh
  3634                              <1> 
  3635 00008FE1 8A15[52860100]      <1> 	mov	dl, [FindFile_Drv]
  3636 00008FE7 38F2                <1> 	cmp	dl, dh
  3637 00008FE9 7409                <1> 	je	short loc_mkdir_change_directory
  3638                              <1> 
  3639 00008FEB E88DE8FFFF          <1> 	call	change_current_drive
  3640                              <1> 	;jc	loc_file_rw_cmd_failed
  3641                              <1> 	; 28/07/2022
  3642 00008FF0 7302                <1> 	jnc	short loc_mkdir_change_directory
  3643 00008FF2 EB8A                <1> 	jmp	loc_file_rw_cmd_failed
  3644                              <1> 
  3645                              <1> loc_mkdir_change_directory:
  3646 00008FF4 803D[53860100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  3647 00008FFB 7614                <1> 	jna	short loc_mkdir_find_directory
  3648                              <1> 
  3649 00008FFD FE05[CF340100]      <1> 	inc	byte [Restore_CDIR]
  3650 00009003 BE[53860100]        <1> 	mov	esi, FindFile_Directory
  3651 00009008 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0
  3652 0000900A E86C160000          <1> 	call	change_current_directory
  3653 0000900F 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 00009011 8B35[10870100]      <1> 	mov	esi, [DelFile_FNPointer]
  3661                              <1> 	;xor	eax, eax
  3662 00009017 6631C0              <1> 	xor	ax, ax ; any name (dir, file, volume)
  3663 0000901A E84BFBFFFF          <1> 	call	find_first_file
  3664 0000901F 7216                <1> 	jc	short loc_mkdir_check_error_code
  3665                              <1> 
  3666                              <1> loc_mkdir_directory_found:
  3667 00009021 BE[1B390100]        <1> 	mov	esi, Msg_Name_Exists
  3668                              <1> loc_mkdir_inv_dname_chrs_msg:
  3669 00009026 E83FDDFFFF          <1> 	call	print_msg
  3670 0000902B E94EFFFFFF          <1> 	jmp	loc_file_rw_restore_retn
  3671                              <1> 
  3672                              <1> loc_mkdir_invalid_dir_name_chars:
  3673 00009030 BE[EE380100]        <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 00009035 EBEF                <1> 	jmp	short loc_mkdir_inv_dname_chrs_msg
  3678                              <1> 
  3679                              <1> loc_mkdir_check_error_code:
  3680 00009037 3C02                <1> 	cmp	al, 2
  3681                              <1> 	;je	short loc_mkdir_directory_not_found
  3682 00009039 7406                <1> 	je	short loc_mkdir_ask_for_yes_no
  3683 0000903B F9                  <1> 	stc
  3684 0000903C 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 00009041 BE[3C390100]        <1> 	mov	esi, Msg_DoYouWantMkdir
  3689 00009046 E81FDDFFFF          <1> 	call	print_msg
  3690 0000904B 8B35[10870100]      <1> 	mov	esi, [DelFile_FNPointer]
  3691 00009051 E814DDFFFF          <1> 	call	print_msg
  3692 00009056 BE[5B390100]        <1> 	mov	esi, Msg_YesNo
  3693 0000905B E80ADDFFFF          <1> 	call	print_msg
  3694                              <1> 
  3695 00009060 C605[65390100]20    <1> 	mov	byte [Y_N_nextline], 20h
  3696                              <1> 
  3697                              <1> loc_mkdir_ask_again:
  3698 00009067 30E4                <1> 	xor	ah, ah
  3699 00009069 E8AE7EFFFF          <1> 	call	int16h
  3700 0000906E 3C1B                <1> 	cmp	al, 1Bh
  3701                              <1> 	;je	short loc_do_not_make_directory
  3702 00009070 743B                <1> 	je	short loc_mkdir_y_n_escape
  3703 00009072 24DF                <1> 	and	al, 0DFh ; y -> Y, n -> N
  3704 00009074 3C59                <1> 	cmp	al, 'Y' ; 'yes'
  3705 00009076 7404                <1> 	je	short loc_mkdir_yes_make_directory
  3706 00009078 3C4E                <1> 	cmp	al, 'N' ; 'no'
  3707 0000907A 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 0000907C 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 00009081 3C4E                <1> 	cmp	al, 'N' ; 'no'
  3716                              <1> 	;je	loc_file_rw_restore_retn
  3717                              <1> 	; 28/07/2022
  3718 00009083 7505                <1> 	jne	short loc_mkdir_call_make_sub_dir
  3719 00009085 E9F4FEFFFF          <1> 	jmp	loc_file_rw_restore_retn
  3720                              <1> 
  3721                              <1> loc_mkdir_call_make_sub_dir:
  3722 0000908A 8B35[10870100]      <1> 	mov	esi, [DelFile_FNPointer]
  3723 00009090 B110                <1> 	mov	cl, 10h ; Directory attributes 
  3724 00009092 E8BD1C0000          <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 00009097 7305                <1> 	jnc	short move_source_file_to_dest_OK
  3729 00009099 E9E0FEFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  3730                              <1> move_source_file_to_dest_OK:
  3731 0000909E BE[69390100]        <1> 	mov	esi, Msg_OK
  3732 000090A3 E8C2DCFFFF          <1> 	call	print_msg
  3733 000090A8 E9D1FEFFFF          <1> 	jmp	loc_file_rw_restore_retn
  3734                              <1> 
  3735                              <1> loc_mkdir_y_n_escape:
  3736 000090AD B04E                <1> 	mov	al, 'N' ; 'no'
  3737 000090AF EBCB                <1> 	jmp	short loc_do_not_make_directory
  3738                              <1> 
  3739                              <1> y_n_answer:
  3740                              <1> 	; 29/12/2017
  3741 000090B1 A2[65390100]        <1> 	mov	[Y_N_nextline], al
  3742                              <1> 	;push	ax
  3743 000090B6 50                  <1> 	push	eax
  3744 000090B7 BE[65390100]        <1> 	mov	esi, Y_N_nextline
  3745 000090BC E8A9DCFFFF          <1> 	call	print_msg
  3746 000090C1 58                  <1> 	pop	eax
  3747                              <1> 	;pop	ax
  3748 000090C2 C3                  <1> 	retn
  3749                              <1> 
  3750                              <1> delete_directory:
  3751                              <1> 	; 17/07/2025 (TRDOS 386 Kernel v2.0.10)
  3752                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  3753                              <1> 	; 29/12/2017
  3754                              <1> 	; 15/10/2016
  3755                              <1> 	; 01/03/2016, 06/03/2016
  3756                              <1> 	; 27/02/2016, 28/02/2016, 29/02/2016
  3757                              <1> 	; 26/02/2016 (TRDOS 386 = TRDOS v2.0)
  3758                              <1> 	; 16/10/2010 (CMD_INTR.ASM, 'cmp_cmd_rmdir')
  3759                              <1> 	; 05/06/2010
  3760                              <1> 	;
  3761                              <1> get_fchar:
  3762                              <1> 	; esi = directory name
  3763 000090C3 803E20              <1> 	cmp	byte [esi], 20h
  3764 000090C6 7701                <1>         ja	short loc_rmdir_parse_path_name
  3765                              <1> 
  3766                              <1> loc_rmdir_nodirname_retn:
  3767 000090C8 C3                  <1> 	retn
  3768                              <1> 
  3769                              <1> loc_rmdir_parse_path_name:
  3770 000090C9 BF[52860100]        <1> 	mov	edi, FindFile_Drv
  3771 000090CE E8921B0000          <1> 	call	parse_path_name
  3772                              <1> 	;jc	loc_cmd_failed
  3773                              <1> 	; 28/07/2022
  3774 000090D3 7305                <1> 	jnc	short loc_rmdir_check_dirname_exists
  3775                              <1> lc_del_dir_failed:
  3776 000090D5 E96AF5FFFF          <1> 	jmp	loc_cmd_failed
  3777                              <1> 
  3778                              <1> loc_rmdir_check_dirname_exists:
  3779 000090DA BE[94860100]        <1> 	mov	esi, FindFile_Name
  3780 000090DF 803E20              <1> 	cmp	byte [esi], 20h
  3781                              <1> 	;jna	loc_cmd_failed
  3782                              <1> 	; 28/07/2022
  3783 000090E2 76F1                <1> 	jna	short lc_del_dir_failed
  3784 000090E4 8935[10870100]      <1> 	mov	[DelFile_FNPointer], esi
  3785                              <1> 
  3786                              <1> loc_rmdir_drv:
  3787 000090EA 8A35[B27D0100]      <1> 	mov	dh, [Current_Drv]
  3788 000090F0 8835[0F850100]      <1> 	mov	[RUN_CDRV], dh
  3789                              <1> 
  3790                              <1> 	;;;;
  3791                              <1> 	; 17/07/2025 - TRDOS 386 v2.0.10
  3792 000090F6 8835[58870100]      <1> 	mov	[rmdir_drv], dh
  3793 000090FC 8B1D[AC7D0100]      <1> 	mov	ebx, [Current_Dir_FCluster]
  3794 00009102 891D[54870100]      <1> 	mov	[rmdir_dir_fcluster], ebx
  3795                              <1> 	;;;;
  3796                              <1> 
  3797 00009108 8A15[52860100]      <1> 	mov	dl, [FindFile_Drv]
  3798 0000910E 38F2                <1> 	cmp	dl, dh
  3799 00009110 7407                <1> 	je	short loc_rmdir_change_directory
  3800                              <1> 
  3801 00009112 E866E7FFFF          <1> 	call	change_current_drive
  3802                              <1> 	;jc	loc_file_rw_cmd_failed
  3803                              <1> 	; 28/07/2022
  3804                              <1> 	;jnc	short loc_rmdir_change_directory
  3805                              <1> 	;jmp	loc_file_rw_cmd_failed
  3806 00009117 7233                <1> 	jc	short loc_rmdir_chdrv_failed
  3807                              <1> 
  3808                              <1> loc_rmdir_change_directory:
  3809 00009119 803D[53860100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  3810 00009120 7614                <1> 	jna	short loc_rmdir_find_directory
  3811                              <1> 
  3812 00009122 FE05[CF340100]      <1> 	inc	byte [Restore_CDIR]
  3813 00009128 BE[53860100]        <1> 	mov	esi, FindFile_Directory
  3814 0000912D 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0
  3815 0000912F E847150000          <1> 	call	change_current_directory
  3816 00009134 7211                <1> 	jc	short loc_rmdir_check_error_code
  3817                              <1> 
  3818                              <1> ;loc_rmdir_change_prompt_dir_string:
  3819                              <1> 	;call	change_prompt_dir_string
  3820                              <1> 
  3821                              <1> loc_rmdir_find_directory:
  3822                              <1> 	;mov	esi, FindFile_Name
  3823 00009136 8B35[10870100]      <1> 	mov	esi, [DelFile_FNPointer]
  3824 0000913C 66B81008            <1> 	mov	ax, 0810h ; Only directories
  3825 00009140 E825FAFFFF          <1> 	call	find_first_file
  3826 00009145 730A                <1> 	jnc	short loc_rmdir_ambgfn_check
  3827                              <1> 
  3828                              <1> loc_rmdir_check_error_code:
  3829 00009147 3C02                <1> 	cmp	al, 2
  3830 00009149 740B                <1> 	je	short loc_rmdir_directory_not_found
  3831 0000914B F9                  <1> 	stc
  3832                              <1> loc_rmdir_chdrv_failed:
  3833 0000914C E92DFEFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  3834                              <1> 
  3835                              <1> loc_rmdir_ambgfn_check:
  3836 00009151 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
  3837 00009154 740F                <1> 	jz	short loc_rmdir_directory_found
  3838                              <1> 
  3839                              <1> loc_rmdir_directory_not_found:
  3840 00009156 BE[DA370100]        <1> 	mov	esi, Msg_Dir_Not_Found
  3841 0000915B E80ADCFFFF          <1> 	call	print_msg
  3842                              <1> 
  3843 00009160 E919FEFFFF          <1> 	jmp	loc_file_rw_restore_retn
  3844                              <1> 
  3845                              <1> loc_rmdir_directory_found:
  3846 00009165 80E307              <1> 	and	bl, 07h ; Attributes
  3847                              <1> 	;jnz	loc_permission_denied
  3848                              <1> 	; 28/07/2022
  3849 00009168 7405                <1> 	jz	short loc_rmdir_save_lnel
  3850 0000916A E919FEFFFF          <1> 	jmp	loc_permission_denied
  3851                              <1> 
  3852                              <1> loc_rmdir_save_lnel: ; 28/02/2016
  3853                              <1>        ;mov	bh, [LongName_EntryLength]
  3854 0000916F 883D[1A870100]      <1> 	mov	[DelFile_LNEL], bh ; Long name entry length (if > 0)
  3855                              <1> 	; edi = Directory Entry Offset (DirBuff)
  3856                              <1> 	; esi = Directory Entry (FFF Structure)
  3857                              <1> 	;mov	[DelFile_DirEntryAddr], edi ; not required
  3858                              <1> 	;mov	ax, [edi+20] ; First Cluster High Word
  3859                              <1>         ;shl	eax, 16
  3860                              <1> 	;mov	ax, [edi+26] ; First Cluster Low Word
  3861                              <1> 	; ROOT Dir First Cluster = 0
  3862                              <1>         ;cmp	eax, 2
  3863                              <1> 	;jb	loc_update_direntry_1
  3864                              <1> 
  3865                              <1> pass_rmdir_fc_check:
  3866 00009175 57                  <1> 	push	edi ; * (29/02/2016)
  3867                              <1> 
  3868 00009176 BE[6F390100]        <1> 	mov	esi, Msg_DoYouWantRmDir
  3869 0000917B E8EADBFFFF          <1> 	call	print_msg
  3870 00009180 8B35[10870100]      <1> 	mov	esi, [DelFile_FNPointer]
  3871 00009186 E8DFDBFFFF          <1> 	call	print_msg
  3872 0000918B BE[5B390100]        <1> 	mov	esi, Msg_YesNo
  3873 00009190 E8D5DBFFFF          <1> 	call	print_msg
  3874                              <1> 
  3875                              <1> loc_rmdir_ask_again:
  3876 00009195 30E4                <1> 	xor	ah, ah
  3877 00009197 E8807DFFFF          <1> 	call	int16h
  3878 0000919C 3C1B                <1> 	cmp	al, 1Bh
  3879                              <1> 	;je	short loc_do_not_delete_directory
  3880 0000919E 742F                <1>         je	short loc_rmdir_y_n_escape ; 06/03/2016
  3881 000091A0 24DF                <1> 	and	al, 0DFh
  3882 000091A2 A2[65390100]        <1> 	mov	[Y_N_nextline], al
  3883 000091A7 3C59                <1> 	cmp	al, 'Y'
  3884 000091A9 7404                <1> 	je	short loc_rmdir_yes_delete_directory
  3885 000091AB 3C4E                <1> 	cmp	al, 'N'
  3886 000091AD 75E6                <1> 	jne	short loc_rmdir_ask_again
  3887                              <1> 
  3888                              <1> loc_do_not_delete_directory:
  3889                              <1> loc_rmdir_yes_delete_directory:
  3890 000091AF E8FDFEFFFF          <1> 	call	y_n_answer ; 29/12/2017
  3891 000091B4 5F                  <1> 	pop	edi ; * (29/02/2016)
  3892                              <1> 	;cmp	al, 'Y' ; 'yes'
  3893                              <1> 	;cmc
  3894                              <1>         ;jnc	loc_file_rw_restore_retn
  3895 000091B5 3C4E                <1> 	cmp	al, 'N' ; 'no'
  3896                              <1> 	;je	loc_file_rw_restore_retn
  3897                              <1> 	; 28/07/2022
  3898                              <1> 	;jne	short loc_delete_sub_dir
  3899                              <1> 	;jmp	loc_file_rw_restore_retn
  3900 000091B7 7411                <1> 	je	short loc_rmdir_rw_restore_retn
  3901                              <1> 
  3902                              <1> loc_delete_sub_dir:
  3903                              <1> 	; 29/12/2017
  3904 000091B9 E85E000000          <1> 	call	delete_sub_directory
  3905 000091BE 7213                <1> 	jc	short loc_rmdir_cmd_failed
  3906                              <1> 
  3907                              <1> loc_rmdir_ok:
  3908 000091C0 BE[69390100]        <1> 	mov	esi, Msg_OK
  3909 000091C5 E8A0DBFFFF          <1> 	call	print_msg
  3910                              <1> loc_rmdir_rw_restore_retn: ; 28/07/2022
  3911 000091CA E9AFFDFFFF          <1> 	jmp	loc_file_rw_restore_retn
  3912                              <1> 
  3913                              <1> loc_rmdir_y_n_escape:
  3914 000091CF B04E                <1> 	mov	al, 'N' ; 'no'
  3915 000091D1 EBDC                <1>         jmp     loc_do_not_delete_directory
  3916                              <1> 
  3917                              <1> loc_rmdir_cmd_failed:
  3918                              <1> 	; 29/12/2017
  3919 000091D3 09C0                <1> 	or	eax, eax ; EAX = 0 -> Directory not empty!
  3920 000091D5 7423                <1> 	jz	short loc_rmdir_directory_not_empty
  3921                              <1> 
  3922                              <1> 	; EAX > 0 -> Error code in AL (or AX or EAX)
  3923                              <1> 
  3924 000091D7 833D[CE840100]01    <1> 	cmp	dword [FAT_ClusterCounter], 1
  3925                              <1> 	;jb	loc_file_rw_cmd_failed
  3926                              <1> 	; 28/07/2022
  3927 000091DE 7305                <1> 	jnb	short loc_rmdir_failed
  3928 000091E0 E999FDFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  3929                              <1> 
  3930                              <1> loc_rmdir_failed:
  3931 000091E5 F9                  <1> 	stc
  3932                              <1> loc_rmdir_cmd_return:
  3933                              <1> 	; 01/03/2016
  3934 000091E6 9C                  <1> 	pushf
  3935                              <1> 	; ESI = Logical DOS Drive Description Table address
  3936 000091E7 66BB00FF            <1> 	mov	bx, 0FF00h ; BH = FFh -> use ESI for Drive parameters
  3937                              <1> 	           ; BL = 0 -> Recalculate free cluster count
  3938 000091EB 50                  <1> 	push	eax
  3939 000091EC E86F370000          <1> 	call	calculate_fat_freespace	
  3940 000091F1 58                  <1> 	pop	eax
  3941 000091F2 9D                  <1> 	popf
  3942                              <1> 	;jc	loc_file_rw_cmd_failed
  3943                              <1> 	;jmp	loc_file_rw_restore_retn
  3944                              <1> 	; 28/07/2022
  3945 000091F3 73D5                <1> 	jnc	short loc_rmdir_rw_restore_retn
  3946 000091F5 E984FDFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  3947                              <1> 
  3948                              <1> loc_rmdir_directory_not_empty:
  3949 000091FA BE[90390100]        <1> 	mov	esi, Msg_Dir_Not_Empty
  3950 000091FF E866DBFFFF          <1> 	call	print_msg
  3951                              <1> 	; 01/03/2016
  3952 00009204 A1[CE840100]        <1> 	mov	eax, [FAT_ClusterCounter]
  3953 00009209 09C0                <1> 	or	eax, eax ; 0 ?
  3954                              <1> 	;jz	loc_file_rw_restore_retn
  3955                              <1> 	; 28/07/2022
  3956 0000920B 74BD                <1> 	jz	short loc_rmdir_rw_restore_retn	
  3957                              <1> 
  3958                              <1> 	; ESI = Logical DOS Drive Description Table address
  3959 0000920D 66BB01FF            <1> 	mov	bx, 0FF01h ; BH = FFh -> use ESI for Drive parameters
  3960                              <1> 	           ; BL = 1 -> add free clusters
  3961 00009211 E84A370000          <1> 	call	calculate_fat_freespace
  3962 00009216 09C9                <1> 	or	ecx, ecx
  3963                              <1> 	;jz	loc_file_rw_restore_retn ; ecx = 0 -> OK
  3964                              <1> 	;; ecx > 0 -> Error (Recalculation is needed)
  3965                              <1> 	;jmp	short loc_rmdir_cmd_return
  3966                              <1> 	; 28/07/2022
  3967 00009218 75CC                <1> 	jnz	short loc_rmdir_cmd_return
  3968 0000921A EBAE                <1> 	jmp	short loc_rmdir_rw_restore_retn
  3969                              <1> 	;jmp	loc_file_rw_restore_retn
  3970                              <1> 
  3971                              <1> delete_sub_directory:
  3972                              <1> 	; 17/07/2025 (TRDOS 386 Kernel v2.0.10)
  3973                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  3974                              <1> 	; 29/12/2017 
  3975                              <1> 	; (moved here from 'delete_directory' for 'sysrmdir' )
  3976                              <1> 
  3977                              <1> 	; EDI = Directory buffer entry offset/address
  3978                              <1> 
  3979                              <1> loc_rmdir_delete_short_name_check_dir_empty:
  3980 0000921C 668B4714            <1> 	mov	ax, [edi+20] ; First Cluster High Word
  3981 00009220 C1E010              <1>         shl	eax, 16
  3982 00009223 668B471A            <1> 	mov	ax, [edi+26] ; First Cluster Low Word
  3983                              <1> 
  3984                              <1> 	;;;
  3985                              <1> 	; 17/07/2025
  3986                              <1>  	; (sure it is not the current directory)
  3987 00009227 8A15[58870100]      <1> 	mov	dl, [rmdir_drv]
  3988 0000922D 3A15[B27D0100]      <1> 	cmp	dl, [Current_Drv]
  3989 00009233 7508                <1> 	jne	short loc_rmdir_delete_short_name_check_dot
  3990 00009235 3B05[54870100]      <1> 	cmp	eax, [rmdir_dir_fcluster]
  3991 0000923B 7447                <1> 	je	short loc_rmdir_permission_denied
  3992                              <1> loc_rmdir_delete_short_name_check_dot:
  3993                              <1>  	; (DOT and DOTDOT can not be deleted)
  3994 0000923D 803F2E              <1> 	cmp	byte [edi], '.'
  3995 00009240 750F                <1> 	jne	short loc_rmdir_delete_short_name_skip_dot
  3996 00009242 66813F2E20          <1> 	cmp	word [edi], '. '
  3997 00009247 743B                <1> 	je	short loc_rmdir_permission_denied
  3998 00009249 813F2E2E2020        <1> 	cmp	dword [edi], '..  '
  3999 0000924F 7433                <1> 	je	short loc_rmdir_permission_denied
  4000                              <1> loc_rmdir_delete_short_name_skip_dot:
  4001                              <1> 	;;;
  4002                              <1> 
  4003                              <1> 	;mov 	[DelFile_FCluster], eax
  4004                              <1> 
  4005                              <1> 	;;mov	bx, [DirBuff_EntryCounter]
  4006                              <1> 	;mov	bx, [FindFile_DirEntryNumber] ; 27/02/2016
  4007                              <1> 	;mov	[DelFile_EntryCounter], bx
  4008                              <1> 
  4009 00009251 29DB                <1>     	sub	ebx, ebx
  4010                              <1> 	; 29/12/2017
  4011 00009253 891D[CE840100]      <1> 	mov	[FAT_ClusterCounter], ebx ; 0 ; Reset
  4012                              <1> 
  4013 00009259 8A3D[52860100]      <1> 	mov	bh, [FindFile_Drv]
  4014 0000925F BE00010900          <1> 	mov	esi, Logical_DOSDisks
  4015 00009264 01DE                <1> 	add	esi, ebx
  4016                              <1> 
  4017 00009266 66817F0CA101        <1> 	cmp	word [edi+DirEntry_NTRes], 01A1h
  4018 0000926C 745A                <1> 	je	short loc_rmdir_check_fs_directory
  4019                              <1> 
  4020                              <1> 	;cmp	byte [esi+LD_FATType], 1
  4021                              <1> 	;jb	short loc_rmdir_get__last_cluster_0
  4022                              <1> 
  4023                              <1> 	; 29/12/2017
  4024 0000926E 83F802              <1> 	cmp	eax, 2
  4025 00009271 7306                <1> 	jnb	short loc_rmdir_get_last_cluster_1
  4026                              <1> 	; eax < 2
  4027                              <1> loc_rmdir_get_last_cluster_0:
  4028                              <1> 	;mov	eax, ERR_INV_FORMAT ; invalid format!
  4029 00009273 B813000000          <1> 	mov	eax, ERR_NOT_DIR ; not a valid directory!
  4030                              <1> 	;stc
  4031 00009278 C3                  <1> 	retn
  4032                              <1> 
  4033                              <1> loc_rmdir_get_last_cluster_1:
  4034 00009279 807E0303            <1> 	cmp	byte [esi+LD_FATType], 3 ; FAT32
  4035 0000927D 750C                <1> 	jne	short loc_rmdir_get_last_cluster_2
  4036                              <1> 
  4037                              <1> 	; is it root directory ?
  4038 0000927F 3B4632              <1> 	cmp	eax, [esi+LD_BPB+BPB_RootClus]
  4039 00009282 7507                <1> 	jne	short loc_rmdir_get_last_cluster_2
  4040                              <1> 
  4041                              <1> 	; root directory can not be deleted !!
  4042                              <1> loc_rmdir_permission_denied:
  4043 00009284 B80B000000          <1> 	mov	eax, ERR_PERM_DENIED ; permission denied!
  4044 00009289 F9                  <1> 	stc
  4045 0000928A C3                  <1> 	retn
  4046                              <1> 
  4047                              <1> loc_rmdir_get_last_cluster_2:
  4048                              <1> 	; 29/12/2017
  4049 0000928B A3[14870100]        <1> 	mov 	[DelFile_FCluster], eax
  4050                              <1> 
  4051                              <1> 	;mov	dx, [DirBuff_EntryCounter]
  4052 00009290 668B15[CC860100]    <1> 	mov	dx, [FindFile_DirEntryNumber] ; 27/02/2016
  4053 00009297 668915[18870100]    <1> 	mov	[DelFile_EntryCounter], dx
  4054                              <1> 
  4055 0000929E 8B15[DE840100]      <1> 	mov	edx, [DirBuff_Cluster]
  4056 000092A4 8915[48870100]      <1> 	mov	[RmDir_ParentDirCluster], edx
  4057                              <1> 
  4058 000092AA 893D[44870100]      <1> 	mov	[RmDir_DirEntryOffset], edi
  4059                              <1> 
  4060                              <1> 	; 01/03/2016
  4061                              <1> 	;mov	dword [FAT_ClusterCounter], 0 ; Reset
  4062                              <1> 
  4063                              <1> loc_rmdir_get_last_cluster_3:
  4064 000092B0 E829380000          <1> 	call	get_last_cluster
  4065                              <1>         ;jc	loc_rmdir_cmd_failed
  4066 000092B5 721E                <1> 	jc	short loc_delete_sub_dir_retn ; 29/12/2017
  4067                              <1> 
  4068 000092B7 3B05[14870100]      <1> 	cmp	eax, [DelFile_FCluster]
  4069 000092BD 7517                <1> 	jne	short loc_rmdir_multi_dir_clusters
  4070                              <1> 
  4071 000092BF C605[43870100]00    <1> 	mov	byte [RmDir_MultiClusters], 0
  4072 000092C6 EB15                <1> 	jmp	short pass_rmdir_multi_dir_clusters
  4073                              <1> 
  4074                              <1> loc_rmdir_check_fs_directory:
  4075                              <1> 	; 29/12/2017
  4076 000092C8 807E04A1            <1> 	cmp	byte [esi+LD_FSType], 0A1h
  4077 000092CC 75B6                <1> 	jne	short loc_rmdir_permission_denied
  4078                              <1> 
  4079                              <1> loc_rmdir_delete_fs_directory:
  4080 000092CE E8CE120000          <1> 	call	delete_fs_directory
  4081                              <1> 	;jnc	loc_print_deleted_message
  4082 000092D3 7300                <1> 	jnc	short loc_delete_sub_dir_retn ; 29/12/2017
  4083                              <1> 
  4084                              <1> 	; EAX=0 -> Directory not empty !
  4085                              <1> 	; EAX>0 -> Disk r/w error or another (misc) error
  4086                              <1> 
  4087                              <1> 	;or	eax, eax
  4088                              <1> 	;jz	loc_rmdir_directory_not_empty_2
  4089                              <1> 	;;stc
  4090                              <1> 	;;jmp	loc_file_rw_cmd_failed
  4091                              <1> 
  4092                              <1> loc_delete_sub_dir_retn:
  4093 000092D5 C3                  <1> 	retn
  4094                              <1> 
  4095                              <1> loc_rmdir_multi_dir_clusters:
  4096 000092D6 C605[43870100]01    <1> 	mov	byte [RmDir_MultiClusters], 1
  4097                              <1> 
  4098                              <1> pass_rmdir_multi_dir_clusters:
  4099 000092DD A3[4C870100]        <1> 	mov 	[RmDir_DirLastCluster], eax
  4100 000092E2 890D[50870100]      <1> 	mov	[RmDir_PreviousCluster], ecx
  4101                              <1> 
  4102                              <1> loc_rmdir_load_fat_sub_directory:
  4103 000092E8 E83B320000          <1> 	call	load_FAT_sub_directory
  4104                              <1> 	;jc	loc_rmdir_cmd_failed
  4105 000092ED 72E6                <1> 	jc	short loc_delete_sub_dir_retn
  4106                              <1> 
  4107                              <1> loc_rmdir_find_last_dir_entry:
  4108 000092EF 56                  <1> 	push	esi
  4109 000092F0 BE[36860100]        <1> 	mov	esi, Dir_File_Name
  4110 000092F5 C6062A              <1> 	mov	byte [esi], '*'
  4111 000092F8 C646082A            <1> 	mov	byte [esi+8], '*'
  4112 000092FC 31DB                <1> 	xor	ebx, ebx ; Entry offset  = 0
  4113                              <1> loc_rmdir_find_last_dir_entry_next:
  4114                              <1> 	;mov	ax, 0800h ; Except volume/long names
  4115                              <1> 	;xor	cx, cx ; 0 = Find a valid file or dir name
  4116                              <1> 	; 28/07/2022
  4117 000092FE 31C0                <1> 	xor	eax, eax
  4118 00009300 B408                <1> 	mov	ah, 8
  4119                              <1> 	; eax = 0800h
  4120 00009302 31C9                <1> 	xor	ecx, ecx ; 0
  4121 00009304 E8C1160000          <1> 	call	find_directory_entry
  4122 00009309 7225                <1> 	jc	short loc_rmdir_empty_dir_cluster
  4123 0000930B 83FB01              <1> 	cmp	ebx, 1
  4124 0000930E 771B                <1> 	ja	short loc_rmdir_directory_not_empty_1
  4125                              <1> loc_rmdir_dot_entry_check:
  4126 00009310 80FD2E              <1> 	cmp	ch, '.' ; The first char of the dir entry
  4127 00009313 7516                <1> 	jne	short loc_rmdir_directory_not_empty_1
  4128 00009315 08DB                <1> 	or	bl, bl
  4129 00009317 7506                <1> 	jnz	short loc_rmdir_dotdot_entry_check
  4130 00009319 807F0120            <1> 	cmp	byte [edi+1], 20h
  4131 0000931D EB06                <1> 	jmp	short pass_rmdir_dot_entry_check
  4132                              <1> 
  4133                              <1> loc_rmdir_dotdot_entry_check:
  4134 0000931F 66817F012E20        <1> 	cmp	word [edi+1], '. '
  4135                              <1> pass_rmdir_dot_entry_check:
  4136 00009325 7504                <1> 	jne	short loc_rmdir_directory_not_empty_1
  4137 00009327 FEC3                <1> 	inc	bl
  4138 00009329 EBD3                <1> 	jmp	short loc_rmdir_find_last_dir_entry_next
  4139                              <1> 
  4140                              <1> loc_rmdir_directory_not_empty_1:
  4141 0000932B 58                  <1> 	pop	eax ; pushed esi
  4142 0000932C 31C0                <1> 	xor	eax, eax ; 0
  4143                              <1> loc_rmdir_directory_not_empty_2:
  4144                              <1> loc_delete_sub_dir_stc_retn:
  4145 0000932E F9                  <1> 	stc
  4146 0000932F C3                  <1> 	retn
  4147                              <1> 
  4148                              <1> loc_rmdir_empty_dir_cluster:
  4149 00009330 5E                  <1> 	pop	esi
  4150                              <1> 
  4151                              <1> loc_rmdir_set_prev_cluster_dir_last_cluster:
  4152 00009331 803D[43870100]00    <1> 	cmp	byte [RmDir_MultiClusters], 0
  4153 00009338 7613                <1> 	jna	short loc_rmdir_unlink_dir_last_cluster
  4154                              <1> 
  4155 0000933A A1[50870100]        <1> 	mov	eax, [RmDir_PreviousCluster]
  4156                              <1> 	;xor	ecx, ecx
  4157 0000933F 49                  <1> 	dec	ecx ; FFFFFFFFh
  4158 00009340 E816330000          <1> 	call	update_cluster
  4159 00009345 7306                <1> 	jnc	short loc_rmdir_unlink_dir_last_cluster
  4160                              <1> 
  4161                              <1> 	; 01/03/2016
  4162                              <1> 	;cmp	eax, 1  ; eax = 0 -> end of cluster chain
  4163                              <1> 	;cmc
  4164                              <1> 	;jc	short loc_rmdir_cmd_failed
  4165                              <1> 	;jmp	short loc_rmdir_save_fat_buffer
  4166                              <1> 	; 29/12/2017
  4167 00009347 21C0                <1> 	and	eax, eax
  4168 00009349 75E3                <1> 	jnz	short loc_delete_sub_dir_stc_retn
  4169 0000934B EB12                <1> 	jmp	short loc_rmdir_save_fat_buffer
  4170                              <1> 
  4171                              <1> loc_rmdir_unlink_dir_last_cluster:
  4172 0000934D A1[4C870100]        <1> 	mov	eax, [RmDir_DirLastCluster]
  4173 00009352 31C9                <1> 	xor	ecx, ecx ; 0
  4174 00009354 E802330000          <1> 	call	update_cluster
  4175 00009359 7327                <1> 	jnc	short loc_rmdir_unlink_stc_retn_0Bh
  4176                              <1> 	; Because of it is the last cluster
  4177                              <1> 	; 'update_cluster' must return with eocc error
  4178 0000935B 09C0                <1> 	or	eax, eax
  4179                              <1> 	;jz	short loc_rmdir_save_fat_buffer ; eocc
  4180                              <1> 	;stc
  4181                              <1>         ;jmp	short loc_rmdir_cmd_failed
  4182                              <1> 	; 29/12/2017
  4183 0000935D 75CF                <1> 	jnz	short loc_delete_sub_dir_stc_retn
  4184                              <1> 
  4185                              <1> loc_rmdir_save_fat_buffer:
  4186 0000935F 803D[C6840100]02    <1> 	cmp	byte [FAT_BuffValidData], 2
  4187 00009366 7527                <1> 	jne	short loc_rmdir_calculate_FAT_freespace
  4188 00009368 E862350000          <1> 	call	save_fat_buffer
  4189                              <1> 	;jc	short loc_rmdir_cmd_failed
  4190                              <1> 	; 29/12/2017
  4191 0000936D 7219                <1> 	jc	short loc_rmdir_unlink_error_retn
  4192                              <1> 
  4193                              <1> 	; 01/03/2016
  4194 0000936F 803D[43870100]00    <1> 	cmp	byte [RmDir_MultiClusters], 0
  4195 00009376 7617                <1> 	jna	short loc_rmdir_calculate_FAT_freespace
  4196                              <1> 
  4197 00009378 A1[14870100]        <1> 	mov	eax, [DelFile_FCluster]
  4198 0000937D E92EFFFFFF          <1>         jmp     loc_rmdir_get_last_cluster_3
  4199                              <1> 
  4200                              <1> loc_rmdir_unlink_stc_retn_0Bh:
  4201                              <1> 	; 15/10/2016 (0Bh -> 28)
  4202 00009382 B81C000000          <1> 	mov	eax, ERR_INV_FORMAT ; 28 = Invalid format
  4203                              <1> loc_rmdir_unlink_stc_retn:
  4204 00009387 F9                  <1> 	stc
  4205                              <1> loc_rmdir_unlink_error_retn:
  4206 00009388 C3                  <1> 	retn
  4207                              <1> 
  4208                              <1> loc_rmdir_delete_short_name_invalid_data:
  4209                              <1> 	;mov	eax, 29 ; Invalid data (15/10/2016)
  4210                              <1> 	; 28/07/2022
  4211 00009389 29C0                <1> 	sub	eax, eax
  4212 0000938B B01D                <1> 	mov	al, 29
  4213                              <1> 	;stc
  4214                              <1>         ;jmp	loc_rmdir_cmd_failed
  4215                              <1> 	; 29/12/2017
  4216 0000938D EBF8                <1> 	jmp	short loc_rmdir_unlink_stc_retn
  4217                              <1> 
  4218                              <1> loc_rmdir_calculate_FAT_freespace:
  4219                              <1> 	;mov	eax, [FAT_ClusterCounter]
  4220                              <1> 	; 29/12/2017
  4221 0000938F 29C0                <1> 	sub	eax, eax ; 0
  4222 00009391 8705[CE840100]      <1> 	xchg	eax, [FAT_ClusterCounter]
  4223                              <1> 	;
  4224 00009397 66BB01FF            <1> 	mov	bx, 0FF01h
  4225                              <1> 	; BL = 1 -> Add EAX to free space count
  4226                              <1> 	; BH = FFh ->
  4227                              <1> 	; ESI = Logical DOS Drive Description Table address
  4228 0000939B E8C0350000          <1> 	call	calculate_fat_freespace
  4229                              <1> 
  4230 000093A0 21C9                <1> 	and	ecx, ecx ; ecx = 0 -> valid free sector count
  4231 000093A2 7409                <1> 	jz 	short loc_rmdir_delete_short_name_continue
  4232                              <1> 
  4233                              <1> loc_rmdir_recalculate_FAT_freespace:
  4234 000093A4 66BB00FF            <1>         mov     bx, 0FF00h ; BL = 0 -> Recalculate free space
  4235 000093A8 E8B3350000          <1> 	call	calculate_fat_freespace
  4236                              <1> 
  4237                              <1> loc_rmdir_delete_short_name_continue:
  4238 000093AD A1[48870100]        <1> 	mov	eax, [RmDir_ParentDirCluster]
  4239 000093B2 83F802              <1> 	cmp	eax, 2
  4240 000093B5 7309                <1> 	jnb	short loc_rmdir_del_short_name_load_sub_dir
  4241 000093B7 E8EE300000          <1> 	call	load_FAT_root_directory
  4242                              <1> 	;jc	loc_file_rw_cmd_failed
  4243                              <1> 	; 29/12/2017
  4244 000093BC 72CA                <1> 	jc	short loc_rmdir_unlink_error_retn
  4245 000093BE EB07                <1> 	jmp	short loc_rmdir_del_short_name_ld_chk_fclust
  4246                              <1> 
  4247                              <1> loc_rmdir_del_short_name_load_sub_dir:
  4248 000093C0 E863310000          <1> 	call	load_FAT_sub_directory
  4249                              <1> 	;jc	loc_file_rw_cmd_failed
  4250                              <1> 	; 29/12/2017
  4251 000093C5 72C1                <1> 	jc	short loc_rmdir_unlink_error_retn
  4252                              <1> 
  4253                              <1> loc_rmdir_del_short_name_ld_chk_fclust:
  4254 000093C7 0FB73D[44870100]    <1> 	movzx	edi, word [RmDir_DirEntryOffset]
  4255 000093CE 81C700000800        <1> 	add	edi, Directory_Buffer
  4256                              <1> 
  4257 000093D4 668B4714            <1> 	mov	ax, [edi+20] ; First Cluster High Word
  4258 000093D8 C1E010              <1> 	shl	eax, 16
  4259 000093DB 668B471A            <1> 	mov	ax, [edi+26] ; First Cluster Low Word
  4260                              <1>         ; Not necessary... 
  4261 000093DF 3B05[14870100]      <1> 	cmp	eax, [DelFile_FCluster]
  4262 000093E5 75A2                <1> 	jne	short loc_rmdir_delete_short_name_invalid_data
  4263                              <1> 	;
  4264 000093E7 C607E5              <1> 	mov	byte [edi], 0E5h ; 'Deleted' sign
  4265                              <1> 	; 27/02/2016
  4266                              <1> 	; TRDOS v1 has a bug here! it does not set
  4267                              <1> 	; 'DirBuff_ValidData' to 2; as result of this bug,
  4268                              <1> 	; 'save_directory_buffer' would not save the change !
  4269 000093EA C605[D9840100]02    <1>   	mov	byte [DirBuff_ValidData], 2 ; change sign
  4270                              <1> 	;
  4271 000093F1 E8A61C0000          <1> 	call	save_directory_buffer
  4272                              <1> 	;jc	loc_file_rw_cmd_failed
  4273                              <1> 	; 29/12/2017
  4274 000093F6 7290                <1> 	jc	short loc_rmdir_unlink_error_retn
  4275                              <1> 
  4276                              <1> loc_rmdir_del_long_name:
  4277 000093F8 0FB615[1A870100]    <1> 	movzx	edx, byte [DelFile_LNEL]
  4278 000093FF 08D2                <1> 	or	dl, dl
  4279 00009401 7410                <1> 	jz	short loc_rmdir_update_parent_dir_lmdt
  4280                              <1> 
  4281 00009403 0FB705[18870100]    <1> 	movzx	eax, word [DelFile_EntryCounter]
  4282 0000940A 29D0                <1> 	sub	eax, edx
  4283                              <1> 	; 29/12/2017
  4284 0000940C 7205                <1> 	jc	short loc_rmdir_update_parent_dir_lmdt
  4285                              <1> 
  4286                              <1>  	; EAX = Directory Entry Number of the long name last entry
  4287 0000940E E8E31D0000          <1> 	call	delete_longname
  4288                              <1> 
  4289                              <1> loc_rmdir_update_parent_dir_lmdt:
  4290 00009413 E81C1D0000          <1> 	call	update_parent_dir_lmdt
  4291                              <1> 	;jc	short loc_file_rw_cmd_failed
  4292                              <1> 	; 29/12/2017
  4293                              <1> 	;jc	short loc_rmdir_unlink_error_retn
  4294                              <1> 
  4295                              <1> loc_delete_sub_directory_ok:
  4296                              <1> 	; 29/12/2017
  4297 00009418 31C0                <1> 	xor	eax, eax ;  0 ;  cf = 0
  4298 0000941A C3                  <1> 	retn
  4299                              <1> 
  4300                              <1> delete_file:
  4301                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  4302                              <1> 	; 29/02/2016
  4303                              <1> 	; 28/02/2016 (TRDOS 386 = TRDOS v2.0)
  4304                              <1> 	; 09/08/2010 (CMD_INTR.ASM, 'cmp_cmd_del')
  4305                              <1> 	; 28/02/2010
  4306                              <1> 
  4307                              <1> get_delfile_fchar:
  4308                              <1> 	; esi = file name
  4309 0000941B 803E20              <1> 	cmp	byte [esi], 20h
  4310 0000941E 7701                <1>         ja	short loc_delfile_parse_path_name
  4311                              <1> 
  4312                              <1> loc_delfile_nofilename_retn:
  4313 00009420 C3                  <1> 	retn
  4314                              <1> 
  4315                              <1> loc_delfile_parse_path_name:
  4316 00009421 BF[52860100]        <1> 	mov	edi, FindFile_Drv
  4317 00009426 E83A180000          <1> 	call	parse_path_name
  4318                              <1> 	;jc	loc_cmd_failed
  4319                              <1> 	; 28/07/2022
  4320 0000942B 7305                <1> 	jnc	short loc_delfile_check_filename_exists
  4321                              <1> loc_delfile_failed:
  4322 0000942D E912F2FFFF          <1> 	jmp	loc_cmd_failed
  4323                              <1> 
  4324                              <1> loc_delfile_check_filename_exists:
  4325 00009432 BE[94860100]        <1> 	mov	esi, FindFile_Name
  4326 00009437 803E20              <1> 	cmp	byte [esi], 20h
  4327                              <1> 	;jna	loc_cmd_failed
  4328                              <1> 	; 28/07/2022
  4329 0000943A 76F1                <1> 	jna	short loc_delfile_failed
  4330 0000943C 8935[10870100]      <1> 	mov	[DelFile_FNPointer], esi
  4331                              <1> 
  4332                              <1> loc_delfile_drv:
  4333 00009442 8A15[52860100]      <1> 	mov	dl, [FindFile_Drv]
  4334 00009448 8A35[B27D0100]      <1> 	mov	dh, [Current_Drv]
  4335 0000944E 8835[0F850100]      <1> 	mov	[RUN_CDRV], dh
  4336 00009454 38F2                <1> 	cmp	dl, dh
  4337 00009456 7407                <1> 	je	short loc_delfile_change_directory
  4338                              <1> 
  4339 00009458 E820E4FFFF          <1> 	call	change_current_drive
  4340                              <1> 	;jc	loc_file_rw_cmd_failed
  4341                              <1> 	; 28/07/2022
  4342                              <1> 	;jnc	short loc_delfile_change_directory
  4343                              <1> 	;jmp	loc_file_rw_cmd_failed
  4344 0000945D 721D                <1> 	jc	short loc_delfile_chdrv_failed
  4345                              <1> 
  4346                              <1> loc_delfile_change_directory:
  4347 0000945F 803D[53860100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  4348 00009466 7619                <1> 	jna	short loc_delfile_find
  4349                              <1> 
  4350 00009468 FE05[CF340100]      <1> 	inc	byte [Restore_CDIR]
  4351 0000946E BE[53860100]        <1> 	mov	esi, FindFile_Directory
  4352 00009473 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0
  4353 00009475 E801120000          <1> 	call	change_current_directory
  4354                              <1> 	;jc	loc_file_rw_cmd_failed
  4355                              <1> 	; 28/07/2022
  4356 0000947A 7305                <1> 	jnc	short loc_delfile_chdir_ok
  4357                              <1> loc_delfile_chdrv_failed:
  4358                              <1> loc_delfile_fff_failed:
  4359 0000947C E9FDFAFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4360                              <1> 
  4361                              <1> loc_delfile_chdir_ok: ; 28/07/2022
  4362                              <1> 
  4363                              <1> ;loc_delfile_change_prompt_dir_string:
  4364                              <1> 	;call	change_prompt_dir_string
  4365                              <1> 
  4366                              <1> loc_delfile_find:
  4367                              <1> 	;mov	esi, FindFile_Name
  4368 00009481 8B35[10870100]      <1> 	mov	esi, [DelFile_FNPointer]
  4369 00009487 66B80018            <1> 	mov	ax, 1800h ; Except volume label and dirs
  4370 0000948B E8DAF6FFFF          <1> 	call	find_first_file
  4371                              <1> 	;jc	loc_file_rw_cmd_failed
  4372                              <1> 	; 28/07/2022
  4373 00009490 72EA                <1> 	jc	short loc_delfile_fff_failed
  4374                              <1> 
  4375                              <1> loc_delfile_ambgfn_check:
  4376 00009492 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
  4377 00009495 740A                <1> 	jz	short loc_delfile_found
  4378                              <1> 
  4379                              <1> loc_file_not_found:
  4380                              <1> 	;mov	eax, 2 ; File not found sign
  4381                              <1> 	; 28/07/2022
  4382 00009497 31C0                <1> 	xor	eax, eax
  4383 00009499 B002                <1> 	mov	al, 2
  4384 0000949B F9                  <1> 	stc
  4385 0000949C E9DDFAFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4386                              <1> 
  4387                              <1> loc_delfile_found:
  4388 000094A1 80E307              <1> 	and	bl, 07h ; Attributes
  4389                              <1> 	;jnz	loc_permission_denied
  4390                              <1> 	; 28/07/2022
  4391 000094A4 7405                <1> 	jz	short loc_delfile_attrb_ok
  4392 000094A6 E9DDFAFFFF          <1> 	jmp	loc_permission_denied
  4393                              <1> 
  4394                              <1> loc_delfile_attrb_ok: ; 28/07/2022
  4395                              <1> 
  4396                              <1> ;loc_delfile_found_save_lnel:
  4397                              <1> ;	mov	[DelFile_LNEL], bh ; Long name entry length (if > 0)
  4398                              <1> 
  4399                              <1> loc_delfile_ask_for_delete:
  4400 000094AB 57                  <1> 	push	edi ; * (29/02/2016)
  4401                              <1> 
  4402 000094AC BE[A7390100]        <1> 	mov	esi, Msg_DoYouWantDelete
  4403 000094B1 E8B4D8FFFF          <1> 	call	print_msg
  4404 000094B6 8B35[10870100]      <1> 	mov	esi, [DelFile_FNPointer]
  4405 000094BC E8A9D8FFFF          <1> 	call	print_msg
  4406 000094C1 BE[5B390100]        <1> 	mov	esi, Msg_YesNo
  4407 000094C6 E89FD8FFFF          <1> 	call	print_msg
  4408                              <1> 
  4409                              <1> loc_delfile_ask_again:
  4410 000094CB 30E4                <1> 	xor	ah, ah
  4411 000094CD E84A7AFFFF          <1> 	call	int16h
  4412 000094D2 3C1B                <1> 	cmp	al, 1Bh
  4413                              <1> 	;je	short loc_do_not_delete_file
  4414 000094D4 744C                <1> 	je	short loc_delfile_y_n_escape ; 06/03/2016
  4415 000094D6 24DF                <1> 	and	al, 0DFh
  4416 000094D8 A2[65390100]        <1> 	mov	[Y_N_nextline], al
  4417 000094DD 3C59                <1> 	cmp	al, 'Y'
  4418 000094DF 7404                <1> 	je	short loc_yes_delete_file
  4419 000094E1 3C4E                <1> 	cmp	al, 'N'
  4420 000094E3 75E6                <1> 	jne	short loc_delfile_ask_again
  4421                              <1> 
  4422                              <1> loc_do_not_delete_file:
  4423                              <1> loc_yes_delete_file:
  4424 000094E5 E8C7FBFFFF          <1> 	call	y_n_answer ; 29/12/2017
  4425 000094EA 5F                  <1> 	pop	edi ; * (29/02/2016)
  4426                              <1> 	;cmp	al, 'Y' ; 'yes'
  4427                              <1> 	;cmc
  4428                              <1>         ;jnc	loc_file_rw_restore_retn
  4429 000094EB 3C4E                <1> 	cmp	al, 'N' ; 'no'
  4430                              <1>         ;je	loc_file_rw_restore_retn
  4431                              <1> 	; 28/07/2022
  4432 000094ED 7505                <1> 	jne	short loc_delete_file
  4433 000094EF E98AFAFFFF          <1> 	jmp	loc_file_rw_restore_retn
  4434                              <1> 
  4435                              <1> loc_delete_file:
  4436 000094F4 8A3D[52860100]      <1> 	mov	bh, [FindFile_Drv]
  4437                              <1> 	;mov	bl, [DelFile_LNEL]
  4438 000094FA 8A1D[A1860100]      <1> 	mov	bl, [FindFile_LongNameEntryLength]
  4439                              <1> 	;mov	cx, [DirBuff_EntryCounter]
  4440 00009500 668B0D[CC860100]    <1> 	mov	cx, [FindFile_DirEntryNumber]
  4441                              <1> 	; (*) EDI = Directory buffer entry offset/address
  4442 00009507 E8C21E0000          <1> 	call	remove_file ; (FILE.ASM, 'proc_delete_file')
  4443                              <1> 	;jnc	loc_print_deleted_message
  4444                              <1> 	; 28/07/2022
  4445 0000950C 7205                <1> 	jc	short loc_delete_file_err1
  4446 0000950E E961FAFFFF          <1> 	jmp	loc_print_deleted_message
  4447                              <1> 
  4448                              <1> loc_delete_file_err1:
  4449                              <1> 	;cmp	al, 05h
  4450 00009513 3C0B                <1> 	cmp	al, ERR_PERM_DENIED  ; 29/12/2017 (5 -> 11)
  4451                              <1> 	;je	loc_permission_denied
  4452                              <1> 	; 28/07/2022
  4453 00009515 7505                <1> 	jne	short loc_delete_file_err2
  4454 00009517 E96CFAFFFF          <1> 	jmp	loc_permission_denied
  4455                              <1> loc_delete_file_err2:
  4456 0000951C F9                  <1> 	stc
  4457 0000951D E95CFAFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4458                              <1> 
  4459                              <1> loc_delfile_y_n_escape:
  4460 00009522 B04E                <1> 	mov	al, 'N' ; 'no'
  4461 00009524 EBBF                <1> 	jmp	short loc_do_not_delete_file
  4462                              <1> 
  4463                              <1> set_file_attributes:
  4464                              <1> 	; 26/09/2024 (TRDOS 386 v2.0.9)
  4465                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  4466                              <1> 	; 06/03/2016
  4467                              <1> 	; 04/03/2016 (TRDOS 386 = TRDOS v2.0)
  4468                              <1> 	; 10/07/2010 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_attrib')
  4469                              <1> 	; 23/05/2010 
  4470                              <1> 	; 17/12/2000 (P2000.ASM)
  4471                              <1> 
  4472                              <1> 	; esi = file or directory name
  4473                              <1> 	;xor	ax, ax
  4474                              <1> 	; 28/07/2022
  4475 00009526 31C0                <1> 	xor	eax, eax
  4476 00009528 66A3[F8390100]      <1> 	mov	[Attr_Chars], ax
  4477 0000952E A2[6C870100]        <1> 	mov	[Attributes], al
  4478                              <1> 
  4479                              <1> get_attrib_fchar:
  4480                              <1> 	; esi = file name
  4481 00009533 8A06                <1> 	mov	al, [esi]
  4482 00009535 3C20                <1> 	cmp	al, 20h
  4483 00009537 7621                <1> 	jna	short loc_attr_file_nofilename_retn
  4484                              <1> 
  4485                              <1> loc_scan_attrib_params:
  4486 00009539 3C2D                <1> 	cmp	al, '-'
  4487                              <1> 	;ja	loc_attr_file_parse_path_name
  4488                              <1> 	;je	short loc_attr_space
  4489                              <1> 	; 28/07/2022
  4490 0000953B 7207                <1> 	jb	short loc_sfa_1
  4491 0000953D 740E                <1> 	je	short loc_attr_space
  4492 0000953F E911010000          <1> 	jmp	loc_attr_file_parse_path_name
  4493                              <1> 
  4494                              <1> loc_sfa_1:
  4495                              <1> 	; 28/07/2022
  4496 00009544 3C2B                <1> 	cmp	al, '+'
  4497                              <1> 	;jne	loc_cmd_failed
  4498 00009546 7405                <1> 	je	short loc_attr_space
  4499                              <1> loc_sfa_2:
  4500 00009548 E9F7F0FFFF          <1> 	jmp	loc_cmd_failed
  4501                              <1> loc_attr_space:
  4502 0000954D 8A6601              <1> 	mov	ah, [esi+1]
  4503 00009550 80FC20              <1>  	cmp	ah, 20h
  4504 00009553 7706                <1> 	ja	short pass_attr_space
  4505                              <1> 	;jb	loc_cmd_failed
  4506                              <1> 	; 28/07/2022
  4507 00009555 72F1                <1> 	jb	short loc_sfa_2
  4508 00009557 46                  <1> 	inc	esi
  4509 00009558 EBF3                <1> 	jmp	short loc_attr_space
  4510                              <1> 
  4511                              <1> loc_attr_file_nofilename_retn:
  4512 0000955A C3                  <1> 	retn
  4513                              <1> 
  4514                              <1> pass_attr_space:
  4515 0000955B 80E4DF              <1> 	and	ah, 0DFh
  4516 0000955E 80FC53              <1> 	cmp	ah, 'S'
  4517                              <1> 	;ja	loc_cmd_failed
  4518                              <1> 	; 28/07/2022
  4519 00009561 77E5                <1> 	ja	short loc_sfa_2
  4520 00009563 7204                <1> 	jb	short pass_attr_system
  4521 00009565 B404                <1> 	mov	ah, 04h	; System
  4522 00009567 EB1D                <1> 	jmp	short pass_attr_archive
  4523                              <1> 
  4524                              <1> pass_attr_system:
  4525 00009569 80FC48              <1> 	cmp	ah, 'H'
  4526 0000956C 7706                <1> 	ja	short pass_attr_hidden
  4527 0000956E 720F                <1> 	jb	short pass_attr_read_only
  4528 00009570 B402                <1> 	mov	ah, 02h	; Hidden
  4529 00009572 EB12                <1> 	jmp	short pass_attr_archive
  4530                              <1> 
  4531                              <1> pass_attr_hidden:
  4532 00009574 80FC52              <1> 	cmp	ah, 'R'
  4533                              <1> 	;ja	loc_cmd_failed
  4534                              <1> 	; 28/07/2022
  4535 00009577 77CF                <1> 	ja	short loc_sfa_2
  4536 00009579 7204                <1> 	jb	short pass_attr_read_only ; Read only
  4537 0000957B B401                <1> 	mov	ah, 01h
  4538 0000957D EB07                <1> 	jmp	short pass_attr_archive
  4539                              <1> 
  4540                              <1> pass_attr_read_only:
  4541 0000957F 80FC41              <1> 	cmp	ah, 'A'
  4542 00009582 753B                <1> 	jne	short loc_chk_attr_enter
  4543 00009584 B420                <1> 	mov	ah, 20h	; Archive
  4544                              <1> 
  4545                              <1> pass_attr_archive:
  4546 00009586 3C2D                <1> 	cmp	al, '-'
  4547 00009588 7508                <1> 	jne	short pass_reducing_attributes
  4548 0000958A 0825[F8390100]      <1> 	or	[Attr_Chars], ah
  4549 00009590 EB06                <1> 	jmp	short loc_change_attributes_inc
  4550                              <1> 
  4551                              <1> pass_reducing_attributes:
  4552 00009592 0825[F9390100]      <1> 	or	[Attr_Chars+1], ah
  4553                              <1> 
  4554                              <1> loc_change_attributes_inc:
  4555 00009598 46                  <1> 	inc	esi
  4556 00009599 8A6601              <1> 	mov	ah, [esi+1]
  4557 0000959C 80FC20              <1> 	cmp	ah, 20h
  4558 0000959F 7228                <1> 	jb	short pass_change_attr
  4559 000095A1 74F5                <1> 	je	short loc_change_attributes_inc
  4560 000095A3 80FC2D              <1> 	cmp	ah, '-'
  4561 000095A6 770D                <1> 	ja	short loc_chk_next_attr_char1
  4562 000095A8 7405                <1> 	je	short loc_chk_next_attr_char0
  4563 000095AA 80FC2B              <1> 	cmp	ah, '+'
  4564 000095AD 7506                <1> 	jne	short loc_chk_next_attr_char1
  4565                              <1> 
  4566                              <1> loc_chk_next_attr_char0:
  4567 000095AF 46                  <1> 	inc	esi
  4568 000095B0 668B06              <1> 	mov	ax, [esi]
  4569 000095B3 EBA6                <1> 	jmp	short pass_attr_space
  4570                              <1> 
  4571                              <1> loc_chk_next_attr_char1:
  4572 000095B5 803E2D              <1> 	cmp	byte [esi], '-'
  4573 000095B8 77A1                <1> 	ja	short pass_attr_space
  4574 000095BA E989000000          <1>         jmp     loc_attr_file_check_fname_fchar
  4575                              <1> 
  4576                              <1> loc_chk_attr_enter:
  4577 000095BF 80FC0D              <1> 	cmp	ah, 0Dh
  4578                              <1> 	;jne	loc_cmd_failed
  4579                              <1> 	; 28/07/202
  4580 000095C2 7405                <1> 	je	short pass_change_attr
  4581 000095C4 E97BF0FFFF          <1> 	jmp	loc_cmd_failed
  4582                              <1> 
  4583                              <1> pass_change_attr:
  4584 000095C9 A0[F8390100]        <1> 	mov	al, [Attr_Chars]
  4585 000095CE F6D0                <1> 	not	al
  4586 000095D0 2005[6C870100]      <1> 	and	[Attributes], al
  4587 000095D6 A0[F9390100]        <1> 	mov	al, [Attr_Chars+1]
  4588 000095DB 0805[6C870100]      <1> 	or	[Attributes], al
  4589                              <1> 
  4590                              <1> loc_show_attributes:
  4591 000095E1 BE[5B3F0100]        <1> 	mov	esi, nextline
  4592 000095E6 E87FD7FFFF          <1> 	call	print_msg
  4593                              <1> 
  4594                              <1> loc_show_attributes_no_nextline:
  4595 000095EB C705[F8390100]4E4F- <1> 	mov	dword [Attr_Chars], 'NORM'
  4595 000095F3 524D                <1>
  4596 000095F5 66C705[FC390100]41- <1> 	mov	word [Attr_Chars+4], 'AL'
  4596 000095FD 4C                  <1>
  4597 000095FE BE[F8390100]        <1> 	mov	esi, Attr_Chars
  4598 00009603 A0[6C870100]        <1> 	mov	al, [Attributes]
  4599 00009608 A804                <1> 	test	al, 04h
  4600 0000960A 7406                <1> 	jz	short pass_put_attr_s
  4601 0000960C 66C7065300          <1> 	mov	word [esi], 0053h     ; S
  4602 00009611 46                  <1> 	inc	esi
  4603                              <1> 
  4604                              <1> pass_put_attr_s:
  4605 00009612 A802                <1> 	test	al, 02h
  4606 00009614 7406                <1> 	jz	short pass_put_attr_h
  4607 00009616 66C7064800          <1> 	mov	word [esi], 0048h     ; H
  4608 0000961B 46                  <1> 	inc	esi
  4609                              <1> 
  4610                              <1> pass_put_attr_h:
  4611 0000961C A801                <1> 	test	al, 01h
  4612 0000961E 7406                <1> 	jz	short pass_put_attr_r
  4613 00009620 66C7065200          <1> 	mov	word [esi], 0052h     ; R
  4614 00009625 46                  <1> 	inc	esi
  4615                              <1> 
  4616                              <1> pass_put_attr_r:
  4617 00009626 3C20                <1> 	cmp	al, 20h
  4618 00009628 7205                <1> 	jb	short pass_put_attr_a
  4619 0000962A 66C7064100          <1> 	mov	word [esi], 0041h     ; A
  4620                              <1> 
  4621                              <1> pass_put_attr_a:
  4622 0000962F BE[EB390100]        <1> 	mov	esi, Str_Attributes
  4623 00009634 E831D7FFFF          <1> 	call	print_msg
  4624 00009639 BE[5B3F0100]        <1> 	mov	esi, nextline
  4625 0000963E E827D7FFFF          <1> 	call	print_msg
  4626 00009643 E936F9FFFF          <1> 	jmp	loc_file_rw_restore_retn 
  4627                              <1> 
  4628                              <1> loc_attr_file_check_fname_fchar:
  4629 00009648 46                  <1> 	inc	esi
  4630 00009649 803E20              <1> 	cmp	byte [esi], 20h
  4631 0000964C 74FA                <1> 	je	short loc_attr_file_check_fname_fchar
  4632                              <1>         ;jb	pass_change_attr
  4633                              <1> 	; 28/07/2022
  4634 0000964E 7705                <1> 	ja	short loc_attr_file_parse_path_name
  4635 00009650 E974FFFFFF          <1> 	jmp	pass_change_attr
  4636                              <1> 
  4637                              <1> loc_attr_file_parse_path_name:
  4638 00009655 BF[52860100]        <1> 	mov	edi, FindFile_Drv
  4639 0000965A E806160000          <1> 	call	parse_path_name
  4640                              <1> 	;jc	loc_cmd_failed
  4641                              <1> 	; 28/07/2022
  4642 0000965F 7305                <1> 	jnc	short loc_attr_file_check_filename_exists
  4643                              <1> loc_sfa_3:
  4644 00009661 E9DEEFFFFF          <1> 	jmp	loc_cmd_failed
  4645                              <1> 
  4646                              <1> loc_attr_file_check_filename_exists:
  4647 00009666 BE[94860100]        <1> 	mov	esi, FindFile_Name
  4648 0000966B 803E20              <1> 	cmp	byte [esi], 20h
  4649                              <1> 	;jna	loc_cmd_failed
  4650                              <1> 	; 28/07/2022
  4651 0000966E 76F1                <1> 	jna	short loc_sfa_3
  4652 00009670 8935[10870100]      <1> 	mov	[DelFile_FNPointer], esi
  4653                              <1> 
  4654                              <1> loc_attr_file_drv:
  4655 00009676 8A35[B27D0100]      <1> 	mov	dh, [Current_Drv]
  4656 0000967C 8835[0F850100]      <1> 	mov	[RUN_CDRV], dh
  4657                              <1> 
  4658 00009682 8A15[52860100]      <1> 	mov	dl, [FindFile_Drv]
  4659 00009688 38F2                <1> 	cmp	dl, dh
  4660 0000968A 7407                <1> 	je	short loc_attr_file_change_directory
  4661                              <1> 
  4662 0000968C E8ECE1FFFF          <1> 	call	change_current_drive
  4663                              <1> 	;jc	loc_file_rw_cmd_failed
  4664                              <1> 	; 28/07/2022
  4665 00009691 722E                <1> 	jc	short loc_sfa_4
  4666                              <1> 
  4667                              <1> loc_attr_file_change_directory:
  4668 00009693 803D[53860100]20    <1>         cmp     byte [FindFile_Directory], 20h
  4669 0000969A 7614                <1> 	jna	short loc_attr_file_find
  4670                              <1> 
  4671 0000969C FE05[CF340100]      <1> 	inc	byte [Restore_CDIR]
  4672                              <1> 
  4673 000096A2 BE[53860100]        <1> 	mov	esi, FindFile_Directory
  4674 000096A7 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0
  4675 000096A9 E8CD0F0000          <1> 	call	change_current_directory
  4676                              <1> 	;jc	loc_file_rw_cmd_failed
  4677                              <1> 	; 28/07/2022
  4678 000096AE 7211                <1> 	jc	short loc_sfa_4
  4679                              <1> 
  4680                              <1> ;loc_attr_file_change_prompt_dir_string:
  4681                              <1> 	;call	change_prompt_dir_string
  4682                              <1> 
  4683                              <1> loc_attr_file_find:
  4684                              <1> 	;mov	esi, FindFile_Name
  4685 000096B0 8B35[10870100]      <1> 	mov	esi, [DelFile_FNPointer]
  4686 000096B6 66B80008            <1> 	mov	ax, 0800h ; Except volume labels
  4687 000096BA E8ABF4FFFF          <1> 	call	find_first_file
  4688                              <1> 	;jc	loc_file_rw_cmd_failed
  4689                              <1> 	; 28/07/2022
  4690 000096BF 7305                <1> 	jnc	short loc_attr_file_ambgfn_check
  4691                              <1> loc_sfa_4:
  4692 000096C1 E9B8F8FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4693                              <1> 
  4694                              <1> loc_attr_file_ambgfn_check:
  4695 000096C6 6609D2              <1> 	or	dx, dx ; Ambiguous filename chars used sign (DX>0)
  4696                              <1> 	;	(Note: It was BX in TRDOS v1)
  4697                              <1> 	;;jz	short loc_attr_file_found
  4698                              <1> 	;jnz	loc_file_not_found ; 06/03/2016
  4699                              <1> 	; 28/07/2022
  4700 000096C9 7405                <1> 	jz	short loc_attr_file_found
  4701 000096CB E9C7FDFFFF          <1> 	jmp	loc_file_not_found
  4702                              <1> 
  4703                              <1> 	;mov	eax, 2 ; File not found sign
  4704                              <1> 	;stc
  4705                              <1> 	;jmp	loc_file_rw_cmd_failed
  4706                              <1> 
  4707                              <1> loc_attr_file_found:
  4708                              <1> 	; EDI = Directory buffer entry offset/address
  4709                              <1> 	; BL = File (or Directory) Attributes
  4710                              <1> 	;	(Note: It was 'CL' in TRDOS v1)
  4711                              <1> 	; mov	bl, [EDI+0Bh]
  4712                              <1> 
  4713 000096D0 66833D[F8390100]00  <1> 	cmp	word [Attr_Chars], 0
  4714 000096D8 770B                <1> 	ja	short loc_attr_file_change_attributes
  4715 000096DA 881D[6C870100]      <1> 	mov	[Attributes], bl
  4716 000096E0 E9FCFEFFFF          <1> 	jmp	loc_show_attributes
  4717                              <1> 
  4718                              <1> loc_attr_file_change_attributes:
  4719 000096E5 A0[F8390100]        <1> 	mov	al, [Attr_Chars]
  4720 000096EA F6D0                <1> 	not	al
  4721 000096EC 20C3                <1> 	and	bl, al
  4722 000096EE A0[F9390100]        <1> 	mov	al, [Attr_Chars+1]
  4723 000096F3 08C3                <1> 	or	bl, al
  4724                              <1> 
  4725 000096F5 66817F0CA101        <1> 	cmp	word [edi+DirEntry_NTRes], 01A1h ; Singlix FS
  4726 000096FB 741C                <1> 	je	short loc_attr_file_fs_check
  4727                              <1> 
  4728 000096FD 881D[6C870100]      <1> 	mov	[Attributes], bl
  4729 00009703 885F0B              <1> 	mov	[edi+0Bh], bl    ; Attributes (New!)
  4730                              <1> 
  4731                              <1> 	; 04/03/2016
  4732                              <1> 	; TRDOS v1 has a bug here! it does not set
  4733                              <1> 	; 'DirBuff_ValidData' to 2; as result of this bug,
  4734                              <1> 	; 'save_directory_buffer' would not save the new attributes !
  4735                              <1> 
  4736 00009706 C605[D9840100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  4737                              <1> 
  4738 0000970D E88A190000          <1> 	call 	save_directory_buffer
  4739                              <1> 	;jc	loc_file_rw_cmd_failed
  4740                              <1> 	;jmp	short loc_print_attr_changed_message
  4741                              <1> 	; 28/07/2022
  4742 00009712 7337                <1> 	jnc	short loc_print_attr_changed_message
  4743                              <1> loc_sfa_5:
  4744 00009714 E965F8FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4745                              <1> 
  4746                              <1> loc_attr_file_fs_check:
  4747 00009719 29C0                <1> 	sub	eax, eax
  4748 0000971B 8A25[D7840100]      <1>         mov     ah, [DirBuff_DRV]
  4749                              <1> 	; 26/09/2024 (BugFix)
  4750 00009721 80EC41              <1> 	sub	ah, 'A'
  4751 00009724 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  4752 00009729 01C6                <1>         add     esi, eax
  4753 0000972B 807E04A1            <1>         cmp     byte [esi+LD_FSType], 0A1h
  4754 0000972F 7309                <1> 	jnc	short loc_attr_file_change_fs_file_attributes
  4755                              <1> 	; 29/12/2017 (0Dh -> 29)
  4756 00009731 66B81D00            <1> 	mov	ax, 29 ; Invalid Data
  4757 00009735 E944F8FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4758                              <1> 
  4759                              <1> loc_attr_file_change_fs_file_attributes:
  4760                              <1> 	; BL = New MS-DOS File Attributes
  4761 0000973A 88D8                <1> 	mov	al, bl ; File/Directory Attributes
  4762 0000973C 30E4                <1> 	xor	ah, ah ; Attributes in MS-DOS format sign
  4763 0000973E E834050000          <1> 	call	change_fs_file_attributes
  4764                              <1> 	;jc	loc_file_rw_cmd_failed
  4765                              <1> 	; 28/07/2022
  4766 00009743 72CF                <1> 	jc	short loc_sfa_5
  4767                              <1> 
  4768 00009745 881D[6C870100]      <1> 	mov	[Attributes], bl
  4769                              <1> 
  4770                              <1> loc_print_attr_changed_message:
  4771 0000974B BE[E6390100]        <1> 	mov	esi, Msg_New
  4772 00009750 E815D6FFFF          <1> 	call	print_msg
  4773 00009755 E991FEFFFF          <1> 	jmp	loc_show_attributes_no_nextline
  4774                              <1> 
  4775                              <1> rename_file:
  4776                              <1> 	; 25/07/2025 (BugFix)
  4777                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  4778                              <1> 	; 13/11/2017
  4779                              <1> 	; 06/11/2016
  4780                              <1> 	; 05/11/2016
  4781                              <1> 	; 16/10/2016
  4782                              <1> 	; 08/03/2016
  4783                              <1> 	; 06/03/2016 (TRDOS 386 = TRDOS v2.0)
  4784                              <1> 	; 20/11/2010 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_rename')
  4785                              <1> 	; 16/11/2010 
  4786                              <1> 
  4787                              <1> get_rename_source_fchar:
  4788                              <1> 	; esi = file name
  4789 0000975A 803E20              <1> 	cmp	byte [esi], 20h
  4790 0000975D 7613                <1>         jna	short loc_rename_nofilename_retn
  4791                              <1> 
  4792 0000975F 8935[94870100]      <1> 	mov	[SourceFilePath], esi
  4793                              <1> 
  4794                              <1> rename_scan_source_file:
  4795 00009765 46                  <1> 	inc	esi
  4796 00009766 803E20              <1> 	cmp	byte [esi], 20h
  4797 00009769 7408                <1> 	je	short rename_scan_destination_file_1
  4798                              <1> 	;;jb	short loc_rename_nofilename_retn
  4799                              <1> 	;jb	loc_cmd_failed
  4800                              <1> 	;jmp	short rename_scan_source_file
  4801                              <1> 	; 28/07/2022
  4802 0000976B 77F8                <1> 	ja	short rename_scan_source_file
  4803                              <1> loc_rename_failed:
  4804 0000976D E9D2EEFFFF          <1> 	jmp	loc_cmd_failed
  4805                              <1> 
  4806                              <1> loc_rename_nofilename_retn: ; 08/03/2016
  4807 00009772 C3                  <1> 	retn
  4808                              <1> 
  4809                              <1> rename_scan_destination_file_1:
  4810 00009773 C60600              <1> 	mov	byte [esi], 0
  4811                              <1> 
  4812                              <1> rename_scan_destination_file_2:
  4813 00009776 46                  <1> 	inc	esi
  4814 00009777 803E20              <1> 	cmp	byte [esi], 20h
  4815 0000977A 74FA                <1> 	je	short rename_scan_destination_file_2
  4816                              <1> 	;;jb	short loc_rename_nofilename_retn
  4817                              <1> 	;jb	loc_cmd_failed
  4818                              <1> 	; 28/07/2022
  4819 0000977C 72EF                <1> 	jb	short loc_rename_failed
  4820                              <1> 
  4821 0000977E 8935[98870100]      <1> 	mov	[DestinationFilePath], esi
  4822                              <1> 
  4823                              <1> rename_scan_destination_file_3:
  4824 00009784 46                  <1> 	inc	esi  
  4825 00009785 803E20              <1> 	cmp	byte [esi], 20h
  4826 00009788 77FA                <1> 	ja	short rename_scan_destination_file_3
  4827                              <1> 
  4828 0000978A C60600              <1> 	mov	byte [esi], 0
  4829                              <1> 
  4830                              <1> loc_rename_save_current_drive:
  4831 0000978D 8A35[B27D0100]      <1> 	mov	dh, [Current_Drv]
  4832 00009793 8835[0F850100]      <1> 	mov	byte [RUN_CDRV], dh
  4833                              <1> 
  4834                              <1> loc_rename_sf_parse_path_name:
  4835 00009799 8B35[94870100]      <1> 	mov	esi, [SourceFilePath]
  4836 0000979F BF[52860100]        <1> 	mov	edi, FindFile_Drv
  4837 000097A4 E8BC140000          <1> 	call	parse_path_name
  4838                              <1> 	;jc	loc_cmd_failed
  4839                              <1> 	; 28/07/2022
  4840 000097A9 72C2                <1> 	jc	short loc_rename_failed
  4841                              <1> 
  4842                              <1> loc_rename_sf_check_filename_exists:
  4843 000097AB BE[94860100]        <1> 	mov	esi, FindFile_Name
  4844 000097B0 803E20              <1> 	cmp	byte [esi], 20h
  4845                              <1> 	;jna	loc_cmd_failed
  4846                              <1> 	; 28/07/2022
  4847 000097B3 76B8                <1> 	jna	short loc_rename_failed
  4848                              <1> 
  4849                              <1> 	;mov	[DelFile_FNPointer], esi
  4850                              <1> 
  4851                              <1> loc_rename_sf_drv:
  4852                              <1> 	;mov	dh, [Current_Drv]
  4853                              <1> 	;mov	[RUN_CDRV], dh
  4854                              <1> 
  4855 000097B5 8A15[52860100]      <1> 	mov	dl, [FindFile_Drv]
  4856 000097BB 38F2                <1> 	cmp	dl, dh ; dh = [Current_Drv]
  4857 000097BD 7407                <1> 	je	short rename_sf_change_directory
  4858                              <1> 
  4859 000097BF E8B9E0FFFF          <1> 	call	change_current_drive
  4860                              <1>  	;jc	loc_file_rw_cmd_failed
  4861                              <1> 	; 28/07/2022
  4862 000097C4 722D                <1> 	jc	short loc_rename_fff_failed
  4863                              <1> 
  4864                              <1> rename_sf_change_directory:
  4865 000097C6 803D[53860100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  4866 000097CD 7614                <1> 	jna	short rename_sf_find
  4867                              <1> 
  4868 000097CF FE05[CF340100]      <1> 	inc	byte [Restore_CDIR]
  4869 000097D5 BE[53860100]        <1> 	mov	esi, FindFile_Directory
  4870 000097DA 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0
  4871 000097DC E89A0E0000          <1> 	call	change_current_directory
  4872                              <1>  	;jc	loc_file_rw_cmd_failed
  4873                              <1> 	; 28/07/2022
  4874 000097E1 7210                <1> 	jc	short loc_rename_fff_failed
  4875                              <1> 
  4876                              <1> ;rename_sf_change_prompt_dir_string:
  4877                              <1> 	;call	change_prompt_dir_string
  4878                              <1> 
  4879                              <1> rename_sf_find:
  4880                              <1> 	;mov	esi, [DelFile_FNPointer]
  4881 000097E3 BE[94860100]        <1> 	mov	esi, FindFile_Name
  4882                              <1> 
  4883 000097E8 66B80008            <1> 	mov	ax, 0800h ; Except volume labels
  4884 000097EC E879F3FFFF          <1> 	call	find_first_file
  4885                              <1> 	;jc	loc_file_rw_cmd_failed
  4886                              <1> 	; 28/07/2022
  4887 000097F1 7305                <1> 	jnc	short loc_rename_sf_ambgfn_check
  4888                              <1> 
  4889                              <1> loc_rename_fff_failed:
  4890 000097F3 E986F7FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4891                              <1> 
  4892                              <1> loc_rename_sf_ambgfn_check:
  4893 000097F8 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
  4894                              <1> 	;	(Note: It was BX in TRDOS v1)
  4895                              <1> 	;;jz	short loc_rename_sf_found
  4896                              <1> 	;jnz	loc_file_not_found
  4897                              <1> 	; 28/07/2022
  4898 000097FB 7405                <1> 	jz	short loc_rename_sf_found
  4899 000097FD E995FCFFFF          <1> 	jmp	loc_file_not_found
  4900                              <1> 
  4901                              <1> 	;mov	eax, 2 ; File not found sign
  4902                              <1> 	;stc
  4903                              <1> 	;jmp	loc_file_rw_cmd_failed
  4904                              <1> 
  4905                              <1> loc_rename_sf_found:
  4906                              <1> 	; EDI = Directory buffer entry offset/address
  4907                              <1> 	; BL = File (or Directory) Attributes
  4908                              <1> 	;	(Note: It was 'CL' in TRDOS v1)
  4909                              <1> 	; mov	bl, [EDI+0Bh]
  4910                              <1> 
  4911 00009802 F6C307              <1> 	test	bl, 07h ; Attributes, S-H-R
  4912                              <1> 	;jnz	loc_permission_denied
  4913                              <1> 	; 28/07/2022
  4914 00009805 7405                <1> 	jz	short loc_rename_attrb_ok
  4915 00009807 E97CF7FFFF          <1> 	jmp	loc_permission_denied
  4916                              <1> 
  4917                              <1> loc_rename_attrb_ok:
  4918 0000980C BE[52860100]        <1>         mov     esi, FindFile_Drv
  4919 00009811 BF[9C870100]        <1>         mov     edi, SourceFile_Drv
  4920 00009816 B920000000          <1> 	mov	ecx, 32
  4921 0000981B F3A5                <1> 	rep	movsd
  4922                              <1> 
  4923                              <1> loc_rename_df_parse_path_name:
  4924 0000981D 8B35[98870100]      <1> 	mov	esi, [DestinationFilePath]
  4925 00009823 BF[52860100]        <1> 	mov	edi, FindFile_Drv
  4926 00009828 E838140000          <1> 	call	parse_path_name
  4927 0000982D 7219                <1> 	jc	short loc_rename_df_cmd_failed
  4928                              <1> 
  4929                              <1> 	;mov	dh, [RUN_CDRV]
  4930 0000982F 8A35[B27D0100]      <1> 	mov	dh, [Current_Drv]
  4931                              <1> 
  4932                              <1> 	; 'rename' command is valid only for same dos drive and same dir!
  4933                              <1> 	; ('move' command must be used if source file and destination file
  4934                              <1> 	; directories are not same!)
  4935 00009835 8A15[52860100]      <1> 	mov	dl, [FindFile_Drv]
  4936 0000983B 38F2                <1> 	cmp	dl, dh ; are source and destination drives different ?!
  4937 0000983D 7509                <1> 	jne	short loc_rename_df_cmd_failed ; yes!
  4938                              <1> 
  4939                              <1> rename_df_check_dirname_exists:
  4940 0000983F 803D[53860100]00    <1> 	cmp	byte [FindFile_Directory], 0
  4941 00009846 760B                <1> 	jna	short rename_df_check_filename_exists
  4942                              <1> 
  4943                              <1> 	; different source file and destination file directories !
  4944                              <1> loc_rename_df_cmd_failed:
  4945 00009848 B801000000          <1> 	mov	eax, 1 ; TRDOS 'Bad command or file name' error
  4946 0000984D F9                  <1> 	stc
  4947 0000984E E92BF7FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4948                              <1> 
  4949                              <1> rename_df_check_filename_exists:
  4950 00009853 BE[94860100]        <1> 	mov	esi, FindFile_Name
  4951 00009858 E8B2F6FFFF          <1> 	call	check_filename
  4952                              <1> 	;jc	loc_mkdir_invalid_dir_name_chars
  4953                              <1> 	; 28/07/2022
  4954 0000985D 7305                <1> 	jnc	short loc_rename_file_name_ok
  4955 0000985F E9CCF7FFFF          <1> 	jmp	loc_mkdir_invalid_dir_name_chars
  4956                              <1> 
  4957                              <1> loc_rename_file_name_ok:
  4958                              <1> 	;mov	[DelFile_FNPointer], esi
  4959                              <1> 	;cmp	byte [esi], 20h
  4960                              <1> 	;ja	short loc_rename_df_find
  4961                              <1> 
  4962                              <1> 	;mov	dh, [Current_Drv] ; dh has not been changed
  4963                              <1> 
  4964                              <1> rename_df_drv_check_writable:
  4965                              <1> 	;movzx	esi, dh
  4966                              <1> 	;;movzx	esi, byte [Current_Drv]
  4967                              <1> 	;add	esi, Logical_DOSDisks
  4968                              <1> 	; 25/07/2025 (BugFix)
  4969 00009864 31C0                <1> 	xor	eax, eax
  4970 00009866 88F4                <1> 	mov	ah, dh
  4971 00009868 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  4972 0000986D 01C6                <1> 	add	esi, eax
  4973                              <1> 
  4974 0000986F 88F2                <1> 	mov	dl, dh ; dl = [Current_Drv]
  4975 00009871 8A7601              <1> 	mov	dh, [esi+LD_DiskType]
  4976                              <1> 
  4977 00009874 80FE01              <1> 	cmp	dh, 1 ; 0 = Invalid
  4978 00009877 7310                <1> 	jnb	short rename_df_compare_sf_df_name
  4979                              <1> 
  4980                              <1> 	; 16/10/2016 (13h -> 30)
  4981 00009879 B81E000000          <1> 	mov	eax, 30 ; 'Disk write-protected' error
  4982 0000987E 8B1D[98870100]      <1> 	mov	ebx, [DestinationFilePath]
  4983 00009884 E9F5F6FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4984                              <1> 
  4985                              <1> rename_df_compare_sf_df_name:
  4986 00009889 BE[94860100]        <1> 	mov	esi, FindFile_Name
  4987 0000988E BF[DE870100]        <1> 	mov	edi, SourceFile_Name
  4988                              <1> 	;mov	ecx, 12
  4989                              <1> 	; 28/07/2022
  4990 00009893 29C9                <1> 	sub	ecx, ecx
  4991 00009895 B10C                <1> 	mov	cl, 12
  4992                              <1> rename_df_compare_sf_df_name_next:
  4993 00009897 AC                  <1> 	lodsb
  4994 00009898 AE                  <1> 	scasb
  4995 00009899 7506                <1> 	jne	short loc_rename_df_find
  4996 0000989B 08C0                <1> 	or	al, al
  4997 0000989D 74A9                <1> 	jz	short loc_rename_df_cmd_failed
  4998 0000989F E2F6                <1> 	loop	rename_df_compare_sf_df_name_next
  4999                              <1> 
  5000                              <1> loc_rename_df_find:
  5001                              <1> 	;mov	esi, [DelFile_FNPointer]
  5002 000098A1 BE[94860100]        <1> 	mov	esi, FindFile_Name
  5003                              <1> 
  5004                              <1> 	;xor	ax, ax ; Any
  5005                              <1> 	; 28/07/2022
  5006 000098A6 31C0                <1> 	xor	eax, eax ; 0 ; Any
  5007 000098A8 E8BDF2FFFF          <1> 	call	find_first_file
  5008                              <1> 	;;jnc	short loc_rename_df_found
  5009                              <1> 	;; 29/12/2017
  5010                              <1> 	;jnc	loc_permission_denied
  5011                              <1> 	; 28/07/2022
  5012 000098AD 7205                <1> 	jc	short loc_rename_df_check_error_code
  5013 000098AF E9D4F6FFFF          <1> 	jmp	loc_permission_denied
  5014                              <1> 
  5015                              <1> loc_rename_df_check_error_code:
  5016                              <1> 	;cmp	eax, 2
  5017 000098B4 3C02                <1> 	cmp	al, 2 ; Not found error
  5018 000098B6 7406                <1> 	je	short rename_df_move_find_struct_to_dest
  5019 000098B8 F9                  <1> 	stc
  5020 000098B9 E9C0F6FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  5021                              <1> 
  5022                              <1> ;loc_rename_df_found:
  5023                              <1> 	; 05/11/2016
  5024                              <1> 	; Permission denied error
  5025                              <1> 	;mov	eax, ERR_PERM_DENIED ; 29/12/2017
  5026                              <1> 	;stc
  5027                              <1> 	;jmp	loc_permission_denied  ; 06/11/2016
  5028                              <1> 
  5029                              <1> rename_df_move_find_struct_to_dest:
  5030 000098BE BE[52860100]        <1>         mov     esi, FindFile_Drv
  5031 000098C3 BF[1C880100]        <1>         mov     edi, DestinationFile_Drv
  5032                              <1> 	;mov	ecx, 32
  5033                              <1> 	; 28/07/2022
  5034 000098C8 29C9                <1> 	sub	ecx, ecx
  5035 000098CA B120                <1> 	mov	cl, 32
  5036 000098CC F3A5                <1> 	rep	movsd
  5037                              <1> 
  5038                              <1> loc_rename_df_process_q_sf:
  5039                              <1> 	;mov	ecx, 12
  5040 000098CE B10C                <1> 	mov	cl, 12
  5041 000098D0 BE[DE870100]        <1>  	mov	esi, SourceFile_Name
  5042 000098D5 BF[273A0100]        <1> 	mov	edi, Rename_OldName
  5043                              <1> rename_df_process_q_nml_1_sf:
  5044 000098DA AC                  <1> 	lodsb
  5045 000098DB 3C20                <1>         cmp	al, 20h
  5046 000098DD 7603                <1>         jna	short rename_df_process_q_nml_2_sf
  5047 000098DF AA                  <1> 	stosb
  5048 000098E0 E2F8                <1> 	loop	rename_df_process_q_nml_1_sf
  5049                              <1> 
  5050                              <1> rename_df_process_q_nml_2_sf:
  5051 000098E2 C60700              <1> 	mov	byte [edi], 0
  5052                              <1> 
  5053                              <1> loc_rename_df_process_q_df:
  5054                              <1> 	;mov	ecx, 12
  5055 000098E5 B10C                <1> 	mov	cl, 12
  5056 000098E7 BE[5E880100]        <1> 	mov	esi, DestinationFile_Name
  5057 000098EC BF[383A0100]        <1> 	mov	edi, Rename_NewName
  5058                              <1> rename_df_process_q_nml_1_df:
  5059 000098F1 AC                  <1> 	lodsb
  5060 000098F2 3C20                <1> 	cmp	al, 20h
  5061 000098F4 7603                <1> 	jna	short loc_rename_df_process_q_nml_2_df
  5062 000098F6 AA                  <1> 	stosb
  5063 000098F7 E2F8                <1> 	loop	rename_df_process_q_nml_1_df
  5064                              <1> 
  5065                              <1> loc_rename_df_process_q_nml_2_df:
  5066 000098F9 C60700              <1> 	mov	byte [edi], 0
  5067                              <1> 
  5068                              <1> loc_rename_confirmation_question:
  5069 000098FC BE[FF390100]        <1> 	mov	esi, Msg_DoYouWantRename
  5070 00009901 E864D4FFFF          <1> 	call	print_msg
  5071                              <1> 
  5072 00009906 A0[F9870100]        <1> 	mov	al, [SourceFile_DirEntry+11] ; Attributes
  5073 0000990B 2410                <1> 	and	al, 10h
  5074 0000990D 750C                <1> 	jnz	short rename_confirmation_question_dir
  5075                              <1> 
  5076                              <1> rename_confirmation_question_file:
  5077 0000990F BE[163A0100]        <1> 	mov	esi, Rename_File
  5078 00009914 E851D4FFFF          <1> 	call	print_msg 
  5079 00009919 EB0A                <1> 	jmp	short rename_confirmation_question_as
  5080                              <1> 
  5081                              <1> rename_confirmation_question_dir:
  5082 0000991B BE[1C3A0100]        <1> 	mov	esi, Rename_Directory
  5083 00009920 E845D4FFFF          <1> 	call	print_msg
  5084                              <1> 
  5085                              <1> rename_confirmation_question_as:
  5086 00009925 BE[273A0100]        <1> 	mov	esi, Rename_OldName
  5087 0000992A E83BD4FFFF          <1> 	call	print_msg
  5088 0000992F BE[343A0100]        <1> 	mov	esi, Msg_File_rename_as
  5089 00009934 E831D4FFFF          <1> 	call	print_msg
  5090 00009939 BE[5B390100]        <1> 	mov	esi, Msg_YesNo
  5091 0000993E E827D4FFFF          <1> 	call	print_msg
  5092                              <1> 
  5093                              <1> loc_rename_ask_again:
  5094 00009943 30E4                <1> 	xor	ah, ah
  5095 00009945 E8D275FFFF          <1> 	call	int16h
  5096 0000994A 3C1B                <1> 	cmp	al, 1Bh
  5097 0000994C 740F                <1> 	je	short loc_do_not_rename_file
  5098 0000994E 24DF                <1> 	and	al, 0DFh
  5099 00009950 A2[65390100]        <1> 	mov	[Y_N_nextline], al
  5100 00009955 3C59                <1> 	cmp	al, 'Y'
  5101 00009957 7404                <1> 	je	short loc_yes_rename_file
  5102 00009959 3C4E                <1> 	cmp	al, 'N'
  5103 0000995B 75E6                <1> 	jne	short loc_rename_ask_again
  5104                              <1> 
  5105                              <1> loc_do_not_rename_file:
  5106                              <1> loc_yes_rename_file:
  5107 0000995D E84FF7FFFF          <1> 	call	y_n_answer ; 29/12/2017
  5108                              <1> 	;cmp	al, 'Y' ; 'yes'
  5109                              <1> 	;cmc
  5110                              <1>         ;jnc	loc_file_rw_restore_retn
  5111 00009962 3C4E                <1> 	cmp	al, 'N' ; 'no'
  5112                              <1> 	;je	loc_file_rw_restore_retn
  5113                              <1> 	; 28/07/2022
  5114 00009964 7505                <1> 	jne	short loc_rename_file_yes
  5115 00009966 E913F6FFFF          <1> 	jmp	loc_file_rw_restore_retn
  5116                              <1> 
  5117                              <1> loc_rename_file_yes: ; 28/07/2022
  5118 0000996B BE[383A0100]        <1> 	mov	esi, Rename_NewName
  5119 00009970 668B0D[16880100]    <1> 	mov	cx, [SourceFile_DirEntryNumber]
  5120 00009977 66A1[02880100]      <1> 	mov	ax, [SourceFile_DirEntry+20] ; First Cluster, HW
  5121 0000997D C1E010              <1> 	shl	eax, 16 ; 13/11/2017
  5122 00009980 66A1[08880100]      <1> 	mov	ax, [SourceFile_DirEntry+26] ; First Cluster, LW
  5123                              <1> 
  5124 00009986 0FB61D[EB870100]    <1>   	movzx	ebx, byte [SourceFile_LongNameEntryLength]
  5125 0000998D E8D71A0000          <1>    	call	rename_directory_entry
  5126 00009992 E900F7FFFF          <1> 	jmp	loc_rename_file_ok
  5127                              <1> ;loc_rename_file_ok:
  5128                              <1> ;	jc	loc_run_cmd_failed
  5129                              <1> ;	mov	esi, Msg_OK
  5130                              <1> ;	call	proc_printmsg
  5131                              <1> ;	jmp	loc_file_rw_restore_retn
  5132                              <1> 
  5133                              <1> move_file:
  5134                              <1> 	; 07/08/2022
  5135                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  5136                              <1> 	; 11/03/2016
  5137                              <1> 	; 09/03/2016
  5138                              <1> 	; 08/03/2016 (TRDOS 386 = TRDOS v2.0)
  5139                              <1> 	; 21/05/2011 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_move')
  5140                              <1> 	; 23/04/2011
  5141                              <1> 
  5142                              <1> get_move_source_fchar:
  5143                              <1> 	; esi = file name
  5144 00009997 803E20              <1> 	cmp	byte [esi], 20h
  5145 0000999A 7613                <1>         jna	short loc_move_nofilename_retn
  5146                              <1> 
  5147 0000999C 8935[94870100]      <1> 	mov	[SourceFilePath], esi
  5148                              <1> 
  5149                              <1> move_scan_source_file:
  5150 000099A2 46                  <1> 	inc	esi
  5151 000099A3 803E20              <1> 	cmp	byte [esi], 20h
  5152 000099A6 7408                <1>         je      short move_scan_destination_1
  5153                              <1> 	;;jb	short loc_move_nofilename_retn
  5154                              <1> 	;jb	loc_cmd_failed
  5155                              <1> 	;jmp	short move_scan_source_file
  5156                              <1> 	; 28/07/2022
  5157 000099A8 77F8                <1> 	ja	short move_scan_source_file
  5158                              <1> loc_move_failed:
  5159 000099AA E995ECFFFF          <1> 	jmp	loc_cmd_failed
  5160                              <1> 
  5161                              <1> loc_move_nofilename_retn:
  5162 000099AF C3                  <1> 	retn
  5163                              <1> 
  5164                              <1> move_scan_destination_1:
  5165 000099B0 C60600              <1> 	mov	byte [esi], 0
  5166                              <1> 
  5167                              <1> move_scan_destination_2:
  5168 000099B3 46                  <1> 	inc	esi  
  5169 000099B4 803E20              <1> 	cmp	byte [esi], 20h
  5170 000099B7 74FA                <1> 	je	short move_scan_destination_2
  5171                              <1> 	;;jb	short loc_move_nofilename_retn
  5172                              <1> 	;jb	loc_cmd_failed
  5173                              <1> 	; 28/07/2022
  5174 000099B9 72EF                <1> 	jb	short loc_move_failed
  5175                              <1> 
  5176 000099BB 8935[98870100]      <1> 	mov	[DestinationFilePath], esi
  5177                              <1> 
  5178                              <1> move_scan_destination_3:
  5179 000099C1 46                  <1> 	inc	esi
  5180 000099C2 803E20              <1> 	cmp	byte [esi], 20h
  5181 000099C5 77FA                <1> 	ja	short move_scan_destination_3
  5182 000099C7 C60600              <1> 	mov	byte [esi], 0
  5183                              <1> 
  5184                              <1> loc_move_scan_destination_OK:
  5185 000099CA 8B35[94870100]      <1> 	mov	esi, [SourceFilePath]
  5186 000099D0 8B3D[98870100]      <1> 	mov	edi, [DestinationFilePath]
  5187                              <1> 
  5188 000099D6 B001                <1> 	mov	al, 1  ; move procedure Phase 1
  5189 000099D8 E8061B0000          <1> 	call	move_source_file_to_destination_file
  5190 000099DD 7325                <1> 	jnc	short move_source_file_to_destination_question
  5191                              <1> 
  5192                              <1> loc_move_cmd_failed_1:
  5193 000099DF 08C0                <1> 	or	al, al
  5194                              <1> 	;jz	loc_cmd_failed
  5195                              <1> 	; 28/07/2022
  5196 000099E1 74C7                <1> 	jz	short loc_move_failed
  5197                              <1> 
  5198 000099E3 3C11                <1> 	cmp	al, 11h
  5199 000099E5 7409                <1> 	je	short loc_msg_not_same_device
  5200                              <1> 	;cmp	al, 05h
  5201                              <1> 	;cmp	al, ERR_PERM_DENIED ; 29/12/2017
  5202                              <1> 	;jne	loc_run_cmd_failed
  5203                              <1> 	;jmp	loc_permission_denied
  5204 000099E7 3C0B                <1> 	cmp	al, ERR_PERM_DENIED
  5205                              <1> 	;je	loc_permission_denied
  5206                              <1> 	; 28/07/2022
  5207 000099E9 7414                <1> 	je	short loc_move_perm_denied
  5208 000099EB E97FECFFFF          <1> 	jmp	loc_run_cmd_failed
  5209                              <1> 
  5210                              <1> 	;mov	esi, Msg_Permission_denied
  5211                              <1> 	;call	print_msg
  5212                              <1> 	;jmp	loc_file_rw_restore_retn
  5213                              <1> 
  5214                              <1> loc_msg_not_same_device:
  5215 000099F0 BE[453A0100]        <1> 	mov	esi, msg_not_same_drv
  5216 000099F5 E870D3FFFF          <1> 	call	print_msg
  5217 000099FA E97FF5FFFF          <1> 	jmp	loc_file_rw_restore_retn
  5218                              <1> 
  5219                              <1> 	; 28/07/2022
  5220                              <1> loc_move_perm_denied:
  5221 000099FF E984F5FFFF          <1> 	jmp	loc_permission_denied
  5222                              <1> 
  5223                              <1> move_source_file_to_destination_question:
  5224 00009A04 A0[9C870100]        <1>         mov     al, [SourceFile_Drv]
  5225 00009A09 0441                <1> 	add	al, 'A'
  5226 00009A0B A2[A73A0100]        <1> 	mov	[msg_source_file_drv], al
  5227 00009A10 A0[1C880100]        <1>         mov     al, [DestinationFile_Drv]
  5228 00009A15 0441                <1> 	add	al, 'A'
  5229 00009A17 A2[C63A0100]        <1> 	mov	[msg_destination_file_drv], al
  5230                              <1> 
  5231 00009A1C 57                  <1> 	push	edi ; *
  5232                              <1> 
  5233 00009A1D BE[8B3A0100]        <1> 	mov	esi, msg_source_file
  5234 00009A22 E843D3FFFF          <1> 	call	print_msg
  5235 00009A27 BE[9D870100]        <1> 	mov	esi, SourceFile_Directory
  5236 00009A2C 803E20              <1> 	cmp	byte [esi], 20h
  5237 00009A2F 7605                <1> 	jna	short msftdfq_sfn
  5238 00009A31 E834D3FFFF          <1> 	call	print_msg
  5239                              <1> msftdfq_sfn:
  5240 00009A36 BE[DE870100]        <1> 	mov	esi, SourceFile_Name
  5241 00009A3B E82AD3FFFF          <1> 	call	print_msg
  5242 00009A40 BE[AA3A0100]        <1> 	mov	esi, msg_destination_file
  5243 00009A45 E820D3FFFF          <1> 	call	print_msg
  5244 00009A4A BE[1D880100]        <1> 	mov	esi, DestinationFile_Directory
  5245 00009A4F 803E20              <1> 	cmp	byte [esi], 20h
  5246 00009A52 7605                <1> 	jna	short msftdfq_dfn
  5247 00009A54 E811D3FFFF          <1> 	call	print_msg
  5248                              <1> msftdfq_dfn:
  5249 00009A59 BE[5E880100]        <1> 	mov	esi, DestinationFile_Name
  5250 00009A5E E807D3FFFF          <1> 	call	print_msg
  5251 00009A63 BE[C93A0100]        <1> 	mov	esi, msg_copy_nextline
  5252 00009A68 E8FDD2FFFF          <1> 	call	print_msg
  5253 00009A6D BE[C93A0100]        <1> 	mov	esi, msg_copy_nextline
  5254 00009A72 E8F3D2FFFF          <1> 	call	print_msg
  5255                              <1> 
  5256                              <1> loc_move_ask_for_new_file_yes_no:
  5257 00009A77 BE[573A0100]        <1> 	mov	esi, Msg_DoYouWantMoveFile
  5258 00009A7C E8E9D2FFFF          <1> 	call	print_msg
  5259 00009A81 BE[5B390100]        <1> 	mov	esi, Msg_YesNo
  5260 00009A86 E8DFD2FFFF          <1> 	call	print_msg
  5261                              <1> loc_move_ask_for_new_file_again:
  5262 00009A8B 30E4                <1> 	xor	ah, ah
  5263 00009A8D E88A74FFFF          <1> 	call	int16h
  5264 00009A92 3C1B                <1> 	cmp	al, 1Bh
  5265                              <1> 	;je	short loc_do_not_move_file
  5266 00009A94 743F                <1> 	je	short loc_move_y_n_escape
  5267 00009A96 24DF                <1> 	and	al, 0DFh
  5268 00009A98 A2[65390100]        <1>         mov     [Y_N_nextline], al
  5269 00009A9D 3C59                <1> 	cmp	al, 'Y'
  5270 00009A9F 7404                <1> 	je	short loc_yes_move_file
  5271 00009AA1 3C4E                <1> 	cmp	al, 'N'
  5272 00009AA3 75E6                <1> 	jne	short loc_move_ask_for_new_file_again
  5273                              <1> 
  5274                              <1> loc_do_not_move_file:
  5275                              <1> loc_yes_move_file:
  5276 00009AA5 E807F6FFFF          <1> 	call	y_n_answer ; 29/12/2017
  5277 00009AAA 5F                  <1> 	pop	edi ; *
  5278                              <1> 	;cmp	al, 'Y' ; 'yes'
  5279                              <1> 	;cmc
  5280                              <1>         ;jnc	loc_file_rw_restore_retn
  5281 00009AAB 3C4E                <1> 	cmp	al, 'N' ; 'no'
  5282                              <1>         ;je	loc_file_rw_restore_retn
  5283                              <1> 	; 28/07/2022
  5284 00009AAD 7421                <1> 	je	short loc_move_rw_restore_retn
  5285                              <1> 
  5286                              <1> loc_move_yes_move_file:
  5287 00009AAF B002                <1> 	mov	al, 2 ; move procedure Phase 2
  5288 00009AB1 E82D1A0000          <1> 	call	move_source_file_to_destination_file
  5289                              <1> 	;;jc	short loc_move_cmd_failed_2
  5290                              <1>         ;jnc	move_source_file_to_dest_OK
  5291                              <1> 	; 28/07/2022
  5292 00009AB6 7205                <1> 	jc	short loc_move_cmd_failed_2
  5293                              <1> 	; 07/08/2022
  5294 00009AB8 E9E1F5FFFF          <1> 	jmp	move_source_file_to_dest_OK
  5295                              <1> 
  5296                              <1> ;move_source_file_to_destination_OK:
  5297                              <1> ;	mov	esi, Msg_OK
  5298                              <1> ;	call	print_msg
  5299                              <1> ;	jmp	loc_file_rw_restore_retn
  5300                              <1> 
  5301                              <1> loc_move_cmd_failed_2:
  5302 00009ABD 3C27                <1> 	cmp	al, 27h
  5303                              <1> 	;jne	loc_run_cmd_failed
  5304                              <1> 	; 28/07/2022
  5305 00009ABF 7405                <1> 	je	short loc_move_ids_err
  5306 00009AC1 E9A9EBFFFF          <1> 	jmp	loc_run_cmd_failed
  5307                              <1> 
  5308                              <1> loc_move_ids_err: ; 28/07/2022
  5309 00009AC6 BE[703A0100]        <1> 	mov	esi, msg_insufficient_disk_space
  5310 00009ACB E89AD2FFFF          <1> 	call	print_msg
  5311                              <1> 
  5312                              <1> loc_move_rw_restore_retn: ; 28/07/2022
  5313 00009AD0 E9A9F4FFFF          <1> 	jmp	loc_file_rw_restore_retn
  5314                              <1> 
  5315                              <1> loc_move_y_n_escape:
  5316 00009AD5 B04E                <1> 	mov	al, 'N' ; 'no'
  5317 00009AD7 EBCC                <1> 	jmp	short loc_do_not_move_file
  5318                              <1> 
  5319                              <1> copy_file:
  5320                              <1> 	; 31/08/2024 - TRDOS 386 v2.0.9
  5321                              <1> 	; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  5322                              <1> 	; 15/10/2016
  5323                              <1> 	; 24/03/2016
  5324                              <1> 	; 21/03/2016
  5325                              <1> 	; 15/03/2016 (TRDOS 386 = TRDOS v2.0)
  5326                              <1> 	; 21/05/2011 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_copy')
  5327                              <1> 	; 01/08/2010
  5328                              <1> 
  5329                              <1> get_copy_source_fchar:
  5330                              <1> 	; esi = file name
  5331 00009AD9 803E20              <1> 	cmp	byte [esi], 20h
  5332 00009ADC 7613                <1>         jna     short loc_copy_nofilename_retn
  5333                              <1> 
  5334 00009ADE 8935[94870100]      <1> 	mov	[SourceFilePath], esi
  5335                              <1> 
  5336                              <1> copy_scan_source_file:
  5337 00009AE4 46                  <1> 	inc	esi  
  5338 00009AE5 803E20              <1> 	cmp	byte [esi], 20h
  5339 00009AE8 7408                <1> 	je	short copy_scan_destination_1
  5340                              <1> 	;;jb	short loc_copy_nofilename_retn
  5341                              <1> 	;jb	loc_cmd_failed
  5342                              <1> 	;jmp	short copy_scan_source_file
  5343                              <1> 	; 25/07/2022
  5344 00009AEA 73F8                <1> 	jnb	short copy_scan_source_file
  5345                              <1> copy_scan_destination_0:
  5346 00009AEC E953EBFFFF          <1> 	jmp	loc_cmd_failed
  5347                              <1> 
  5348                              <1> loc_copy_nofilename_retn:
  5349 00009AF1 C3                  <1> 	retn
  5350                              <1> 
  5351                              <1> copy_scan_destination_1:
  5352 00009AF2 C60600              <1> 	mov	byte [esi], 0
  5353                              <1> 
  5354                              <1> copy_scan_destination_2:
  5355 00009AF5 46                  <1> 	inc	esi  
  5356 00009AF6 803E20              <1> 	cmp	byte [esi], 20h
  5357 00009AF9 74FA                <1> 	je	short copy_scan_destination_2
  5358                              <1> 	;;jb	short loc_copy_nofilename_retn
  5359                              <1> 	;jb	loc_cmd_failed
  5360                              <1> 	; 25/07/2022
  5361 00009AFB 72EF                <1> 	jb	short copy_scan_destination_0
  5362                              <1> 
  5363 00009AFD 8935[98870100]      <1> 	mov	[DestinationFilePath], esi
  5364                              <1> 
  5365                              <1> copy_scan_destination_3:
  5366 00009B03 46                  <1> 	inc	esi
  5367 00009B04 803E20              <1> 	cmp	byte [esi], 20h
  5368 00009B07 77FA                <1> 	ja	short copy_scan_destination_3
  5369 00009B09 C60600              <1> 	mov	byte [esi], 0
  5370                              <1> 
  5371                              <1> loc_copy_save_current_drive:
  5372 00009B0C 8A35[B27D0100]      <1> 	mov	dh, [Current_Drv]
  5373 00009B12 8835[0F850100]      <1> 	mov	[RUN_CDRV], dh
  5374                              <1> 
  5375                              <1> copy_source_file_to_destination_phase_1:
  5376 00009B18 8B35[94870100]      <1> 	mov	esi, [SourceFilePath]
  5377 00009B1E 8B3D[98870100]      <1> 	mov	edi, [DestinationFilePath]
  5378                              <1> 
  5379 00009B24 B001                <1> 	mov	al, 1  ; copy procedure Phase 1
  5380 00009B26 E8511C0000          <1> 	call	copy_source_file_to_destination_file
  5381 00009B2B 7327                <1> 	jnc	short copy_source_file_to_destination_question
  5382                              <1> 
  5383                              <1> loc_copy_cmd_failed_1:
  5384                              <1> 	; 18/03/2016 (restore current drive and directory)
  5385 00009B2D 08C0                <1> 	or	al, al
  5386 00009B2F 7507                <1> 	jnz	short loc_copy_cmd_failed_2
  5387                              <1> 
  5388 00009B31 FEC0                <1>         inc     al ; mov al, 1 ; Bad command or file name !
  5389                              <1> loc_copy_cmd_failed_3:	; 25/07/2022
  5390 00009B33 E937EBFFFF          <1> 	jmp	loc_run_cmd_failed
  5391                              <1> 
  5392                              <1> loc_copy_cmd_failed_2:
  5393 00009B38 3C27                <1> 	cmp	al, 27h ; Insufficient disk space 
  5394 00009B3A 7409                <1> 	je	short loc_file_write_insuff_disk_space_msg
  5395                              <1> 
  5396                              <1> 	; 29/12/2017
  5397                              <1> 	;cmp	al, 05h
  5398 00009B3C 3C0B                <1> 	cmp	al, ERR_PERM_DENIED
  5399                              <1> 	;jne	loc_run_cmd_failed
  5400                              <1> 	; 25/07/2022
  5401 00009B3E 75F3                <1> 	jne	short loc_copy_cmd_failed_3
  5402                              <1> 
  5403 00009B40 E943F4FFFF          <1> 	jmp	loc_permission_denied
  5404                              <1> 
  5405                              <1> loc_file_write_insuff_disk_space_msg:
  5406 00009B45 BE[703A0100]        <1> 	mov	esi, msg_insufficient_disk_space
  5407 00009B4A E81BD2FFFF          <1> 	call	print_msg
  5408 00009B4F E92AF4FFFF          <1>         jmp     loc_file_rw_restore_retn 
  5409                              <1> 
  5410                              <1> copy_source_file_to_destination_question:
  5411 00009B54 57                  <1> 	push	edi ; *
  5412                              <1> 
  5413                              <1> 	; dh = source file attributes
  5414                              <1> 	; dl > 0 -> destination file found
  5415 00009B55 20D2                <1> 	and	dl, dl
  5416 00009B57 7446                <1> 	jz	short copy_source_file_to_destination_pass_owrq
  5417                              <1> 
  5418                              <1> loc_copy_ask_for_owr_yes_no:
  5419 00009B59 BE[CC3A0100]        <1> 	mov	esi, Msg_DoYouWantOverWriteFile
  5420 00009B5E E807D2FFFF          <1> 	call	print_msg
  5421 00009B63 BE[5E880100]        <1> 	mov	esi, DestinationFile_Name
  5422 00009B68 E8FDD1FFFF          <1> 	call	print_msg
  5423 00009B6D BE[5B390100]        <1> 	mov	esi, Msg_YesNo
  5424 00009B72 E8F3D1FFFF          <1> 	call	print_msg
  5425                              <1> 
  5426                              <1> loc_copy_ask_for_owr_again:
  5427 00009B77 30E4                <1> 	xor	ah, ah
  5428 00009B79 E89E73FFFF          <1> 	call	int16h
  5429 00009B7E 3C1B                <1> 	cmp	al, 1Bh
  5430                              <1>         ;je     loc_do_not_copy_file
  5431 00009B80 7419                <1>         je      short loc_copy_y_n_escape
  5432 00009B82 24DF                <1> 	and	al, 0DFh
  5433 00009B84 A2[65390100]        <1>         mov     [Y_N_nextline], al
  5434 00009B89 3C59                <1> 	cmp	al, 'Y'
  5435                              <1> 	;je	loc_yes_copy_file
  5436                              <1> 	; 25/07/2022
  5437 00009B8B 7505                <1> 	jne	short loc_copy_ask_for_owr_n
  5438 00009B8D E9AD000000          <1> 	jmp	loc_yes_copy_file
  5439                              <1> 
  5440                              <1> loc_copy_ask_for_owr_n: ; 25/07/2022
  5441 00009B92 3C4E                <1> 	cmp	al, 'N'
  5442                              <1>         ;je	loc_do_not_copy_file
  5443                              <1> 	;jmp	short loc_copy_ask_for_owr_again
  5444                              <1> 	; 25/07/2022
  5445 00009B94 75E1                <1> 	jne	short loc_copy_ask_for_owr_again
  5446                              <1> loc_do_not_copy_file_j:
  5447 00009B96 E9A4000000          <1> 	jmp	loc_do_not_copy_file
  5448                              <1> 
  5449                              <1> loc_copy_y_n_escape:
  5450 00009B9B B04E                <1> 	mov	al, 'N' ; 'no'
  5451                              <1> 	;jmp	loc_do_not_copy_file
  5452                              <1> 	; 25/07/2022
  5453 00009B9D EBF7                <1> 	jmp	short loc_do_not_copy_file_j
  5454                              <1> 
  5455                              <1> copy_source_file_to_destination_pass_owrq:
  5456 00009B9F A0[9C870100]        <1> 	mov     al, [SourceFile_Drv]
  5457 00009BA4 0441                <1> 	add	al, 'A'
  5458 00009BA6 A2[A73A0100]        <1> 	mov	[msg_source_file_drv], al
  5459 00009BAB A0[1C880100]        <1>         mov     al, [DestinationFile_Drv]
  5460 00009BB0 0441                <1> 	add	al, 'A'
  5461 00009BB2 A2[C63A0100]        <1> 	mov	[msg_destination_file_drv], al
  5462                              <1> 
  5463 00009BB7 BE[8B3A0100]        <1> 	mov	esi, msg_source_file
  5464 00009BBC E8A9D1FFFF          <1> 	call	print_msg
  5465 00009BC1 BE[9D870100]        <1> 	mov	esi, SourceFile_Directory
  5466 00009BC6 803E20              <1> 	cmp	byte [esi], 20h
  5467 00009BC9 7605                <1> 	jna	short csftdfq_sfn
  5468 00009BCB E89AD1FFFF          <1> 	call	print_msg
  5469                              <1> csftdfq_sfn:
  5470 00009BD0 BE[DE870100]        <1> 	mov	esi, SourceFile_Name
  5471 00009BD5 E890D1FFFF          <1> 	call	print_msg
  5472 00009BDA BE[AA3A0100]        <1> 	mov	esi, msg_destination_file
  5473 00009BDF E886D1FFFF          <1> 	call	print_msg
  5474 00009BE4 BE[1D880100]        <1> 	mov	esi, DestinationFile_Directory
  5475 00009BE9 803E20              <1> 	cmp	byte [esi], 20h
  5476 00009BEC 7605                <1> 	jna	short csftdfq_dfn
  5477 00009BEE E877D1FFFF          <1> 	call	print_msg
  5478                              <1> csftdfq_dfn:
  5479 00009BF3 BE[5E880100]        <1> 	mov	esi, DestinationFile_Name
  5480 00009BF8 E86DD1FFFF          <1> 	call	print_msg
  5481 00009BFD BE[C93A0100]        <1> 	mov	esi, msg_copy_nextline
  5482 00009C02 E863D1FFFF          <1> 	call	print_msg
  5483 00009C07 BE[C93A0100]        <1> 	mov	esi, msg_copy_nextline
  5484 00009C0C E859D1FFFF          <1> 	call	print_msg
  5485                              <1> 
  5486                              <1> loc_copy_ask_for_new_file_yes_no:
  5487 00009C11 BE[EB3A0100]        <1> 	mov	esi, Msg_DoYouWantCopyFile
  5488 00009C16 E84FD1FFFF          <1> 	call	print_msg
  5489 00009C1B BE[5B390100]        <1> 	mov	esi, Msg_YesNo
  5490 00009C20 E845D1FFFF          <1> 	call	print_msg
  5491                              <1> 
  5492                              <1> loc_copy_ask_for_new_file_again:
  5493 00009C25 30E4                <1> 	xor	ah, ah
  5494 00009C27 E8F072FFFF          <1> 	call	int16h
  5495 00009C2C 3C1B                <1> 	cmp	al, 1Bh
  5496 00009C2E 740F                <1> 	je	short loc_do_not_copy_file
  5497 00009C30 24DF                <1> 	and	al, 0DFh
  5498 00009C32 A2[65390100]        <1>         mov     [Y_N_nextline], al
  5499 00009C37 3C59                <1> 	cmp	al, 'Y'
  5500 00009C39 7404                <1> 	je	short loc_yes_copy_file
  5501 00009C3B 3C4E                <1> 	cmp	al, 'N'
  5502 00009C3D 75E6                <1> 	jne	short loc_copy_ask_for_new_file_again
  5503                              <1> 
  5504                              <1> loc_do_not_copy_file:
  5505                              <1> loc_yes_copy_file:
  5506 00009C3F E86DF4FFFF          <1> 	call	y_n_answer ; 29/12/2017
  5507 00009C44 5F                  <1> 	pop	edi ; *
  5508                              <1> 	;cmp	al, 'Y' ; 'yes'
  5509                              <1> 	;cmc
  5510                              <1>         ;jnc	loc_file_rw_restore_retn
  5511 00009C45 3C4E                <1> 	cmp	al, 'N' ; 'no'
  5512                              <1> 	;je	loc_file_rw_restore_retn
  5513                              <1> 	; 25/07/2022
  5514 00009C47 7505                <1> 	jne	short copy_source_file_to_destination_pass_q
  5515 00009C49 E930F3FFFF          <1> 	jmp	loc_file_rw_restore_retn
  5516                              <1> 
  5517                              <1> copy_source_file_to_destination_pass_q:
  5518 00009C4E B002                <1> 	mov	al, 2  ; copy procedure Phase 2
  5519 00009C50 E8271B0000          <1> 	call	copy_source_file_to_destination_file
  5520                              <1> 	;jc	short loc_file_write_check_disk_space_err
  5521                              <1> 
  5522                              <1> 	; 31/08/2024
  5523 00009C55 9C                  <1> 	pushf
  5524                              <1> 
  5525                              <1> 	; 24/03/2016
  5526                              <1> 	;;push	cx
  5527                              <1> 	;push	ecx ; 29/12/2017
  5528                              <1> 
  5529 00009C56 BE[C93A0100]        <1> 	mov	esi, msg_copy_nextline
  5530 00009C5B E80AD1FFFF          <1> 	call	print_msg
  5531                              <1> 
  5532                              <1> 	;pop	eax ; 29/12/2017
  5533                              <1> 	;;pop	cx
  5534                              <1> 	;pop	ax
  5535                              <1> 
  5536                              <1> 	; 31/08/2024
  5537 00009C60 9D                  <1> 	popf
  5538 00009C61 7305                <1> 	jnc	short copy_source_file_to_destination_OK
  5539                              <1> 
  5540                              <1> 	; 31/08/2024
  5541                              <1> 	;;or	cl, cl
  5542                              <1> 	;;or	al, al
  5543                              <1> 	;jz	short copy_source_file_to_destination_OK
  5544                              <1> 	;
  5545                              <1> 	;; 15/10/2016 (1Dh -> 18)
  5546                              <1> 	;; 18/03/2016 (1Dh)
  5547                              <1> 	;;cmp	cl, 18 ; write error
  5548                              <1> 	;cmp	al, 18
  5549                              <1> 	;jne	short copy_source_file_to_destination_not_OK
  5550                              <1> 	;;
  5551                              <1> 	;;mov	al, cl ; error number (write fault!)
  5552                              <1> 	;stc
  5553                              <1> 
  5554 00009C63 E916F3FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  5555                              <1> 
  5556                              <1> 	; 31/08/2024
  5557                              <1> ;copy_source_file_to_destination_not_OK:
  5558                              <1> 	;mov	esi, Msg_read_file_error_before_EOF
  5559                              <1> 	;call	print_msg
  5560                              <1> 	;jmp	loc_file_rw_restore_retn
  5561                              <1> 
  5562                              <1> copy_source_file_to_destination_OK:
  5563 00009C68 BE[69390100]        <1> 	mov	esi, Msg_OK
  5564 00009C6D E8F8D0FFFF          <1> 	call	print_msg
  5565                              <1> 
  5566 00009C72 E907F3FFFF          <1> 	jmp	loc_file_rw_restore_retn
  5567                              <1> 
  5568                              <1> ;loc_file_write_check_disk_space_err:
  5569                              <1> 	;cmp	al, 27h ; Insufficient disk space
  5570                              <1> 	;je	loc_file_write_insuff_disk_space_msg
  5571                              <1>         ;jb	loc_file_rw_cmd_failed
  5572                              <1> 
  5573                              <1> 	;call	print_misc_error_msg ; 15/03/2016
  5574                              <1>         ;jmp	loc_file_rw_restore_retn
  5575                              <1> 
  5576                              <1> change_fs_file_attributes:
  5577                              <1> 	; 04/03/2016 ; Temporary
  5578                              <1> 	; AL = File or directory attributes
  5579                              <1> 	; AH = 0 -> Attributes are in MS-DOS format
  5580                              <1> 	; AH > 0 -> Attributes are in SINGLIX format
  5581                              <1> 	;push	ebx
  5582                              <1> 	; ... do somethings here ...
  5583                              <1> 	;pop	ebx
  5584                              <1> 	; BL = File or directory attributes
  5585 00009C77 C3                  <1> 	retn
  5586                              <1> 
  5587                              <1> set_get_env:
  5588                              <1> 	; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  5589                              <1> 	; 11/04/2016 (TRDOS 386 = TRDOS v2.0)
  5590                              <1> 	; 02/09/2011 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_set')
  5591                              <1> 	; 2005 - 28/08/2011
  5592                              <1> get_setenv_fchar:
  5593                              <1> 	; esi = environment variable/string
  5594 00009C78 8A06                <1> 	mov	al, [esi]
  5595 00009C7A 3C20                <1> 	cmp	al, 20h
  5596 00009C7C 771E                <1> 	ja	short loc_find_env
  5597                              <1> 
  5598 00009C7E BE00300900          <1> 	mov	esi, Env_Page
  5599                              <1> loc_print_setline:
  5600 00009C83 803E00              <1> 	cmp	byte [esi], 0
  5601 00009C86 7613                <1> 	jna	short loc_setenv_retn
  5602 00009C88 E8DDD0FFFF          <1> 	call	print_msg
  5603 00009C8D 56                  <1> 	push	esi
  5604 00009C8E BE[5B3F0100]        <1> 	mov	esi, nextline
  5605 00009C93 E8D2D0FFFF          <1> 	call	print_msg
  5606 00009C98 5E                  <1> 	pop	esi
  5607 00009C99 EBE8                <1> 	jmp	short loc_print_setline
  5608                              <1> 
  5609                              <1> loc_setenv_retn:
  5610 00009C9B C3                  <1> 	retn
  5611                              <1> 
  5612                              <1> loc_find_env:
  5613 00009C9C 3C3D                <1> 	cmp	al, '='
  5614                              <1> 	;je	loc_cmd_failed
  5615                              <1> 	; 25/07/2022
  5616 00009C9E 7505                <1> 	jne	short loc_find_envr
  5617 00009CA0 E99FE9FFFF          <1> 	jmp	loc_cmd_failed
  5618                              <1> 
  5619                              <1> loc_find_envr:	; 25/07/2022
  5620 00009CA5 56                  <1> 	push	esi
  5621                              <1> loc_repeat_env_equal_check:
  5622 00009CA6 46                  <1> 	inc	esi
  5623 00009CA7 803E3D              <1> 	cmp	byte [esi], '='
  5624 00009CAA 7430                <1> 	je	short pass_env_equal_check
  5625 00009CAC 803E20              <1> 	cmp	byte [esi], 20h
  5626 00009CAF 73F5                <1> 	jnb	short loc_repeat_env_equal_check
  5627 00009CB1 C60600              <1> 	mov	byte [esi], 0
  5628 00009CB4 5E                  <1> 	pop	esi
  5629                              <1> 	; 25/07/2022 (*)
  5630                              <1> loc_print_env_string:
  5631 00009CB5 BF[B27E0100]        <1> 	mov	edi, TextBuffer ; out buffer
  5632 00009CBA B9FF000000          <1> 	mov	ecx, 255 ; maximum size (limit)
  5633 00009CBF 30C0                <1> 	xor	al, al ; 0 -> use [ESI]
  5634 00009CC1 E877000000          <1> 	call	get_environment_string
  5635 00009CC6 72D3                <1> 	jc	short loc_setenv_retn
  5636                              <1> 	 ; 25/07/2022
  5637                              <1> ;loc_print_env_string:
  5638 00009CC8 BE[B27E0100]        <1> 	mov	esi, TextBuffer
  5639 00009CCD E898D0FFFF          <1> 	call	print_msg
  5640 00009CD2 BE[5B3F0100]        <1> 	mov	esi, nextline
  5641                              <1> 	;call	print_msg
  5642                              <1> 	;retn
  5643                              <1> 	; 25/07/2022
  5644 00009CD7 E98ED0FFFF          <1> 	jmp	print_msg
  5645                              <1> 
  5646                              <1> pass_env_equal_check:
  5647 00009CDC 46                  <1> 	inc	esi
  5648 00009CDD 803E20              <1> 	cmp	byte [esi], 20h
  5649 00009CE0 73FA                <1> 	jnb	short pass_env_equal_check
  5650 00009CE2 C60600              <1> 	mov	byte [esi], 0
  5651                              <1> 
  5652                              <1> loc_call_set_env_string:
  5653 00009CE5 5E                  <1> 	pop	esi
  5654 00009CE6 E815010000          <1> 	call	set_environment_string
  5655 00009CEB 73AE                <1> 	jnc	short loc_setenv_retn
  5656                              <1> 
  5657                              <1> loc_set_cmd_failed:
  5658 00009CED 3C08                <1> 	cmp	al, 08h
  5659                              <1> 	;jne	loc_cmd_failed
  5660                              <1> 	; 25/07/2022
  5661 00009CEF 7405                <1> 	je	short loc_set_cmd_failed_spc
  5662 00009CF1 E94EE9FFFF          <1> 	jmp	loc_cmd_failed
  5663                              <1> 
  5664                              <1> loc_set_cmd_failed_spc:
  5665 00009CF6 BE[443B0100]        <1> 	mov	esi, Msg_No_Set_Space
  5666                              <1> 	;call	print_msg
  5667                              <1> 	;retn
  5668                              <1> 	; 25/07/2022
  5669 00009CFB E96AD0FFFF          <1> 	jmp	print_msg
  5670                              <1> 
  5671                              <1> set_get_path:
  5672                              <1> 	; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  5673                              <1> 	; 11/04/2016 (TRDOS 386 = TRDOS v2.0)
  5674                              <1> 	; 03/09/2011 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_path')
  5675                              <1> 	; 2005
  5676                              <1> get_path_fchar:
  5677                              <1>  	; esi = path
  5678 00009D00 803E20              <1> 	cmp	byte [esi], 20h
  5679 00009D03 7711                <1> 	ja	short loc_set_path
  5680                              <1> 
  5681 00009D05 BE00300900          <1> 	mov	esi, Env_Page
  5682                              <1> loc_print_path:
  5683 00009D0A 803E00              <1> 	cmp	byte [esi], 0
  5684 00009D0D 762D                <1> 	jna	short loc_path_retn
  5685                              <1> 
  5686 00009D0F BE[A4350100]        <1> 	mov	esi, Cmd_Path ; 'PATH' address
  5687                              <1> 	; 25/07/2022 (*)
  5688 00009D14 EB9F                <1> 	jmp	short loc_print_env_string
  5689                              <1> ; 25/07/2022
  5690                              <1> ;	mov	edi, TextBuffer ; out buffer
  5691                              <1> ;	xor	al, al  ; use [ESI]
  5692                              <1> ;	mov	ecx, 255 ; maximum size (limit)
  5693                              <1> ;	call	get_environment_string
  5694                              <1> ;	;jc	short loc_path_retn
  5695                              <1> ;	; 25/07/2022
  5696                              <1> ;	jnc	short loc_print_env_string
  5697                              <1> ;	retn
  5698                              <1> 
  5699                              <1> ;	mov	esi, TextBuffer
  5700                              <1> ;	call	print_msg
  5701                              <1> ;	mov	esi, nextline
  5702                              <1> ;	;call	print_msg
  5703                              <1> ;loc_path_retn:
  5704                              <1> ;	;retn
  5705                              <1> ;	; 25/07/2022
  5706                              <1> ;	jmp	print_msg
  5707                              <1> 
  5708                              <1> loc_set_path:
  5709 00009D16 56                  <1> 	push	esi
  5710                              <1> loc_set_path_find_end:
  5711 00009D17 46                  <1> 	inc	esi
  5712 00009D18 803E20              <1> 	cmp	byte [esi], 20h
  5713 00009D1B 73FA                <1> 	jnb	short loc_set_path_find_end
  5714 00009D1D C60600              <1> 	mov	byte [esi], 0
  5715                              <1> loc_set_path_header:
  5716 00009D20 5E                  <1> 	pop	esi
  5717                              <1> set_path_x: ; 31/12/2017 ('syspath')
  5718 00009D21 4E                  <1> 	dec	esi
  5719 00009D22 C6063D              <1> 	mov	byte [esi], '='
  5720 00009D25 4E                  <1> 	dec	esi
  5721 00009D26 C60648              <1> 	mov	byte [esi], 'H'
  5722 00009D29 4E                  <1> 	dec	esi
  5723 00009D2A C60654              <1> 	mov	byte [esi], 'T'
  5724 00009D2D 4E                  <1> 	dec	esi
  5725 00009D2E C60641              <1> 	mov	byte [esi], 'A'
  5726 00009D31 4E                  <1> 	dec	esi
  5727 00009D32 C60650              <1> 	mov	byte [esi], 'P'
  5728                              <1> 
  5729                              <1> loc_path_call_set_env_string:
  5730 00009D35 E8C6000000          <1> 	call	set_environment_string
  5731 00009D3A 72B1                <1>         jc	short loc_set_cmd_failed
  5732                              <1> loc_path_retn:	; 25/07/2022
  5733 00009D3C C3                  <1> 	retn
  5734                              <1> 
  5735                              <1> get_environment_string:
  5736                              <1> 	; 12/04/2016
  5737                              <1> 	; 11/04/2016
  5738                              <1> 	; 05/04/2016 (TRDOS 386 = TRDOS v2.0)
  5739                              <1> 	; 02/09/2011 (TRDOS v1, MAINPROG.ASM)
  5740                              <1> 	; 28/08/2011
  5741                              <1> 	; INPUT->
  5742                              <1> 	;	EDI = Output buffer
  5743                              <1> 	;	CX = Buffer length (<= ENV_PAGE_SIZE)
  5744                              <1> 	;
  5745                              <1> 	;	AL > 0 = AL = String sequence number
  5746                              <1> 	;	AL = 0 -> ESI = ASCIIZ Set word
  5747                              <1> 	;		(environment variable)
  5748                              <1> 	; OUTPUT ->
  5749                              <1> 	;	ESI is not changed
  5750                              <1> 	;	EDI is not changed
  5751                              <1> 	;	EAX = String length (with zero tail)
  5752                              <1> 	;	EDX = Environment variables page address
  5753                              <1> 	;	CF = 1 -> Not found (EAX not valid)
  5754                              <1> 	;
  5755                              <1> 	; (Modified registers: EAX, EDX)
  5756                              <1> 
  5757 00009D3D BA00300900          <1> 	mov	edx, Env_Page
  5758 00009D42 803A00              <1> 	cmp	byte [edx], 0
  5759 00009D45 7474                <1> 	jz	short get_env_string_with_word_stc_retn
  5760                              <1> 
  5761 00009D47 66890D[20890100]    <1> 	mov	[env_var_length], cx
  5762                              <1> 
  5763 00009D4E 51                  <1> 	push	ecx ; *
  5764 00009D4F 56                  <1> 	push	esi ; **
  5765                              <1> 
  5766 00009D50 08C0                <1> 	or	al, al
  5767 00009D52 7449                <1> 	jz	short get_env_string_with_word
  5768                              <1> 
  5769                              <1> get_env_string_with_seq_number:
  5770 00009D54 B101                <1> 	mov	cl, 1
  5771 00009D56 88C5                <1> 	mov	ch, al
  5772 00009D58 31C0                <1> 	xor	eax, eax
  5773 00009D5A 89D6                <1> 	mov	esi, edx ; Env_Page
  5774                              <1> 
  5775                              <1> get_env_string_seq_number_check:
  5776 00009D5C 38CD                <1> 	cmp	ch, cl
  5777 00009D5E 7726                <1> 	ja	short get_env_string_seq_number_next
  5778                              <1> 
  5779                              <1> get_env_string_move_to_buff:
  5780 00009D60 57                  <1> 	push	edi ; ***
  5781                              <1> 
  5782 00009D61 29D2                <1> 	sub	edx, edx
  5783                              <1> 
  5784                              <1> get_env_string_seq_number_repeat1:
  5785 00009D63 42                  <1> 	inc	edx
  5786 00009D64 AC                  <1> 	lodsb
  5787 00009D65 AA                  <1> 	stosb
  5788                              <1> 
  5789 00009D66 66FF0D[20890100]    <1> 	dec	word [env_var_length]
  5790 00009D6D 7508                <1> 	jnz	short get_env_string_seq_number_repeat3
  5791                              <1> 
  5792                              <1> get_env_string_seq_number_repeat2:
  5793 00009D6F 20C0                <1> 	and	al, al
  5794 00009D71 7408                <1> 	jz	short get_env_string_seq_number_ok
  5795 00009D73 42                  <1> 	inc	edx
  5796 00009D74 AC                  <1> 	lodsb
  5797 00009D75 EBF8                <1> 	jmp	short get_env_string_seq_number_repeat2
  5798                              <1> 
  5799                              <1> get_env_string_seq_number_repeat3:
  5800 00009D77 08C0                <1> 	or	al, al
  5801 00009D79 75E8                <1> 	jnz	short get_env_string_seq_number_repeat1
  5802                              <1> 
  5803                              <1> get_env_string_seq_number_ok:
  5804 00009D7B 5F                  <1> 	pop	edi ; ***
  5805 00009D7C 89D0                <1> 	mov	eax, edx ; Length of the environment string
  5806                              <1> 			 ; (ASCIIZ, includes ZERO tail)
  5807 00009D7E BA00300900          <1> 	mov	edx, Env_Page
  5808                              <1> 
  5809                              <1> get_env_string_stc_retn:
  5810 00009D83 5E                  <1> 	pop	esi ; **
  5811 00009D84 59                  <1> 	pop	ecx ; *
  5812 00009D85 C3                  <1> 	retn
  5813                              <1> 
  5814                              <1> get_env_string_seq_number_next:
  5815 00009D86 AC                  <1> 	lodsb
  5816 00009D87 08C0                <1> 	or	al, al
  5817 00009D89 75FB                <1> 	jnz	short get_env_string_seq_number_next
  5818                              <1> 
  5819 00009D8B 81FE00320900        <1> 	cmp	esi, Env_Page + Env_Page_Size ; +512 (+4096)
  5820 00009D91 F5                  <1> 	cmc
  5821 00009D92 72EF                <1> 	jc	short get_env_string_stc_retn
  5822                              <1> 
  5823 00009D94 AC                  <1> 	lodsb
  5824 00009D95 3C01                <1> 	cmp	al, 1
  5825 00009D97 72EA                <1> 	jb	short get_env_string_stc_retn
  5826 00009D99 FEC1                <1> 	inc	cl
  5827 00009D9B EBBF                <1> 	jmp	short get_env_string_seq_number_check
  5828                              <1> 
  5829                              <1> get_env_string_with_word:
  5830 00009D9D 31C9                <1> 	xor	ecx, ecx
  5831                              <1> 
  5832                              <1> get_env_string_calc_word_length:
  5833 00009D9F AC                  <1> 	lodsb 
  5834 00009DA0 3C20                <1> 	cmp	al, 20h
  5835 00009DA2 7211                <1> 	jb	short get_env_string_calc_word_length_ok
  5836                              <1> 	;inc	cx
  5837 00009DA4 FEC1                <1> 	inc	cl
  5838                              <1> 
  5839 00009DA6 3C61                <1> 	cmp	al, 'a'
  5840 00009DA8 72F5                <1> 	jb	short get_env_string_calc_word_length
  5841 00009DAA 3C7A                <1> 	cmp	al, 'z'
  5842 00009DAC 77F1                <1> 	ja	short get_env_string_calc_word_length
  5843 00009DAE 24DF                <1> 	and	al, 0DFh
  5844 00009DB0 8846FF              <1> 	mov	[esi-1], al
  5845 00009DB3 EBEA                <1> 	jmp	short get_env_string_calc_word_length
  5846                              <1> 
  5847                              <1> get_env_string_calc_word_length_ok:
  5848 00009DB5 08C9                <1> 	or	cl, cl
  5849 00009DB7 7506                <1> 	jnz	short get_env_string_calc_word_length_save
  5850                              <1> 
  5851 00009DB9 5E                  <1> 	pop	esi ; **
  5852                              <1> 
  5853                              <1> get_env_string_stc_retn1:
  5854 00009DBA 59                  <1> 	pop	ecx ; *
  5855                              <1> 
  5856                              <1> get_env_string_with_word_stc_retn:
  5857 00009DBB 31C0                <1> 	xor	eax, eax
  5858 00009DBD F9                  <1> 	stc
  5859 00009DBE C3                  <1> 	retn
  5860                              <1> 
  5861                              <1> get_env_string_calc_word_length_save:
  5862 00009DBF 871C24              <1> 	xchg	ebx, [esp] ; **
  5863 00009DC2 89DE                <1> 	mov	esi, ebx 
  5864                              <1> 		; Start of the env string (to be searched)
  5865                              <1> 
  5866 00009DC4 57                  <1> 	push	edi ; ***
  5867 00009DC5 89D7                <1> 	mov	edi, edx ; Env_Page
  5868                              <1> 
  5869                              <1> get_env_string_compare:
  5870 00009DC7 57                  <1> 	push	edi ; ****
  5871 00009DC8 51                  <1> 	push	ecx ; ***** ; Variable name length
  5872                              <1> 
  5873                              <1> get_env_string_compare_rep:
  5874 00009DC9 AC                  <1> 	lodsb
  5875 00009DCA AE                  <1> 	scasb
  5876 00009DCB 7511                <1> 	jne	short get_env_string_compare_next1
  5877 00009DCD E2FA                <1> 	loop	get_env_string_compare_rep
  5878                              <1> 
  5879 00009DCF 803F3D              <1> 	cmp	byte [edi], '='
  5880 00009DD2 750A                <1> 	jne	short get_env_string_compare_next1
  5881                              <1> 
  5882 00009DD4 59                  <1> 	pop	ecx ; *****
  5883 00009DD5 5F                  <1> 	pop	edi ; ****
  5884 00009DD6 89FE                <1> 	mov	esi, edi
  5885 00009DD8 5F                  <1> 	pop	edi ; ***
  5886 00009DD9 871C24              <1> 	xchg	ebx, [esp] ; **
  5887 00009DDC EB82                <1> 	jmp	short get_env_string_move_to_buff
  5888                              <1> 
  5889                              <1> get_env_string_compare_next1:
  5890 00009DDE 89FE                <1> 	mov	esi, edi
  5891 00009DE0 59                  <1> 	pop	ecx ; *****
  5892 00009DE1 5F                  <1> 	pop	edi ; ****
  5893                              <1> get_env_string_compare_next2:
  5894 00009DE2 81FEFF310900        <1> 	cmp	esi, Env_Page + Env_Page_Size - 1 ; +511 (+4095)
  5895 00009DE8 7310                <1> 	jnb	short get_env_string_compare_not_ok
  5896 00009DEA 20C0                <1> 	and	al, al
  5897 00009DEC AC                  <1> 	lodsb
  5898 00009DED 75F3                <1> 	jnz	short get_env_string_compare_next2
  5899 00009DEF 08C0                <1> 	or	al, al
  5900 00009DF1 7407                <1> 	jz	short get_env_string_compare_not_ok
  5901 00009DF3 4E                  <1> 	dec	esi ; 12/04/2016
  5902 00009DF4 89F7                <1> 	mov	edi, esi
  5903 00009DF6 89DE                <1> 	mov	esi, ebx
  5904 00009DF8 EBCD                <1> 	jmp	short get_env_string_compare
  5905                              <1> 
  5906                              <1> get_env_string_compare_not_ok:
  5907 00009DFA 5F                  <1> 	pop	edi ; ***
  5908 00009DFB 89DE                <1> 	mov	esi, ebx
  5909 00009DFD 5B                  <1> 	pop	ebx ; **
  5910 00009DFE EBBA                <1> 	jmp	short get_env_string_stc_retn1
  5911                              <1> 
  5912                              <1> set_environment_string:
  5913                              <1> 	; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  5914                              <1> 	; 13/04/2016
  5915                              <1> 	; 12/04/2016
  5916                              <1> 	; 11/04/2016
  5917                              <1> 	; 06/04/2016
  5918                              <1> 	; 05/04/2016 (TRDOS 386 = TRDOS v2.0)
  5919                              <1> 	; 02/09/2011 (TRDOS v1, MAINPROG.ASM)
  5920                              <1> 	; 29/08/2011
  5921                              <1> 	; 29/08/2011
  5922                              <1> 	; INPUT->
  5923                              <1> 	;	ESI = ASCIIZ environment string
  5924                              <1> 	; OUTPUT ->
  5925                              <1> 	;	ESI is not changed
  5926                              <1> 	;	CF = 1 -> Could not set,
  5927                              <1> 	;	     insufficient environment space
  5928                              <1> 	;
  5929                              <1> 	; (EAX, EDX will be changed)
  5930                              <1> 	;
  5931                              <1> 	;    (EAX = Start address of the env string if > 0)
  5932                              <1> 	;    (EDX = Environment string length)
  5933                              <1> 
  5934 00009E00 56                  <1> 	push 	esi ; *
  5935                              <1> 
  5936 00009E01 31C0                <1> 	xor	eax, eax
  5937                              <1> 
  5938                              <1> set_env_chk_validation1:
  5939 00009E03 FEC4                <1> 	inc	ah ; variable (string) length
  5940 00009E05 AC                  <1> 	lodsb
  5941 00009E06 3C3D                <1> 	cmp	al, '='
  5942 00009E08 7415                <1> 	je	short set_env_chk_validation2
  5943 00009E0A 3C20                <1> 	cmp	al, 20h
  5944 00009E0C 720F                <1> 	jb	short set_env_string_stc
  5945                              <1> 
  5946                              <1> 	; 06/04/2016
  5947 00009E0E 3C61                <1> 	cmp	al, 'a'
  5948 00009E10 72F1                <1> 	jb	short set_env_chk_validation1
  5949 00009E12 3C7A                <1> 	cmp	al, 'z'
  5950 00009E14 77ED                <1> 	ja	short set_env_chk_validation1
  5951 00009E16 2C20                <1> 	sub	al, 'a'-'A'
  5952 00009E18 8846FF              <1> 	mov	[esi-1], al
  5953 00009E1B EBE6                <1> 	jmp	short set_env_chk_validation1
  5954                              <1> 
  5955                              <1> set_env_string_stc:
  5956 00009E1D 5E                  <1> 	pop	esi ; *
  5957                              <1> 	;stc
  5958 00009E1E C3                  <1> 	retn
  5959                              <1> 
  5960                              <1> set_env_chk_validation2:
  5961 00009E1F 51                  <1> 	push	ecx ; **
  5962 00009E20 53                  <1> 	push	ebx ; ***
  5963 00009E21 57                  <1> 	push	edi ; ****
  5964                              <1> 
  5965                              <1> 	; 12/04/2016
  5966                              <1> 	;mov	ebx, [esp+12]
  5967                              <1> 	; 25/07/2022
  5968 00009E22 8B54240C            <1> 	mov	edx, [esp+12]
  5969                              <1> 
  5970                              <1> set_env_chk_validation2w:
  5971 00009E26 89F7                <1> 	mov	edi, esi
  5972 00009E28 4F                  <1> 	dec	edi
  5973                              <1> 
  5974 00009E29 807FFF20            <1> 	cmp	byte [edi-1], 20h
  5975 00009E2D 771A                <1> 	ja	short set_env_chk_validation2z
  5976                              <1> 
  5977 00009E2F 56                  <1> 	push	esi
  5978 00009E30 89FE                <1> 	mov	esi, edi
  5979 00009E32 4E                  <1> 	dec	esi
  5980                              <1> 
  5981                              <1> set_env_chk_validation2x:
  5982 00009E33 4E                  <1> 	dec	esi
  5983                              <1> 
  5984                              <1> 	;cmp	esi, ebx
  5985 00009E34 39D6                <1> 	cmp	esi, edx ; 25/07/2022
  5986 00009E36 7207                <1> 	jb	short set_env_chk_validation2y
  5987                              <1> 
  5988 00009E38 4F                  <1> 	dec	edi
  5989                              <1> 
  5990 00009E39 8A06                <1> 	mov	al, [esi]
  5991 00009E3B 8807                <1> 	mov	[edi], al
  5992                              <1> 
  5993 00009E3D EBF4                <1> 	jmp	short set_env_chk_validation2x
  5994                              <1> 
  5995                              <1> set_env_chk_validation2y:
  5996 00009E3F 5E                  <1> 	pop	esi
  5997                              <1> 
  5998                              <1> 	;;mov	byte [ebx], 20h
  5999                              <1> 	; 25/07/2022
  6000                              <1> 	;mov	byte [edx], 20h
  6001                              <1> 
  6002                              <1> 	;inc 	ebx
  6003                              <1> 	;mov	[esp+12], ebx
  6004                              <1> 	; 25/07/2022
  6005 00009E40 42                  <1> 	inc	edx
  6006 00009E41 8954240C            <1> 	mov	[esp+12], edx
  6007                              <1> 
  6008 00009E45 FECC                <1> 	dec 	ah ; 13/04/2016
  6009                              <1> 
  6010 00009E47 EBDD                <1> 	jmp	short set_env_chk_validation2w
  6011                              <1> 
  6012                              <1> set_env_chk_validation2z:
  6013                              <1> 	;mov	edx, Env_Page
  6014                              <1> 	;mov	edi, edx
  6015                              <1> 	; 25/07/2022
  6016 00009E49 BB00300900          <1> 	mov	ebx, Env_Page
  6017 00009E4E 89DF                <1> 	mov	edi, ebx
  6018                              <1> 
  6019                              <1> set_env_chk_validation3:
  6020 00009E50 AC                  <1> 	lodsb
  6021 00009E51 3C20                <1> 	cmp	al, 20h
  6022 00009E53 74FB                <1> 	je	short set_env_chk_validation3
  6023                              <1> 
  6024 00009E55 9C                  <1> 	pushf
  6025                              <1> 
  6026                              <1> 	; 12/04/2016
  6027                              <1> set_env_chk_validation3n:
  6028 00009E56 3C61                <1> 	cmp	al, 'a'
  6029 00009E58 720C                <1> 	jb	short set_env_chk_validation3c
  6030 00009E5A 3C7A                <1> 	cmp	al, 'z'
  6031 00009E5C 7705                <1> 	ja	short set_env_chk_validation3x
  6032 00009E5E 2C20                <1> 	sub	al, 'a'-'A'
  6033 00009E60 8846FF              <1> 	mov	[esi-1], al
  6034                              <1> 
  6035                              <1> set_env_chk_validation3x:
  6036 00009E63 AC                  <1> 	lodsb
  6037 00009E64 EBF0                <1> 	jmp	short set_env_chk_validation3n
  6038                              <1> 
  6039                              <1> set_env_chk_validation3c:
  6040 00009E66 3C20                <1> 	cmp	al, 20h
  6041 00009E68 73F9                <1> 	jnb	short set_env_chk_validation3x
  6042                              <1> 		
  6043 00009E6A 803F00              <1> 	cmp	byte [edi], 0
  6044 00009E6D 772B                <1> 	ja	short set_env_chk_validation4
  6045                              <1> 
  6046 00009E6F 9D                  <1> 	popf
  6047 00009E70 7222                <1> 	jb	short set_env_string_nothing
  6048                              <1> 
  6049 00009E72 B900020000          <1> 	mov	ecx, Env_Page_Size ; 512 (4096)
  6050                              <1> 
  6051                              <1> 	;mov	esi, ebx ; 12/04/2016
  6052                              <1> 	; 25/07/2022
  6053 00009E77 89D6                <1> 	mov	esi, edx
  6054                              <1> 
  6055                              <1> 	; 25/07/2022
  6056 00009E79 89CA                <1> 	mov	edx, ecx
  6057                              <1> 
  6058                              <1> set_env_string_copy_to_envb:
  6059 00009E7B AC                  <1> 	lodsb
  6060 00009E7C 3C20                <1> 	cmp	al, 20h
  6061 00009E7E 7207                <1> 	jb	short set_env_string_copy_to_envb_z
  6062 00009E80 AA                  <1> 	stosb
  6063 00009E81 E2F8                <1> 	loop	set_env_string_copy_to_envb
  6064                              <1> 
  6065                              <1> 	; 11/04/2016
  6066                              <1> 	;mov	edi, edx ; Env_Page
  6067                              <1> 	; 25/07/2022
  6068 00009E83 89DF                <1> 	mov	edi, ebx
  6069                              <1> 	; 25/07/2022
  6070                              <1> 	;mov	ecx, Env_Page_Size
  6071 00009E85 89D1                <1> 	mov	ecx, edx
  6072                              <1> 
  6073                              <1> set_env_string_copy_to_envb_z:
  6074                              <1> 	; 25/07/2022
  6075                              <1> 	;push	edx  ; Start address of the variable
  6076                              <1> 
  6077                              <1> 	;;mov	edx, Env_Page_Size
  6078                              <1> 	;; 25/07/2022
  6079 00009E87 29CA                <1> 	sub	edx, ecx ; variable (string) length
  6080                              <1> 
  6081 00009E89 28C0                <1> 	sub	al, al ; 0
  6082 00009E8B F3AA                <1>  	rep	stosb ; clear remain bytes of the env page
  6083                              <1> 
  6084                              <1> 	;pop	eax  ; Start address of the variable
  6085                              <1> 	; 25/07/2022
  6086 00009E8D 89D8                <1> 	mov	eax, ebx
  6087                              <1> 
  6088                              <1> set_env_string_allocate_envb_retn:  ; stc or clc return
  6089 00009E8F 5F                  <1> 	pop	edi ; ****
  6090 00009E90 5B                  <1> 	pop	ebx ; ***
  6091 00009E91 59                  <1> 	pop	ecx ; **
  6092 00009E92 5E                  <1> 	pop	esi ; *
  6093 00009E93 C3                  <1> 	retn
  6094                              <1> 
  6095                              <1> set_env_string_nothing:
  6096 00009E94 31C0                <1> 	xor	eax, eax
  6097 00009E96 31D2                <1> 	xor	edx, edx ; 11/04/2016
  6098 00009E98 EBF5                <1> 	jmp	short set_env_string_allocate_envb_retn
  6099                              <1> 
  6100                              <1> set_env_chk_validation4:
  6101                              <1> 	; 11/04/2016
  6102 00009E9A 9D                  <1> 	popf
  6103                              <1> 
  6104                              <1> 	;mov	esi, edx  ; Env_Page
  6105                              <1> 	; 25/07/2022
  6106 00009E9B 89DE                <1> 	mov	esi, ebx
  6107                              <1> 
  6108                              <1> set_env_chk_validation5:
  6109                              <1> 	;mov	edi, ebx ; ASCIIZ environment string address
  6110                              <1> 	; 25/07/2022
  6111 00009E9D 89D7                <1> 	mov	edi, edx
  6112 00009E9F 0FB6CC              <1> 	movzx	ecx, ah ; Variable (string) length (with '=')
  6113                              <1> 
  6114                              <1> set_env_chk_validation5_loop:
  6115 00009EA2 AC                  <1> 	lodsb
  6116 00009EA3 AE                  <1> 	scasb
  6117 00009EA4 7508                <1> 	jne	short set_env_chk_validation6
  6118 00009EA6 E2FA                <1> 	loop	set_env_chk_validation5_loop
  6119                              <1> 
  6120 00009EA8 3C3D                <1> 	cmp	al, '='
  6121                              <1>         ;je	set_env_change_variable
  6122                              <1> 	; 25/07/2022
  6123 00009EAA 7502                <1> 	jne	short set_env_chk_validation6
  6124 00009EAC EB7E                <1> 	jmp	set_env_change_variable
  6125                              <1> 
  6126                              <1> set_env_chk_validation6:
  6127 00009EAE 08C0                <1> 	or	al, al ; 0
  6128 00009EB0 7403                <1> 	jz	short set_env_chk_validation7
  6129                              <1> 
  6130 00009EB2 AC                  <1> 	lodsb
  6131 00009EB3 EBF9                <1> 	jmp	short set_env_chk_validation6
  6132                              <1> 
  6133                              <1> set_env_chk_validation7:
  6134 00009EB5 88E1                <1> 	mov	cl, ah
  6135 00009EB7 01F1                <1> 	add	ecx, esi
  6136 00009EB9 81F9FF310900        <1> 	cmp	ecx, Env_Page + Env_Page_Size - 1
  6137                              <1> 		; 511 (4095) 
  6138                              <1> 		; strlen + '=' + 0
  6139 00009EBF 72DC                <1> 	jb	short set_env_chk_validation5
  6140                              <1> 
  6141                              <1> set_env_chk_validation8: ; variable not found
  6142 00009EC1 0FB6F4              <1> 	movzx	esi, ah  ; variable name length (with '=')
  6143                              <1> 	;add	esi, ebx ; position just after of the '='
  6144                              <1> 	; 25/07/2022
  6145 00009EC4 01D6                <1> 	add	esi, edx
  6146                              <1> 
  6147                              <1> set_env_chk_validation8_loop:
  6148 00009EC6 AC                  <1> 	lodsb
  6149 00009EC7 3C20                <1> 	cmp	al, 20h
  6150 00009EC9 74FB                <1> 	je	short set_env_chk_validation8_loop
  6151 00009ECB 72C7                <1> 	jb	short set_env_string_nothing
  6152                              <1> 
  6153                              <1> set_env_chk_validation9:
  6154 00009ECD AC                  <1> 	lodsb
  6155 00009ECE 3C20                <1> 	cmp	al, 20h
  6156 00009ED0 73FB                <1> 	jnb	short set_env_chk_validation9
  6157                              <1> 
  6158                              <1> 	; End of ASCIIZ environment string
  6159                              <1> 
  6160                              <1> set_env_add_variable:
  6161                              <1> 	;sub	esi, ebx ; variable+definition length
  6162                              <1> 	; 25/07/2022
  6163 00009ED2 29D6                <1> 	sub	esi, edx
  6164                              <1> 
  6165 00009ED4 56                  <1> 	push	esi ; *****
  6166                              <1> 
  6167                              <1> 	;mov	esi, edx ; Environment page address
  6168                              <1> 	; 25/07/2022
  6169 00009ED5 89DE                <1> 	mov	esi, ebx
  6170                              <1> 
  6171 00009ED7 B900020000          <1> 	mov	ecx, Env_Page_Size ; 512 (4096)
  6172                              <1> 
  6173                              <1> set_env_add_variable_loop:
  6174 00009EDC AC                  <1> 	lodsb
  6175 00009EDD 20C0                <1> 	and	al, al
  6176 00009EDF 7406                <1> 	jz	short set_env_add_variable_chk1 ; 0
  6177 00009EE1 E2F9                <1> 	loop	set_env_add_variable_loop
  6178                              <1> 
  6179                              <1> 	; 11/04/2016
  6180 00009EE3 884EFF              <1> 	mov	[esi-1], cl ; 0
  6181 00009EE6 41                  <1> 	inc	ecx
  6182                              <1> 
  6183                              <1> set_env_add_variable_chk1:
  6184 00009EE7 49                  <1> 	dec	ecx
  6185 00009EE8 7408                <1> 	jz	short set_env_add_variable_nspc
  6186 00009EEA AC                  <1> 	lodsb
  6187 00009EEB 08C0                <1> 	or 	al, al
  6188 00009EED 740B                <1> 	jz	short set_env_add_variable_chk2 ; 00
  6189 00009EEF 49                  <1> 	dec	ecx
  6190 00009EF0 75EA                <1> 	jnz	short set_env_add_variable_loop
  6191                              <1> 
  6192                              <1> set_env_add_variable_nspc: ; no space on environment page
  6193 00009EF2 58                  <1> 	pop	eax ; *****
  6194                              <1> 	;mov	eax, 8 ; No space for new environment string
  6195                              <1> 	; 25/07/2022
  6196 00009EF3 29C0                <1> 	sub	eax, eax
  6197 00009EF5 B008                <1> 	mov	al, 8
  6198 00009EF7 F9                  <1> 	stc
  6199 00009EF8 EB95                <1>         jmp     short set_env_string_allocate_envb_retn
  6200                              <1> 
  6201                              <1> set_env_add_variable_chk2:
  6202 00009EFA 8B0C24              <1> 	mov	ecx, [esp] ; *****
  6203 00009EFD 4E                  <1> 	dec	esi ; beginning address of the new variable
  6204 00009EFE 89F0                <1> 	mov	eax, esi
  6205 00009F00 01C8                <1> 	add	eax, ecx ; string length (with CR)
  6206                              <1> 	;add	edx, Env_Page_Size ; 512 (4096)
  6207                              <1> 	; 25/07/2022
  6208 00009F02 81C300020000        <1> 	add	ebx, Env_Page_Size
  6209                              <1> 	;cmp	eax, edx 
  6210 00009F08 39D8                <1> 	cmp	eax, ebx ; 25/07/2022
  6211 00009F0A 77E6                <1> 	ja	short set_env_add_variable_nspc
  6212 00009F0C 49                  <1> 	dec	ecx ; except CR at the end
  6213                              <1> 	;mov	edx, ecx ; 12/04/2016
  6214                              <1> 	; 25/07/2022
  6215 00009F0D 89CB                <1> 	mov	ebx, ecx
  6216 00009F0F 89F7                <1> 	mov	edi, esi
  6217 00009F11 893C24              <1> 	mov	[esp], edi ; ***** ; Start address of new variable
  6218                              <1> 	;mov	esi, ebx ; ASCIIZ environment string address
  6219                              <1> 	; 25/07/2022
  6220 00009F14 89D6                <1> 	mov	esi, edx
  6221 00009F16 F3A4                <1> 	rep	movsb
  6222 00009F18 28C0                <1> 	sub	al, al
  6223 00009F1A AA                  <1> 	stosb
  6224 00009F1B 58                  <1> 	pop	eax ; ***** ; Beginning address of new variable
  6225 00009F1C 81FF00320900        <1>         cmp     edi, Env_Page + Env_Page_Size ; 12/04/2016
  6226                              <1> 	;jnb	set_env_string_allocate_envb_retn ; OK !
  6227                              <1> 	; 25/07/2022
  6228 00009F22 7303                <1>  	jnb	short set_env_add_variable_chk3
  6229 00009F24 880F                <1> 	mov	[edi], cl ; 0
  6230 00009F26 F8                  <1> 	clc	; 13/04/2016
  6231                              <1> set_env_add_variable_chk3:
  6232 00009F27 E963FFFFFF          <1>         jmp     set_env_string_allocate_envb_retn ; OK !
  6233                              <1> 
  6234                              <1> set_env_change_variable:
  6235                              <1> 	; 06/04/2016
  6236                              <1> 	; esi = Variable's address in environment page (after '=')
  6237                              <1> 	; edi = ASCIIZ environment string address (after '=')
  6238                              <1> 
  6239                              <1> 	; ah = variable length from start to the '='
  6240 00009F2C 8825[20890100]      <1> 	mov	[env_var_length], ah
  6241                              <1> 
  6242 00009F32 28C9                <1> 	sub	cl, cl ; ecx = 0
  6243                              <1> 
  6244 00009F34 57                  <1> 	push	edi ; *****
  6245                              <1> 
  6246 00009F35 89F7                <1> 	mov	edi, esi ; 11/04/2016
  6247                              <1> 
  6248                              <1> set_env_change_variable_calc1:
  6249 00009F37 AC                  <1> 	lodsb
  6250 00009F38 08C0                <1> 	or	al, al
  6251 00009F3A 7403                <1> 	jz	short set_env_change_variable_calc2
  6252                              <1> 
  6253 00009F3C 41                  <1> 	inc	ecx ; length of environment string (after the '=')
  6254                              <1> 
  6255 00009F3D EBF8                <1> 	jmp	short set_env_change_variable_calc1
  6256                              <1> 
  6257                              <1> set_env_change_variable_calc2:
  6258 00009F3F 8B3424              <1> 	mov	esi, [esp] ; ASCIIZ environment string address
  6259                              <1> 
  6260 00009F42 29D2                <1> 	sub	edx, edx
  6261                              <1> 
  6262                              <1> set_env_change_variable_calc3:
  6263 00009F44 AC                  <1> 	lodsb
  6264 00009F45 3C20                <1> 	cmp	al, 20h
  6265 00009F47 7203                <1> 	jb	short set_env_change_variable_calc4
  6266                              <1> 
  6267 00009F49 42                  <1> 	inc	edx ; length of ASCIIZ string (after the '=')
  6268                              <1> 
  6269 00009F4A EBF8                <1> 	jmp	short set_env_change_variable_calc3
  6270                              <1> 
  6271                              <1> set_env_change_variable_calc4:
  6272 00009F4C C646FF00            <1> 	mov	byte [esi-1], 0  ; put ZERO instead of CR
  6273                              <1> 
  6274 00009F50 5E                  <1> 	pop	esi ; ***** ; ASCIIZ string address (after '=')
  6275                              <1> 
  6276                              <1> 	; EDI = Old variable's address (after '=')
  6277                              <1> 
  6278                              <1> 	; compare the new string with the old string
  6279 00009F51 39CA                <1> 	cmp	edx, ecx
  6280 00009F53 7718                <1> 	ja	short set_env_change_variable_calc5 ; longer
  6281                              <1> 	;jb	set_env_change_variable_calc9 ; shorter
  6282                              <1> 	; 25/07/2022
  6283 00009F55 7405                <1> 	je	short set_env_change_variable_calc22
  6284 00009F57 E98C000000          <1> 	jmp	set_env_change_variable_calc9 
  6285                              <1> 
  6286                              <1> set_env_change_variable_calc22:
  6287                              <1> 	;same length (simple copy)
  6288 00009F5C 0FB6C4              <1> 	movzx	eax, ah
  6289 00009F5F 01C2                <1> 	add	edx, eax
  6290 00009F61 F7D8                <1> 	neg	eax
  6291 00009F63 01F8                <1> 	add	eax, edi
  6292                              <1> 	; EAX = Start address of the variable
  6293                              <1> 	; EDX = Variable length (without ZERO at the end of variable)
  6294                              <1> 
  6295 00009F65 F3A4                <1> 	rep	movsb
  6296 00009F67 F8                  <1> 	clc	; 13/04/2016
  6297 00009F68 E922FFFFFF          <1>         jmp     set_env_string_allocate_envb_retn ; OK !
  6298                              <1> 
  6299                              <1> set_env_change_variable_calc5:
  6300                              <1> 	; 11/04/2016
  6301 00009F6D 52                  <1> 	push	edx ; *****
  6302 00009F6E 29CA                <1> 	sub	edx, ecx ; difference ; (the new string is longer)
  6303 00009F70 89F3                <1> 	mov 	ebx, esi
  6304 00009F72 89FE                <1> 	mov	esi, edi
  6305                              <1> 
  6306                              <1> set_env_change_variable_calc6:
  6307 00009F74 AC                  <1> 	lodsb
  6308 00009F75 20C0                <1> 	and	al, al
  6309 00009F77 75FB                <1> 	jnz	short set_env_change_variable_calc6
  6310                              <1> 
  6311 00009F79 81FE00320900        <1> 	cmp	esi, Env_Page + Env_Page_Size ; 512 (4096)
  6312 00009F7F 0F836DFFFFFF        <1>         jnb     set_env_add_variable_nspc
  6313                              <1> 
  6314 00009F85 89F9                <1> 	mov	ecx, edi  ; current (old) variable's address
  6315 00009F87 89F7                <1> 	mov	edi, esi  ; next variable's address
  6316                              <1> 
  6317 00009F89 AC                  <1> 	lodsb
  6318 00009F8A 08C0                <1> 	or	al, al
  6319 00009F8C 7417                <1> 	jz	short set_env_change_variable_calc8 ; 00
  6320                              <1> 
  6321                              <1> set_env_change_variable_calc7:
  6322 00009F8E AC                  <1> 	lodsb
  6323 00009F8F 20C0                <1> 	and	al, al
  6324 00009F91 75FB                <1> 	jnz	short set_env_change_variable_calc7
  6325                              <1> 
  6326 00009F93 81FE00320900        <1> 	cmp	esi, Env_Page + Env_Page_Size ; 512 (4096)
  6327                              <1> 	;jnb	set_env_add_variable_nspc
  6328                              <1> 	; 25/07/2022
  6329 00009F99 7205                <1> 	jb	short set_env_change_variable_calc24
  6330                              <1> set_env_change_variable_calc23:
  6331 00009F9B E952FFFFFF          <1> 	jmp	set_env_add_variable_nspc
  6332                              <1> 
  6333                              <1> set_env_change_variable_calc24:
  6334 00009FA0 AC                  <1> 	lodsb
  6335 00009FA1 08C0                <1> 	or	al, al
  6336 00009FA3 75E9                <1> 	jnz	short set_env_change_variable_calc7
  6337                              <1> 
  6338                              <1> set_env_change_variable_calc8:
  6339 00009FA5 4E                  <1> 	dec	esi ; address of the second (last) 0 of the 00
  6340                              <1> 
  6341 00009FA6 01F2                <1> 	add	edx, esi ; final position of the last 0
  6342                              <1> 
  6343 00009FA8 81FA00320900        <1> 	cmp	edx, Env_Page + Env_Page_Size ; 512 (4096)
  6344                              <1> 	;jnb     set_env_add_variable_nspc
  6345                              <1> 	; 25/07/2022
  6346 00009FAE 73EB                <1> 	jnb	short set_env_change_variable_calc23
  6347                              <1> 
  6348 00009FB0 89C8                <1> 	mov	eax, ecx ; old variable's address (after '=')
  6349                              <1> 
  6350 00009FB2 89F1                <1> 	mov	ecx, esi 
  6351 00009FB4 29F9                <1> 	sub	ecx, edi ; count of bytes to move forward
  6352                              <1> 
  6353                              <1> 	; 13/04/2016
  6354 00009FB6 C60200              <1> 	mov	byte [edx], 0
  6355 00009FB9 89D7                <1> 	mov	edi, edx
  6356 00009FBB 29F2                <1> 	sub	edx, esi ; difference (additional byte count)
  6357 00009FBD 4F                  <1> 	dec	edi ; the last zero address (first byte of the 00)
  6358 00009FBE 89FE                <1> 	mov	esi, edi
  6359 00009FC0 29D6                <1> 	sub	esi, edx ; - displacement
  6360                              <1> 
  6361 00009FC2 FA                  <1> 	cli	; disable interrupts
  6362 00009FC3 FD                  <1> 	std	; backward
  6363                              <1> 
  6364 00009FC4 F3A4                <1> 	rep	movsb ; move ECX bytes from DS:ESI to ES:EDI
  6365                              <1> 
  6366 00009FC6 FC                  <1> 	cld	; forward (default)
  6367 00009FC7 FB                  <1> 	sti	; enable interrupts
  6368                              <1> 
  6369 00009FC8 89C7                <1> 	mov	edi, eax
  6370 00009FCA 59                  <1> 	pop	ecx ; ***** ; byte count (after '=')
  6371 00009FCB 89CA                <1> 	mov	edx, ecx
  6372 00009FCD 89DE                <1> 	mov	esi, ebx ; ASCIIZ string address (after '=')
  6373 00009FCF 89FB                <1> 	mov	ebx, edi
  6374                              <1> 
  6375 00009FD1 F3A4                <1> 	rep	movsb
  6376                              <1> 
  6377 00009FD3 880F                <1> 	mov	[edi], cl ; 0 ; end of variable
  6378                              <1> 
  6379 00009FD5 0FB605[20890100]    <1> 	movzx	eax, byte [env_var_length]
  6380 00009FDC 01C2                <1> 	add	edx, eax ; variable length (total)
  6381 00009FDE F7D8                <1> 	neg	eax
  6382 00009FE0 01D8                <1> 	add	eax, ebx ; start address of the variable
  6383 00009FE2 F8                  <1> 	clc	; 13/04/2016
  6384 00009FE3 E9A7FEFFFF          <1>         jmp     set_env_string_allocate_envb_retn ; OK !
  6385                              <1> 
  6386                              <1> set_env_change_variable_calc9:
  6387                              <1> 	; 11/04/2016
  6388 00009FE8 21D2                <1> 	and	edx, edx ; is empty ?
  6389 00009FEA 753B                <1> 	jnz	short set_env_change_variable_calc15
  6390                              <1> 
  6391 00009FEC 0FB6DC              <1> 	movzx	ebx, ah
  6392 00009FEF F7DB                <1> 	neg	ebx
  6393 00009FF1 01FB                <1> 	add	ebx, edi
  6394                              <1> 
  6395                              <1> 	; EBX = Start address of the variable (in env page)
  6396                              <1> 	; EDX = Variable length = 0
  6397                              <1> 
  6398 00009FF3 89FE                <1> 	mov	esi, edi
  6399                              <1> 
  6400                              <1> set_env_change_variable_calc10:
  6401 00009FF5 AC                  <1> 	lodsb
  6402 00009FF6 08C0                <1> 	or	al, al
  6403 00009FF8 75FB                <1> 	jnz	short set_env_change_variable_calc10
  6404                              <1> 
  6405 00009FFA B9FF310900          <1> 	mov	ecx, Env_Page + Env_Page_Size - 1
  6406                              <1> 
  6407 00009FFF 39CE                <1> 	cmp	esi, ecx ; +511 (+4095)
  6408 0000A001 7604                <1> 	jna	short set_env_change_variable_calc11
  6409                              <1> 
  6410 0000A003 89CE                <1> 	mov	esi, ecx
  6411 0000A005 8806                <1> 	mov	[esi], al ; 0
  6412                              <1> 
  6413                              <1> set_env_change_variable_calc11:
  6414 0000A007 89DF                <1> 	mov	edi, ebx ; old variable's start address
  6415                              <1> 
  6416                              <1> set_env_change_variable_calc12:
  6417 0000A009 AC                  <1> 	lodsb
  6418 0000A00A AA                  <1> 	stosb
  6419 0000A00B 20C0                <1> 	and	al, al
  6420 0000A00D 75FA                <1> 	jnz	short set_env_change_variable_calc12
  6421 0000A00F 39CE                <1> 	cmp	esi, ecx
  6422 0000A011 7706                <1> 	ja	short set_env_change_variable_calc13
  6423 0000A013 AC                  <1> 	lodsb
  6424 0000A014 AA                  <1> 	stosb
  6425 0000A015 20C0                <1> 	and	al, al
  6426 0000A017 75F0                <1> 	jnz	short set_env_change_variable_calc12
  6427                              <1> 
  6428                              <1> set_env_change_variable_calc13:
  6429 0000A019 29F9                <1> 	sub	ecx, edi
  6430 0000A01B 7203                <1> 	jb	short set_env_change_variable_calc14
  6431 0000A01D 41                  <1> 	inc	ecx ; 1-512 (1-4096)
  6432 0000A01E F3AA                <1> 	rep	stosb ; al = 0
  6433                              <1> 
  6434                              <1> set_env_change_variable_calc14:
  6435 0000A020 29C0                <1> 	sub	eax, eax ; Start address of the variable
  6436                              <1> 	; EAX = 0 -> Variable is removed
  6437                              <1> 	; EDX = Variable length = 0
  6438                              <1> 
  6439 0000A022 E968FEFFFF          <1>         jmp     set_env_string_allocate_envb_retn ; OK !
  6440                              <1> 
  6441                              <1> set_env_change_variable_calc15:
  6442 0000A027 52                  <1> 	push	edx ; *****
  6443 0000A028 F7DA                <1> 	neg	edx
  6444 0000A02A 01CA                <1> 	add	edx, ecx ; difference (the old string is longer)
  6445 0000A02C 89F3                <1> 	mov 	ebx, esi
  6446 0000A02E 89FE                <1> 	mov	esi, edi
  6447                              <1> 
  6448                              <1> set_env_change_variable_calc16:
  6449 0000A030 AC                  <1> 	lodsb
  6450 0000A031 20C0                <1> 	and	al, al
  6451 0000A033 75FB                <1> 	jnz	short set_env_change_variable_calc16
  6452                              <1> 
  6453 0000A035 B900320900          <1> 	mov	ecx, Env_Page + Env_Page_Size
  6454                              <1> 
  6455 0000A03A 39CE                <1> 	cmp	esi, ecx ; +512 (+4096)
  6456 0000A03C 7605                <1> 	jna	short set_env_change_variable_calc17
  6457                              <1> 
  6458 0000A03E 89CE                <1> 	mov	esi, ecx
  6459 0000A040 8846FF              <1> 	mov	[esi-1], al ; 0
  6460                              <1> 
  6461                              <1> set_env_change_variable_calc17:
  6462 0000A043 89F9                <1> 	mov	ecx, edi  ; current (old) variable's address
  6463 0000A045 89F7                <1> 	mov	edi, esi  ; next variable's address
  6464                              <1> 
  6465 0000A047 AC                  <1> 	lodsb
  6466 0000A048 08C0                <1> 	or	al, al
  6467 0000A04A 741D                <1> 	jz	short set_env_change_variable_calc20
  6468                              <1> 
  6469                              <1> set_env_change_variable_calc18:
  6470 0000A04C AC                  <1> 	lodsb
  6471 0000A04D 20C0                <1> 	and	al, al
  6472 0000A04F 75FB                <1> 	jnz	short set_env_change_variable_calc18
  6473                              <1> 
  6474 0000A051 81FE00320900        <1> 	cmp	esi, Env_Page + Env_Page_Size
  6475 0000A057 720B                <1> 	jb	short set_env_change_variable_calc19
  6476 0000A059 740E                <1> 	je	short set_env_change_variable_calc20
  6477                              <1> 
  6478 0000A05B BEFF310900          <1> 	mov	esi, Env_Page + Env_Page_Size - 1
  6479 0000A060 8806                <1> 	mov	[esi], al ; 0
  6480 0000A062 EB06                <1> 	jmp	short set_env_change_variable_calc21
  6481                              <1> 
  6482                              <1> set_env_change_variable_calc19:
  6483 0000A064 AC                  <1> 	lodsb
  6484 0000A065 08C0                <1> 	or	al, al
  6485 0000A067 75E3                <1> 	jnz	short set_env_change_variable_calc18
  6486                              <1> 
  6487                              <1> set_env_change_variable_calc20:
  6488 0000A069 4E                  <1> 	dec	esi ; address of the second (last) 0 of the 00
  6489                              <1> 
  6490                              <1> set_env_change_variable_calc21:
  6491                              <1> 	; edx = difference (byte count)
  6492                              <1> 
  6493 0000A06A 89C8                <1> 	mov	eax, ecx ; old variable's address (after '=')
  6494                              <1> 
  6495 0000A06C 89F1                <1> 	mov	ecx, esi
  6496 0000A06E 29F9                <1> 	sub	ecx, edi ; count of bytes to move backward
  6497                              <1> 
  6498 0000A070 89FE                <1> 	mov	esi, edi ; next variable's address
  6499 0000A072 29D7                <1> 	sub	edi, edx ; (displacement)
  6500                              <1> 
  6501 0000A074 F3A4                <1> 	rep	movsb
  6502                              <1> 
  6503 0000A076 880F                <1> 	mov	[edi], cl ; 0 ; 00 ; end of environment variables
  6504                              <1> 
  6505 0000A078 89C7                <1> 	mov	edi, eax
  6506 0000A07A 5A                  <1> 	pop	edx ; ***** ; byte count (after '=')
  6507 0000A07B 89D1                <1> 	mov	ecx, edx
  6508 0000A07D 89DE                <1> 	mov	esi, ebx ; ASCIIZ string address (after '=')
  6509 0000A07F 89FB                <1> 	mov	ebx, edi
  6510                              <1> 
  6511 0000A081 F3A4                <1> 	rep	movsb
  6512                              <1> 
  6513 0000A083 880F                <1> 	mov	[edi], cl ; 0 ; end of variable
  6514                              <1> 
  6515 0000A085 0FB605[20890100]    <1> 	movzx	eax, byte [env_var_length]
  6516 0000A08C 01C2                <1> 	add	edx, eax ; variable length (total)
  6517 0000A08E F7D8                <1> 	neg	eax
  6518 0000A090 01D8                <1> 	add	eax, ebx ; start address of the variable
  6519 0000A092 F8                  <1> 	clc	; 13/04/2016
  6520 0000A093 E9F7FDFFFF          <1>         jmp     set_env_string_allocate_envb_retn ; OK !
  6521                              <1> 
  6522                              <1> mainprog_startup_configuration:
  6523                              <1> 	; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  6524                              <1> 	; 22/11/2017
  6525                              <1> 	; 06/05/2016
  6526                              <1> 	; 14/04/2016 (TRDOS 386 = TRDOS v2.0)
  6527                              <1> 	; 17/09/2011 (TRDOS v1, MAINPROG.ASM)
  6528                              <1> 	;
  6529                              <1> loc_load_mainprog_cfg_file:
  6530 0000A098 BE[1E350100]        <1> 	mov	esi, MainProgCfgFile
  6531 0000A09D 66B80018            <1> 	mov	ax, 1800h ; Except volume label and dirs
  6532 0000A0A1 E8C4EAFFFF          <1> 	call	find_first_file
  6533 0000A0A6 7256                <1> 	jc	short loc_load_mainprog_cfg_exit
  6534                              <1> 
  6535                              <1> 	;or	eax, eax
  6536                              <1> 	;jz	short loc_load_mainprog_cfg_exit
  6537                              <1> 
  6538                              <1> loc_start_mainprog_configuration:
  6539                              <1> 	; ESI = FindFile_DirEntry Location
  6540                              <1> 	; EAX = File Size
  6541                              <1> 
  6542 0000A0A8 A3[A07D0100]        <1> 	mov	[MainProgCfg_FileSize], eax
  6543                              <1> 
  6544 0000A0AD 668B5614            <1> 	mov	dx, [esi+DirEntry_FstClusHI]
  6545 0000A0B1 C1E210              <1> 	shl	edx, 16
  6546 0000A0B4 668B561A            <1> 	mov	dx, [esi+DirEntry_FstClusLO]
  6547 0000A0B8 8915[D4880100]      <1> 	mov	[csftdf_sf_cluster], edx
  6548                              <1> 
  6549 0000A0BE 89C1                <1> 	mov	ecx, eax
  6550 0000A0C0 29C0                <1> 	sub	eax, eax
  6551                              <1> 
  6552                              <1> 	; TRDOS 386 (TRDOS v2.0)
  6553                              <1> 	; Allocate contiguous memory block for loading the file
  6554                              <1> 
  6555                              <1> 	; eax = 0 (Allocate memory from the beginning)
  6556                              <1> 	; ecx = File (Allocation) size in bytes
  6557                              <1> 
  6558 0000A0C2 E82CBCFFFF          <1> 	call	allocate_memory_block
  6559 0000A0C7 7235                <1> 	jc	short loc_load_mainprog_cfg_exit
  6560                              <1> 
  6561 0000A0C9 A3[CC880100]        <1> 	mov	[csftdf_sf_mem_addr], eax ; loading address
  6562 0000A0CE 890D[D0880100]      <1> 	mov	[csftdf_sf_mem_bsize], ecx ; block size
  6563                              <1> 
  6564 0000A0D4 31DB                <1> 	xor	ebx, ebx
  6565                              <1> 	;mov	[csftdf_sf_rbytes], ebx ; 0, reset
  6566                              <1> 
  6567 0000A0D6 8A3D[B27D0100]      <1> 	mov	bh, [Current_Drv] ; [FindFile_Drv]
  6568 0000A0DC BE00010900          <1> 	mov	esi, Logical_DOSDisks
  6569 0000A0E1 01DE                <1> 	add	esi, ebx
  6570                              <1> 
  6571 0000A0E3 8B1D[CC880100]      <1> 	mov	ebx, [csftdf_sf_mem_addr] ; memory block address
  6572                              <1> 
  6573 0000A0E9 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  6574 0000A0ED 7710                <1>         ja	short loc_mcfg_load_fat_file
  6575                              <1> 
  6576 0000A0EF C705[DC880100]0000- <1> 	mov	dword [csftdf_r_size], 65536
  6576 0000A0F7 0100                <1>
  6577 0000A0F9 E99A010000          <1>         jmp     loc_mcfg_load_fs_file
  6578                              <1> 
  6579                              <1> loc_load_mainprog_cfg_exit:
  6580 0000A0FE C3                  <1> 	retn
  6581                              <1> 
  6582                              <1> loc_mcfg_load_fat_file:
  6583 0000A0FF 0FB74611            <1> 	movzx	eax, word [esi+LD_BPB+BytesPerSec]
  6584 0000A103 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+SecPerClust]
  6585 0000A107 F7E1                <1> 	mul	ecx
  6586 0000A109 A3[DC880100]        <1> 	mov	[csftdf_r_size], eax
  6587                              <1> 
  6588                              <1> loc_mcfg_load_fat_file_next:
  6589 0000A10E E81D010000          <1> 	call	mcfg_read_fat_file_sectors
  6590 0000A113 7259                <1>         jc	short mcfg_deallocate_mem ; 25/07/2022
  6591                              <1> 
  6592 0000A115 09D2                <1> 	or	edx, edx ; edx > 0 -> EOF
  6593 0000A117 74F5                <1> 	jz	short loc_mcfg_load_fat_file_next
  6594                              <1> 
  6595                              <1> loc_mcfg_load_fat_file_ok:
  6596                              <1> 	; 06/05/2016
  6597 0000A119 C705[78890100]-     <1> 	mov	dword [mainprog_return_addr], loc_mcfg_ci_return_addr 
  6597 0000A11F [EBA10000]          <1>
  6598                              <1> 	;
  6599 0000A123 8B35[CC880100]      <1> 	mov	esi, [csftdf_sf_mem_addr]
  6600 0000A129 8935[A47D0100]      <1> 	mov	[MainProgCfg_LineOffset], esi
  6601                              <1> 
  6602 0000A12F A1[A07D0100]        <1> 	mov	eax, [MainProgCfg_FileSize]
  6603 0000A134 89C2                <1> 	mov	edx, eax
  6604 0000A136 01F2                <1> 	add	edx, esi
  6605                              <1> 
  6606                              <1> loc_mcfg_process_next_line_check:
  6607 0000A138 89C1                <1> 	mov	ecx, eax
  6608                              <1> 
  6609 0000A13A 803E2A              <1> 	cmp	byte [esi], "*" ; Remark sign
  6610 0000A13D 7503                <1> 	jne	short loc_mcfg_process_next_line
  6611 0000A13F 46                  <1> 	inc	esi
  6612 0000A140 EB16                <1> 	jmp	short loc_move_mainprog_cfg_nl1
  6613                              <1> 
  6614                              <1> loc_mcfg_process_next_line:
  6615 0000A142 83F94F              <1> 	cmp	ecx, 79
  6616 0000A145 7604                <1> 	jna	short loc_start_mainprog_cfg_process
  6617                              <1> 
  6618                              <1> 	;mov	ecx, 79
  6619                              <1> 	; 25/07/2022
  6620 0000A147 29C9                <1> 	sub	ecx, ecx
  6621 0000A149 B14F                <1> 	mov	cl, 79
  6622                              <1> 
  6623                              <1> loc_start_mainprog_cfg_process:
  6624 0000A14B BF[627E0100]        <1> 	mov	edi, CommandBuffer
  6625                              <1> 
  6626                              <1> loc_move_mainprog_cfg_line:
  6627 0000A150 AC                  <1> 	lodsb
  6628 0000A151 3C20                <1> 	cmp	al, 20h
  6629 0000A153 720C                <1> 	jb	short loc_move_mainprog_cfg_nl2
  6630 0000A155 AA                  <1> 	stosb
  6631 0000A156 E2F8                <1> 	loop	loc_move_mainprog_cfg_line
  6632                              <1> 
  6633                              <1> loc_move_mainprog_cfg_nl1:
  6634 0000A158 39D6                <1> 	cmp	esi, edx ; + configuration file size
  6635 0000A15A 7322                <1> 	jnb	short loc_end_of_mainprog_cfg_line
  6636 0000A15C AC                  <1> 	lodsb
  6637 0000A15D 3C20                <1> 	cmp	al, 20h
  6638 0000A15F 73F7                <1> 	jnb	short loc_move_mainprog_cfg_nl1
  6639                              <1> 
  6640                              <1> loc_move_mainprog_cfg_nl2:
  6641 0000A161 39D6                <1> 	cmp	esi, edx
  6642 0000A163 7319                <1> 	jnb	short loc_end_of_mainprog_cfg_line
  6643 0000A165 8A06                <1> 	mov	al, [esi]
  6644 0000A167 3C20                <1> 	cmp	al, 20h
  6645 0000A169 7713                <1>  	ja	short loc_end_of_mainprog_cfg_line
  6646 0000A16B 46                  <1> 	inc	esi
  6647 0000A16C EBF3                <1> 	jmp	short loc_move_mainprog_cfg_nl2	
  6648                              <1> 
  6649                              <1> 	; 25/07/2022
  6650                              <1> mcfg_deallocate_mem:
  6651 0000A16E A1[CC880100]        <1> 	mov	eax, [csftdf_sf_mem_addr] ; start address
  6652 0000A173 8B0D[D0880100]      <1> 	mov	ecx, [csftdf_sf_mem_bsize] ; block size
  6653                              <1> 	;call	deallocate_memory_block
  6654                              <1> 	;retn
  6655 0000A179 E98FBDFFFF          <1> 	jmp	deallocate_memory_block
  6656                              <1> 
  6657                              <1> loc_end_of_mainprog_cfg_line:
  6658 0000A17E C60700              <1> 	mov	byte [edi], 0
  6659                              <1> 
  6660 0000A181 8935[A47D0100]      <1> 	mov	[MainProgCfg_LineOffset], esi
  6661                              <1> 
  6662                              <1> 	; 22/11/2017
  6663 0000A187 BE[6A7E0100]        <1> 	mov	esi, CommandBuffer + 8
  6664 0000A18C 29FE                <1> 	sub	esi, edi
  6665 0000A18E 7606                <1> 	jna	short loc_move_mainprog_cfg_command
  6666 0000A190 30C0                <1> 	xor	al, al
  6667                              <1> loc_mainprog_cfg_clear_chrs:
  6668 0000A192 AA                  <1> 	stosb
  6669 0000A193 4E                  <1> 	dec	esi
  6670 0000A194 75FC                <1> 	jnz	short loc_mainprog_cfg_clear_chrs
  6671                              <1> 
  6672                              <1> loc_move_mainprog_cfg_command:
  6673 0000A196 BE[627E0100]        <1> 	mov	esi, CommandBuffer
  6674 0000A19B 89F7                <1> 	mov	edi, esi
  6675 0000A19D 31DB                <1> 	xor	ebx, ebx
  6676                              <1> 	;xor	ecx, ecx
  6677 0000A19F 30C9                <1> 	xor	cl, cl
  6678                              <1> 
  6679                              <1> loc_move_mcfg_first_cmd_char:
  6680 0000A1A1 8A041E              <1> 	mov	al, [esi+ebx]
  6681 0000A1A4 FEC3                <1> 	inc	bl
  6682 0000A1A6 3C20                <1> 	cmp	al, 20h
  6683 0000A1A8 7712                <1> 	ja	short loc_move_mcfg_cmd_capitalizing
  6684 0000A1AA 7237                <1> 	jb	short loc_move_mcfg_cmd_arguments_ok
  6685 0000A1AC 80FB4F              <1> 	cmp	bl, 79
  6686 0000A1AF 72F0                <1> 	jb	short loc_move_mcfg_first_cmd_char
  6687 0000A1B1 EB30                <1> 	jmp	short loc_move_mcfg_cmd_arguments_ok
  6688                              <1> 
  6689                              <1> loc_move_mcfg_next_cmd_char:
  6690 0000A1B3 8A041E              <1> 	mov	al, [esi+ebx]
  6691 0000A1B6 FEC3                <1> 	inc	bl
  6692 0000A1B8 3C20                <1> 	cmp	al, 20h
  6693 0000A1BA 7614                <1> 	jna	short loc_move_mcfg_cmd_ok
  6694                              <1> 
  6695                              <1> loc_move_mcfg_cmd_capitalizing:
  6696 0000A1BC 3C61                <1> 	cmp	al, 61h ; 'a'
  6697 0000A1BE 7206                <1> 	jb	short loc_move_mcfg_cmd_caps_ok
  6698 0000A1C0 3C7A                <1> 	cmp	al, 7Ah ; 'z'
  6699 0000A1C2 7702                <1> 	ja	short loc_move_mcfg_cmd_caps_ok
  6700 0000A1C4 24DF                <1> 	and	al, 0DFh ; sub	al, 'a'-'A'
  6701                              <1> 
  6702                              <1> loc_move_mcfg_cmd_caps_ok:
  6703 0000A1C6 AA                  <1> 	stosb
  6704 0000A1C7 FEC1                <1> 	inc	cl
  6705 0000A1C9 80FB4F              <1> 	cmp	bl, 79
  6706 0000A1CC 72E5                <1> 	jb	short loc_move_mcfg_next_cmd_char
  6707 0000A1CE EB13                <1> 	jmp	short loc_move_mcfg_cmd_arguments_ok
  6708                              <1> 
  6709                              <1> loc_move_mcfg_cmd_ok:
  6710 0000A1D0 30C0                <1> 	xor	al, al ; 0
  6711                              <1> 
  6712                              <1> loc_move_mcfg_cmd_arguments:
  6713 0000A1D2 8807                <1> 	mov	[edi], al
  6714 0000A1D4 47                  <1> 	inc	edi
  6715 0000A1D5 80FB4F              <1> 	cmp	bl, 79
  6716 0000A1D8 7309                <1> 	jnb	short loc_move_mcfg_cmd_arguments_ok
  6717 0000A1DA 8A041E              <1> 	mov	al, [esi+ebx]
  6718 0000A1DD FEC3                <1> 	inc	bl
  6719 0000A1DF 3C20                <1> 	cmp	al, 20h
  6720 0000A1E1 73EF                <1> 	jnb	short loc_move_mcfg_cmd_arguments
  6721                              <1> 
  6722                              <1> loc_move_mcfg_cmd_arguments_ok:
  6723 0000A1E3 C60700              <1> 	mov	byte [edi], 0
  6724                              <1> 
  6725                              <1> loc_mcfg_process_cmd_interpreter:
  6726 0000A1E6 E87EE0FFFF          <1> 	call    command_interpreter
  6727                              <1> 
  6728                              <1> loc_mcfg_ci_return_addr:
  6729 0000A1EB A1[A07D0100]        <1> 	mov	eax, [MainProgCfg_FileSize]
  6730 0000A1F0 89C2                <1> 	mov	edx, eax
  6731 0000A1F2 8B35[A47D0100]      <1> 	mov	esi, [MainProgCfg_LineOffset]
  6732 0000A1F8 01F2                <1> 	add	edx, esi
  6733 0000A1FA 0305[CC880100]      <1> 	add	eax, [csftdf_sf_mem_addr]
  6734 0000A200 29F0                <1> 	sub	eax, esi
  6735 0000A202 0F8730FFFFFF        <1>         ja      loc_mcfg_process_next_line_check
  6736                              <1> 
  6737 0000A208 E861FFFFFF          <1> 	call	mcfg_deallocate_mem
  6738                              <1> 
  6739 0000A20D B94F000000          <1>  	mov	ecx, 79 ; 80 ?
  6740 0000A212 BF[627E0100]        <1> 	mov	edi, CommandBuffer
  6741 0000A217 30C0                <1> 	xor	al, al
  6742 0000A219 F3AA                <1> 	rep	stosb
  6743                              <1> 
  6744                              <1> 	; 06/05/2016
  6745 0000A21B BE[5B3F0100]        <1> 	mov	esi, nextline
  6746 0000A220 E845CBFFFF          <1> 	call	print_msg
  6747 0000A225 E990D7FFFF          <1> 	jmp	dos_prompt
  6748                              <1> 
  6749                              <1> mcfg_read_file_sectors:
  6750                              <1> 	; 14/04/2016
  6751 0000A22A 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  6752 0000A22E 7668                <1>         jna	short mcfg_read_fs_file_sectors
  6753                              <1> 
  6754                              <1> mcfg_read_fat_file_sectors:
  6755                              <1> 	; return:
  6756                              <1> 	;   CF = 0 & EDX > 0 -> END OF FILE
  6757                              <1> 	;   CF = 0 & EDX = 0 -> not EOF
  6758                              <1> 	;   CF = 1 -> read error (error code in AL)
  6759                              <1> 
  6760                              <1> mcfg_read_fat_file_secs_0:
  6761 0000A230 8B15[A07D0100]      <1> 	mov	edx, [MainProgCfg_FileSize]
  6762 0000A236 2B15[E4880100]      <1> 	sub	edx, [csftdf_sf_rbytes]
  6763 0000A23C 3B15[DC880100]      <1> 	cmp	edx, [csftdf_r_size]
  6764 0000A242 7306                <1> 	jnb	short mcfg_read_fat_file_secs_1
  6765 0000A244 8915[DC880100]      <1> 	mov	[csftdf_r_size], edx
  6766                              <1> 
  6767                              <1> mcfg_read_fat_file_secs_1:
  6768 0000A24A A1[DC880100]        <1> 	mov	eax, [csftdf_r_size]
  6769 0000A24F 29D2                <1> 	sub	edx, edx
  6770 0000A251 0FB74E11            <1> 	movzx	ecx, word [esi+LD_BPB+BytesPerSec]
  6771 0000A255 01C8                <1> 	add	eax, ecx
  6772 0000A257 48                  <1> 	dec	eax
  6773 0000A258 F7F1                <1> 	div	ecx
  6774 0000A25A 89C1                <1> 	mov	ecx, eax ; sector count
  6775 0000A25C A1[D4880100]        <1> 	mov	eax, [csftdf_sf_cluster]
  6776                              <1> 
  6777                              <1> 	; EBX = memory block address (current)
  6778                              <1> 
  6779 0000A261 E806230000          <1> 	call	read_fat_file_sectors
  6780 0000A266 7230                <1> 	jc	short mcfg_read_fat_file_secs_3
  6781                              <1> 
  6782                              <1> 	; EBX = next memory address
  6783                              <1> 
  6784 0000A268 A1[E4880100]        <1> 	mov	eax, [csftdf_sf_rbytes]
  6785 0000A26D 0305[DC880100]      <1> 	add	eax, [csftdf_r_size]
  6786 0000A273 8B15[A07D0100]      <1> 	mov	edx, [MainProgCfg_FileSize]
  6787 0000A279 39D0                <1> 	cmp	eax, edx
  6788 0000A27B 731B                <1> 	jnb	short mcfg_read_fat_file_secs_3 ; edx > 0
  6789 0000A27D A3[E4880100]        <1> 	mov	[csftdf_sf_rbytes], eax
  6790                              <1> 
  6791 0000A282 53                  <1> 	push	ebx ; *
  6792                              <1> 	; get next cluster (csftdf_r_size! bytes)
  6793 0000A283 A1[D4880100]        <1> 	mov	eax, [csftdf_sf_cluster]
  6794 0000A288 E8DF200000          <1> 	call	get_next_cluster
  6795 0000A28D 5B                  <1> 	pop	ebx ; *
  6796 0000A28E 7301                <1> 	jnc	short mcfg_read_fat_file_secs_2
  6797                              <1> 
  6798                              <1> 	;mov	eax, 17; Read error !
  6799 0000A290 C3                  <1> 	retn
  6800                              <1> 
  6801                              <1> mcfg_read_fat_file_secs_2:
  6802 0000A291 29D2                <1> 	sub	edx, edx ; 0
  6803 0000A293 A3[D4880100]        <1> 	mov	[csftdf_sf_cluster], eax ; next cluster
  6804                              <1> 
  6805                              <1> ; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  6806                              <1> 
  6807                              <1> mcfg_read_fat_file_secs_3:
  6808                              <1> 	;retn
  6809                              <1> 
  6810                              <1> mcfg_read_fs_file_sectors:
  6811                              <1> 	;retn
  6812                              <1> 
  6813                              <1> loc_mcfg_load_fs_file:
  6814 0000A298 C3                  <1> 	retn
  6815                              <1> 
  6816                              <1> load_and_execute_file:
  6817                              <1> 	; 04/07/2025
  6818                              <1> 	; 03/07/2025 - TRDOS 386 Kernel v2.0.10
  6819                              <1> 	; 03/09/2024 - TRDOS 386 Kernel v2.0.9
  6820                              <1> 	; 30/08/2023 - TRDOS 386 Kernel v2.0.6
  6821                              <1> 	; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  6822                              <1> 	; 04/01/2017
  6823                              <1> 	; 06/05/2016 - 07/05/2016 - 11/05/2016
  6824                              <1> 	; 23/04/2016 - 24/04/2016
  6825                              <1> 	; 22/04/2016 (TRDOS 386 = TRDOS v2.0)
  6826                              <1> 	; 05/11/2011 
  6827                              <1> 	; (TRDOS v1, CMDINTR.ASM, 'cmp_cmd_run', 'cmp_cmd_external')
  6828                              <1> 	; ('loc_run_check_filename')
  6829                              <1> 	; 29/08/2011
  6830                              <1> 	; 10/09/2011
  6831                              <1> 	; INPUT->
  6832                              <1> 	;	ESI = Path Name address (CommandBuffer address)
  6833                              <1> 	; OUTPUT ->
  6834                              <1> 	;	none (error message will be shown if an error will occur)
  6835                              <1> 	;
  6836                              <1> 	; (EAX, EBX, ECX, EDX, ESI, EDI, EBP will be changed)
  6837                              <1> 	;
  6838                              <1> loc_run_check_filename:
  6839 0000A299 803E20              <1> 	cmp	byte [esi], 20h
  6840                              <1> 	;jb	loc_cmd_failed
  6841                              <1> 	; 25/07/2022
  6842 0000A29C 7237                <1> 	jb	short loc_run_ppn_failed
  6843 0000A29E 7703                <1> 	ja	short loc_run_check_filename_ok
  6844 0000A2A0 46                  <1> 	inc	esi
  6845 0000A2A1 EBF6                <1> 	jmp	short loc_run_check_filename
  6846                              <1> 
  6847                              <1> loc_run_check_filename_ok:
  6848 0000A2A3 C605[137E0100]00    <1> 	mov	byte [CmdArgStart], 0 ; reset
  6849 0000A2AA 56                  <1> 	push	esi ; *
  6850                              <1> loc_run_get_first_arg_pos:
  6851 0000A2AB 46                  <1> 	inc	esi
  6852 0000A2AC 8A06                <1> 	mov	al, [esi]
  6853 0000A2AE 3C20                <1> 	cmp	al, 20h
  6854 0000A2B0 77F9                <1> 	ja	short loc_run_get_first_arg_pos
  6855 0000A2B2 C60600              <1> 	mov	byte [esi], 0
  6856                              <1> loc_run_get_external_arg_pos:
  6857                              <1> 	; 11/05/2016
  6858 0000A2B5 46                  <1> 	inc	esi
  6859 0000A2B6 8A06                <1> 	mov	al, [esi]
  6860 0000A2B8 3C20                <1> 	cmp	al, 20h
  6861 0000A2BA 760C                <1> 	jna	short loc_run_parse_path_name
  6862 0000A2BC 89F0                <1> 	mov	eax, esi
  6863 0000A2BE 2D[627E0100]        <1> 	sub	eax, CommandBuffer
  6864 0000A2C3 A2[137E0100]        <1> 	mov	byte [CmdArgStart], al
  6865                              <1> loc_run_parse_path_name:
  6866 0000A2C8 5E                  <1> 	pop	esi ; *
  6867 0000A2C9 BF[52860100]        <1> 	mov	edi, FindFile_Drv
  6868 0000A2CE E892090000          <1> 	call	parse_path_name
  6869                              <1> 	;jc	loc_cmd_failed
  6870                              <1> 	; 25/07/2022
  6871 0000A2D3 7305                <1> 	jnc	short loc_run_check_filename_exists
  6872                              <1> loc_run_ppn_failed:
  6873 0000A2D5 E96AE3FFFF          <1> 	jmp	loc_cmd_failed
  6874                              <1> 
  6875                              <1> loc_run_check_filename_exists:
  6876 0000A2DA BE[94860100]        <1> 	mov	esi, FindFile_Name
  6877 0000A2DF 803E20              <1> 	cmp	byte [esi], 20h
  6878                              <1> 	;jna	loc_cmd_failed
  6879                              <1> 	; 25/07/2022
  6880 0000A2E2 76F1                <1> 	jna	short loc_run_ppn_failed
  6881                              <1> 
  6882                              <1> loc_run_check_exe_filename_ext:
  6883 0000A2E4 E885020000          <1> 	call	check_prg_filename_ext
  6884                              <1> 	;jc	loc_cmd_failed
  6885                              <1> 	; 25/07/2022
  6886 0000A2E9 72EA                <1> 	jc	short loc_run_ppn_failed
  6887                              <1> 	; 03/07/2025
  6888                              <1> 	; if al = 0 -> ah = file name length
  6889                              <1> 
  6890                              <1> loc_run_check_exe_filename_ext_ok:
  6891 0000A2EB 66A3[75890100]      <1> 	mov	word [EXE_ID], ax ; 'P.' or 'P'+0
  6892                              <1> 
  6893                              <1> loc_run_drv:
  6894 0000A2F1 C605[74890100]00    <1> 	mov	byte [Run_Manual_Path], 0
  6895 0000A2F8 A1[AC7D0100]        <1> 	mov	eax, [Current_Dir_FCluster]
  6896 0000A2FD A3[68890100]        <1>         mov     [Run_CDirFC], eax
  6897                              <1> 	;
  6898 0000A302 8A35[B27D0100]      <1> 	mov	dh, [Current_Drv]
  6899 0000A308 8835[0F850100]      <1> 	mov	[RUN_CDRV], dh
  6900                              <1> 
  6901 0000A30E 8A15[52860100]      <1> 	mov	dl, [FindFile_Drv]
  6902 0000A314 38F2                <1> 	cmp	dl, dh
  6903 0000A316 7413                <1> 	je	short loc_run_change_directory
  6904                              <1> 
  6905 0000A318 8005[74890100]02    <1> 	add	byte [Run_Manual_Path], 2
  6906                              <1> 
  6907 0000A31F E859D5FFFF          <1> 	call	change_current_drive
  6908                              <1> 	;jc	loc_run_cmd_failed
  6909                              <1> 	; 25/07/2022
  6910 0000A324 7305                <1> 	jnc	short loc_run_change_directory
  6911 0000A326 E944E3FFFF          <1> 	jmp	loc_run_cmd_failed
  6912                              <1> 
  6913                              <1> loc_run_change_directory:
  6914 0000A32B 803D[53860100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  6915 0000A332 7624                <1> 	jna	short loc_run_find_executable_file
  6916                              <1> 
  6917 0000A334 FE05[74890100]      <1> 	inc	byte [Run_Manual_Path]
  6918                              <1> 
  6919 0000A33A FE05[CF340100]      <1> 	inc	byte [Restore_CDIR]
  6920                              <1> 
  6921 0000A340 BE[53860100]        <1> 	mov	esi, FindFile_Directory
  6922 0000A345 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0
  6923 0000A347 E82F030000          <1> 	call	change_current_directory
  6924                              <1> 	;jc	loc_run_cmd_failed
  6925                              <1> 	; 25/07/2022
  6926 0000A34C 7305                <1> 	jnc	short loc_run_change_prompt_dir_string
  6927 0000A34E E91CE3FFFF          <1> 	jmp	loc_run_cmd_failed
  6928                              <1> 
  6929                              <1> loc_run_change_prompt_dir_string:
  6930 0000A353 E84C020000          <1> 	call	change_prompt_dir_string
  6931                              <1> 
  6932                              <1> loc_run_find_executable_file:
  6933 0000A358 66C705[70890100]00- <1> 	mov	word [Run_Auto_Path], 0
  6933 0000A360 00                  <1>
  6934                              <1> 
  6935                              <1> loc_run_find_executable_file_next:
  6936 0000A361 BE[94860100]        <1> 	mov	esi, FindFile_Name
  6937                              <1> loc_run_find_program_file_next:
  6938 0000A366 66B80018            <1> 	mov	ax, 1800h ; Except volume label and dirs
  6939 0000A36A E8FBE7FFFF          <1> 	call	find_first_file
  6940                              <1> 	; ESI = Directory Entry (FindFile_DirEntry) Location
  6941                              <1> 	; EDI = Directory Buffer Directory Entry Location
  6942                              <1> 	; EAX = File size
  6943                              <1> 	;jnc	loc_load_and_run_file
  6944                              <1> 	; 25/07/2022
  6945 0000A36F 7205                <1> 	jc	short loc_run_program_file_not_found
  6946 0000A371 E957010000          <1> 	jmp	loc_load_and_run_file
  6947                              <1> 
  6948                              <1> loc_run_program_file_not_found:
  6949 0000A376 3C02                <1> 	cmp	al, 2 ; file not found
  6950                              <1> 	;jne	loc_run_cmd_failed
  6951                              <1> 	; 25/07/2022
  6952 0000A378 7405                <1> 	je	short loc_run_progr_file_chk_prg_ext
  6953 0000A37A E9F0E2FFFF          <1> 	jmp	loc_run_cmd_failed
  6954                              <1> 
  6955                              <1> loc_run_progr_file_chk_prg_ext: ; 25/07/2022
  6956 0000A37F 66A1[75890100]      <1> 	mov	ax, word [EXE_ID]
  6957                              <1> 
  6958                              <1> 	;cmp	ah, '.' ; File name has extension sign
  6959                              <1> 	;je	short loc_run_check_auto_path
  6960                              <1> 	;or	al, al
  6961                              <1> 	;jnz	short loc_run_check_auto_path
  6962                              <1> 	; 03/07/2025
  6963 0000A385 663D502E            <1> 	cmp	ax, 'P.'
  6964 0000A389 7420                <1> 	je	short loc_run_check_auto_path
  6965                              <1> 
  6966 0000A38B 80FC08              <1> 	cmp	ah, 8 ; count of file name chars
  6967 0000A38E 771B                <1> 	ja	short loc_run_check_auto_path
  6968                              <1> 
  6969                              <1> loc_run_change_file_ext_to_prg:
  6970 0000A390 0FB6DC              <1> 	movzx	ebx, ah ; count of file name chars
  6971 0000A393 BE[94860100]        <1> 	mov	esi, FindFile_Name
  6972 0000A398 01F3                <1> 	add	ebx, esi
  6973                              <1> 	; 07/05/2016
  6974 0000A39A C7032E505247        <1> 	mov	dword [ebx],  '.PRG'
  6975 0000A3A0 66C705[75890100]50- <1> 	mov	word [EXE_ID], 'P.'
  6975 0000A3A8 2E                  <1>
  6976 0000A3A9 EBBB                <1> 	jmp	short loc_run_find_program_file_next
  6977                              <1> 
  6978                              <1> loc_run_check_auto_path:
  6979                              <1> 	; NOTE: /// 07/05/2016 ///
  6980                              <1> 	; If the path is given, value of byte [Run_Manual_Path]
  6981                              <1> 	; will not be ZERO. If so, file searching by using
  6982                              <1> 	; Automatic Path (via 'PATH' environment variable)
  6983                              <1> 	; will not be applicable, because the program file
  6984                              <1> 	; is already/absolutely not found.
  6985                              <1> 
  6986 0000A3AB A0[74890100]        <1> 	mov	al, [Run_Manual_Path]
  6987 0000A3B0 08C0                <1> 	or	al, al
  6988                              <1> 	;jnz	loc_cmd_failed
  6989                              <1> 	; 25/07/2022
  6990 0000A3B2 752B                <1> 	jnz	short loc_run_cap_failed
  6991                              <1> 
  6992                              <1> loc_run_check_auto_path_again:
  6993                              <1> 	;cmp	word [Run_Auto_Path], 0FFFFh
  6994                              <1> 	;	; 0FFFFh = Not a valid run path (in ENV block)
  6995                              <1> 	;;jnb	loc_cmd_failed
  6996                              <1> 	;; 25/07/2022
  6997                              <1> 	;jnb	short loc_run_cap_failed
  6998                              <1> 	; 03/07/2025
  6999 0000A3B4 FF05[70890100]      <1> 	inc	dword [Run_Auto_Path] ; 0FFFFFFFFh -> 0
  7000 0000A3BA 7423                <1> 	jz	short loc_run_cap_failed ; -1 -> 0
  7001                              <1> 
  7002                              <1> 	; 03/07/2025
  7003 0000A3BC BF[B27E0100]        <1> 	mov	edi, TextBuffer
  7004 0000A3C1 FF0D[70890100]      <1> 	dec	dword [Run_Auto_Path] ; 0 -> init auto path
  7005 0000A3C7 751D                <1> 	jnz	short loc_run_chk_filename_ext_next
  7006                              <1> 
  7007                              <1> 	;xor	al, al
  7008 0000A3C9 BE[A4350100]        <1> 	mov	esi, Cmd_Path ; 'PATH'
  7009                              <1> 	; 03/07/2025
  7010                              <1> 	;mov	edi, TextBuffer
  7011                              <1> 	; al = 0
  7012                              <1> 	; 03/09/2024 (bugfix)
  7013 0000A3CE 66B90001            <1> 	mov	cx, 256 ; TextBuffer (maximum) length
  7014 0000A3D2 E866F9FFFF          <1> 	call	get_environment_string
  7015 0000A3D7 7315                <1> 	jnc	short loc_run_chk_filename_ext_again
  7016                              <1> 	;mov	word [Run_Auto_Path], 0FFFFh ; invalid
  7017                              <1> 	; 03/07/2025
  7018 0000A3D9 FF0D[70890100]      <1> 	dec	dword [Run_Auto_Path] ; -1 (invalid)
  7019                              <1> loc_run_cap_failed: ; 25/07/2022
  7020                              <1> 	;jmp	loc_cmd_failed
  7021                              <1> 	; 30/08/2023
  7022 0000A3DF B001                <1> 	mov	al, 1 ; (force jump to loc_cmd_failed at the end)
  7023 0000A3E1 E989E2FFFF          <1> 	jmp	loc_run_cmd_failed ; (restore cdir if it is needed)
  7024                              <1> 
  7025                              <1> 	; 03/07/2025
  7026                              <1> loc_run_chk_filename_ext_next:
  7027 0000A3E6 8B0D[6C890100]      <1> 	mov	ecx, [Run_Path_Length]
  7028 0000A3EC EB09                <1> 	jmp	short loc_run_chk_filename_ext_again_@
  7029                              <1> 
  7030                              <1> loc_run_chk_filename_ext_again:
  7031 0000A3EE 89C1                <1> 	mov	ecx, eax ; string length (with zero tail)
  7032 0000A3F0 49                  <1> 	dec	ecx ; without zero tail
  7033                              <1> 	; 03/07/2025
  7034 0000A3F1 890D[6C890100]      <1> 	mov 	[Run_Path_Length], ecx
  7035                              <1> loc_run_chk_filename_ext_again_@:
  7036                              <1> 	; 04/07/2025
  7037                              <1> 	;mov	ax, [EXE_ID]
  7038                              <1> 	;cmp	ah, '.'
  7039                              <1> 	;je	short loc_run_chk_auto_path_pos
  7040                              <1> 
  7041                              <1> loc_run_change_file_ext_to_noext_again:
  7042                              <1> 	; 04/07/2025
  7043                              <1> 	;movzx	ebx, ah
  7044 0000A3F7 BE[94860100]        <1> 	mov	esi, FindFile_Name
  7045                              <1> 	;add 	ebx, esi
  7046 0000A3FC 31C0                <1> 	xor	eax, eax
  7047                              <1> loc_run_change_file_ext_to_noext_@:
  7048 0000A3FE 46                  <1> 	inc	esi
  7049 0000A3FF FEC4                <1> 	inc	ah
  7050                              <1> 	;cmp	al, '.'
  7051 0000A401 803E2E              <1> 	cmp	byte [esi], '.'
  7052 0000A404 75F8                <1> 	jne	short loc_run_change_file_ext_to_noext_@
  7053 0000A406 66A3[75890100]      <1> 	mov	[EXE_ID], ax
  7054                              <1> 		; al = 0, ah = file name length
  7055                              <1> 	;sub	eax, eax
  7056                              <1> 	;;mov	[ebx], eax ; 0 ; erase extension (.PRG)
  7057                              <1> 	;mov	[esi], eax ; 0
  7058 0000A40C 8806                <1> 	mov	[esi], al ; 0
  7059                              <1> 
  7060                              <1> loc_run_chk_auto_path_pos:
  7061                              <1> 	;;movzx	eax, word [Run_Auto_Path]
  7062                              <1> 	;mov	ax, [Run_Auto_Path]
  7063                              <1> 	; 03/07/2025
  7064 0000A40E A1[70890100]        <1> 	mov	eax, [Run_Auto_Path]
  7065 0000A413 39C8                <1> 	cmp	eax, ecx ; ecx = string length (except zero tail)
  7066                              <1> 	;jnb	loc_cmd_failed
  7067                              <1>  	; 25/07/2022
  7068 0000A415 73C8                <1> 	jnb	short loc_run_cap_failed
  7069                              <1> 
  7070                              <1> 	; 03/07/2025
  7071 0000A417 09C0                <1> 	or	eax, eax
  7072                              <1> 	;or	ax, ax
  7073 0000A419 7502                <1> 	jnz	short loc_run_auto_path_pos_move
  7074 0000A41B B005                <1> 	mov	al, 5
  7075                              <1> 
  7076                              <1> loc_run_auto_path_pos_move:
  7077 0000A41D 89FE                <1> 	mov	esi, edi ; offset TextBuffer
  7078                              <1> 	; 04/07/2025
  7079 0000A41F BF[327F0100]        <1> 	mov	edi, RunPathBuffer
  7080 0000A424 01C6                <1> 	add	esi, eax
  7081                              <1> 
  7082                              <1> loc_run_auto_path_pos_space_loop:
  7083 0000A426 AC                  <1> 	lodsb
  7084 0000A427 3C20                <1> 	cmp	al, 20h
  7085 0000A429 74FB                <1> 	je	short loc_run_auto_path_pos_space_loop
  7086                              <1> 	;jb	loc_cmd_failed
  7087                              <1>  	; 25/07/2022
  7088 0000A42B 72B2                <1> 	jb	short loc_run_cap_failed
  7089                              <1> 	;
  7090                              <1> loc_run_auto_path_pos_move_next_@:
  7091 0000A42D AA                  <1> 	stosb
  7092                              <1> loc_run_auto_path_pos_move_next:
  7093 0000A42E AC                  <1> 	lodsb
  7094 0000A42F 3C3B                <1> 	cmp	al, ';'
  7095 0000A431 741B                <1> 	je	short loc_run_auto_path_pos_move_last_byte
  7096 0000A433 3C20                <1> 	cmp	al, 20h
  7097 0000A435 74F7                <1> 	je	short loc_run_auto_path_pos_move_next
  7098                              <1> 	;jb	short loc_byte_ptr_end_of_path
  7099                              <1> 	;stosb
  7100                              <1> 	;jmp	short loc_run_auto_path_pos_move_next
  7101                              <1> 	; 03/09/2024
  7102 0000A437 73F4                <1> 	jnb	short loc_run_auto_path_pos_move_next_@
  7103                              <1> 
  7104                              <1> loc_byte_ptr_end_of_path:
  7105 0000A439 66C705[70890100]FF- <1> 	mov	word [Run_Auto_Path], 0FFFFh ; end of path
  7105 0000A441 FF                  <1>
  7106                              <1> 	; 03/07/2025
  7107 0000A442 C705[70890100]FFFF- <1> 	mov	dword [Run_Auto_Path], 0FFFFFFFFh
  7107 0000A44A FFFF                <1>
  7108 0000A44C EB0C                <1> 	jmp	short loc_run_auto_path_move_ok
  7109                              <1> 
  7110                              <1> loc_run_auto_path_pos_move_last_byte:
  7111 0000A44E 89F0                <1> 	mov	eax, esi
  7112 0000A450 2D[B27E0100]        <1> 	sub	eax, TextBuffer
  7113                              <1> 	;mov	[Run_Auto_Path], ax ; next path position
  7114                              <1> 	; 03/07/2025
  7115 0000A455 A3[70890100]        <1> 	mov	[Run_Auto_Path], eax
  7116                              <1> 
  7117                              <1> loc_run_auto_path_move_ok:
  7118 0000A45A 4F                  <1> 	dec	edi
  7119 0000A45B B02F                <1> 	mov	al, '/'
  7120 0000A45D 3807                <1> 	cmp	[edi], al
  7121 0000A45F 7403                <1> 	je	short loc_run_auto_path_move_file_name
  7122 0000A461 47                  <1> 	inc	edi
  7123 0000A462 8807                <1> 	mov	[edi], al
  7124                              <1> 
  7125                              <1> loc_run_auto_path_move_file_name:
  7126 0000A464 47                  <1> 	inc	edi
  7127 0000A465 BE[94860100]        <1> 	mov	esi, FindFile_Name
  7128                              <1> 
  7129                              <1> loc_run_auto_path_move_fn_loop:
  7130 0000A46A AC                  <1> 	lodsb
  7131 0000A46B AA                  <1> 	stosb
  7132 0000A46C 08C0                <1> 	or	al, al
  7133 0000A46E 75FA                <1> 	jnz	short loc_run_auto_path_move_fn_loop
  7134                              <1> 
  7135                              <1> 	;mov	esi, TextBuffer
  7136                              <1> 	; 04/07/2025
  7137 0000A470 BE[327F0100]        <1> 	mov	esi, RunPathBuffer
  7138 0000A475 BF[52860100]        <1> 	mov	edi, FindFile_Drv
  7139 0000A47A E8E6070000          <1> 	call	parse_path_name
  7140                              <1> 	;jc	loc_run_cmd_failed
  7141                              <1> 	; 25/07/2022
  7142                              <1> 	;jnc	short loc_run_change_current_drive
  7143                              <1> 	;jmp	loc_run_cmd_failed
  7144 0000A47F 723D                <1> 	jc	short loc_run_path_failed
  7145                              <1> 
  7146                              <1> loc_run_change_current_drive:
  7147 0000A481 8A35[B27D0100]      <1> 	mov	dh, [Current_Drv]
  7148 0000A487 8A15[52860100]      <1> 	mov	dl, [FindFile_Drv]
  7149 0000A48D 38F2                <1> 	cmp	dl, dh
  7150 0000A48F 7407                <1> 	je	short loc_run_change_directory_again
  7151                              <1> 
  7152 0000A491 E8E7D3FFFF          <1> 	call	change_current_drive
  7153                              <1> 	;jc	loc_run_cmd_failed
  7154                              <1> 	; 25/07/2022
  7155                              <1> 	;jnc	short loc_run_change_directory_again
  7156                              <1> 	;jmp	loc_run_cmd_failed
  7157 0000A496 7226                <1> 	jc	short loc_run_path_failed
  7158                              <1> 
  7159                              <1> loc_run_change_directory_again:
  7160 0000A498 803D[53860100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  7161 0000A49F 7627                <1> 	jna	short loc_load_executable_cdir_chk_again
  7162                              <1> 
  7163 0000A4A1 FE05[CF340100]      <1> 	inc	byte [Restore_CDIR]
  7164 0000A4A7 BE[53860100]        <1> 	mov	esi, FindFile_Directory
  7165 0000A4AC 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0
  7166 0000A4AE E8C8010000          <1> 	call	change_current_directory
  7167                              <1> 	;jc	loc_run_cmd_failed
  7168                              <1> 	; 25/07/2022
  7169 0000A4B3 730E                <1> 	jnc	short loc_run_chg_prompt_dir_str_again
  7170                              <1> 
  7171                              <1> 	; 03/07/2025
  7172                              <1> 	; ignore 'directory not found' error
  7173                              <1> 	; if auto path in progress
  7174 0000A4B5 803D[74890100]00    <1> 	cmp	byte [Run_Manual_Path], 0
  7175 0000A4BC 760A                <1> 	jna	short jmp_loc_run_find_executable_file_next
  7176                              <1> 
  7177                              <1> loc_run_path_failed: ; 25/07/2022
  7178 0000A4BE E9ACE1FFFF          <1> 	jmp	loc_run_cmd_failed
  7179                              <1> 
  7180                              <1> loc_run_chg_prompt_dir_str_again:
  7181 0000A4C3 E8DC000000          <1> 	call	change_prompt_dir_string
  7182                              <1> 
  7183                              <1> loc_load_executable_cdir_chk_again:
  7184                              <1> ; 04/07/2025
  7185                              <1> %if 0
  7186                              <1> 	; 03/07/2025
  7187                              <1> 	mov	al, [Current_Drv]
  7188                              <1> 	cmp	al, [RUN_CDRV]
  7189                              <1> 	jne	short jmp_loc_run_find_executable_file_next
  7190                              <1> 	;
  7191                              <1> 	mov	eax, [Current_Dir_FCluster]
  7192                              <1> 	cmp	eax, [Run_CDirFC]
  7193                              <1> 	;jne	loc_run_find_executable_file_next
  7194                              <1> 	; 30/08/2023
  7195                              <1> 	je	short jmp_loc_run_check_auto_path_again
  7196                              <1> 
  7197                              <1> jmp_loc_run_find_executable_file_next: ; 03/07/2025
  7198                              <1> 	jmp	loc_run_find_executable_file_next
  7199                              <1> jmp_loc_run_check_auto_path_again:
  7200                              <1> 	xor	al, al ; 0
  7201                              <1> 	jmp	loc_run_check_auto_path_again
  7202                              <1> %else
  7203                              <1> 	; 04/07/2025
  7204                              <1> jmp_loc_run_find_executable_file_next:
  7205 0000A4C8 E994FEFFFF          <1> 	jmp	loc_run_find_executable_file_next
  7206                              <1> %endif
  7207                              <1> 
  7208                              <1> loc_load_and_run_file:
  7209                              <1> 	; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  7210                              <1> 	; 13/11/2017
  7211                              <1> 	; 04/01/2017
  7212                              <1> 	; 23/04/2016
  7213 0000A4CD BE[94860100]        <1> 	mov	esi, FindFile_Name
  7214 0000A4D2 BF[B27E0100]        <1> 	mov	edi, TextBuffer
  7215                              <1> 
  7216                              <1>  	; 24/04/2016
  7217 0000A4D7 31D2                <1> 	xor	edx, edx
  7218                              <1> 	;mov	word [argc], dx ; 0
  7219                              <1> 	; 25/07/2022
  7220 0000A4D9 8915[A8950100]      <1> 	mov	dword [argc], edx
  7221 0000A4DF 8915[D8940100]      <1> 	mov	dword [u.nread], edx ; 0
  7222                              <1> 
  7223                              <1> loc_load_and_run_file_1:
  7224 0000A4E5 AC                  <1> 	lodsb
  7225 0000A4E6 AA                  <1> 	stosb
  7226 0000A4E7 FF05[D8940100]      <1> 	inc	dword [u.nread]
  7227 0000A4ED 20C0                <1> 	and	al, al
  7228 0000A4EF 75F4                <1> 	jnz 	short loc_load_and_run_file_1
  7229                              <1> 
  7230 0000A4F1 A0[137E0100]        <1> 	mov	al, [CmdArgStart]
  7231 0000A4F6 20C0                <1> 	and	al, al
  7232 0000A4F8 7442                <1> 	jz	short loc_load_and_run_file_7
  7233                              <1> 
  7234 0000A4FA 0FB6F0              <1> 	movzx	esi, al ; 11/05/2016
  7235                              <1> 	;mov	ecx, 80
  7236                              <1> 	; 25/07/2022
  7237 0000A4FD 31C9                <1> 	xor	ecx, ecx
  7238 0000A4FF B150                <1> 	mov	cl, 80
  7239                              <1> 	;sub	ecx, esi
  7240 0000A501 28C1                <1> 	sub	cl, al
  7241 0000A503 81C6[627E0100]      <1> 	add	esi, CommandBuffer
  7242                              <1> 
  7243                              <1> 	;inc	word [argc] ; 11/05/2016
  7244                              <1> 	; 25/07/2022
  7245 0000A509 FF05[A8950100]      <1> 	inc	dword [argc]
  7246                              <1> 
  7247                              <1> loc_load_and_run_file_2:
  7248 0000A50F AC                  <1> 	lodsb
  7249 0000A510 3C20                <1> 	cmp	al, 20h
  7250 0000A512 7716                <1> 	ja	short loc_load_and_run_file_5
  7251 0000A514 721D                <1> 	jb	short loc_load_and_run_file_6
  7252                              <1> 
  7253                              <1> loc_load_and_run_file_3:
  7254 0000A516 803E20              <1> 	cmp	byte [esi], 20h
  7255 0000A519 7707                <1> 	ja	short loc_load_and_run_file_4
  7256 0000A51B 7216                <1> 	jb	short loc_load_and_run_file_6
  7257 0000A51D 46                  <1> 	inc	esi
  7258 0000A51E E2F6                <1> 	loop	loc_load_and_run_file_3
  7259 0000A520 EB11                <1> 	jmp	short loc_load_and_run_file_6
  7260                              <1> 
  7261                              <1> loc_load_and_run_file_4:
  7262 0000A522 28C0                <1> 	sub	al, al ; 0
  7263                              <1> 	;inc	word [argc]
  7264                              <1> 	; 25/07/2022
  7265 0000A524 FF05[A8950100]      <1> 	inc	dword [argc]
  7266                              <1> loc_load_and_run_file_5:
  7267 0000A52A AA                  <1> 	stosb
  7268 0000A52B FF05[D8940100]      <1> 	inc	dword [u.nread]
  7269 0000A531 E2DC                <1> 	loop	loc_load_and_run_file_2
  7270                              <1> 
  7271                              <1> loc_load_and_run_file_6:
  7272 0000A533 30C0                <1> 	xor	al, al ; 0
  7273 0000A535 AA                  <1> 	stosb
  7274 0000A536 FF05[D8940100]      <1> 	inc	dword [u.nread]
  7275                              <1> loc_load_and_run_file_7:
  7276 0000A53C 8807                <1> 	mov 	[edi], al ; 0
  7277                              <1> 	;inc	word [argc] ; 24/04/2016
  7278                              <1> 	; 25/07/2022
  7279 0000A53E FF05[A8950100]      <1> 	inc	dword [argc]
  7280 0000A544 FF05[D8940100]      <1> 	inc	dword [u.nread] ; 24/04/2016
  7281 0000A54A BE[B27E0100]        <1> 	mov	esi, TextBuffer
  7282 0000A54F 8B15[C0860100]      <1> 	mov	edx, [FindFile_DirEntry+DirEntry_FileSize]
  7283 0000A555 66A1[B8860100]      <1> 	mov	ax, [FindFile_DirEntry+DirEntry_FstClusHI]
  7284 0000A55B C1E010              <1> 	shl	eax, 16 ; 13/11/2017
  7285 0000A55E 66A1[BE860100]      <1> 	mov	ax, [FindFile_DirEntry+DirEntry_FstClusLO]
  7286                              <1> 	; EAX = First Cluster number
  7287                              <1> 	; EDX = File Size
  7288                              <1> 	; ESI = Argument list address
  7289                              <1> 	; [argc] = argument count
  7290                              <1> 	; [u.nread] = argument list length
  7291 0000A564 E8BF640000          <1> 	call	load_and_run_file ; trdosk6.s
  7292                              <1>         ;jc	loc_run_cmd_failed ; 04/01/2017
  7293                              <1> loc_load_and_run_file_8: ; 06/05/2016
  7294 0000A569 E910EAFFFF          <1> 	jmp	loc_file_rw_restore_retn
  7295                              <1> 
  7296                              <1> check_prg_filename_ext:
  7297                              <1> 	; 23/04/2016 (TRDOS 386 = TRDOS v2.0)
  7298                              <1> 	; 10/09/2011 
  7299                              <1> 	; (TRDOS v1, CMDINTR.ASM, 'proc_check_exe_filename_ext')
  7300                              <1> 	; 14/11/2009
  7301                              <1> 	; INPUT ->
  7302                              <1> 	;	ESI = Dot File Name
  7303                              <1> 	; OUTPUT ->
  7304                              <1> 	;     cf = 0 -> EXE_ID in AL
  7305                              <1> 	;	ESI = Last char + 1 position
  7306                              <1> 	;     cf = 1 -> Invalid executable file name
  7307                              <1> 	;	or no file name extension if AH<=8
  7308                              <1> 	;	AL = Last file name char
  7309                              <1> 	;     cf = 0 -> AL='P' (PRG), AL=0 (no extension)
  7310                              <1> 	;
  7311                              <1> 	; (Modified registers: EAX, ESI)
  7312                              <1> 
  7313 0000A56E 30E4                <1> 	xor	ah, ah
  7314                              <1> loc_run_check_filename_ext:
  7315 0000A570 AC                  <1> 	lodsb
  7316 0000A571 3C21                <1> 	cmp	al, 21h
  7317 0000A573 7229                <1> 	jb	short loc_check_exe_fn_retn
  7318 0000A575 FEC4                <1> 	inc	ah
  7319 0000A577 3C2E                <1> 	cmp	al, '.'
  7320 0000A579 75F5                <1> 	jne	short loc_run_check_filename_ext
  7321                              <1> 
  7322                              <1> loc_run_check_filename_ext_dot:
  7323 0000A57B 80FC02              <1> 	cmp	ah, 2  ; .??? is not valid
  7324 0000A57E 88C4                <1> 	mov	ah, al ; '.' 
  7325 0000A580 7219                <1> 	jb	short loc_check_prg_fn_retn
  7326                              <1> 
  7327                              <1> loc_run_check_filename_ext_dot_ok:
  7328 0000A582 AC                  <1> 	lodsb
  7329 0000A583 24DF                <1> 	and	al, 0DFh
  7330                              <1> 
  7331                              <1> loc_run_check_filename_ext_prg:
  7332 0000A585 3C50                <1> 	cmp	al, 'P'
  7333 0000A587 7212                <1> 	jb	short loc_check_prg_fn_retn
  7334 0000A589 7711                <1> 	ja	short loc_check_prg_fn_stc
  7335 0000A58B AC                  <1> 	lodsb
  7336 0000A58C 24DF                <1> 	and	al, 0DFh
  7337 0000A58E 3C52                <1> 	cmp	al, 'R'
  7338 0000A590 750A                <1> 	jne	short loc_check_prg_fn_stc
  7339 0000A592 AC                  <1> 	lodsb
  7340 0000A593 24DF                <1> 	and	al, 0DFh
  7341 0000A595 3C47                <1> 	cmp	al, 'G'
  7342 0000A597 7503                <1> 	jne	short loc_check_prg_fn_stc
  7343                              <1> 
  7344 0000A599 B050                <1> 	mov	al, 'P'
  7345                              <1> loc_check_prg_fn_retn:
  7346 0000A59B C3                  <1> 	retn
  7347                              <1> 
  7348                              <1> ; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  7349                              <1> 
  7350                              <1> loc_check_prg_fn_stc:
  7351 0000A59C F9                  <1> 	stc
  7352 0000A59D C3                  <1> 	retn
  7353                              <1> 
  7354                              <1> loc_check_exe_fn_retn:
  7355 0000A59E 28C0                <1> 	sub	al, al ; 0
  7356                              <1> 	;retn
  7357                              <1> 
  7358                              <1> find_and_list_files:
  7359                              <1> 	;retn
  7360                              <1> set_exec_arguments:
  7361 0000A5A0 C3                  <1> 	retn
  7362                              <1> 
  7363                              <1> delete_fs_directory:
  7364 0000A5A1 31C0                <1> 	xor	eax, eax
  7365 0000A5A3 C3                  <1> 	retn
  3433                                  %include 'trdosk4.s' ; 24/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.10) - Directory Functions : trdosk4.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 16/07/2025  (Previous: 03/09/2024, v2.0.9)
     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 0000A5A4 BE[10850100]        <1> 	mov	esi, PATH_Array
    28                              <1> change_prompt_dir_str: ; 05/10/2016 (call from 'set_working_path')
    29 0000A5A9 BF[B67D0100]        <1> 	mov	edi, Current_Directory
    30 0000A5AE 8A25[B07D0100]      <1> 	mov	ah, [Current_Dir_Level]
    31 0000A5B4 E807000000          <1> 	call	set_current_directory_string
    32 0000A5B9 880D[117E0100]      <1> 	mov	[Current_Dir_StrLen], cl
    33                              <1> 
    34 0000A5BF 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 0000A5C0 57                  <1> 	push    edi
    50 0000A5C1 80FC00              <1> 	cmp     ah, 0
    51 0000A5C4 7651                <1> 	jna	short pass_write_path
    52 0000A5C6 83C610              <1> 	add	esi, 16
    53 0000A5C9 89F3                <1> 	mov	ebx, esi
    54                              <1> loc_write_path:
    55                              <1> 	;mov	ecx, 8
    56                              <1> 	; 11/08/2022
    57 0000A5CB 29C9                <1> 	sub	ecx, ecx
    58 0000A5CD B108                <1> 	mov	cl, 8
    59                              <1> path_write_dirname1:
    60 0000A5CF AC                  <1> 	lodsb
    61 0000A5D0 3C20                <1> 	cmp	al, 20h
    62 0000A5D2 7612                <1> 	jna	short pass_write_dirname1
    63 0000A5D4 AA                  <1> 	stosb
    64 0000A5D5 81FF[107E0100]      <1> 	cmp	edi, End_Of_Current_Dir_Str
    65 0000A5DB 733A                <1> 	jnb	short pass_write_path
    66 0000A5DD E2F0                <1> 	loop	path_write_dirname1
    67 0000A5DF 803E20              <1> 	cmp	byte [esi], 20h
    68 0000A5E2 7624                <1> 	jna	short pass_write_dirname2
    69 0000A5E4 EB0A                <1> 	jmp     short loc_put_dot_cont_ext
    70                              <1> pass_write_dirname1:
    71 0000A5E6 89DE                <1> 	mov	esi, ebx
    72 0000A5E8 83C608              <1> 	add	esi, 8
    73 0000A5EB 803E20              <1> 	cmp	byte [esi], 20h
    74 0000A5EE 7618                <1> 	jna	short pass_write_dirname2
    75                              <1> loc_put_dot_cont_ext:
    76 0000A5F0 C6072E              <1> 	mov	byte [edi], "."
    77                              <1> 	;mov	ecx, 3
    78 0000A5F3 B103                <1> 	mov	cl, 3
    79                              <1> loc_check_dir_name_ext:
    80 0000A5F5 AC                  <1> 	lodsb
    81 0000A5F6 47                  <1> 	inc	edi
    82 0000A5F7 3C20                <1> 	cmp	al, 20h
    83 0000A5F9 760D                <1> 	jna	short pass_write_dirname2
    84 0000A5FB 8807                <1> 	mov	[edi], al
    85 0000A5FD 81FF[107E0100]      <1> 	cmp	edi, End_Of_Current_Dir_Str
    86 0000A603 7312                <1> 	jnb	short pass_write_path
    87 0000A605 E2EE                <1> 	loop    loc_check_dir_name_ext
    88 0000A607 47                  <1> 	inc	edi
    89                              <1> pass_write_dirname2:
    90 0000A608 FECC                <1> 	dec	ah
    91 0000A60A 740B                <1> 	jz      short pass_write_path
    92 0000A60C 83C310              <1> 	add	ebx, 16
    93 0000A60F 89DE                <1> 	mov	esi, ebx
    94 0000A611 C6072F              <1> 	mov	byte [edi],"/"
    95 0000A614 47                  <1> 	inc	edi
    96 0000A615 EBB4                <1> 	jmp	short loc_write_path
    97                              <1> pass_write_path:
    98 0000A617 C60700              <1> 	mov	byte [edi], 0
    99 0000A61A 47                  <1> 	inc	edi
   100 0000A61B 89F9                <1> 	mov	ecx, edi
   101 0000A61D 5F                  <1> 	pop	edi
   102 0000A61E 29F9                <1> 	sub	ecx, edi
   103                              <1> 	; ECX = Current Directory String Length
   104 0000A620 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 0000A621 29C0                <1> 	sub	eax, eax ; 0
   133                              <1> 	;cmp	dl, 0
   134 0000A623 38C2                <1> 	cmp	dl, al
   135 0000A625 7724                <1> 	ja	short loc_get_current_drive_1
   136 0000A627 8A15[B27D0100]      <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 0000A62D 88D4                <1> 	mov	ah, dl
   145 0000A62F 56                  <1> 	push	esi ; (*)
   146 0000A630 BE00010900          <1> 	mov	esi, Logical_DOSDisks
   147 0000A635 01C6                <1> 	add	esi, eax
   148 0000A637 8A06                <1> 	mov	al, [esi+LD_Name]
   149 0000A639 3C41                <1> 	cmp	al, 'A'
   150 0000A63B 721C                <1> 	jb	short loc_get_current_drive_not_ready_retn
   151                              <1> 
   152                              <1> 	; 28/07/2022
   153 0000A63D 31C9                <1> 	xor	ecx, ecx
   154                              <1> 
   155 0000A63F 8A667F              <1> 	mov	ah, [esi+LD_CDirLevel]
   156 0000A642 08E4                <1> 	or	ah, ah
   157 0000A644 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 0000A646 5E                  <1> 	pop	esi ; (*) Current Directory Buffer address
   163                              <1> 
   164 0000A647 8826                <1> 	mov	[esi], ah
   165                              <1> 	; 28/07/2022
   166                              <1> 	;xor	ecx, ecx
   167 0000A649 EB2D                <1> 	jmp	short loc_get_current_drive_4
   168                              <1> 
   169                              <1> 	; 29/08/2023
   170                              <1> loc_get_current_drive_1:
   171 0000A64B FECA                <1> 	dec 	dl
   172 0000A64D 3A15[CE340100]      <1> 	cmp	dl, [Last_DOS_DiskNo]
   173 0000A653 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 0000A655 B00F                <1> 	mov	al, 0Fh
   180 0000A657 F9                  <1> 	stc
   181 0000A658 C3                  <1> 	retn
   182                              <1> 
   183                              <1> loc_get_current_drive_not_ready_retn:
   184 0000A659 5E                  <1> 	pop	esi
   185                              <1> 	;mov	eax, 15
   186 0000A65A 66B80F00            <1> 	mov	ax, 15 ; Drive not ready
   187 0000A65E C3                  <1> 	retn
   188                              <1> 
   189                              <1> loc_get_current_drive_3:
   190 0000A65F BF[10850100]        <1>         mov     edi, PATH_Array
   191 0000A664 57                  <1> 	push	edi
   192 0000A665 81C680000000        <1> 	add	esi, LD_CurrentDirectory
   193                              <1> 	;mov	ecx, 32
   194                              <1> 	; 28/07/2022
   195 0000A66B B120                <1> 	mov	cl, 32
   196 0000A66D F3A5                <1> 	rep	movsd
   197 0000A66F 5E                  <1> 	pop	esi ; Path Array Address
   198 0000A670 5F                  <1> 	pop	edi ; pushed esi (current dir buffer offset)
   199                              <1> 	;
   200 0000A671 E84AFFFFFF          <1> 	call	set_current_directory_string
   201 0000A676 89FE                <1> 	mov	esi, edi
   202                              <1> 
   203                              <1> loc_get_current_drive_4:
   204 0000A678 30C0                <1> 	xor	al, al
   205 0000A67A 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 0000A67B 8825[9E850100]      <1> 	mov	[CD_COMMAND], ah
   232 0000A681 803E2F              <1> 	cmp	byte [esi], '/'
   233 0000A684 7505                <1> 	jne	short loc_ccd_cdir_level
   234 0000A686 46                  <1> 	inc	esi
   235 0000A687 30C0                <1> 	xor	al, al
   236 0000A689 EB05                <1> 	jmp	short loc_ccd_parse_path_name
   237                              <1> loc_ccd_cdir_level:
   238 0000A68B A0[B07D0100]        <1> 	mov	al, [Current_Dir_Level]
   239                              <1> loc_ccd_parse_path_name:
   240 0000A690 88C4                <1> 	mov	ah, al
   241 0000A692 BF[10850100]        <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 0000A697 0FB6C8              <1> 	movzx	ecx, al
   253 0000A69A FEC1                <1> 	inc	cl
   254 0000A69C C0E104              <1> 	shl	cl, 4
   255 0000A69F 01CF                <1> 	add	edi, ecx
   256 0000A6A1 B107                <1> 	mov	cl, 7
   257 0000A6A3 28C1                <1> 	sub	cl, al
   258 0000A6A5 C0E102              <1> 	shl	cl, 2
   259 0000A6A8 89C3                <1> 	mov	ebx, eax
   260 0000A6AA 31C0                <1> 	xor	eax, eax ; 0
   261 0000A6AC F3AB                <1> 	rep	stosd
   262 0000A6AE 89D8                <1> 	mov	eax, ebx
   263                              <1> 
   264 0000A6B0 BF[10850100]        <1> 	mov	edi, PATH_Array
   265                              <1> 
   266 0000A6B5 803E20              <1> 	cmp	byte [esi], 20h
   267 0000A6B8 F5                  <1> 	cmc
   268 0000A6B9 7305                <1> 	jnc	short pass_ccd_parse_dir_name
   269                              <1> 
   270                              <1> 		; ESI = Path name
   271                              <1> 		; AL = CCD_Level
   272 0000A6BB 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 0000A6C0 9C                  <1> 	pushf
   279                              <1> 
   280                              <1> 	;mov	[CCD_Level], al
   281                              <1>         ;mov	[Last_Dir_Level], ah
   282 0000A6C1 66A3[94850100]      <1> 	mov	[CCD_Level], ax
   283                              <1> 
   284 0000A6C7 31DB                <1> 	xor	ebx, ebx
   285 0000A6C9 8A3D[B27D0100]      <1> 	mov	bh, [Current_Drv]
   286 0000A6CF BE00010900          <1> 	mov	esi, Logical_DOSDisks
   287 0000A6D4 01DE                <1> 	add	esi, ebx
   288                              <1> 
   289 0000A6D6 9D                  <1> 	popf
   290 0000A6D7 720A                <1> 	jc	short loc_ccd_bad_path_name_retn
   291                              <1> 
   292 0000A6D9 8935[90850100]      <1> 	mov	[CCD_DriveDT], esi
   293                              <1> 
   294 0000A6DF 3C07                <1> 	cmp	al, 7
   295 0000A6E1 7208                <1> 	jb	short loc_ccd_load_child_dir
   296                              <1> 
   297                              <1> loc_ccd_bad_path_name_retn:
   298 0000A6E3 87F7                <1> 	xchg	esi, edi
   299                              <1> 	;mov	eax, 19 ; Bad directory/path name
   300                              <1> 	; 28/07/2022
   301 0000A6E5 29C0                <1> 	sub	eax, eax
   302 0000A6E7 B013                <1> 	mov	al, 19
   303 0000A6E9 F9                  <1> 	stc
   304                              <1> loc_ccd_retn_p:
   305 0000A6EA C3                  <1> 	retn
   306                              <1> 
   307                              <1> loc_ccd_load_child_dir:
   308                              <1> 	; AL = CCD_Level
   309 0000A6EB 08C0                <1> 	or	al, al
   310 0000A6ED 7467                <1> 	jz	short loc_ccd_load_root_dir
   311                              <1> 
   312                              <1> 	;mov	cx, ax
   313                              <1> 	; 28/07/2022
   314 0000A6EF 89C1                <1> 	mov	ecx, eax
   315 0000A6F1 C0E004              <1> 	shl	al, 4
   316 0000A6F4 0FB6F0              <1> 	movzx	esi, al
   317 0000A6F7 01FE                <1>      	add	esi, edi  ; offset PATH_Array
   318                              <1> 
   319 0000A6F9 8B460C              <1> 	mov	eax, [esi+12]
   320 0000A6FC 38E9                <1> 	cmp	cl, ch
   321                              <1> 	;je	loc_ccd_load_sub_directory
   322                              <1> 	; 28/07/2022
   323 0000A6FE 7505                <1> 	jne	short loc_ccd_1
   324 0000A700 E9FA000000          <1> 	jmp	loc_ccd_load_sub_directory
   325                              <1> 
   326                              <1> loc_ccd_1:	; 28/07/2022
   327 0000A705 A3[AC7D0100]        <1> 	mov	[Current_Dir_FCluster], eax
   328                              <1> 
   329                              <1> loc_ccd_load_child_dir_next:
   330 0000A70A 83C610              <1> 	add	esi, 16 ; DOS DirEntry Format FileName Address
   331                              <1> 
   332                              <1>  	; Directory attribute : 10h
   333 0000A70D B010                <1> 	mov	al, 00010000b ; 10h (Attrib AND mask)
   334                              <1> 	;mov	ah, 11001000b ; C8h
   335                              <1> 	; Volume name attribute: 8h
   336 0000A70F B408                <1> 	mov	ah, 00001000b ; 08h (Attrib NAND, AND --> zero mask)
   337                              <1> 
   338                              <1> 	;xor	cx, cx  
   339 0000A711 31C9                <1> 	xor	ecx, ecx ; 02/03/2021
   340 0000A713 E8B6010000          <1> 	call	locate_current_dir_file
   341 0000A718 7353                <1> 	jnc	short loc_ccd_set_dir_cluster_ptr
   342                              <1> 
   343                              <1> 	; 19/02/2016
   344                              <1> 	;mov	edi, [CCD_DriveDT]
   345 0000A71A 8A25[94850100]      <1> 	mov	ah, [CCD_Level]
   346 0000A720 803D[9E850100]CD    <1> 	cmp	byte [CD_COMMAND], 0CDh ;'CD' command or another
   347 0000A727 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 0000A729 88E1                <1> 	mov	cl, ah
   353 0000A72B 50                  <1> 	push	eax
   354 0000A72C E8E4000000          <1> 	call	loc_ccd_save_current_dir
   355 0000A731 58                  <1> 	pop	eax
   356                              <1> loc_ccd_load_child_dir_err:
   357 0000A732 3C03                <1> 	cmp	al, 3	; AL = 2 => File not found error
   358 0000A734 7202                <1> 	jb	short loc_ccd_path_not_found_retn
   359 0000A736 F9                  <1> 	stc
   360 0000A737 C3                  <1> 	retn
   361                              <1> 
   362                              <1> loc_ccd_path_not_found_retn:
   363 0000A738 B003                <1> 	mov	al, 3	; Path not found
   364 0000A73A C3                  <1> 	retn
   365                              <1> 
   366                              <1> loc_ccd_load_FAT_root_dir:
   367 0000A73B 803D[B17D0100]02    <1> 	cmp	byte [Current_FATType], 2
   368 0000A742 776B                <1> 	ja	short loc_ccd_load_FAT32_root_dir
   369                              <1> 
   370                              <1> 	;mov	esi, [CCD_DriveDT]
   371                              <1> 	;push	esi
   372 0000A744 E8611D0000          <1> 	call	load_FAT_root_directory
   373                              <1> 	;pop	edi ; Dos Drv Description Table
   374                              <1> 
   375 0000A749 89F7                <1> 	mov	edi, esi
   376 0000A74B BE[10850100]        <1> 	mov	esi, PATH_Array
   377 0000A750 7298                <1> 	jc	short loc_ccd_retn_p
   378                              <1> 
   379 0000A752 31C0                <1> 	xor	eax, eax
   380 0000A754 EB78                <1>         jmp	short loc_ccd_set_cdfc
   381                              <1> 
   382                              <1> loc_ccd_load_root_dir:
   383 0000A756 803D[B17D0100]01    <1> 	cmp	byte [Current_FATType], 1
   384 0000A75D 73DC                <1> 	jnb	short loc_ccd_load_FAT_root_dir
   385                              <1> 
   386                              <1> loc_ccd_load_FS_root_dir:
   387 0000A75F E8FE1D0000          <1> 	call	load_FS_root_directory
   388 0000A764 EB5C                <1> 	jmp	short pass_ccd_load_FAT_sub_directory
   389                              <1> 
   390                              <1> loc_ccd_load_FS_sub_directory_next:
   391 0000A766 E8F71D0000          <1> 	call	load_FS_sub_directory
   392 0000A76B 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 0000A76D 668B4714            <1> 	mov	ax, [edi+20] ; First Cluster High Word
   397 0000A771 C1E010              <1> 	shl	eax, 16
   398 0000A774 668B471A            <1> 	mov	ax, [edi+26] ; First Cluster Low Word
   399                              <1> 
   400 0000A778 8B35[90850100]      <1> 	mov	esi, [CCD_DriveDT]
   401 0000A77E 803D[B17D0100]01    <1> 	cmp	byte [Current_FATType], 1
   402 0000A785 72DF                <1> 	jb	short loc_ccd_load_FS_sub_directory_next
   403                              <1> 	;push	esi
   404 0000A787 E89C1D0000          <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 0000A78C BE[10850100]        <1> 	mov	esi, PATH_Array
   410 0000A791 7265                <1> 	jc	short loc_ccd_retn_c
   411                              <1> 
   412 0000A793 A1[DE840100]        <1> 	mov	eax, [DirBuff_Cluster]
   413                              <1> 
   414 0000A798 FE05[94850100]      <1> 	inc	byte [CCD_Level]
   415 0000A79E 0FB61D[94850100]    <1> 	movzx	ebx, byte [CCD_Level]
   416 0000A7A5 C0E304              <1> 	shl	bl, 4 ; * 16 (<= 128)
   417 0000A7A8 01DE                <1> 	add	esi, ebx ; 19/02/2016
   418 0000A7AA 89460C              <1> 	mov	[esi+12], eax
   419 0000A7AD EB1F                <1> 	jmp	short loc_ccd_set_cdfc
   420                              <1> 
   421                              <1> loc_ccd_load_FAT32_root_dir:
   422 0000A7AF BE[10850100]        <1> 	mov	esi, PATH_Array
   423 0000A7B4 8B460C              <1> 	mov	eax, [esi+12]
   424 0000A7B7 8B35[90850100]      <1> 	mov	esi, [CCD_DriveDT]
   425                              <1> 
   426                              <1> loc_ccd_load_FAT_sub_directory:
   427                              <1> 	;push	esi
   428 0000A7BD E8661D0000          <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 0000A7C2 BE[10850100]        <1> 	mov	esi, PATH_Array
   434 0000A7C7 722F                <1> 	jc	short loc_ccd_retn_c
   435                              <1> 
   436 0000A7C9 A1[DE840100]        <1> 	mov	eax, [DirBuff_Cluster]
   437                              <1> 
   438                              <1> loc_ccd_set_cdfc:
   439 0000A7CE 8A0D[94850100]      <1> 	mov	cl, [CCD_Level]
   440 0000A7D4 880D[B07D0100]      <1> 	mov	[Current_Dir_Level], cl
   441 0000A7DA A3[AC7D0100]        <1> 	mov	[Current_Dir_FCluster], eax
   442                              <1> 
   443 0000A7DF 8A2D[95850100]      <1> 	mov	ch, [Last_Dir_Level]
   444 0000A7E5 38E9                <1> 	cmp	cl, ch 
   445                              <1> 	;jb	loc_ccd_load_child_dir_next
   446                              <1> 	; 28/07/2022
   447 0000A7E7 7305                <1> 	jnb	short loc_ccd_2	
   448 0000A7E9 E91CFFFFFF          <1> 	jmp	loc_ccd_load_child_dir_next
   449                              <1> loc_ccd_2:
   450 0000A7EE 803D[9E850100]CD    <1> 	cmp	byte [CD_COMMAND], 0CDh ;'CD' command or another
   451 0000A7F5 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 0000A7F7 F8                  <1> 	clc
   457                              <1> 
   458                              <1> loc_ccd_retn_c:
   459 0000A7F8 8B3D[90850100]      <1> 	mov	edi, [CCD_DriveDT]
   460 0000A7FE C3                  <1> 	retn
   461                              <1> 
   462                              <1> loc_ccd_load_sub_directory:
   463 0000A7FF 8B35[90850100]      <1> 	mov	esi, [CCD_DriveDT]
   464 0000A805 803D[B17D0100]01    <1> 	cmp	byte [Current_FATType], 1
   465 0000A80C 73AF                <1> 	jnb	short loc_ccd_load_FAT_sub_directory
   466 0000A80E E84F1D0000          <1> 	call	load_FS_sub_directory
   467 0000A813 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 0000A815 BE[10850100]        <1> 	mov	esi, PATH_Array ; 19/02/2016
   475 0000A81A 8B3D[90850100]      <1> 	mov	edi, [CCD_DriveDT]
   476 0000A820 57                  <1> 	push	edi
   477 0000A821 83C77F              <1>         add     edi, LD_CDirLevel
   478 0000A824 880F                <1> 	mov	[edi], cl
   479 0000A826 47                  <1> 	inc	edi ; LD_CurrentDirectory
   480 0000A827 56                  <1> 	push	esi
   481                              <1> 	;;mov	ecx, 32  ; always < 65536 (in this procedure)
   482 0000A828 66B92000            <1> 	mov	cx, 32
   483                              <1> 	; 02/03/2021
   484                              <1> 	;mov	ecx, 32
   485 0000A82C F3A5                <1> 	rep	movsd
   486                              <1> 	; Current directory has been saved to
   487                              <1> 	; the DOS drive description table, cdir area !
   488 0000A82E 5E                  <1> 	pop	esi  ; PATH_Array
   489 0000A82F 5F                  <1> 	pop	edi  ; Dos Drv Description Table
   490                              <1> 
   491 0000A830 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 0000A831 88C4                <1> 	mov	ah, al
   514 0000A833 66A3[34860100]      <1> 	mov	[PATH_CDLevel], ax
   515                              <1> repeat_ppdn_check_slash:
   516 0000A839 AC                  <1> 	lodsb
   517 0000A83A 3C2F                <1> 	cmp	al, '/'
   518 0000A83C 74FB                <1> 	je	short repeat_ppdn_check_slash
   519 0000A83E 3C21                <1> 	cmp	al, 21h
   520 0000A840 7219                <1> 	jb	short loc_ppdn_retn
   521 0000A842 57                  <1> 	push	edi
   522                              <1> loc_ppdn_get_dir_name:
   523 0000A843 B90C000000          <1> 	mov	ecx, 12
   524 0000A848 BF[36860100]        <1> 	mov	edi, Dir_File_Name
   525                              <1> repeat_ppdn_get_dir_name:
   526 0000A84D AA                  <1> 	stosb
   527 0000A84E AC                  <1> 	lodsb
   528 0000A84F 3C2F                <1> 	cmp	al, '/'
   529 0000A851 740A                <1> 	je	short loc_check_level_dot_conv_dir_name
   530 0000A853 3C20                <1> 	cmp	al, 20h
   531 0000A855 7605                <1> 	jna	short loc_ppdn_end_of_path_scan
   532 0000A857 E2F4                <1> 	loop	repeat_ppdn_get_dir_name
   533 0000A859 5F                  <1> 	pop	edi
   534 0000A85A F9                  <1> 	stc
   535                              <1> loc_ppdn_retn:
   536 0000A85B C3                  <1> 	retn
   537                              <1> 
   538                              <1> loc_ppdn_end_of_path_scan:
   539 0000A85C 4E                  <1> 	dec	esi
   540                              <1> loc_check_level_dot_conv_dir_name:
   541 0000A85D 31C0                <1> 	xor	eax, eax
   542 0000A85F AA                  <1> 	stosb
   543 0000A860 89F3                <1> 	mov	ebx, esi
   544 0000A862 BE[36860100]        <1> 	mov	esi, Dir_File_Name
   545 0000A867 AC                  <1> 	lodsb
   546                              <1> repeat_ppdn_name_check_dot:
   547 0000A868 3C2E                <1> 	cmp	al, '.'
   548 0000A86A 7509                <1> 	jne	short loc_ppdn_convert_sub_dir_name
   549                              <1> repeat_ppdn_name_dot_dot:
   550 0000A86C AC                  <1> 	lodsb
   551 0000A86D 3C2E                <1> 	cmp	al, '.'
   552 0000A86F 743E                <1> 	je	short loc_ppdn_dot_dot
   553 0000A871 3C21                <1> 	cmp	al, 21h
   554 0000A873 7226                <1> 	jb	short pass_ppdn_convert_sub_dir_name
   555                              <1> loc_ppdn_convert_sub_dir_name:
   556 0000A875 8A25[35860100]      <1> 	mov	ah, [PATH_Level]
   557 0000A87B 80FC07              <1> 	cmp	ah, 7
   558 0000A87E 731B                <1> 	jnb	short pass_ppdn_convert_sub_dir_name
   559 0000A880 FEC4                <1> 	inc	ah
   560 0000A882 8825[35860100]      <1> 	mov	[PATH_Level], ah
   561 0000A888 BE[36860100]        <1> 	mov	esi, Dir_File_Name
   562                              <1> 	;mov	edi, [PATH_Array_Ptr]
   563 0000A88D B010                <1> 	mov	al, 16
   564 0000A88F F6E4                <1> 	mul	ah
   565 0000A891 8B3C24              <1> 	mov	edi, [esp]
   566                              <1> 	;push	edi
   567 0000A894 01C7                <1> 	add	edi, eax
   568 0000A896 E800030000          <1> 	call	convert_file_name
   569                              <1> 	;pop	edi
   570                              <1> pass_ppdn_convert_sub_dir_name:
   571 0000A89B 89DE                <1> 	mov	esi, ebx
   572                              <1> repeat_ppdn_check_last_slash:
   573 0000A89D AC                  <1> 	lodsb
   574 0000A89E 3C2F                <1> 	cmp	al, '/'
   575 0000A8A0 74FB                <1> 	je	short repeat_ppdn_check_last_slash
   576 0000A8A2 3C21                <1> 	cmp	al, 21h
   577 0000A8A4 739D                <1> 	jnb	short loc_ppdn_get_dir_name
   578                              <1> end_of_parse_dir_name:
   579 0000A8A6 5F                  <1> 	pop	edi
   580 0000A8A7 F5                  <1> 	cmc
   581                              <1> 	;mov	al, [PATH_CDLevel]
   582                              <1> 	;mov	ah, [PATH_Level]
   583 0000A8A8 66A1[34860100]      <1> 	mov	ax, [PATH_CDLevel]
   584 0000A8AE C3                  <1> 	retn
   585                              <1> 
   586                              <1> loc_ppdn_dot_dot:
   587 0000A8AF AC                  <1> 	lodsb
   588 0000A8B0 3C21                <1> 	cmp	al, 21h
   589 0000A8B2 73F2                <1> 	jnb	short end_of_parse_dir_name
   590                              <1> loc_ppdn_dot_dot_prev_level:
   591 0000A8B4 66A1[34860100]      <1> 	mov	ax, [PATH_CDLevel]
   592 0000A8BA 80EC01              <1> 	sub	ah, 1
   593 0000A8BD 80D400              <1> 	adc	ah, 0
   594 0000A8C0 38E0                <1> 	cmp	al, ah
   595 0000A8C2 7602                <1> 	jna	short pass_ppdn_set_al_to_ah
   596 0000A8C4 88E0                <1> 	mov	al, ah
   597                              <1> pass_ppdn_set_al_to_ah:
   598 0000A8C6 66A3[34860100]      <1> 	mov	[PATH_CDLevel], ax
   599 0000A8CC EBCD                <1> 	jmp	short pass_ppdn_convert_sub_dir_name
   600                              <1> 
   601                              <1> locate_current_dir_file:
   602                              <1> 	; 26/08/2024 (TRDOS 386 v2.0.9)
   603                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
   604                              <1> 	; 20/11/2017
   605                              <1> 	; 14/02/2016
   606                              <1> 	; 13/02/2016
   607                              <1> 	; 10/02/2016
   608                              <1> 	; 06/02/2016 (TRDOS 386 = TRDOS v2.0)
   609                              <1> 	; 14/08/2010
   610                              <1> 	; 19/09/2009
   611                              <1>         ; 2005
   612                              <1> 	; INPUT ->
   613                              <1> 	;	ESI = DOS DirEntry Format FileName Address
   614                              <1> 	;	AL = Attributes Mask
   615                              <1> 	;	(<AL AND EntryAttrib> must be equal to AL)
   616                              <1> 	;	AH = Negative Attributes Mask (If AH>0)
   617                              <1> 	;	(<AH AND EntryAttrib> must be ZERO)
   618                              <1> 	;	CH > 0 Find First Free Dir Entry or Deleted Entry
   619                              <1> 	;	CL = 0 -> Return the First Free Dir Entry
   620                              <1> 	;	CL = E5h -> Return the 1st deleted entry
   621                              <1> 	;	CL = FFh -> Return the 1st deleted or free entry
   622                              <1> 	;	CL > 0 and CL <> E5h and CL <> FFh -> Return the first
   623                              <1> 	;	     proper entry (which fits with Atributes Masks)
   624                              <1> 	;	CX = 0 Find Valid File/Directory/VolumeName
   625                              <1> 	;	? = Any One Char
   626                              <1> 	;	* = Every Chars
   627                              <1> 	; OUTPUT ->
   628                              <1> 	;	EDI = Directory Entry Address (in Directory Buffer)
   629                              <1> 	;	ESI = DOS DirEntry Format FileName Address
   630                              <1> 	;	CF = 0 -> No Error, Proper Entry,
   631                              <1> 	;	DL = Attributes
   632                              <1> 	;	DH = Previous Entry Attr (LongName Check)
   633                              <1> 	;	AL > 0 -> Ambiguous filename wildcard "?" used
   634                              <1> 	;	AH > 0 -> Ambiguous filename wildcard "*" used
   635                              <1> 	;	AX = 0 -> Filename full fits with directory entry
   636                              <1> 	;	CH = The 1st Name Char of Current Dir Entry
   637                              <1> 	;	CF = 1 -> Proper entry not found, Error Code in EAX/AL
   638                              <1> 	;	CL = 0 and CH = 0 -> Free Entry (End Of Dir)
   639                              <1> 	;	CL = 0 and CH = E5h -> Deleted Entry fits with filters
   640                              <1> 	;	CL > 0 -> Entry not found, CH invalid
   641                              <1> 	;	CF = 0 ->
   642                              <1> 	;	EBX = Current Directory Entry Index/Number (BX)
   643                              <1> 
   644                              <1> 	;mov	word [DirBuff_EntryCounter], 0 ; Zero Based
   645                              <1> 
   646 0000A8CE 8935[98850100]      <1> 	mov	[CDLF_FNAddress], esi
   647 0000A8D4 66A3[96850100]      <1> 	mov	[CDLF_AttributesMask], ax
   648 0000A8DA 66890D[9C850100]    <1> 	mov	[CDLF_DEType], cx
   649                              <1> 
   650 0000A8E1 31DB                <1> 	xor	ebx, ebx
   651 0000A8E3 881D[AC850100]      <1> 	mov	[PreviousAttr], bl ; 0  ; 13/02/2016
   652                              <1> 
   653 0000A8E9 8A3D[B27D0100]      <1> 	mov	bh, [Current_Drv]
   654 0000A8EF 381D[D9840100]      <1> 	cmp	byte [DirBuff_ValidData], bl ; 0
   655 0000A8F5 761D                <1> 	jna	short loc_lcdf_reload_current_dir2
   656 0000A8F7 8A1D[D7840100]      <1>         mov     bl, [DirBuff_DRV]
   657 0000A8FD 80EB41              <1> 	sub	bl, 'A'
   658 0000A900 38DF                <1> 	cmp	bh, bl
   659 0000A902 750E                <1> 	jne	short loc_lcdf_reload_current_dir1
   660 0000A904 8B15[DE840100]      <1> 	mov	edx, [DirBuff_Cluster]
   661 0000A90A 3B15[AC7D0100]      <1> 	cmp	edx, [Current_Dir_FCluster]
   662 0000A910 7412                <1> 	je	short loc_cdir_locatefile_search
   663                              <1> 
   664                              <1> loc_lcdf_reload_current_dir1:
   665 0000A912 30DB                <1> 	xor	bl, bl
   666                              <1> loc_lcdf_reload_current_dir2:
   667 0000A914 89DE                <1> 	mov	esi, ebx
   668 0000A916 81C600010900        <1>         add     esi, Logical_DOSDisks
   669 0000A91C E870000000          <1> 	call	reload_current_directory
   670 0000A921 7359                <1> 	jnc	short loc_locatefile_search_again
   671 0000A923 C3                  <1> 	retn
   672                              <1> 
   673                              <1> loc_cdir_locatefile_search:
   674 0000A924 31DB                <1> 	xor	ebx, ebx
   675 0000A926 55                  <1> 	push	ebp ; 20/11/2017
   676 0000A927 E89E000000          <1> 	call	find_directory_entry
   677 0000A92C 5D                  <1> 	pop	ebp ; 20/11/2017
   678 0000A92D 7345                <1> 	jnc	short loc_cdir_locate_file_retn
   679                              <1> 
   680                              <1> loc_locatefile_check_stc_reason:
   681 0000A92F 08ED                <1> 	or	ch, ch
   682 0000A931 7440                <1> 	jz	short loc_cdir_locate_file_stc_retn
   683                              <1> 
   684                              <1> loc_locatefile_check_next_entryblock:
   685                              <1> 	;mov	bh, [Current_Drv]
   686                              <1> 	;sub	bl, bl
   687                              <1> 	;movzx	esi, bx
   688                              <1> 	; 28/07/2022
   689 0000A933 31DB                <1>         xor	ebx, ebx
   690 0000A935 8A3D[B27D0100]      <1> 	mov	bh, [Current_Drv]
   691 0000A93B 89DE                <1> 	mov	esi, ebx
   692 0000A93D 81C600010900        <1> 	add     esi, Logical_DOSDisks
   693                              <1> 
   694 0000A943 803D[B07D0100]00    <1> 	cmp	byte [Current_Dir_Level], 0
   695 0000A94A 760A                <1> 	jna	short loc_locatefile_check_FAT_type
   696                              <1> 
   697 0000A94C 803D[B17D0100]01    <1> 	cmp	byte [Current_FATType], 1
   698 0000A953 730A                <1> 	jnb	short loc_locatefile_load_subdir_cluster
   699 0000A955 C3                  <1> 	retn
   700                              <1> 
   701                              <1> loc_locatefile_check_FAT_type:
   702 0000A956 803D[B17D0100]03    <1> 	cmp	byte [Current_FATType], 3
   703 0000A95D 7215                <1> 	jb	short loc_cdir_locate_file_retn
   704                              <1> 
   705                              <1> loc_locatefile_load_subdir_cluster:
   706 0000A95F A1[DE840100]        <1> 	mov	eax, [DirBuff_Cluster]
   707 0000A964 E8031A0000          <1> 	call	get_next_cluster
   708 0000A969 730A                <1> 	jnc	short loc_locatefile_next_cluster
   709 0000A96B 09C0                <1> 	or	eax, eax
   710 0000A96D 7504                <1> 	jnz	short loc_locatefile_drive_not_ready_read_err
   711                              <1> 	;stc
   712                              <1> 	; 28/07/2022
   713                              <1> ;loc_locatefile_file_notfound:
   714                              <1> 	;mov	eax, 2 ; File/Directory/VolName not found
   715                              <1> 	;xor	eax, eax
   716                              <1> 	; 26/08/2024
   717                              <1> 	; eax = 0
   718 0000A96F B002                <1> 	mov	al, 2
   719 0000A971 F9                  <1> 	stc
   720 0000A972 C3                  <1> 	retn
   721                              <1> 
   722                              <1> loc_locatefile_drive_not_ready_read_err:
   723                              <1> 	;mov	eax, 17 ;Drive not ready or read error
   724                              <1> loc_cdir_locate_file_stc_retn:
   725 0000A973 F5                  <1> 	cmc ;stc
   726                              <1> loc_cdir_locate_file_retn:
   727 0000A974 C3                  <1> 	retn
   728                              <1> 
   729                              <1> loc_locatefile_next_cluster:
   730 0000A975 E8AE1B0000          <1> 	call	load_FAT_sub_directory
   731                              <1> 	;jc	short loc_locatefile_drive_not_ready_read_err
   732 0000A97A 72F8                <1> 	jc	short loc_cdir_locate_file_retn 
   733                              <1> 
   734                              <1> loc_locatefile_search_again:
   735 0000A97C 8B35[98850100]      <1> 	mov	esi, [CDLF_FNAddress] 
   736 0000A982 66A1[96850100]      <1> 	mov	ax, [CDLF_AttributesMask]
   737 0000A988 668B0D[9C850100]    <1> 	mov	cx, [CDLF_DEType] 
   738 0000A98F EB93                <1> 	jmp	short loc_cdir_locatefile_search
   739                              <1> 
   740                              <1> reload_current_directory:
   741                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
   742                              <1> 	; 06/02/2016 (TRDOS 386 = TRDOS v2.0)
   743                              <1> 	; 13/06/2010
   744                              <1> 	; 22/09/2009
   745                              <1>         ;
   746                              <1> 	; INPUT ->
   747                              <1> 	;	ESI = Dos drive description table address
   748                              <1> 
   749                              <1> 	;mov	al, [esi+LD_FATType]
   750 0000A991 A0[B17D0100]        <1> 	mov	al, [Current_FATType]
   751 0000A996 3C02                <1> 	cmp	al, 2
   752 0000A998 7726                <1> 	ja	short loc_reload_FAT_sub_directory
   753 0000A99A 8A25[B07D0100]      <1> 	mov	ah, [Current_Dir_Level]
   754 0000A9A0 08C0                <1> 	or	al, al
   755 0000A9A2 7409                <1> 	jz	short loc_reload_FS_directory
   756 0000A9A4 08E4                <1> 	or	ah, ah
   757 0000A9A6 7518                <1> 	jnz	short loc_reload_FAT_sub_directory
   758                              <1> loc_reload_FAT_12_16_root_directory:
   759                              <1> 	;call	load_FAT_root_directory
   760                              <1> 	;retn
   761                              <1> 	; 28/07/2022
   762 0000A9A8 E9FD1A0000          <1> 	jmp	load_FAT_root_directory
   763                              <1> loc_reload_FS_directory:
   764 0000A9AD 20E4                <1> 	and	ah, ah
   765 0000A9AF 7505                <1> 	jnz	short loc_reload_FS_sub_directory 
   766                              <1> loc_reload_FS_root_directory: 
   767                              <1> 	;call	load_FS_root_directory
   768                              <1> 	;retn
   769                              <1> 	; 28/07/2022
   770 0000A9B1 E9AC1B0000          <1> 	jmp	load_FS_root_directory
   771                              <1> loc_reload_FS_sub_directory:
   772 0000A9B6 A1[AC7D0100]        <1> 	mov	eax, [Current_Dir_FCluster]
   773                              <1> 	;call	load_FS_sub_directory
   774                              <1> 	;retn
   775 0000A9BB E9A21B0000          <1> 	jmp	load_FS_sub_directory 
   776                              <1> loc_reload_FAT_sub_directory:
   777 0000A9C0 A1[AC7D0100]        <1> 	mov	eax, [Current_Dir_FCluster]
   778                              <1> 	;call	load_FAT_sub_directory
   779                              <1> 	;retn
   780                              <1> 	; 28/07/2022
   781 0000A9C5 E95E1B0000          <1> 	jmp	load_FAT_sub_directory
   782                              <1> 
   783                              <1> find_directory_entry:
   784                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
   785                              <1> 	; 02/03/2021 (TRDOS 386 v2.0.3) ((BugFix))
   786                              <1> 	; 14/02/2016
   787                              <1> 	; 13/02/2016
   788                              <1> 	; 10/02/2016
   789                              <1> 	; 06/02/2016 (TRDOS 386 = TRDOS v2.0)
   790                              <1> 	; 14/08/2010 (DIR.ASM, "proc_find_direntry")
   791                              <1> 	; 19/09/2009
   792                              <1> 	; 2005
   793                              <1> 	; INPUT ->
   794                              <1> 	;	ESI = Sub Dir or File Name Address
   795                              <1> 	;	AL = Attributes Mask 
   796                              <1> 	;	(<AL AND EntryAttrib> must be equal to AL)
   797                              <1> 	;	AH = Negative Attributes Mask (If AH>0)
   798                              <1> 	;	(<AH AND EntryAttrib> must be ZERO)
   799                              <1> 	;	CH > 0 Find First Free Dir Entry or Deleted Entry
   800                              <1> 	;	CL = 0 -> Return the First Free Dir Entry
   801                              <1> 	;	CL = E5h -> Return the 1st deleted entry
   802                              <1> 	;	CL = FFh -> Return the 1st deleted or free entry
   803                              <1> 	;	CL > 0 and CL <> E5h and CL <> FFh -> Return the first 
   804                              <1> 	;            proper entry (which fits with Atributes Masks)
   805                              <1> 	;	CX = 0 -> Find Valid File/Directory/VolumeName
   806                              <1> 	;	? = Any One Char
   807                              <1> 	;	* = Every Chars
   808                              <1> 	;	EBX = Current Dir Entry (BX)
   809                              <1> 	;
   810                              <1> 	; OUTPUT ->
   811                              <1> 	;	EDI = Directory Entry Address (in DirectoryBuffer)
   812                              <1> 	;	ESI = Sub Dir or File Name Address
   813                              <1> 	;	CF = 0 -> No Error, Proper Entry,
   814                              <1> 	;	DL = Attributes
   815                              <1> 	;	DH = Previous Entry Attr (LongName Check)
   816                              <1> 	;	AL > 0 -> Ambiguous filename wildcard "?" used
   817                              <1> 	;	AH > 0 -> Ambiguous filename wildcard "*" used
   818                              <1> 	;	AX = 0 -> Filename full fits with directory entry
   819                              <1> 	;	EBX = CurrentDirEntry (BX)
   820                              <1> 	;	CH = The 1st Name Char of Current Dir Entry
   821                              <1> 	;	CF = 1 -> Proper entry not found, Error Code in AX/AL
   822                              <1> 	;	CL = 0 and CH = 0 -> Free Entry (End Of Dir)
   823                              <1> 	;	CL = 0 and CH = E5h -> Deleted Entry fits with filters
   824                              <1> 	;	CL > 0 -> Entry not found, CH invalid
   825                              <1> 	;
   826                              <1> 	; (EAX, EBX, ECX, EDX, EDI, EBP will be changed)
   827                              <1> 
   828 0000A9CA 663B1D[DC840100]    <1> 	cmp	bx, [DirBuff_LastEntry]
   829 0000A9D1 7728                <1> 	ja      short loc_ffde_stc_retn_255 ; 28/07/2022
   830                              <1> 
   831                              <1> 	;mov    [DirBuff_CurrentEntry], bx
   832                              <1> 
   833 0000A9D3 BF00000800          <1>   	mov	edi, Directory_Buffer
   834 0000A9D8 66A3[A8850100]      <1> 	mov	[FDE_AttrMask], ax
   835                              <1> 
   836 0000A9DE 29C0                <1> 	sub	eax, eax
   837                              <1> 
   838                              <1> 	;;mov	[PreviousAttr], al ; 0 ;; 13/02/2016
   839 0000A9E0 66A3[AA850100]      <1> 	mov	[AmbiguousFileName], ax ; 0
   840                              <1> 
   841 0000A9E6 6689D8              <1> 	mov	ax, bx
   842                              <1> 	;shl	ax, 5 ; ; * 32 ; Directory entry size
   843                              <1> 	; 28/07/2022
   844 0000A9E9 C1E005              <1> 	shl	eax, 5
   845 0000A9EC 01C7                <1> 	add     edi, eax
   846                              <1> 
   847 0000A9EE 08ED                <1> 	or	ch, ch
   848                              <1> 	;jnz	loc_find_free_deleted_entry_0
   849                              <1> 	; 28/07/2022
   850 0000A9F0 7405                <1> 	jz	short loc_fde_any_valid_entry_opt
   851 0000A9F2 E911010000          <1> 	jmp	loc_find_free_deleted_entry_0
   852                              <1> 
   853                              <1> loc_fde_any_valid_entry_opt:
   854 0000A9F7 08C9                <1> 	or      cl, cl
   855                              <1>         ;jnz	loc_ffde_stc_retn_255
   856                              <1> 	; 28/07/2022
   857 0000A9F9 742E                <1> 	jz	short check_find_dir_entry
   858                              <1> 
   859                              <1> 	; 28/07/2022
   860                              <1> loc_ffde_stc_retn_255:
   861                              <1> 	; 02/03/2021 (TRDOS 386 v2.0.3) ((BugFix))
   862                              <1> 	; (ECX must not be > 65535)
   863                              <1> 	; ((because 'loc_ccd_save_current_dir'
   864                              <1> 	;  sets CX to 32 for 'rep movsd'))
   865 0000A9FB 66B9FFFF            <1> 	mov	cx, 0FFFFh
   866                              <1> 	;xor	ecx, ecx
   867                              <1> 	;dec	ecx ; 0FFFFFFFFh
   868                              <1> 	;xor	eax, eax
   869                              <1> loc_find_direntry_stc_retn:
   870                              <1> loc_check_ffde_retn_1:
   871                              <1> 	;mov	ax, 2
   872                              <1> 	;mov	eax, 2 ; File Not Found
   873                              <1> 	; 28/07/2022
   874 0000A9FF 29C0                <1> 	sub	eax, eax
   875 0000AA01 B002                <1> 	mov	al, 2
   876 0000AA03 8A35[AC850100]      <1> 	mov	dh, [PreviousAttr]
   877 0000AA09 66891D[DA840100]    <1> 	mov	[DirBuff_CurrentEntry], bx
   878 0000AA10 F9                  <1> 	stc
   879 0000AA11 C3                  <1> 	retn
   880                              <1> 
   881                              <1> 	; 28/07/2022
   882                              <1> loc_find_dir_next_entry_prevdeleted:
   883 0000AA12 80CA80              <1> 	or	dl, 80h  ; Bit 7 -> deleted entry sign
   884                              <1> 	;jmp	short loc_find_dir_next_entry
   885                              <1> 
   886                              <1> 	; 28/07/2022
   887                              <1> loc_find_dir_next_entry:
   888 0000AA15 8815[AC850100]      <1> 	mov	byte [PreviousAttr], dl ; LongName check
   889                              <1> loc_find_dir_next_entry_1:
   890 0000AA1B 5E                  <1> 	pop	esi
   891 0000AA1C 83C720              <1> 	add	edi, 32
   892                              <1> 	;;inc	word [DirBuff_EntryCounter]
   893                              <1> 	;inc	bx
   894                              <1> 	; 28/07/2022
   895 0000AA1F 43                  <1> 	inc	ebx
   896 0000AA20 663B1D[DC840100]    <1> 	cmp	bx, [DirBuff_LastEntry]
   897 0000AA27 77D2                <1> 	ja	short loc_ffde_stc_retn_255
   898                              <1>         ; 28/07/2022
   899                              <1> 	;jmp	short check_find_dir_entry
   900                              <1> 
   901                              <1> check_find_dir_entry:
   902 0000AA29 66A1[A8850100]      <1> 	mov	ax, [FDE_AttrMask]
   903 0000AA2F 8A2F                <1> 	mov	ch, [edi]
   904 0000AA31 80FD00              <1> 	cmp     ch, 0 ; Is it never used entry?
   905                              <1> 	;jna	loc_find_direntry_stc_retn
   906                              <1> 	; 28/07/2022
   907 0000AA34 7702                <1> 	ja	short loc_fde_check_attrib
   908                              <1> 	; end of directory entries
   909 0000AA36 EBC7                <1> 	jmp	loc_find_direntry_stc_retn
   910                              <1> loc_fde_check_attrib:
   911 0000AA38 56                  <1> 	push	esi
   912 0000AA39 8A570B              <1> 	mov	dl, [edi+0Bh] ; File attributes
   913 0000AA3C 80FDE5              <1> 	cmp	ch, 0E5h ; Is it a deleted file?
   914 0000AA3F 74D1                <1> 	je	short loc_find_dir_next_entry_prevdeleted
   915                              <1> 
   916 0000AA41 80FA0F              <1> 	cmp     dl, 0Fh ; longname sub component check
   917 0000AA44 7505                <1> 	jne     short loc_check_attributes_mask
   918 0000AA46 E8A6010000          <1> 	call	save_longname_sub_component
   919                              <1> 
   920                              <1> loc_check_attributes_mask:
   921 0000AA4B 88C6                <1> 	mov	dh, al
   922 0000AA4D 20D6                <1> 	and	dh, dl
   923                              <1> 	; 28/07/2022
   924 0000AA4F 38F0                <1> 	cmp	al, dh
   925 0000AA51 75C2                <1> 	jne	short loc_find_dir_next_entry
   926 0000AA53 20D4                <1> 	and	ah, dl
   927 0000AA55 75BE                <1>         jnz	short loc_find_dir_next_entry
   928 0000AA57 80FA0F              <1> 	cmp	dl, 0Fh
   929 0000AA5A 7515                <1> 	jne	short pass_direntry_attr_check
   930                              <1> 
   931 0000AA5C 3C0F                <1> 	cmp	al, 0Fh ; AL = 0Fh -> find long name
   932 0000AA5E 75B5                <1> 	jne	short loc_find_dir_next_entry
   933                              <1> 
   934 0000AA60 5E                  <1> 	pop	esi
   935                              <1> 	;xor	ax, ax
   936                              <1> 	; 28/07/2022
   937                              <1> 	;sub	eax, eax
   938 0000AA61 30C0                <1> 	xor	al, al
   939 0000AA63 8A35[AC850100]      <1> 	mov	dh, [PreviousAttr]
   940 0000AA69 66891D[DA840100]    <1> 	mov	[DirBuff_CurrentEntry], bx
   941 0000AA70 C3                  <1> 	retn
   942                              <1> 
   943                              <1> pass_direntry_attr_check:
   944 0000AA71 89FD                <1> 	mov	ebp, edi ; 14/02/2016
   945                              <1> 	;mov	ecx, 8
   946                              <1> 	; 28/07/2022
   947 0000AA73 29C9                <1> 	sub	ecx, ecx
   948 0000AA75 B108                <1> 	mov	cl, 8
   949                              <1> loc_lodsb_find_dir:
   950 0000AA77 AC                  <1> 	lodsb
   951 0000AA78 3C2A                <1> 	cmp	al, '*'
   952 0000AA7A 7508                <1> 	jne	short pass_fde_ambiguous1_check
   953 0000AA7C FE05[AB850100]      <1>         inc     byte [AmbiguousFileName+1]
   954 0000AA82 EB23                <1> 	jmp	short loc_check_direntry_extension
   955                              <1> 
   956                              <1> pass_fde_ambiguous1_check:
   957 0000AA84 3C3F                <1> 	cmp	al, '?'
   958 0000AA86 750D                <1> 	jne	short pass_fde_ambiguous2_check
   959 0000AA88 FE05[AA850100]      <1> 	inc	byte [AmbiguousFileName]
   960 0000AA8E 803F20              <1> 	cmp	byte [edi], 20h
   961 0000AA91 763E                <1> 	jna	short loc_find_dir_next_entry_ebp
   962 0000AA93 EB0F                <1> 	jmp	short loc_scasb_find_dir_inc_di
   963                              <1> 
   964                              <1> pass_fde_ambiguous2_check:
   965 0000AA95 3C20                <1> 	cmp	al, 20h
   966 0000AA97 7507                <1> 	jne	short loc_scasb_find_dir
   967 0000AA99 803F20              <1> 	cmp	byte [edi], 20h
   968 0000AA9C 7533                <1> 	jne	short loc_find_dir_next_entry_ebp
   969 0000AA9E EB07                <1> 	jmp	short loc_check_direntry_extension
   970                              <1> 
   971                              <1> loc_scasb_find_dir:
   972 0000AAA0 3A07                <1> 	cmp	al, [edi]
   973 0000AAA2 752D                <1> 	jne	short loc_find_dir_next_entry_ebp
   974                              <1> loc_scasb_find_dir_inc_di:
   975 0000AAA4 47                  <1> 	inc	edi
   976 0000AAA5 E2D0                <1> 	loop	loc_lodsb_find_dir
   977                              <1> 
   978                              <1> loc_check_direntry_extension:
   979 0000AAA7 BE08000000          <1> 	mov	esi, 8
   980 0000AAAC 89F7                <1> 	mov	edi, esi ; 8
   981 0000AAAE 033424              <1> 	add	esi, [esp] ; Sub Dir or File Name Address
   982 0000AAB1 01EF                <1> 	add	edi, ebp
   983 0000AAB3 B103                <1> 	mov	cl, 3
   984                              <1> loc_lodsb_find_dir_ext:
   985 0000AAB5 AC                  <1> 	lodsb
   986 0000AAB6 3C2A                <1> 	cmp	al, '*'
   987 0000AAB8 7508                <1> 	jne	short pass_fde_ambiguous3_check
   988 0000AABA FE05[AB850100]      <1> 	inc	byte [AmbiguousFileName+1]
   989 0000AAC0 EB1F                <1> 	jmp	short loc_find_dir_proper_direntry
   990                              <1> 
   991                              <1> pass_fde_ambiguous3_check:
   992 0000AAC2 3C3F                <1> 	cmp	al, '?'
   993 0000AAC4 7512                <1> 	jne	short pass_fde_ambiguous4_check
   994 0000AAC6 FE05[AA850100]      <1> 	inc	byte [AmbiguousFileName]
   995 0000AACC 803F20              <1> 	cmp	byte [edi], 20h
   996                              <1> 	;jna	short loc_find_dir_next_entry_ebp
   997                              <1> 	;jmp	short loc_scasb_find_dir_ext_inc_di
   998                              <1> 	; 28/07/2022
   999 0000AACF 7732                <1> 	ja	short loc_scasb_find_dir_ext_inc_di
  1000                              <1> 
  1001                              <1> loc_find_dir_next_entry_ebp:
  1002 0000AAD1 89EF                <1> 	mov	edi, ebp ; 14/02/2016
  1003 0000AAD3 E93DFFFFFF          <1> 	jmp	loc_find_dir_next_entry ; 28/07/2022
  1004                              <1> 
  1005                              <1> pass_fde_ambiguous4_check:
  1006 0000AAD8 3C20                <1> 	cmp	al, 20h
  1007 0000AADA 7523                <1> 	jne	short loc_scasb_find_dir_ext
  1008 0000AADC 803F20              <1> 	cmp	byte [edi], 20h
  1009                              <1> 	; 28/07/2022
  1010 0000AADF 75F0                <1> 	jne	short loc_find_dir_next_entry_ebp
  1011                              <1> 	;jmp	short loc_find_dir_proper_direntry
  1012                              <1> 
  1013                              <1> loc_find_dir_proper_direntry:
  1014 0000AAE1 30C9                <1> 	xor	cl, cl
  1015                              <1> loc_find_dir_proper_direntry_1:
  1016 0000AAE3 5E                  <1> 	pop	esi
  1017 0000AAE4 89EF                <1>         mov     edi, ebp
  1018 0000AAE6 8A2F                <1> 	mov	ch, [edi]
  1019 0000AAE8 8A570B              <1> 	mov     dl, [edi+0Bh] ; Dir entry attributes
  1020 0000AAEB 66A1[AA850100]      <1> 	mov	ax, [AmbiguousFileName]
  1021                              <1> loc_find_dir_proper_direntry_2:
  1022 0000AAF1 8A35[AC850100]      <1> 	mov     dh, [PreviousAttr]
  1023 0000AAF7 66891D[DA840100]    <1> 	mov	[DirBuff_CurrentEntry], bx
  1024 0000AAFE C3                  <1> 	retn
  1025                              <1> 
  1026                              <1> loc_scasb_find_dir_ext:
  1027 0000AAFF 3A07                <1> 	cmp	al, [edi]
  1028 0000AB01 75CE                <1> 	jne	short loc_find_dir_next_entry_ebp
  1029                              <1> loc_scasb_find_dir_ext_inc_di:
  1030 0000AB03 47                  <1> 	inc	edi
  1031 0000AB04 E2AF                <1> 	loop    loc_lodsb_find_dir_ext
  1032 0000AB06 EBDB                <1> 	jmp	short loc_find_dir_proper_direntry_1
  1033                              <1> 
  1034                              <1> loc_find_free_deleted_entry_0:
  1035 0000AB08 66A1[A8850100]      <1> 	mov	ax, [FDE_AttrMask]
  1036 0000AB0E 8A2F                <1> 	mov	ch, [edi]
  1037 0000AB10 8A570B              <1> 	mov	dl, [edi+0Bh] ; File attributes
  1038 0000AB13 08C9                <1> 	or	cl, cl
  1039 0000AB15 7407                <1> 	jz	short loc_check_ffde_0_repeat
  1040                              <1> 	;cmp	cl, 0E5h
  1041                              <1> 	;je	short pass_loc_check_ffde_0_err
  1042 0000AB17 80F9FF              <1> 	cmp	cl, 0FFh
  1043 0000AB1A 7430                <1> 	je	short loc_find_free_deleted_entry_1
  1044 0000AB1C EB4A                <1> 	jmp	short pass_loc_check_ffde_0_err
  1045                              <1> 
  1046                              <1> loc_check_ffde_0_repeat:
  1047 0000AB1E 08ED                <1> 	or	ch, ch
  1048 0000AB20 7510                <1> 	jnz	short loc_check_ffde_0_next
  1049                              <1> 
  1050                              <1> loc_check_ffde_retn_2:
  1051                              <1> 	;sub	ax, ax
  1052                              <1> 	; 28/07/2022
  1053 0000AB22 29C0                <1> 	sub	eax, eax
  1054 0000AB24 8A35[AC850100]      <1> 	mov	dh, [PreviousAttr]
  1055 0000AB2A 66891D[DA840100]    <1> 	mov	[DirBuff_CurrentEntry], bx
  1056 0000AB31 C3                  <1> 	retn
  1057                              <1>  
  1058                              <1> loc_check_ffde_0_next:
  1059                              <1> 	;inc	bx
  1060                              <1> 	; 28/07/2022
  1061 0000AB32 43                  <1> 	inc	ebx
  1062 0000AB33 83C720              <1> 	add	edi, 32
  1063                              <1> 	;inc	word [DirBuff_EntryCounter]
  1064                              <1> 	 
  1065 0000AB36 663B1D[DC840100]    <1>         cmp	bx, [DirBuff_LastEntry]
  1066                              <1> 	;ja	short loc_ffde_stc_retn_255
  1067                              <1> 	; 07/08/2022
  1068 0000AB3D 773A                <1> 	ja	short jmp_ffde_stc_retn_255
  1069                              <1> 
  1070 0000AB3F 8815[AC850100]      <1> 	mov	[PreviousAttr], dl
  1071 0000AB45 8A2F                <1> 	mov	ch, [edi]
  1072 0000AB47 8A570B              <1> 	mov	dl, [edi+0Bh] ; file attributes
  1073 0000AB4A EBD2                <1> 	jmp	short loc_check_ffde_0_repeat
  1074                              <1> 
  1075                              <1> loc_find_free_deleted_entry_1:
  1076 0000AB4C 28D2                <1> 	sub	dl, dl
  1077                              <1> loc_find_free_deleted_entry_2:
  1078 0000AB4E 20ED                <1> 	and	ch, ch  
  1079 0000AB50 74D0                <1> 	jz	short loc_check_ffde_retn_2
  1080 0000AB52 80FDE5              <1> 	cmp	ch, 0E5h
  1081 0000AB55 74CB                <1> 	je	short loc_check_ffde_retn_2
  1082                              <1> 	;inc	bx
  1083                              <1> 	; 28/07/2022
  1084 0000AB57 43                  <1> 	inc	ebx
  1085 0000AB58 83C720              <1> 	add	edi, 32
  1086 0000AB5B 663B1D[DC840100]    <1> 	cmp	bx, [DirBuff_LastEntry]
  1087                              <1> 	;ja	short loc_ffde_stc_retn_255
  1088                              <1> 	; 07/08/2022
  1089 0000AB62 7715                <1> 	ja	short jmp_ffde_stc_retn_255
  1090                              <1> 
  1091 0000AB64 8A2F                <1> 	mov	ch, [edi]
  1092 0000AB66 EBE6                <1> 	jmp	short loc_find_free_deleted_entry_2
  1093                              <1> 
  1094                              <1> pass_loc_check_ffde_0_err:
  1095 0000AB68 38CD                <1> 	cmp	ch, cl
  1096 0000AB6A 741F                <1> 	je	short loc_check_ffde_attrib
  1097                              <1> 
  1098                              <1> 	;inc	bx
  1099                              <1> 	; 28/07/2022
  1100 0000AB6C 43                  <1> 	inc	ebx
  1101 0000AB6D 83C720              <1> 	add	edi, 32
  1102 0000AB70 663B1D[DC840100]    <1> 	cmp	bx, [DirBuff_LastEntry]
  1103                              <1>         ;ja	loc_ffde_stc_retn_255
  1104                              <1> 	; 28/07/2022
  1105 0000AB77 7605                <1> 	jna	short loc_ffe_save_prev_attr
  1106                              <1> jmp_ffde_stc_retn_255:	; 07/08/2022
  1107 0000AB79 E97DFEFFFF          <1> 	jmp	loc_ffde_stc_retn_255
  1108                              <1> 
  1109                              <1> loc_ffe_save_prev_attr: ; 28/07/2022
  1110 0000AB7E 8815[AC850100]      <1> 	mov	[PreviousAttr], dl
  1111 0000AB84 8A2F                <1> 	mov	ch, [edi]
  1112 0000AB86 8A570B              <1> 	mov	dl, [edi+0Bh]
  1113 0000AB89 EBDD                <1> 	jmp	short pass_loc_check_ffde_0_err
  1114                              <1> 
  1115                              <1> loc_check_ffde_attrib:
  1116 0000AB8B 88C6                <1> 	mov	dh, al
  1117 0000AB8D 20D6                <1> 	and	dh, dl
  1118 0000AB8F 38F0                <1> 	cmp	al, dh
  1119 0000AB91 759F                <1> 	jne	short loc_check_ffde_0_next
  1120 0000AB93 20D4                <1> 	and	ah, dl
  1121 0000AB95 759B                <1> 	jnz	short loc_check_ffde_0_next
  1122 0000AB97 30C9                <1> 	xor	cl, cl 
  1123 0000AB99 EB87                <1>         jmp	short loc_check_ffde_retn_2
  1124                              <1> 
  1125                              <1> convert_file_name:
  1126                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1127                              <1> 	; 06/03/2016
  1128                              <1> 	; 11/02/2016
  1129                              <1> 	; 07/02/2016 (TRDOS 386 = TRDOS v2.0)
  1130                              <1> 	; 06/10/2009
  1131                              <1> 	; 2005
  1132                              <1> 	;
  1133                              <1> 	; INPUT  ->
  1134                              <1> 	;	ESI = Dot File Name Location
  1135                              <1> 	;	EDI = Dir Entry Format File Name Location
  1136                              <1> 	; OUTPUT ->
  1137                              <1> 	;	EDI = Dir Entry Format File Name Location
  1138                              <1> 	;	ESI = Dot File Name Location (capitalized)
  1139                              <1> 	;
  1140                              <1> 	; (ECX, AL will be changed)
  1141                              <1> 
  1142 0000AB9B 56                  <1> 	push	esi
  1143 0000AB9C 57                  <1> 	push	edi
  1144                              <1> 
  1145                              <1> 	;mov	ecx, 11
  1146                              <1> 	; 29/07 2022
  1147 0000AB9D 29C9                <1> 	sub	ecx, ecx
  1148 0000AB9F B10B                <1> 	mov	cl, 11
  1149 0000ABA1 B020                <1> 	mov	al, 20h
  1150 0000ABA3 F3AA                <1> 	rep	stosb
  1151                              <1> 
  1152 0000ABA5 8B3C24              <1> 	mov	edi, [esp]
  1153                              <1> 
  1154 0000ABA8 B10C                <1> 	mov	cl, 12 ; file name length (max.)
  1155                              <1> 	; 06/03/2016
  1156                              <1> 	; Directory entry name limit (11 bytes) check for
  1157                              <1> 	; 'rename_directory_entry' procedure.
  1158                              <1> 	; (EDI points to Directory Entry)
  1159                              <1> 	; (If the file name would not contain a dot
  1160                              <1> 	; and file name length would be 12, this would cause to
  1161                              <1> 	; overwrite the attributes byte of the directory entry.)
  1162                              <1> 	;
  1163 0000ABAA B50B                <1> 	mov	ch, 11 ; directory entry's name length
  1164                              <1> loc_check_first_dot:
  1165 0000ABAC 8A06                <1> 	mov	al, [esi]
  1166 0000ABAE 3C2E                <1> 	cmp	al, 2Eh
  1167 0000ABB0 750C                <1> 	jne	short pass_check_first_dot
  1168 0000ABB2 8807                <1> 	mov	[edi], al
  1169 0000ABB4 47                  <1> 	inc	edi
  1170 0000ABB5 46                  <1> 	inc	esi
  1171 0000ABB6 FEC9                <1> 	dec	cl
  1172 0000ABB8 75F2                <1> 	jnz	short loc_check_first_dot
  1173                              <1> 	;;(ecx <= 12)
  1174                              <1> 	;;loop	loc_check_first_dot 
  1175 0000ABBA EB30                <1> 	jmp	short stop_convert_file
  1176                              <1> 
  1177                              <1> loc_get_fchar:
  1178 0000ABBC 8A06                <1> 	mov	al, [esi]
  1179                              <1> pass_check_first_dot:
  1180 0000ABBE 3C61                <1> 	cmp	al, 61h ; 'a'
  1181 0000ABC0 7208                <1> 	jb	short pass_name_capitalize
  1182 0000ABC2 3C7A                <1> 	cmp	al, 7Ah ; 'z'
  1183 0000ABC4 7704                <1> 	ja	short pass_name_capitalize
  1184 0000ABC6 24DF                <1> 	and	al, 0DFh
  1185 0000ABC8 8806                <1> 	mov	[esi], al
  1186                              <1> pass_name_capitalize:
  1187 0000ABCA 3C21                <1> 	cmp	al, 21h
  1188 0000ABCC 721E                <1> 	jb	short stop_convert_file
  1189 0000ABCE 3C2E                <1> 	cmp	al, 2Eh ; '.'
  1190 0000ABD0 750C                <1> 	jne	short pass_dot_space
  1191                              <1> add_dot_space:
  1192 0000ABD2 80F904              <1> 	cmp	cl, 4
  1193 0000ABD5 760E                <1> 	jna	short inc_and_loop
  1194 0000ABD7 47                  <1> 	inc	edi
  1195 0000ABD8 FECD                <1> 	dec	ch ; 06/03/2016
  1196 0000ABDA FEC9                <1> 	dec	cl
  1197 0000ABDC EBF4                <1> 	jmp	short add_dot_space
  1198                              <1> 
  1199                              <1> 	;mov	al, 4
  1200                              <1> 	;cmp	cl, al
  1201                              <1> 	;jna	short inc_and_loop
  1202                              <1> 	;sub	cl, al
  1203                              <1> 	;add	edi, ecx
  1204                              <1> 	;mov	cl, al
  1205                              <1> 	;jmp	short inc_and_loop
  1206                              <1> 
  1207                              <1> pass_dot_space:
  1208 0000ABDE 8807                <1> 	mov	[edi], al
  1209                              <1> loc_after_double_dot:
  1210                              <1> 	; 06/03/2016
  1211 0000ABE0 FECD                <1> 	dec	ch ; count down for 11 bytes dir entry limit
  1212 0000ABE2 740A                <1> 	jz	short stop_convert_file_x
  1213 0000ABE4 47                  <1> 	inc	edi
  1214                              <1> inc_and_loop:
  1215 0000ABE5 FEC9                <1> 	dec	cl ; count down for 12 bytes filename limit 
  1216 0000ABE7 7403                <1> 	jz	short stop_convert_file	
  1217 0000ABE9 46                  <1> 	inc	esi
  1218                              <1> 	;;(ecx <= 12)
  1219                              <1> 	;;loop	loc_get_fchar
  1220 0000ABEA EBD0                <1> 	jmp	short loc_get_fchar
  1221                              <1> 
  1222                              <1> stop_convert_file:
  1223                              <1> 	; 06/03/2016
  1224 0000ABEC 30ED                <1> 	xor	ch, ch
  1225                              <1> 	; ECX < 256 ; 'find_first_file' -> xor cl, cl
  1226                              <1> stop_convert_file_x:
  1227 0000ABEE 5F                  <1> 	pop	edi
  1228 0000ABEF 5E                  <1> 	pop	esi
  1229 0000ABF0 C3                  <1> 	retn
  1230                              <1> 
  1231                              <1> save_longname_sub_component:
  1232                              <1> 	; 13/02/2016
  1233                              <1> 	; 06/02/2016 (TRDOS 386 = TRDOS v2.0)
  1234                              <1> 	; 28/02/2010
  1235                              <1> 	; 17/10/2009
  1236                              <1> 	; INPUT ->
  1237                              <1> 	;	EDI = Directory Entry
  1238                              <1> 	;     	// This procedure is called
  1239                              <1> 	;	// from 'find_directory_entry' procedure.
  1240                              <1> 	;	// If the last entry returns with
  1241                              <1> 	;	// a non-zero LongnameFound value and
  1242                              <1> 	;	// if LFN_CheckSum value is equal to
  1243                              <1> 	;	// the next shortname checksum,
  1244                              <1> 	;	// long name is valid.
  1245                              <1> 	;	// If a longname is longer than 65 bytes,
  1246                              <1> 	;	// it is invalid for trdos. (>45h)
  1247                              <1> 
  1248 0000ABF1 57                  <1> 	push	edi
  1249 0000ABF2 56                  <1> 	push	esi
  1250                              <1> 	;push	ebx
  1251                              <1> 	;push	ecx
  1252                              <1> 	;push	edx
  1253 0000ABF3 50                  <1> 	push	eax
  1254                              <1>            
  1255 0000ABF4 29C9                <1> 	sub	ecx, ecx
  1256                              <1> 	;sub	eax, eax
  1257 0000ABF6 B11A                <1> 	mov	cl, 26
  1258                              <1> 
  1259 0000ABF8 0FB607              <1> 	movzx	eax, byte [edi] ; LDIR_Order
  1260 0000ABFB 3C41                <1> 	cmp	al, 41h  ; 40h (last long entry sign) + 1
  1261 0000ABFD 722B                <1> 	jb	short pass_pslnsc_last_long_entry
  1262                              <1> 
  1263 0000ABFF 88C4                <1> 	mov	ah, al
  1264 0000AC01 80EC40              <1> 	sub	ah, 40h
  1265 0000AC04 8825[AE850100]      <1> 	mov	[LFN_EntryLength], ah
  1266                              <1> 	
  1267 0000AC0A 3C45                <1> 	cmp	al, 45h  ; 40h (last long entry sign) + 5
  1268                              <1>  		; Max 130 byte length is usable in TRDOS
  1269                              <1> ; 26*5 = 130
  1270 0000AC0C 7753                <1> 	ja	short loc_pslnsc_retn
  1271                              <1> 
  1272 0000AC0E 2407                <1> 	and	al, 07h ; 0Fh
  1273 0000AC10 A2[AD850100]        <1> 	mov	[LongNameFound], al
  1274                              <1> 
  1275 0000AC15 FEC8                <1> 	dec	al
  1276                              <1> 	;mov	cl, 26
  1277 0000AC17 F6E1                <1> 	mul	cl
  1278                              <1> 
  1279 0000AC19 89C6                <1> 	mov	esi, eax
  1280 0000AC1B 01CE                <1> 	add	esi, ecx
  1281                              <1> 		; to make is an ASCIIZ string
  1282                              <1> 		; with ax+26 bytes length
  1283 0000AC1D 81C6[B0850100]      <1> 	add	esi, LongFileName
  1284 0000AC23 66C7060000          <1> 	mov	word [esi], 0
  1285 0000AC28 EB16                <1> 	jmp	short loc_pslsc_move_ldir_name2
  1286                              <1> 
  1287                              <1> pass_pslnsc_last_long_entry:
  1288 0000AC2A 3C04                <1> 	cmp	al, 04h
  1289 0000AC2C 7733                <1> 	ja	short loc_pslnsc_retn
  1290 0000AC2E FE0D[AD850100]      <1> 	dec	byte [LongNameFound]
  1291 0000AC34 3A05[AD850100]      <1> 	cmp	al, [LongNameFound]
  1292 0000AC3A 7525                <1> 	jne	short loc_pslnsc_retn
  1293                              <1> 
  1294                              <1> loc_pslsc_move_ldir_name1:
  1295 0000AC3C FEC8                <1> 	dec	al
  1296                              <1> 	;mov	cl, 26
  1297 0000AC3E F6E1                <1> 	mul	cl
  1298                              <1> 
  1299                              <1> loc_pslsc_move_ldir_name2:
  1300 0000AC40 8A4F0D              <1> 	mov	cl, [edi+0Dh] ; long name checksum
  1301 0000AC43 880D[AF850100]      <1> 	mov	[LFN_CheckSum], cl
  1302 0000AC49 89FE                <1> 	mov	esi, edi ; LDIR_Order
  1303 0000AC4B BF[B0850100]        <1> 	mov	edi, LongFileName
  1304 0000AC50 01C7                <1> 	add	edi, eax
  1305 0000AC52 46                  <1> 	inc	esi
  1306 0000AC53 B105                <1> 	mov	cl, 5 ; chars 1 to 5
  1307 0000AC55 F366A5              <1> 	rep	movsw
  1308 0000AC58 83C603              <1> 	add	esi, 3
  1309 0000AC5B A5                  <1> 	movsd	; char 6 & 7
  1310 0000AC5C A5                  <1> 	movsd	; char 8 & 9
  1311 0000AC5D A5                  <1> 	movsd	; char 10 & 11
  1312 0000AC5E 46                  <1> 	inc	esi
  1313 0000AC5F 46                  <1> 	inc	esi
  1314 0000AC60 A5                  <1> 	movsd   ; char 12 & 13 
  1315                              <1> 
  1316                              <1> loc_pslnsc_retn:
  1317 0000AC61 58                  <1>  	pop	eax
  1318                              <1> 	;pop	edx
  1319                              <1> 	;pop	ecx
  1320                              <1> 	;pop	ebx
  1321 0000AC62 5E                  <1> 	pop	esi
  1322 0000AC63 5F                  <1> 	pop	edi
  1323                              <1> 
  1324 0000AC64 C3                  <1>     	retn
  1325                              <1> 
  1326                              <1> parse_path_name:
  1327                              <1> 	; 03/09/2024 (TRDOS 386 v2.0.9)
  1328                              <1> 	; 09/08/2022
  1329                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1330                              <1> 	; 10/02/2016
  1331                              <1> 	; 08/02/2016 (TRDOS 386 = TRDOS v2.0)
  1332                              <1> 	; 10/009/2011 ('proc_parse_pathname')
  1333                              <1> 	; 27/11/2009
  1334                              <1> 	; 05/12/2004
  1335                              <1> 	;
  1336                              <1> 	; INPUT ->
  1337                              <1> 	;	ESI = Beginning of ASCIIZ pathname string
  1338                              <1> 	;       EDI = Destination Address
  1339                              <1> 	;	      (which is TR-DOS FindFile data buffer)
  1340                              <1> 	; OUTPUT ->
  1341                              <1> 	;	CF = 1 -> Error
  1342                              <1> 	;	     EAX = Error Code (AL)
  1343                              <1> 	;
  1344                              <1> 	; (Modified registers: eax, ecx, esi, edi)
  1345                              <1> 	
  1346                              <1> 	; Clear the pathname bytes in TR-DOS Findfile data buffer
  1347 0000AC65 57                  <1> 	push	edi
  1348                              <1> 	;mov	ecx, 20  ; 80 bytes
  1349                              <1> 	; 29/07/2022
  1350 0000AC66 29C9                <1> 	sub	ecx, ecx
  1351 0000AC68 B114                <1> 	mov	cl, 20
  1352 0000AC6A 31C0                <1> 	xor	eax, eax
  1353 0000AC6C F3AB                <1> 	rep	stosd 
  1354 0000AC6E 5F                  <1> 	pop	edi
  1355                              <1> 
  1356 0000AC6F 668B06              <1> 	mov	ax, [esi]
  1357 0000AC72 80FC3A              <1> 	cmp	ah, ':'
  1358 0000AC75 741C                <1> 	je	short loc_ppn_change_drive
  1359 0000AC77 A0[B27D0100]        <1> 	mov	al, [Current_Drv]
  1360 0000AC7C EB33                <1> 	jmp	short pass_ppn_change_drive
  1361                              <1> 
  1362                              <1> pass_ppn_cdir:
  1363 0000AC7E 8B35[D2860100]      <1> 	mov	esi, [First_Path_Pos]
  1364 0000AC84 AC                  <1> 	lodsb
  1365                              <1> loc_ppn_get_filename:
  1366 0000AC85 83C741              <1> 	add	edi, 65 ; FindFile_Name location
  1367                              <1> 	; TRDOS Filename length must not be more than 12 bytes
  1368                              <1> 	;mov	ecx, 12
  1369 0000AC88 B10C                <1> 	mov	cl, 12
  1370                              <1> loc_ppn_get_fnchar_next:
  1371 0000AC8A AA                  <1> 	stosb
  1372 0000AC8B AC                  <1> 	lodsb
  1373 0000AC8C 3C21                <1> 	cmp	al, 21h
  1374 0000AC8E 726A                <1> 	jb	short loc_ppn_clc_return
  1375 0000AC90 E2F8                <1>         loop    loc_ppn_get_fnchar_next
  1376                              <1> loc_ppn_return:
  1377 0000AC92 C3                  <1> 	retn
  1378                              <1> 
  1379                              <1> loc_ppn_change_drive:
  1380                              <1> 	; 29/07/2022
  1381                              <1> 	; ecx = 0
  1382 0000AC93 24DF                <1> 	and	al, 0DFh
  1383 0000AC95 2C41                <1> 	sub	al, 'A' ; A:
  1384 0000AC97 7265                <1> 	jc	short loc_ppn_invalid_drive
  1385 0000AC99 3805[CE340100]      <1> 	cmp	[Last_DOS_DiskNo], al
  1386 0000AC9F 725D                <1> 	jb	short loc_ppn_invalid_drive
  1387                              <1> 
  1388 0000ACA1 46                  <1> 	inc	esi
  1389 0000ACA2 46                  <1> 	inc	esi
  1390 0000ACA3 8A26                <1> 	mov	ah, [esi]
  1391 0000ACA5 80FC21              <1> 	cmp	ah, 21h
  1392 0000ACA8 7307                <1> 	jnb	short pass_ppn_change_drive
  1393                              <1> 
  1394                              <1> loc_ppn_cmd_failed:
  1395                              <1> 	; File or directory name is not existing
  1396 0000ACAA 8807                <1> 	mov	[edi], al ; Drv 
  1397 0000ACAC 66B80100            <1> 	mov	ax, 1 ; eax = 1
  1398                              <1> 	; TR-DOS Error Code 01h = Bad Command Argument
  1399                              <1> 	; MS-DOS Error Code 01h : Invalid Function Number
  1400                              <1> 	;stc
  1401                              <1> 	; (MainProg ErrMsg: "Bad command or file name!")
  1402 0000ACB0 C3                  <1> 	retn
  1403                              <1> 
  1404                              <1> pass_ppn_change_drive:
  1405 0000ACB1 8935[D2860100]      <1> 	mov	[First_Path_Pos], esi
  1406                              <1> 	;mov	dword [Last_Slash_Pos], 0
  1407                              <1> 	; 29/07/2022
  1408 0000ACB7 890D[D6860100]      <1> 	mov	[Last_Slash_Pos], ecx ; 0
  1409 0000ACBD AA                  <1> 	stosb
  1410 0000ACBE 8A06                <1> 	mov	al, [esi]
  1411                              <1> loc_scan_ppn_dslash:
  1412 0000ACC0 3C2F                <1> 	cmp	al, '/'
  1413 0000ACC2 7506                <1>   	jne	short loc_scan_next_slash_pos
  1414 0000ACC4 8935[D6860100]      <1> 	mov	[Last_Slash_Pos], esi
  1415                              <1> loc_scan_next_slash_pos:
  1416 0000ACCA 46                  <1> 	inc	esi
  1417 0000ACCB 8A06                <1> 	mov	al, [esi]
  1418 0000ACCD 3C20                <1> 	cmp	al, 20h
  1419 0000ACCF 77EF                <1> 	ja	short loc_scan_ppn_dslash
  1420                              <1> 	;cmp	dword [Last_Slash_Pos], 0
  1421                              <1> 	; 09/08/2022
  1422                              <1> 	;cmp	[Last_Slash_Pos], ecx ; 0 ?
  1423                              <1> 	;jna	short pass_ppn_cdir
  1424                              <1> 
  1425 0000ACD1 8B0D[D6860100]      <1> 	mov	ecx, [Last_Slash_Pos]
  1426                              <1> 	; 03/09/2024
  1427 0000ACD7 67E3A4              <1> 	jcxz	pass_ppn_cdir
  1428 0000ACDA 8B35[D2860100]      <1> 	mov	esi, [First_Path_Pos]
  1429 0000ACE0 29F1                <1> 	sub	ecx, esi
  1430 0000ACE2 41                  <1> 	inc	ecx
  1431                              <1> 	;cmp	ecx, 64
  1432 0000ACE3 80F940              <1> 	cmp	cl, 64
  1433 0000ACE6 7715                <1> 	ja	short loc_ppn_invalid_drive_stc
  1434                              <1> 
  1435 0000ACE8 89F8                <1> 	mov	eax, edi ; Dest Dir String Location (65 bytes)
  1436 0000ACEA F3A4                <1> 	rep	movsb
  1437                              <1> 	;mov	[edi], cl ; 0, End of Dir String
  1438 0000ACEC 8B35[D6860100]      <1> 	mov	esi, [Last_Slash_Pos]
  1439 0000ACF2 46                  <1> 	inc	esi
  1440 0000ACF3 89C7                <1> 	mov	edi, eax
  1441 0000ACF5 AC                  <1> 	lodsb
  1442 0000ACF6 3C21                <1> 	cmp	al, 21h
  1443 0000ACF8 738B                <1> 	jnb	short loc_ppn_get_filename
  1444                              <1> loc_ppn_clc_return:
  1445                              <1> 	;clc
  1446 0000ACFA 31C0                <1> 	xor	eax, eax
  1447 0000ACFC C3                  <1> 	retn
  1448                              <1> 
  1449                              <1> loc_ppn_invalid_drive_stc:
  1450 0000ACFD F5                  <1> 	cmc	 ; stc
  1451                              <1> loc_ppn_invalid_drive:
  1452                              <1> 	; cf = 1
  1453                              <1> 	; The Drive Letter/Char < "A" or > "Z"
  1454 0000ACFE 66B80F00            <1> 	mov	ax, 0Fh
  1455                              <1> 	; MS-DOS Error Code 0Fh = Disk Drive Invalid 
  1456                              <1> 	; (MainProg ErrMsg: "Drive not ready or read error!")
  1457 0000AD02 C3                  <1> 	retn
  1458                              <1> 
  1459                              <1> find_longname:
  1460                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1461                              <1> 	; 13/02/2016 (TRDOS 386 = TRDOS v2.0)
  1462                              <1> 	; 24/01/2010 (DIR.ASM, 'proc_find_longname')
  1463                              <1> 	; 17/10/2009
  1464                              <1> 	
  1465                              <1> 	; INPUT -> 
  1466                              <1> 	;	ESI = DOS short file name address
  1467                              <1> 	; 	for example: "filename.ext"
  1468                              <1> 	;
  1469                              <1> 	; OUTPUT ->
  1470                              <1> 	; 	ESI = ASCIIZ longname address (cf = 0)
  1471                              <1> 	;	cf = 1 -> error number returns in EAX (AL)
  1472                              <1> 	;	AL = 0 & CF=1 -> longname not found
  1473                              <1> 	;	     the file/directory has no longname
  1474                              <1> 	; 	cf = 0 -> AL = FAT Type 
  1475                              <1>  
  1476                              <1> 	; 17/10/2009
  1477                              <1> 	; ASCIIZ string will be returned
  1478                              <1> 	; as LongFileName
  1479                              <1> 	; clearing/reset is not needed
  1480                              <1> 	;mov	ecx, 33
  1481                              <1> 	;mov	edi, LongFileName
  1482                              <1> 	;sub	ax, ax ; 0
  1483                              <1> 	;rep	stosw
  1484                              <1> 
  1485                              <1> 	;mov	byte [LongNameFound], 0
  1486                              <1> 
  1487                              <1> 	; ESI = ASCIIZ file/directory name address
  1488                              <1> 	;   AL = Attributes AND mask 
  1489                              <1> 	;	(Result of AND must be equal to AL)
  1490                              <1> 	;   AH = Negative attributes mask
  1491                              <1> 	;	(Result of AND must be ZERO)
  1492 0000AD03 66B80008            <1> 	mov	ax, 0800h 
  1493                              <1> 		; it must not be volume name or longname
  1494 0000AD07 E85EDEFFFF          <1> 	call	find_first_file
  1495 0000AD0C 7212                <1> 	jc	short loc_fln_retn
  1496                              <1> 
  1497                              <1> loc_fln_check_FAT_Type:
  1498 0000AD0E 803D[B17D0100]01    <1> 	cmp	byte [Current_FATType], 1
  1499 0000AD15 7302                <1> 	jnb	short loc_fln_check_longname_yes_sign
  1500                              <1> 
  1501                              <1> 	;call	get_fs_longname
  1502                              <1> 	;retn
  1503                              <1> 	; 29/07/2022
  1504 0000AD17 EB37                <1> 	jmp	get_fs_longname
  1505                              <1> 
  1506                              <1> loc_fln_check_longname_yes_sign:
  1507 0000AD19 08FF                <1> 	or	bh, bh
  1508 0000AD1B 7504                <1> 	jnz	short loc_fln_check_longnamefound_number
  1509                              <1> loc_fln_longname_not_found_retn:
  1510 0000AD1D 31C0                <1> 	xor	eax, eax 
  1511                              <1> 	; cf = 1 & al = 0 -> longname not found
  1512 0000AD1F F9                  <1> 	stc
  1513                              <1> loc_fln_retn:
  1514 0000AD20 C3                  <1> 	retn
  1515                              <1> 
  1516                              <1> loc_fln_check_longnamefound_number:
  1517                              <1> 	; 'LongNameFound' is set by
  1518                              <1>         ; by 'save_longname_sub_component'
  1519                              <1> 	; which is called from
  1520                              <1> 	; 'find_directory_entry'
  1521                              <1> 	; which is called from
  1522                              <1> 	; 'find_first_file'
  1523                              <1> 	; It must 1 if the longname is valid
  1524 0000AD21 803D[AD850100]01    <1>         cmp     byte [LongNameFound], 1
  1525 0000AD28 75F3                <1> 	jne	short loc_fln_longname_not_found_retn
  1526                              <1> 
  1527                              <1> loc_fln_calculate_checksum: 
  1528 0000AD2A E813000000          <1> 	call	calculate_checksum
  1529                              <1> 	; AL = shortname checksum
  1530                              <1> 
  1531                              <1> loc_fln_longname_validation:
  1532                              <1> 	; 'LFN_CheckSum' has been set already
  1533                              <1> 	; by 'save_longname_sub_component'
  1534                              <1> 	; which is called from
  1535                              <1> 	; 'find_directory_entry'
  1536                              <1> 	; which is called from
  1537                              <1> 	; 'find_first_file'
  1538 0000AD2F 3805[AF850100]      <1> 	cmp	[LFN_CheckSum], al
  1539 0000AD35 75E6                <1> 	jne	short loc_fln_longname_not_found_retn
  1540                              <1> 
  1541 0000AD37 BE[B0850100]        <1> 	mov	esi, LongFileName
  1542 0000AD3C A0[B17D0100]        <1> 	mov	al, [Current_FATType]
  1543 0000AD41 C3                  <1> 	retn
  1544                              <1> 
  1545                              <1> calculate_checksum:
  1546                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1547                              <1> 	; 13/02/2016 (TRDOS 386 = TRDOS v2.0)
  1548                              <1> 	; 17/10/2009 (DIR.ASM, 'proc_calculate_checksum')
  1549                              <1>         ;
  1550                              <1> 	; INPUT ->
  1551                              <1> 	;	ESI = 11 byte DOS File Name location
  1552                              <1> 	;	(in DOS Directory Entry Format)
  1553                              <1> 	; OUTPUT ->
  1554                              <1> 	;	 AL = 8 bit checksum (CRC) value
  1555                              <1> 	;
  1556                              <1> 	; (Modified registers: EAX, ECX, ESI)
  1557                              <1> 
  1558                              <1> 	; Erdogan Tan [ 17-10-2009 ]
  1559                              <1> 	;  'ror al, 1' instruction
  1560                              <1> 
  1561                              <1> 	; Erdogan Tan [ 20-06-2004 ]
  1562                              <1> 	; This 8086 assembly code is an original code
  1563                              <1> 	; which is adapted from C code in
  1564                              <1> 	; Microsoft FAT32 File System Specification
  1565                              <1> 	; Version 1.03, December 6, 2000
  1566                              <1> 	; Page 28
  1567                              <1> 
  1568 0000AD42 30C0                <1> 	xor	al, al
  1569                              <1> 	;mov	ecx, 11
  1570                              <1> 	; 29/07/2022
  1571 0000AD44 29C9                <1> 	sub	ecx, ecx
  1572 0000AD46 B10B                <1> 	mov	cl, 11
  1573                              <1> loc_next_sum:
  1574                              <1> 	;xor	ah, ah
  1575                              <1> 	;test	al, 1
  1576                              <1> 	;jz	short pass_ah_80h
  1577                              <1> 	;mov	ah, 80h
  1578                              <1> ;pass_ah_80h:
  1579                              <1> 	;shr	al, 1
  1580 0000AD48 D0C8                <1> 	ror	al, 1 ; 17/10/2009
  1581 0000AD4A 0206                <1> 	add	al, [esi]
  1582 0000AD4C 46                  <1> 	inc	esi
  1583                              <1> 	;add	al, ah
  1584 0000AD4D E2F9                <1> 	loop	loc_next_sum
  1585 0000AD4F C3                  <1> 	retn
  1586                              <1> 
  1587                              <1> get_fs_longname:
  1588                              <1> 	; temporary (13/02/2016)
  1589 0000AD50 31C0                <1> 	xor	eax, eax
  1590 0000AD52 F9                  <1> 	stc
  1591 0000AD53 C3                  <1> 	retn
  1592                              <1> 
  1593                              <1> make_sub_directory:
  1594                              <1> 	; 07/08/2022
  1595                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1596                              <1> 	; 16/10/2016
  1597                              <1> 	; 02/03/2016, 03/03/2016
  1598                              <1> 	; 26/02/2016, 27/02/2016
  1599                              <1> 	; 21/02/2016 (TRDOS 386 = TRDOS v2.0)
  1600                              <1> 	; 01/08/2011 (DIR.ASM, 'proc_make_directory')
  1601                              <1> 	; 10/07/2010
  1602                              <1> 	; INPUT ->
  1603                              <1> 	; 	ESI = ASCIIZ Directory Name
  1604                              <1> 	;	CL = Directory Attributes
  1605                              <1> 	; OUTPUT ->
  1606                              <1> 	;	EAX = New sub dir's first cluster
  1607                              <1> 	;	ESI = Logical Dos Drv Descr. Table Addr.
  1608                              <1> 	;	CF = 1 -> error code in AL (EAX)
  1609                              <1> 
  1610                              <1> 	;test	cl, 10h  ; directory
  1611                              <1> 	;jz	short loc_make_directory_access_denied
  1612                              <1> 	;test	cl, 08h ; volume name
  1613                              <1> 	;jnz	short loc_make_directory_access_denied
  1614                              <1> 
  1615 0000AD54 80E107              <1> 	and	cl, 07h
  1616 0000AD57 880D[30870100]      <1> 	mov	byte [mkdir_attrib], cl
  1617                              <1> 
  1618 0000AD5D 56                  <1> 	push	esi
  1619 0000AD5E 31DB                <1> 	xor	ebx, ebx
  1620 0000AD60 8A3D[B27D0100]      <1> 	mov	bh, [Current_Drv]
  1621 0000AD66 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1622 0000AD6B 01DE                <1> 	add	esi, ebx
  1623 0000AD6D 5B                  <1> 	pop	ebx
  1624                              <1> 
  1625                              <1> 	; 10/07/2010 -> 1st writable disk check for trdos
  1626                              <1> 	; LD_DiskType = 0 for write protection (read only)
  1627 0000AD6E 807E0101            <1> 	cmp	byte [esi+LD_DiskType], 1 ; 0 = Invalid
  1628 0000AD72 7308                <1> 	jnb	short loc_mkdir_check_file_sytem
  1629                              <1> 	; 16/10/2016 (13h -> 30)
  1630                              <1> 	;mov	eax, 30 ; 'Disk write-protected' error
  1631                              <1> 	;mov	edx, 0
  1632                              <1> 	; 29/07/2022
  1633 0000AD74 29C0                <1> 	sub	eax, eax
  1634 0000AD76 B01E                <1> 	mov	al, 30
  1635 0000AD78 29D2                <1> 	sub	edx, edx ; 0
  1636 0000AD7A F9                  <1> 	stc
  1637                              <1> 	; err retn: EDX = 0, EBX = Dir name offset
  1638                              <1> 	;ESI = Logical DOS drive description table address
  1639 0000AD7B C3                  <1> 	retn
  1640                              <1> 
  1641                              <1> ;loc_make_directory_access_denied:
  1642                              <1> 	;mov	ax, 05h ; access denied (invalid attributes input)
  1643                              <1> 	;stc
  1644                              <1> 	;retn
  1645                              <1> 
  1646                              <1> loc_mkdir_check_file_sytem:
  1647 0000AD7C 807E0301            <1> 	cmp	byte [esi+LD_FATType], 1
  1648 0000AD80 730A                <1> 	jnb	short loc_mkdir_check_free_sectors
  1649                              <1> 
  1650                              <1> loc_make_fs_directory:
  1651 0000AD82 A1[AC7D0100]        <1> 	mov	eax, [Current_Dir_FCluster]
  1652                              <1> 
  1653                              <1> 	; EAX = Parent directory DDT Address
  1654                              <1> 	; ESI = Logical DOS Drive DT Address
  1655                              <1> 	; EBX = Directory name offset (as ASCIIZ name)
  1656                              <1> 
  1657                              <1> 	;call	make_fs_directory
  1658                              <1> 	;retn
  1659                              <1> 	; 29/07/2022
  1660 0000AD87 E9DF150000          <1> 	jmp	make_fs_directory
  1661                              <1> 
  1662                              <1> loc_mkdir_check_free_sectors:
  1663 0000AD8C 0FB64613            <1>         movzx   eax, byte [esi+LD_BPB+SecPerClust]
  1664 0000AD90 8B4E74              <1> 	mov	ecx, [esi+LD_FreeSectors]
  1665 0000AD93 39C1                <1> 	cmp	ecx, eax
  1666 0000AD95 7254                <1> 	jb	short loc_mkdir_insufficient_disk_space
  1667                              <1> 
  1668                              <1> loc_make_fat_directory:
  1669 0000AD97 891D[20870100]      <1> 	mov	[mkdir_DirName_Offset], ebx
  1670 0000AD9D 890D[2C870100]      <1> 	mov	[mkdir_FreeSectors], ecx
  1671                              <1> 
  1672                              <1> 	;mov	al, [esi+LD_BPB+SecPerClust]
  1673 0000ADA3 A2[32870100]        <1> 	mov	byte [mkdir_SecPerClust], al
  1674                              <1> 
  1675                              <1> loc_mkdir_gffc_1:
  1676 0000ADA8 E8E1170000          <1> 	call	get_first_free_cluster
  1677 0000ADAD 722A                <1> 	jc	short loc_mkdir_gffc_retn
  1678                              <1> 
  1679                              <1> ;loc_mkdir_gffc_1_cont: 
  1680                              <1> 	;cmp	eax, 2
  1681                              <1> 	;jb	short loc_mkdir_gffc_insufficient_disk_space
  1682                              <1> 
  1683                              <1> ;loc_mkdir_gffc_1_save_fcluster:  
  1684 0000ADAF A3[24870100]        <1> 	mov	[mkdir_FFCluster], eax
  1685                              <1> 
  1686                              <1> loc_mkdir_locate_ffe:
  1687                              <1> 	; Current directory fcluster <> Directory buffer cluster
  1688                              <1> 	; Current directory will be reloaded by
  1689                              <1> 	; 'locate_current_dir_file' procedure
  1690                              <1> 	;
  1691                              <1> 	; ESI = Logical DOS Drive Description Table Address
  1692                              <1> 	;push	esi ; 27/02/2016
  1693 0000ADB4 31C0                <1> 	xor	eax, eax
  1694 0000ADB6 89C1                <1>         mov	ecx, eax
  1695 0000ADB8 6649                <1> 	dec	cx ; FFFFh  
  1696                              <1> 	; CX = FFFFh -> find first deleted or free entry
  1697                              <1> 	; ESI would be ASCIIZ filename address if the call
  1698                              <1> 	; would not be for first free or deleted dir entry
  1699 0000ADBA E80FFBFFFF          <1> 	call	locate_current_dir_file
  1700 0000ADBF 734A                <1> 	jnc	short loc_mkdir_set_ff_dir_entry_1
  1701                              <1> 	;pop	esi
  1702                              <1> 	; ESI = Logical DOS Drive Description Table Address
  1703 0000ADC1 83F802              <1> 	cmp	eax, 2  ; cmp al, 2 ; File/Dir not found !
  1704 0000ADC4 7529                <1> 	jne	short loc_mkdir_stc_return
  1705                              <1> 
  1706                              <1> loc_mkdir_add_new_cluster:
  1707 0000ADC6 3805[B17D0100]      <1> 	cmp	byte [Current_FATType], al ; 2
  1708                              <1> 	;cmp	byte ptr [esi+LD_FATType], 2
  1709 0000ADCC 770C                <1> 	ja	short loc_mkdir_add_new_cluster_check_fsc
  1710 0000ADCE 803D[B07D0100]01    <1> 	cmp	byte [Current_Dir_Level], 1
  1711                              <1> 	;cmp	byte [esi+LD_CDirLevel], 1
  1712 0000ADD5 7303                <1> 	jnb	short loc_mkdir_add_new_cluster_check_fsc
  1713                              <1> 
  1714 0000ADD7 B00C                <1> 	mov	al, 12 ; No more files 
  1715                              <1> loc_mkdir_gffc_retn:
  1716 0000ADD9 C3                  <1> 	retn
  1717                              <1> 
  1718                              <1> loc_mkdir_add_new_cluster_check_fsc:
  1719 0000ADDA 8B0D[2C870100]      <1> 	mov	ecx, [mkdir_FreeSectors]
  1720                              <1> 	;movzx	eax, byte [mkdir_SecPerClust]
  1721 0000ADE0 A0[32870100]        <1> 	mov	al, [mkdir_SecPerClust]
  1722                              <1> 	;shl	ax, 1 ; AX = 2 * AX
  1723                              <1> 	; 29/07/2022
  1724 0000ADE5 D1E0                <1> 	shl	eax, 1
  1725 0000ADE7 39C1                <1> 	cmp	ecx, eax
  1726 0000ADE9 7350                <1> 	jnb	short loc_mkdir_add_new_subdir_cluster
  1727                              <1> 
  1728                              <1> loc_mkdir_insufficient_disk_space:
  1729                              <1> 	;mov	edx, ecx
  1730                              <1> ;loc_mkdir_gffc_insufficient_disk_space:
  1731                              <1> 	; 29/07/2022
  1732                              <1> 	;mov	ax, 27h ; MSDOS err => insufficient disk space
  1733                              <1> 
  1734                              <1> 	; err retn: EDX = Free sectors, EBX = Dir name offset
  1735                              <1>         ; ESI -> Dos drive description table address
  1736                              <1> 	;; ecx = edx
  1737                              <1> 
  1738                              <1> 	;retn
  1739                              <1> 
  1740                              <1> 	; 29/07/2022
  1741 0000ADEB 30E4                <1> 	xor	ah, ah
  1742 0000ADED B027                <1> 	mov	al, 27h
  1743                              <1> 
  1744                              <1> loc_mkdir_stc_return:
  1745 0000ADEF F9                  <1> 	stc
  1746 0000ADF0 C3                  <1> 	retn
  1747                              <1> 
  1748                              <1> loc_mkdir_gffc_2:
  1749 0000ADF1 E898170000          <1> 	call	get_first_free_cluster
  1750 0000ADF6 72E1                <1> 	jc	short loc_mkdir_gffc_retn
  1751                              <1> 
  1752                              <1> ;loc_mkdir_gffc_1_cont:
  1753                              <1> 	;cmp	eax, 2
  1754                              <1> 	;jb	short loc_mkdir_gffc_insufficient_disk_space
  1755                              <1> 
  1756                              <1> ;loc_mkdir_gffc_2_save_fcluster:
  1757 0000ADF8 A3[24870100]        <1> 	mov	[mkdir_FFCluster], eax
  1758                              <1> 
  1759 0000ADFD A1[28870100]        <1> 	mov	eax, [mkdir_LastDirCluster]
  1760                              <1> 
  1761 0000AE02 E821170000          <1> 	call	load_FAT_sub_directory
  1762 0000AE07 72D0                <1> 	jc	short loc_mkdir_gffc_retn
  1763                              <1> 
  1764 0000AE09 31FF                <1> 	xor	edi, edi
  1765                              <1> loc_mkdir_set_ff_dir_entry_1:
  1766                              <1> 	; 27/02/2016
  1767 0000AE0B 56                  <1> 	push	esi ; Logical DOS Drv Desc. Tbl. address
  1768                              <1> 	; EDI = Directory Entry Address
  1769 0000AE0C 8B35[20870100]      <1> 	mov	esi, [mkdir_DirName_Offset]
  1770 0000AE12 A1[24870100]        <1> 	mov	eax, [mkdir_FFCluster]
  1771                              <1> 
  1772 0000AE17 66B91000            <1> 	mov	cx, 10h	; CL = Directory attribute
  1773                              <1> 			; CH = 0 -> File size is 0
  1774 0000AE1B 0A0D[30870100]      <1> 	or	cl, [mkdir_attrib] ; S, H, R
  1775 0000AE21 E8A3010000          <1> 	call	make_directory_entry
  1776                              <1> 
  1777 0000AE26 5E                  <1> 	pop	esi
  1778                              <1> 
  1779 0000AE27 C605[D9840100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  1780 0000AE2E E869020000          <1> 	call	save_directory_buffer
  1781                              <1>         ;jnc	loc_mkdir_set_ff_dir_entry_2
  1782                              <1> 	; 29/07/2022
  1783 0000AE33 7205                <1> 	jc	short loc_mkdir_return
  1784 0000AE35 E9CA000000          <1> 	jmp	loc_mkdir_set_ff_dir_entry_2
  1785                              <1> 
  1786                              <1> loc_mkdir_return:
  1787 0000AE3A C3                  <1> 	retn
  1788                              <1> 
  1789                              <1> loc_mkdir_add_new_subdir_cluster:
  1790 0000AE3B 8B15[DE840100]      <1> 	mov	edx, [DirBuff_Cluster]
  1791 0000AE41 8915[28870100]      <1> 	mov	[mkdir_LastDirCluster], edx
  1792                              <1> 
  1793 0000AE47 A1[24870100]        <1> 	mov	eax, [mkdir_FFCluster]
  1794 0000AE4C E8D7160000          <1> 	call	load_FAT_sub_directory
  1795 0000AE51 72E7                <1> 	jc	short loc_mkdir_return
  1796                              <1> 	; eax = 0
  1797                              <1> 	; ecx = directory buffer sector count (<= 128)
  1798                              <1> 
  1799                              <1> pass_mkdir_add_new_subdir_cluster:
  1800                              <1> 
  1801                              <1> ; 29/07/2022
  1802                              <1> ;	;sub	edi, edi ; 0
  1803                              <1> ;	; 29/07/2022 - BUGFIX !
  1804                              <1> ;	mov	edi, Directory_Buffer
  1805                              <1> ;
  1806                              <1> ;	;mov	al, 128 ; double word
  1807                              <1> ;	;mul	ecx ; ecx =  directory buffer sector count
  1808                              <1> ;	;mov	ecx, eax
  1809                              <1> ;	;shl	cx, 7 ; 128 * sector count
  1810                              <1> ;	mov	ax, [esi+LD_BPB+BytesPerSec] ; 512
  1811                              <1> ;	;shr	ax, 2 ; 'byte count / 4' for 'stosd'
  1812                              <1> ;	; 29/07/2022
  1813                              <1> ;	shr	eax, 2
  1814                              <1> ;	;mul	cx ; max = 128*(512/4) -> 16384 (stosd)
  1815                              <1> ;	;mov	cx, ax
  1816                              <1> ;	;sub	ax, ax ; 0
  1817                              <1> ;	; 29/07/2022
  1818                              <1> ;	mul	ecx
  1819                              <1> ;	mov	ecx, eax
  1820                              <1> ;	sub	eax, eax
  1821                              <1> ;	rep	stosd ; clear directory buffer
  1822                              <1> 
  1823                              <1> 	; 29/07/2022
  1824 0000AE53 E85C010000          <1> 	call	clear_directory_buffer
  1825                              <1> 
  1826 0000AE58 C605[D9840100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  1827 0000AE5F E838020000          <1> 	call	save_directory_buffer 
  1828 0000AE64 72D4                <1> 	jc	short loc_mkdir_return
  1829                              <1> 
  1830                              <1> loc_mkdir_save_added_cluster:
  1831 0000AE66 A1[28870100]        <1> 	mov	eax, [mkdir_LastDirCluster]
  1832 0000AE6B 8B0D[24870100]      <1> 	mov	ecx, [mkdir_FFCluster]
  1833                              <1> 	; 01/03/2016
  1834 0000AE71 31D2                <1> 	xor	edx, edx
  1835 0000AE73 8915[CE840100]      <1> 	mov	[FAT_ClusterCounter], edx ; 0 ; reset
  1836 0000AE79 E8DD170000          <1> 	call	update_cluster
  1837 0000AE7E 7304                <1> 	jnc	short loc_mkdir_save_fat_buffer_0
  1838 0000AE80 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  1839 0000AE82 7518                <1> 	jnz	short loc_mkdir_save_fat_buffer_stc_retn
  1840                              <1> 
  1841                              <1> loc_mkdir_save_fat_buffer_0:
  1842 0000AE84 A1[24870100]        <1> 	mov	eax, [mkdir_FFCluster]
  1843 0000AE89 A3[28870100]        <1> 	mov	[mkdir_LastDirCluster], eax
  1844                              <1> 
  1845 0000AE8E 31C9                <1> 	xor	ecx, ecx
  1846 0000AE90 49                  <1> 	dec	ecx ; FFFFFFFFh
  1847                              <1> 	; ESI = Logical DOS Drive Description Table address
  1848 0000AE91 E8C5170000          <1> 	call	update_cluster
  1849 0000AE96 731A                <1> 	jnc	short loc_mkdir_save_fat_buffer_1
  1850 0000AE98 09C0                <1> 	or	eax, eax
  1851 0000AE9A 7416                <1> 	jz	short loc_mkdir_save_fat_buffer_1
  1852                              <1> 
  1853                              <1> loc_mkdir_save_fat_buffer_stc_retn:
  1854                              <1> 	; 01/03/2016
  1855 0000AE9C 803D[CE840100]01    <1> 	cmp	byte [FAT_ClusterCounter], 1
  1856 0000AEA3 720C                <1> 	jb	short loc_mkdir_save_fat_buffer_retn
  1857                              <1> 
  1858 0000AEA5 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate free space (BL = 0)
  1859                              <1> 			   ; (BH = FFh -> Use ESI as Drv Param. Tbl.)
  1860 0000AEA9 50                  <1> 	push	eax
  1861 0000AEAA E8B11A0000          <1> 	call	calculate_fat_freespace
  1862 0000AEAF 58                  <1> 	pop	eax
  1863 0000AEB0 F9                  <1> 	stc
  1864                              <1> loc_mkdir_save_fat_buffer_retn:
  1865 0000AEB1 C3                  <1> 	retn
  1866                              <1> 
  1867                              <1> loc_mkdir_save_fat_buffer_1:
  1868                              <1> 	; byte [FAT_BuffValidData] = 2
  1869 0000AEB2 E8181A0000          <1> 	call	save_fat_buffer
  1870 0000AEB7 72E3                <1> 	jc	short loc_mkdir_save_fat_buffer_stc_retn
  1871                              <1> 
  1872                              <1> 	; 01/03/2016
  1873 0000AEB9 803D[CE840100]01    <1> 	cmp	byte [FAT_ClusterCounter], 1
  1874 0000AEC0 721B                <1> 	jb	short loc_mkdir_save_fat_buffer_2
  1875                              <1> 
  1876                              <1> 	; ESI = Logical DOS Drive Description Table address
  1877 0000AEC2 A1[CE840100]        <1> 	mov	eax, [FAT_ClusterCounter]
  1878 0000AEC7 66BB01FF            <1> 	mov	bx, 0FF01h ; add free clusters
  1879 0000AECB E8901A0000          <1> 	call	calculate_fat_freespace
  1880                              <1> 
  1881                              <1> 	;inc	eax ; 0FFFFFFFFh -> 0 ; recalculation is needed!
  1882                              <1> 	;jnz	short loc_mkdir_save_fat_buffer_2
  1883                              <1> 
  1884                              <1> 	; ecx > 0 -> Recalculation is needed
  1885 0000AED0 09C9                <1> 	or	ecx, ecx 
  1886 0000AED2 7409                <1> 	jz	short loc_mkdir_save_fat_buffer_2
  1887                              <1> 
  1888 0000AED4 66BB00FF            <1> 	mov	bx, 0FF00h ; ; recalculate free space
  1889 0000AED8 E8831A0000          <1> 	call	calculate_fat_freespace
  1890                              <1> 
  1891                              <1> loc_mkdir_save_fat_buffer_2:
  1892 0000AEDD C605[33870100]01    <1> 	mov	byte [mkdir_add_new_cluster], 1
  1893 0000AEE4 E9B0000000          <1> 	jmp	loc_mkdir_upd_parent_dir_lmdt
  1894                              <1> 
  1895                              <1> loc_mkdir_update_sub_dir_cluster:
  1896 0000AEE9 A1[24870100]        <1> 	mov	eax, [mkdir_FFCluster]
  1897 0000AEEE 29C9                <1> 	sub	ecx, ecx ; 0
  1898                              <1> 	; 01/03/2016
  1899 0000AEF0 890D[CE840100]      <1> 	mov	[FAT_ClusterCounter], ecx ; 0 ; Reset
  1900 0000AEF6 49                  <1> 	dec	ecx ; 0FFFFFFFFh
  1901                              <1> 
  1902                              <1> 	; ESI = Logical DOS Drive Descisption Table address
  1903 0000AEF7 E85F170000          <1> 	call	update_cluster
  1904 0000AEFC 7364                <1> 	jnc	short loc_mkdir_save_fat_buffer_3
  1905 0000AEFE 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  1906 0000AF00 7460                <1> 	jz	short loc_mkdir_save_fat_buffer_3
  1907                              <1> 	; 01/03/2016
  1908 0000AF02 EB98                <1> 	jmp	short loc_mkdir_save_fat_buffer_stc_retn
  1909                              <1> 
  1910                              <1> loc_mkdir_set_ff_dir_entry_2:
  1911                              <1> 	; ESI = Logical DOS Drive Description Table address
  1912 0000AF04 A1[24870100]        <1> 	mov	eax, [mkdir_FFCluster]
  1913                              <1> 	; Load disk sectors as a directory cluster
  1914 0000AF09 E81A160000          <1> 	call	load_FAT_sub_directory
  1915 0000AF0E 7251                <1> 	jc	short retn_make_fat_directory
  1916                              <1> 
  1917                              <1> 	; eax = 0
  1918                              <1> 	; ecx = directory buffer sector count (<= 128)
  1919                              <1> 
  1920                              <1> ; 29/07/2022
  1921                              <1> ;	mov	edi, Directory_Buffer + 64 ; 26/02/2016
  1922                              <1> ;
  1923                              <1> ;	; 02/03/2016
  1924                              <1> ;	mov	ax, [esi+LD_BPB+BytesPerSec] ; 512
  1925                              <1> ;	;shr	ax, 2 ; 'byte count / 4' for 'stosd'
  1926                              <1> ;	; 29/07/2022
  1927                              <1> ;	shr	eax, 2
  1928                              <1> ;	mul 	ecx
  1929                              <1> ;	mov	ecx, eax
  1930                              <1> ;	;
  1931                              <1> ;	; 29/07/2022 - BUGFIX !
  1932                              <1> ;	sub	ecx, 16 ; - 64 bytes
  1933                              <1> ;			; (space for '.' & '..' entries)
  1934                              <1> ;	;sub	ax, ax
  1935                              <1> ;	sub	eax, eax
  1936                              <1> ;	rep	stosd
  1937                              <1> ;
  1938                              <1> ;	;;mov	al, 128 ; double word (count in sector)
  1939                              <1> ;	;;mul	ecx ; ecx = directory buffer sector count
  1940                              <1> ;	;;mov	ecx, eax
  1941                              <1> ;	;shl	cx, 7 ; 128 * sector count
  1942                              <1> ;	;sub	ecx, 64 ; 29/07/2022
  1943                              <1> ;	;;sub	eax, eax
  1944                              <1> ;	;;sub	al, al ; 0
  1945                              <1> ;	;rep	stosd ; clear directory buffer
  1946                              <1> 
  1947                              <1> 	; 29/07/2022
  1948 0000AF10 E89F000000          <1> 	call	clear_directory_buffer
  1949                              <1> 
  1950 0000AF15 BF00000800          <1> 	mov	edi, Directory_Buffer ; 26/02/2016
  1951                              <1> 
  1952 0000AF1A 56                  <1> 	push	esi
  1953                              <1> 
  1954 0000AF1B BE[34870100]        <1> 	mov	esi, mkdir_Name
  1955 0000AF20 66C7062E00          <1> 	mov	word [esi], 2Eh ; db '.', '0'
  1956                              <1> 
  1957 0000AF25 A1[24870100]        <1> 	mov	eax, [mkdir_FFCluster]
  1958                              <1> 	;mov	cx, 10h ; CL = Directory attribute
  1959                              <1> 			; CH = 0 -> File size is 0
  1960                              <1> 	; 29/07/2022
  1961 0000AF2A B110                <1> 	mov	cl, 10h
  1962 0000AF2C E898000000          <1> 	call	make_directory_entry
  1963                              <1> 
  1964 0000AF31 BF20000800          <1> 	mov	edi, Directory_Buffer + 32 ; 26/02/2016
  1965                              <1> 
  1966                              <1> 	; 03/03/2016
  1967                              <1> 	; Following modification has been done according to
  1968                              <1> 	; 'Microsoft Extensible Firmware Initiative
  1969                              <1> 	; FAT32 File System Specification' document,
  1970                              <1> 	; 'FAT: General Overview of On-Disk FormatPage 25'.
  1971                              <1> 	; "Finally, you set DIR_FstClusLO and DIR_FstClusHI
  1972                              <1> 	; for the dotdot entry (the second entry) to the
  1973                              <1> 	; first cluster number of the directory in which you
  1974                              <1> 	; just created the directory (value is 0 if this directory
  1975                              <1> 	; is the root directory even for FAT32 volumes)."
  1976                              <1> 	; (Correctness of this modification has been verified
  1977                              <1> 	;  by using Windows 98 'scandisk.exe'.)
  1978                              <1> 
  1979 0000AF36 29C0                <1> 	sub	eax, eax
  1980 0000AF38 3805[B07D0100]      <1> 	cmp	byte [Current_Dir_Level], al ; 0
  1981 0000AF3E 7605                <1> 	jna	short loc_mkdir_set_ff_dir_entry_3
  1982 0000AF40 A1[AC7D0100]        <1> 	mov	eax, [Current_Dir_FCluster] ; parent dir
  1983                              <1> loc_mkdir_set_ff_dir_entry_3:
  1984 0000AF45 66C746012E00        <1> 	mov	word [esi+1], 2Eh ; db '.', '0'
  1985                              <1> 
  1986                              <1> 	;mov	cx, 10h
  1987 0000AF4B E879000000          <1> 	call	make_directory_entry
  1988                              <1> 
  1989 0000AF50 5E                  <1> 	pop	esi
  1990                              <1> 
  1991 0000AF51 C605[D9840100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  1992 0000AF58 E83F010000          <1> 	call	save_directory_buffer
  1993                              <1> 	;jnc	loc_mkdir_update_sub_dir_cluster
  1994                              <1> 	; 29/07/2022
  1995 0000AF5D 7202                <1> 	jc	short retn_make_fat_directory
  1996 0000AF5F EB88                <1> 	jmp	loc_mkdir_update_sub_dir_cluster
  1997                              <1> 
  1998                              <1> retn_make_fat_directory:
  1999 0000AF61 C3                  <1> 	retn
  2000                              <1> 
  2001                              <1> loc_mkdir_save_fat_buffer_3:
  2002                              <1> 	; 01/03/2016
  2003                              <1> 	; byte [FAT_BuffValidData] = 2
  2004 0000AF62 E868190000          <1> 	call	save_fat_buffer
  2005                              <1> 	;jc	short loc_mkdir_save_fat_buffer_stc_retn
  2006                              <1> 	; 07/08/2022
  2007 0000AF67 7305                <1> 	jnc	short loc_mkdir_save_fat_buffer_4
  2008 0000AF69 E92EFFFFFF          <1> 	jmp	loc_mkdir_save_fat_buffer_stc_retn
  2009                              <1> 
  2010                              <1> loc_mkdir_save_fat_buffer_4:
  2011 0000AF6E 803D[CE840100]01    <1> 	cmp	byte [FAT_ClusterCounter], 1
  2012 0000AF75 721B                <1> 	jb	short loc_mkdir_save_fat_buffer_5
  2013                              <1> 
  2014                              <1> 	; ESI = Logical DOS Drive Description Table address
  2015 0000AF77 A1[CE840100]        <1> 	mov	eax, [FAT_ClusterCounter]
  2016 0000AF7C 66BB01FF            <1> 	mov	bx, 0FF01h ; add free clusters
  2017 0000AF80 E8DB190000          <1> 	call	calculate_fat_freespace
  2018                              <1> 
  2019                              <1> 	;inc	eax ; 0FFFFFFFFh -> 0 ; recalculation is needed!
  2020                              <1>         ;jnz    short loc_mkdir_save_fat_buffer_5
  2021                              <1> 
  2022                              <1> 	; ecx > 0 -> Recalculation is needed
  2023 0000AF85 09C9                <1> 	or	ecx, ecx
  2024 0000AF87 7409                <1>         jz      short loc_mkdir_save_fat_buffer_5
  2025                              <1> 
  2026 0000AF89 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate free space
  2027 0000AF8D E8CE190000          <1> 	call	calculate_fat_freespace
  2028                              <1> 
  2029                              <1> loc_mkdir_save_fat_buffer_5:
  2030 0000AF92 C605[33870100]00    <1> 	mov	byte [mkdir_add_new_cluster], 0
  2031                              <1> 
  2032                              <1> loc_mkdir_upd_parent_dir_lmdt:
  2033 0000AF99 E896010000          <1> 	call	update_parent_dir_lmdt
  2034                              <1> 
  2035                              <1> 	; 01/03/2016
  2036 0000AF9E 803D[33870100]00    <1> 	cmp	byte [mkdir_add_new_cluster], 0
  2037                              <1> 	;ja	loc_mkdir_gffc_2
  2038                              <1> 	; 29/07/2022
  2039 0000AFA5 7605                <1> 	jna	short loc_mkdir_retn_new_dir_cluster
  2040 0000AFA7 E945FEFFFF          <1> 	jmp	loc_mkdir_gffc_2
  2041                              <1> 
  2042                              <1> loc_mkdir_retn_new_dir_cluster:
  2043 0000AFAC A1[24870100]        <1> 	mov	eax, [mkdir_FFCluster]
  2044 0000AFB1 31D2                <1> 	xor	edx, edx
  2045                              <1> loc_mkdir_retn:
  2046 0000AFB3 C3                  <1> 	retn
  2047                              <1> 
  2048                              <1> clear_directory_buffer:
  2049                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2050                              <1> 	;
  2051                              <1> 	; eax = 0
  2052                              <1> 	; ecx = directory buffer sector count (<= 128)
  2053                              <1> 	;
  2054 0000AFB4 BF00000800          <1> 	mov	edi, Directory_Buffer
  2055                              <1> 	;mov	al, 128 ; double word
  2056                              <1> 	;mul	ecx ; ecx = directory buffer sector count
  2057                              <1> 	;mov	ecx, eax
  2058                              <1> 	;shl	cx, 7 ; 128 * sector count
  2059 0000AFB9 668B4611            <1> 	mov	ax, [esi+LD_BPB+BytesPerSec] ; 512
  2060 0000AFBD C1E802              <1> 	shr	eax, 2 ; 'byte count / 4' for 'stosd'
  2061 0000AFC0 F7E1                <1> 	mul	ecx ; max = 128*(512/4) -> 16384 (stosd)
  2062 0000AFC2 89C1                <1> 	mov	ecx, eax
  2063 0000AFC4 29C0                <1> 	sub	eax, eax
  2064 0000AFC6 F3AB                <1> 	rep	stosd ; clear directory buffer
  2065 0000AFC8 C3                  <1> 	retn
  2066                              <1> 
  2067                              <1> make_directory_entry:
  2068                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2069                              <1> 	; 02/03/2016
  2070                              <1> 	; 21/02/2016 (TRDOS 386 = TRDOS v2.0)
  2071                              <1> 	; 09/08/2010 (DIR.ASM, 'proc_make_directory_entry')
  2072                              <1> 	; 17/07/2010
  2073                              <1> 	; INPUT ->
  2074                              <1> 	; 	EDI = Directory Entry Address
  2075                              <1> 	;	ESI = Dot File Name Location
  2076                              <1> 	;	EAX = First Cluster
  2077                              <1> 	;	File Size = 0 (Must be set later)
  2078                              <1> 	;	CL = Attributes
  2079                              <1> 	;	CH = 0 (File size = 0)
  2080                              <1> 	;	(If CH>0, File size is in dword [EBX]) (*)
  2081                              <1> 	; OUTPUT ->
  2082                              <1> 	;	EDI = Directory Entry Address
  2083                              <1> 	;	ESI = Dot File Name Location (Capitalized)
  2084                              <1> 	;	If CH input = 0, File Size = 0
  2085                              <1> 	;	Otherwise file size is as dword [EBX] (*)
  2086                              <1> 	;	DX = Date, AX = Time in DOS Dir Entry format
  2087                              <1> 	;	EBX = same
  2088                              <1> 	;	ECX = same
  2089                              <1> 
  2090 0000AFC9 51                  <1> 	push	ecx
  2091                              <1> 
  2092 0000AFCA 884F0B              <1> 	mov	[edi+11], cl ; Attributes
  2093 0000AFCD 6689471A            <1> 	mov	[edi+26], ax ; FClusterLw, 26
  2094 0000AFD1 C1E810              <1> 	shr	eax, 16
  2095 0000AFD4 66894714            <1> 	mov	[edi+20], ax ; FClusterHw, 20
  2096                              <1> 	;xor	ax, ax
  2097                              <1> 	; 29/07/2022
  2098 0000AFD8 31C0                <1> 	xor	eax, eax
  2099 0000AFDA 6689470C            <1> 	mov	[edi+12], ax ; NTReserved, 12
  2100                              <1> 			     ; CrtTimeTenth, 13
  2101 0000AFDE 08ED                <1> 	or	ch, ch
  2102 0000AFE0 7402                <1> 	jz	short loc_make_direntry_set_filesize
  2103                              <1> 
  2104 0000AFE2 8B03                <1> 	mov	eax, [ebx]
  2105                              <1> 
  2106                              <1> loc_make_direntry_set_filesize:
  2107 0000AFE4 89471C              <1> 	mov	[edi+28], eax ; FileSize, 28
  2108                              <1> 
  2109 0000AFE7 E8AFFBFFFF          <1> 	call	convert_file_name
  2110                              <1> 	; EDI = Dir Entry Format File Name Location
  2111                              <1> 	; ESI = Dot File Name Location (capitalized)
  2112                              <1> 
  2113 0000AFEC E816000000          <1> 	call	convert_current_date_time
  2114                              <1> 	; OUTPUT -> DX = Date in dos dir entry format
  2115                              <1>         ; 	    AX = Time in dos dir entry format
  2116 0000AFF1 6689470E            <1> 	mov	[edi+14], ax ; CrtTime, 14
  2117 0000AFF5 66895710            <1> 	mov	[edi+16], dx ; CrtDate, 16
  2118 0000AFF9 66895712            <1> 	mov	[edi+18], dx ; LastAccDate, 18
  2119 0000AFFD 66894716            <1> 	mov	[edi+22], ax ; WrtTime, 14
  2120 0000B001 66895718            <1> 	mov	[edi+24], dx ; WrtDate, 16
  2121 0000B005 59                  <1> 	pop	ecx
  2122                              <1> 
  2123 0000B006 C3                  <1> 	retn
  2124                              <1> 
  2125                              <1> convert_current_date_time:
  2126                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2127                              <1> 	; 21/02/2016 (TRDOS 386 = TRDOS v2.0)
  2128                              <1> 	; 13/06/2010 (DIR.ASM, 'proc_convert_current_date_time')
  2129                              <1> 	; converts date&time to dos dir entry format
  2130                              <1> 	; INPUT -> none
  2131                              <1> 	; OUTPUT -> DX = Date in dos dir entry format
  2132                              <1> 	;           AX = Time in dos dir entry format
  2133                              <1> 
  2134 0000B007 B404                <1> 	mov	ah, 04h ; Return Current Date
  2135 0000B009 E889B2FFFF          <1> 	call	int1Ah
  2136                              <1> 
  2137 0000B00E 88E8                <1> 	mov	al, ch ; <- century BCD
  2138 0000B010 240F                <1> 	and	al, 0Fh
  2139 0000B012 88EC                <1> 	mov	ah, ch
  2140 0000B014 C0EC04              <1> 	shr	ah, 4
  2141 0000B017 D50A                <1> 	aad
  2142 0000B019 88C5                <1> 	mov	ch, al ; -> century
  2143                              <1> 
  2144 0000B01B 88C8                <1> 	mov	al, cl ; <- year BCD
  2145 0000B01D 240F                <1> 	and	al, 0Fh
  2146 0000B01F 88CC                <1> 	mov	ah, cl
  2147 0000B021 C0EC04              <1> 	shr	ah, 4
  2148 0000B024 D50A                <1> 	aad
  2149 0000B026 88C1                <1> 	mov	cl, al ; -> year
  2150                              <1> 
  2151                              <1> 	;mov	al, ch
  2152                              <1> 	;mov	ah, 100
  2153                              <1> 	;mul	ah
  2154                              <1> 	; 29/07/2022
  2155 0000B028 B064                <1> 	mov	al, 100
  2156 0000B02A F6E5                <1> 	mul	ch
  2157                              <1> 
  2158                              <1> 	;xor	ch, ch
  2159                              <1> 	;add	ax, cx
  2160                              <1> 	; 29/07/2022
  2161 0000B02C 00C8                <1> 	add	al, cl
  2162 0000B02E 80D400              <1> 	adc	ah, 0
  2163 0000B031 662DBC07            <1> 	sub	ax, 1980 ; ms-dos epoch
  2164                              <1> 	;mov	cx, ax
  2165                              <1> 	; 29/07/2022
  2166 0000B035 88C1                <1> 	mov	cl, al
  2167                              <1> 	;mov	ecx, eax
  2168                              <1> 
  2169 0000B037 88F0                <1> 	mov	al, dh ; <- month in bcd
  2170 0000B039 240F                <1> 	and	al, 0Fh
  2171 0000B03B 88F4                <1> 	mov	ah, dh
  2172 0000B03D C0EC04              <1> 	shr	ah, 4
  2173 0000B040 D50A                <1> 	aad
  2174 0000B042 88C6                <1> 	mov	dh, al ; -> month
  2175                              <1> 
  2176 0000B044 88D0                <1> 	mov	al, dl ; <- day BCD
  2177 0000B046 240F                <1> 	and	al, 0Fh
  2178 0000B048 88D4                <1> 	mov	ah, dl
  2179 0000B04A C0EC04              <1> 	shr	ah, 4
  2180 0000B04D D50A                <1> 	aad
  2181 0000B04F 88C2                <1> 	mov	dl, al ; -> day
  2182                              <1> 
  2183 0000B051 88C8                <1> 	mov	al, cl ; count of years from 1980
  2184                              <1> 	;shl	ax, 4
  2185                              <1> 	; 29/07/2022
  2186                              <1> 	;mov	eax, ecx
  2187 0000B053 C1E004              <1> 	shl	eax, 4
  2188                              <1> 
  2189 0000B056 08F0                <1> 	or	al, dh ; month of year, 1 to 12
  2190                              <1> 	;shl	ax, 5
  2191                              <1> 	; 29/07/2022
  2192 0000B058 C1E005              <1> 	shl	eax, 5
  2193 0000B05B 08D0                <1> 	or	al, dl ; day of year, 1 to 31
  2194                              <1> 
  2195                              <1> 	;push	ax ; push date
  2196                              <1> 	; 29/07/2022
  2197 0000B05D 50                  <1> 	push	eax
  2198                              <1> 
  2199 0000B05E B402                <1> 	mov	ah, 02h ; Return Current Time
  2200 0000B060 E832B2FFFF          <1> 	call	int1Ah
  2201                              <1> 
  2202 0000B065 88E8                <1> 	mov	al, ch ; <- hours BCD
  2203 0000B067 240F                <1> 	and	al, 0Fh
  2204 0000B069 88EC                <1> 	mov	ah, ch
  2205 0000B06B C0EC04              <1> 	shr	ah, 4
  2206 0000B06E D50A                <1> 	aad
  2207 0000B070 88C5                <1> 	mov	ch, al ; -> hours
  2208                              <1> 
  2209 0000B072 88C8                <1> 	mov	al, cl ; <- minutes BCD
  2210 0000B074 240F                <1> 	and	al, 0Fh
  2211 0000B076 88CC                <1> 	mov	ah, cl
  2212 0000B078 C0EC04              <1> 	shr	ah, 4
  2213 0000B07B D50A                <1> 	aad
  2214 0000B07D 88C1                <1> 	mov	cl, al ; -> minutes
  2215                              <1> 
  2216 0000B07F 88F0                <1> 	mov	al, dh ; <- seconds BCD
  2217 0000B081 240F                <1> 	and	al, 0Fh
  2218 0000B083 88F4                <1> 	mov	ah, dh
  2219 0000B085 C0EC04              <1> 	shr	ah, 4
  2220 0000B088 D50A                <1> 	aad
  2221 0000B08A 88C6                <1> 	mov	dh, al ; -> seconds
  2222                              <1> 
  2223 0000B08C 88E8                <1> 	mov	al, ch ; hours
  2224                              <1> 	;shl	ax, 6
  2225                              <1> 	; 29/07/2022
  2226 0000B08E C1E006              <1> 	shl	eax, 6
  2227 0000B091 08C8                <1> 	or	al, cl ; minutes
  2228                              <1> 	;shl	ax, 5
  2229                              <1> 	; 29/07/2022
  2230 0000B093 C1E005              <1> 	shl	eax, 5
  2231 0000B096 D0EE                <1> 	shr	dh, 1 ; 2 seconds
  2232                              <1> 	; There is a bug in TRDOS v1 here !
  2233                              <1> 	; it was 'or al, dl' !
  2234 0000B098 08F0                <1> 	or	al, dh ; seconds
  2235                              <1> 
  2236                              <1> 	;pop	dx ; pop date
  2237                              <1> 	; 29/07/2022
  2238 0000B09A 5A                  <1> 	pop	edx
  2239                              <1> 
  2240 0000B09B C3                  <1> 	retn
  2241                              <1> 
  2242                              <1> save_directory_buffer:
  2243                              <1> 	; 30/07/2022
  2244                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2245                              <1> 	; 15/10/2016
  2246                              <1> 	; 23/03/2016
  2247                              <1> 	; 26/02/2016
  2248                              <1> 	; 22/02/2016 (TRDOS 386 = TRDOS v2.0)
  2249                              <1> 	; 01/08/2011
  2250                              <1> 	; 14/03/2010
  2251                              <1> 	; INPUT ->
  2252                              <1> 	; 	 none
  2253                              <1> 	; OUTPUT ->
  2254                              <1> 	;  cf = 0 -> write OK...
  2255                              <1> 	;  cf = 1 -> error code in AL (EAX)
  2256                              <1> 	;  cf = 1 & AL = 0Dh => CH & CL = FS & FAT type
  2257                              <1> 	;  EBX = Directory Buffer Address
  2258                              <1> 	;
  2259                              <1> 	;  (EAX, ECX, EDX will be modified)
  2260                              <1> 
  2261 0000B09C BB00000800          <1> 	mov	ebx, Directory_Buffer
  2262 0000B0A1 803D[D9840100]02    <1> 	cmp	byte [DirBuff_ValidData], 2
  2263 0000B0A8 7403                <1> 	je	short loc_save_dir_buffer
  2264 0000B0AA 31C0                <1> 	xor	eax, eax
  2265 0000B0AC C3                  <1> 	retn
  2266                              <1> 
  2267                              <1> loc_save_dir_buffer:
  2268 0000B0AD 56                  <1> 	push	esi
  2269 0000B0AE 31DB                <1> 	xor	ebx, ebx
  2270 0000B0B0 8A3D[D7840100]      <1>         mov     bh, [DirBuff_DRV]
  2271 0000B0B6 80EF41              <1> 	sub	bh, 'A'
  2272 0000B0B9 BE00010900          <1>         mov     esi, Logical_DOSDisks
  2273 0000B0BE 01DE                <1> 	add	esi, ebx
  2274 0000B0C0 668B4E03            <1>         mov     cx, [esi+LD_FATType]
  2275                              <1> 	; CH = FS Type (A1h for FS)
  2276                              <1> 	; CL = FAT Type (0 for FS)
  2277 0000B0C4 08C9                <1> 	or	cl, cl
  2278 0000B0C6 7431                <1> 	jz	short loc_save_dir_buff_stc_retn
  2279                              <1> 
  2280                              <1> loc_save_dir_buffer_check_cluster_no:
  2281 0000B0C8 A1[DE840100]        <1> 	mov	eax, [DirBuff_Cluster]
  2282 0000B0CD 28FF                <1> 	sub	bh, bh ; ebx = 0
  2283 0000B0CF 09C0                <1> 	or	eax, eax
  2284 0000B0D1 753E                <1> 	jnz	short loc_save_sub_dir_buffer
  2285 0000B0D3 8A25[D8840100]      <1> 	mov	ah, [DirBuff_FATType]
  2286 0000B0D9 FEC3                <1> 	inc	bl ;  bl = 1
  2287 0000B0DB 38DC                <1> 	cmp	ah, bl
  2288 0000B0DD 721B                <1> 	jb	short loc_save_dir_buff_inv_data_retn
  2289 0000B0DF FEC3                <1> 	inc	bl ; bl = 2
  2290 0000B0E1 38E3                <1> 	cmp	bl, ah
  2291 0000B0E3 7215                <1> 	jb	short loc_save_dir_buff_inv_data_retn
  2292                              <1> 
  2293                              <1> loc_save_root_dir_buffer:
  2294 0000B0E5 668B5E17            <1> 	mov	bx, [esi+LD_BPB+RootDirEnts]
  2295 0000B0E9 6683C30F            <1> 	add	bx, 15
  2296                              <1> 	;shr	bx, 4 ; 16 dir entries per sector
  2297                              <1> 	; 29/07/2022
  2298 0000B0ED C1EB04              <1> 	shr	ebx, 4
  2299                              <1> 	;or	bx, bx
  2300 0000B0F0 09DB                <1> 	or	ebx, ebx
  2301 0000B0F2 7405                <1> 	jz	short loc_save_dir_buff_stc_retn
  2302                              <1> 	;mov	ecx, ebx
  2303 0000B0F4 8B4664              <1> 	mov	eax, [esi+LD_ROOTBegin] ; 26/02/2016
  2304 0000B0F7 EB22                <1> 	jmp	short loc_write_directory_to_disk
  2305                              <1> 
  2306                              <1> loc_save_dir_buff_stc_retn:
  2307 0000B0F9 F9                  <1> 	stc
  2308                              <1> loc_save_dir_buff_inv_data_retn:
  2309                              <1> 	; 15/10/2016 (0Dh -> 29)
  2310 0000B0FA B01D                <1> 	mov	al, 29 ; Invalid data !
  2311 0000B0FC C605[D9840100]00    <1> 	mov	byte [DirBuff_ValidData], 0
  2312 0000B103 EB05                <1> 	jmp	short loc_save_dir_buff_retn
  2313                              <1> 
  2314                              <1> loc_write_directory_to_disk_err:
  2315                              <1> 	; 15/10/2016 (disk write error code, 1Dh -> 18)
  2316 0000B105 B812000000          <1> 	mov	eax, 18 ; Drive not ready or write error
  2317                              <1> 
  2318                              <1> loc_save_dir_buff_retn:
  2319 0000B10A BB00000800          <1> 	mov	ebx, Directory_Buffer
  2320 0000B10F 5E                  <1> 	pop	esi
  2321 0000B110 C3                  <1> 	retn
  2322                              <1> 
  2323                              <1> loc_save_sub_dir_buffer:
  2324                              <1> 	; ebx  = 0
  2325                              <1> 	;sub	eax, 2
  2326                              <1> 	; 30/07/2022
  2327 0000B111 48                  <1> 	dec	eax
  2328 0000B112 48                  <1> 	dec	eax
  2329 0000B113 8A5E13              <1> 	mov	bl, [esi+LD_BPB+SecPerClust]
  2330 0000B116 F7E3                <1> 	mul	ebx
  2331 0000B118 034668              <1>         add     eax, [esi+LD_DATABegin]
  2332                              <1>  	;mov	ecx, ebx
  2333                              <1> 
  2334                              <1> loc_write_directory_to_disk:
  2335 0000B11B 89D9                <1>  	mov	ecx, ebx
  2336 0000B11D BB00000800          <1> 	mov	ebx, Directory_Buffer
  2337 0000B122 E8FE6E0000          <1> 	call	disk_write
  2338 0000B127 72DC                <1> 	jc	short loc_write_directory_to_disk_err
  2339                              <1> 
  2340                              <1> loc_save_dir_buff_validate_retn:
  2341 0000B129 C605[D9840100]01    <1> 	mov	byte [DirBuff_ValidData], 1
  2342 0000B130 31C0                <1> 	xor	eax, eax
  2343                              <1> 	; 26/02/2016
  2344 0000B132 EBD6                <1> 	jmp	short loc_save_dir_buff_retn
  2345                              <1> 
  2346                              <1> update_parent_dir_lmdt:
  2347                              <1> 	; 16/07/2025 (TRDOS 386 Kernel v2.0.10) (BugFix)
  2348                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2349                              <1> 	; 29/12/2017
  2350                              <1> 	; 22/02/2016 (TRDOS 386 = TRDOS v2.0)
  2351                              <1> 	; 01/08/2011
  2352                              <1> 	; 16/10/2010
  2353                              <1> 	;
  2354                              <1> 	; INPUT ->
  2355                              <1> 	;	none
  2356                              <1>  	; OUTPUT ->
  2357                              <1> 	;	(last modification date & time of the parent dir
  2358                              <1> 	;	will be changed/updated)
  2359                              <1> 	;
  2360                              <1> 	; (EAX, EBX, ECX, EDX, EDI will be changed)
  2361                              <1> 
  2362 0000B134 29C0                <1> 	sub	eax, eax
  2363 0000B136 8A25[B07D0100]      <1> 	mov	ah, [Current_Dir_Level]
  2364 0000B13C A0[B17D0100]        <1> 	mov	al, [Current_FATType]
  2365 0000B141 3C01                <1> 	cmp	al, 1
  2366 0000B143 7239                <1> 	jb	short loc_UPDLMDT_proc_retn
  2367                              <1> 
  2368                              <1> loc_update_parent_dir_lm_date_time:
  2369 0000B145 08E4                <1> 	or	ah, ah
  2370 0000B147 7435                <1> 	jz	short loc_UPDLMDT_proc_retn
  2371                              <1> 
  2372 0000B149 56                  <1> 	push	esi ; *
  2373 0000B14A 8825[1B870100]      <1> 	mov	[UPDLMDT_CDirLevel], ah
  2374 0000B150 8B15[AC7D0100]      <1> 	mov	edx, [Current_Dir_FCluster]
  2375 0000B156 8915[1C870100]      <1> 	mov	[UPDLMDT_CDirFCluster], edx
  2376                              <1> 
  2377 0000B15C FECC                <1> 	dec	ah
  2378                              <1> 	;mov	ecx, 12
  2379                              <1>         ; 29/07/2022
  2380 0000B15E 29C9                <1> 	sub	ecx, ecx
  2381 0000B160 B10C                <1> 	mov	cl, 12
  2382                              <1> 	;
  2383 0000B162 BE[10850100]        <1> 	mov     esi, PATH_Array
  2384                              <1> 
  2385 0000B167 8825[B07D0100]      <1> 	mov	[Current_Dir_Level], ah
  2386 0000B16D 08E4                <1> 	or	ah, ah
  2387 0000B16F 750E                <1> 	jnz	short loc_update_parent_dir_lmdt_load_sub_dir_1
  2388 0000B171 803D[B17D0100]02    <1> 	cmp	byte [Current_FATType], 2
  2389 0000B178 770B                <1> 	ja	short loc_update_parent_dir_lmdt_load_sub_dir_2
  2390 0000B17A 28C0                <1> 	sub	al, al ; eax = 0
  2391 0000B17C EB0A                <1> 	jmp	short loc_update_parent_dir_lmdt_load_sub_dir_3
  2392                              <1> 
  2393                              <1> loc_UPDLMDT_proc_retn:
  2394 0000B17E C3                  <1> 	retn
  2395                              <1> 
  2396                              <1> loc_update_parent_dir_lmdt_load_sub_dir_1:
  2397 0000B17F B010                <1> 	mov	al, 16
  2398 0000B181 F6E4                <1> 	mul	ah
  2399 0000B183 01C6                <1> 	add	esi, eax
  2400                              <1> 
  2401                              <1> loc_update_parent_dir_lmdt_load_sub_dir_2:
  2402 0000B185 8B460C              <1> 	mov	eax, [esi+12] ; Parent Dir First Cluster
  2403                              <1> 
  2404                              <1> loc_update_parent_dir_lmdt_load_sub_dir_3:
  2405 0000B188 A3[AC7D0100]        <1> 	mov	[Current_Dir_FCluster], eax
  2406                              <1> 
  2407 0000B18D 83C610              <1> 	add	esi, 16
  2408                              <1> 	;mov	di, Dir_File_Name
  2409                              <1> 	; 16/07/2025 (BugFix)
  2410 0000B190 BF[36860100]        <1> 	mov	edi, Dir_File_Name
  2411 0000B195 F3A4                <1> 	rep	movsb
  2412                              <1> 
  2413 0000B197 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  2414 0000B19C 29DB                <1> 	sub	ebx, ebx
  2415 0000B19E 8A3D[B27D0100]      <1> 	mov	bh, [Current_Drv]
  2416 0000B1A4 01DE                <1> 	add	esi, ebx
  2417 0000B1A6 E8E6F7FFFF          <1> 	call	reload_current_directory
  2418 0000B1AB 722F                <1> 	jc	short loc_update_parent_dir_lmdt_restore_cdirlevel
  2419                              <1> 
  2420                              <1> loc_update_parent_dir_lmdt_locate_dir:
  2421 0000B1AD BE[36860100]        <1> 	mov	esi, Dir_File_Name
  2422                              <1> 	;xor	cx, cx
  2423                              <1> 	; 29/07/2022
  2424 0000B1B2 31C9                <1> 	xor	ecx, ecx
  2425 0000B1B4 66B81008            <1> 	mov	ax, 0810h ; Only directories
  2426 0000B1B8 E811F7FFFF          <1>         call    locate_current_dir_file
  2427                              <1> 	; EDI = DirBuff Directory Entry Address
  2428 0000B1BD 721D                <1> 	jc	short loc_update_parent_dir_lmdt_restore_cdirlevel
  2429                              <1> 
  2430 0000B1BF E843FEFFFF          <1> 	call	convert_current_date_time
  2431 0000B1C4 66895712            <1> 	mov	[edi+18], dx ; Last Access Date
  2432 0000B1C8 66895718            <1> 	mov	[edi+24], dx ; Last Write Date
  2433 0000B1CC 66894716            <1> 	mov	[edi+22], ax ; Last Write Time
  2434                              <1> 
  2435 0000B1D0 C605[D9840100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  2436 0000B1D7 E8C0FEFFFF          <1> 	call	save_directory_buffer
  2437                              <1> 	; 29/12/2017
  2438                              <1> 	;jc	short loc_update_parent_dir_lmdt_restore_cdirlevel
  2439                              <1> 	;xor	al, al
  2440                              <1> loc_update_parent_dir_lmdt_restore_cdirlevel:
  2441                              <1>  	;current directory level restoration
  2442 0000B1DC 8A25[1B870100]      <1> 	mov	ah, [UPDLMDT_CDirLevel]
  2443 0000B1E2 8825[B07D0100]      <1> 	mov	[Current_Dir_Level], ah
  2444 0000B1E8 8B15[1C870100]      <1>         mov     edx, [UPDLMDT_CDirFCluster]
  2445 0000B1EE 8915[AC7D0100]      <1> 	mov	[Current_Dir_FCluster], edx
  2446                              <1> 
  2447 0000B1F4 5E                  <1> 	pop	esi ; *
  2448 0000B1F5 C3                  <1> 	retn
  2449                              <1> 
  2450                              <1> delete_longname:
  2451                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2452                              <1> 	; 27/02/2016 (TRDOS 386 = TRDOS v2.0)
  2453                              <1> 	; 01/08/2011 (DIR.ASM, 'proc_delete_longname')
  2454                              <1> 	; 14/03/2010
  2455                              <1> 	; INPUT ->
  2456                              <1> 	; 	EAX = Directory Entry (Index) Number (< 65536)
  2457                              <1> 	; OUTPUT ->
  2458                              <1> 	;	cf = 0 -> OK  (EAX = 0)
  2459                              <1> 	; 	cf = 1 -> error code in EAX (AL)
  2460                              <1> 	;
  2461                              <1> 	; (Modified registers: EAX, EDX, ECX, EBX, EDI)
  2462                              <1> 
  2463 0000B1F6 66A3[84870100]      <1> 	mov	[DLN_EntryNumber], ax
  2464 0000B1FC C605[86870100]40    <1>         mov     byte [DLN_40h], 40h
  2465                              <1> 
  2466 0000B203 E857000000          <1> 	call	locate_current_dir_entry
  2467 0000B208 7307                <1> 	jnc	short loc_dln_check_attributes
  2468 0000B20A C3                  <1> 	retn
  2469                              <1> 
  2470                              <1> loc_dln_longname_not_found:
  2471                              <1> 	;mov	eax, 2
  2472                              <1> 	; 29/07/2022
  2473 0000B20B 29C0                <1> 	sub	eax, eax
  2474 0000B20D B002                <1> 	mov	al, 2
  2475 0000B20F F9                  <1> 	stc
  2476 0000B210 C3                  <1> 	retn
  2477                              <1> 
  2478                              <1> loc_dln_check_attributes:
  2479 0000B211 B00F                <1> 	mov	al, 0Fh  ; long name
  2480 0000B213 8A670B              <1> 	mov	ah, [edi+0Bh] ; dir entry attributes
  2481 0000B216 38C4                <1> 	cmp	ah, al
  2482 0000B218 75F1                <1> 	jne	short loc_dln_longname_not_found
  2483 0000B21A 8A27                <1> 	mov	ah, [edi]
  2484 0000B21C 2A25[86870100]      <1> 	sub	ah, [DLN_40h]
  2485 0000B222 76E7                <1> 	jna	short loc_dln_longname_not_found
  2486 0000B224 80FC14              <1> 	cmp	ah, 14h ; 84-64=20 -> 20*13=260 bytes
  2487 0000B227 77E2                <1> 	ja	short loc_dln_longname_not_found
  2488                              <1> 
  2489 0000B229 C607E5              <1> 	mov	byte [edi], 0E5h  ; deleted sign
  2490 0000B22C C605[D9840100]02    <1> 	mov	byte [DirBuff_ValidData], 2 ; changed/write sign
  2491 0000B233 C605[86870100]00    <1> 	mov	byte [DLN_40h], 0 ; 40h -> 0
  2492                              <1> 
  2493                              <1> loc_dln_delete_next_ln_entry:
  2494 0000B23A 80FC01              <1> 	cmp	ah, 1
  2495 0000B23D 7616                <1> 	jna	short loc_dln_longname_retn
  2496                              <1> loc_dln_delete_next_ln_entry_0:
  2497 0000B23F 66FF05[84870100]    <1> 	inc	word [DLN_EntryNumber]
  2498 0000B246 0FB705[84870100]    <1> 	movzx	eax, word [DLN_EntryNumber]
  2499 0000B24D E80D000000          <1> 	call	locate_current_dir_entry
  2500 0000B252 73BD                <1> 	jnc	short loc_dln_check_attributes
  2501                              <1> 
  2502                              <1> loc_dln_longname_stc_retn:
  2503 0000B254 C3                  <1> 	retn
  2504                              <1> 
  2505                              <1> loc_dln_longname_retn:
  2506                              <1> 	;cmp	byte [DirBuff_ValidData], 2
  2507                              <1> 	;jne	short loc_dln_longname_retn_xor_eax
  2508 0000B255 E842FEFFFF          <1> 	call	save_directory_buffer
  2509 0000B25A 72F8                <1> 	jc	short loc_dln_longname_stc_retn
  2510                              <1> 
  2511                              <1> loc_dln_longname_retn_xor_eax:
  2512 0000B25C 31C0                <1> 	xor	eax, eax
  2513 0000B25E C3                  <1> 	retn
  2514                              <1> 
  2515                              <1> locate_current_dir_entry:
  2516                              <1> 	; 30/07/2022
  2517                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2518                              <1> 	; 16/10/2016
  2519                              <1> 	; 15/10/2016
  2520                              <1> 	; 23/03/2016
  2521                              <1> 	; 27/02/2016 (TRDOS 386 = TRDOS v2.0)
  2522                              <1> 	; 01/08/2011 (DIR.ASM, 'proc_locate_current_dir_entry')
  2523                              <1> 	; 07/03/2010
  2524                              <1> 	; INPUT ->
  2525                              <1> 	;	EAX = Directory Entry (Index) Number (< 65536)
  2526                              <1> 	; OUTPUT ->
  2527                              <1> 	;	EDI = Directory Entry Address
  2528                              <1> 	; 	EAX = Cluster Number of Directory Buffer
  2529                              <1> 	;	EBX = Directory Buffer Entry Offset
  2530                              <1> 	;	ECX = DirBuff Valid Data identifier (CL)
  2531                              <1> 	;   	If CF = 0 and CL = 2 then
  2532                              <1> 	;	   directory buffer modified and
  2533                              <1> 	;	   must be written to disk.
  2534                              <1> 	; 	If CF = 0  and CL = 1 then
  2535                              <1> 	;	   dir buffer has been written to disk, already.
  2536                              <1> 	;	CF = 1 -> Error code in EAX (AL)
  2537                              <1> 	;
  2538                              <1> 	; (Modified registers: EAX, EDX, ECX, EBX, EDI)
  2539                              <1> 
  2540                              <1> loc_locate_current_dir_entry:
  2541 0000B25F 56                  <1> 	push	esi
  2542 0000B260 89C1                <1> 	mov	ecx, eax
  2543                              <1> 	;mov	edx, 32
  2544                              <1> 	; 29/07/2022
  2545 0000B262 29D2                <1> 	sub	edx, edx
  2546 0000B264 B220                <1> 	mov	dl, 32
  2547 0000B266 F7E2                <1> 	mul	edx 
  2548 0000B268 A3[90870100]        <1> 	mov	[LCDE_ByteOffset], eax
  2549 0000B26D 31DB                <1> 	xor	ebx, ebx
  2550 0000B26F 8A3D[B27D0100]      <1> 	mov	bh, [Current_Drv]
  2551 0000B275 A0[D7840100]        <1>         mov     al, [DirBuff_DRV]
  2552 0000B27A 2C41                <1> 	sub	al, 'A'
  2553 0000B27C BE00010900          <1>         mov     esi, Logical_DOSDisks
  2554 0000B281 01DE                <1> 	add	esi, ebx
  2555 0000B283 38C7                <1> 	cmp	bh, al
  2556                              <1> 	;jne	loc_lcde_reload_current_directory
  2557                              <1> 	; 29/07/2022
  2558 0000B285 7405                <1> 	je	short loc_lcde_cdl_check
  2559 0000B287 E986000000          <1> 	jmp	loc_lcde_reload_current_directory
  2560                              <1> loc_lcde_cdl_check:
  2561                              <1> 	; 29/07/2022
  2562 0000B28C 31C0                <1> 	xor	eax, eax
  2563 0000B28E 803D[B07D0100]00    <1> 	cmp	byte [Current_Dir_Level], 0
  2564 0000B295 7728                <1> 	ja	short loc_lcde_calc_dirbuff_cluster_offset
  2565                              <1> 	; 27/02/2016
  2566                              <1> 	; TRDOS v1 has bug here for FAT32 fs !
  2567                              <1> 	; (Root Directory Entries for FAT32 = 0)
  2568 0000B297 807E0303            <1> 	cmp	byte [esi+LD_FATType], 3  ; FAT32
  2569 0000B29B 7322                <1> 	jnb	short loc_lcde_calc_dirbuff_cluster_offset
  2570                              <1> 
  2571                              <1> loc_lcde_cdl_check_FAT12_16:
  2572                              <1> 	; 29/07/2022
  2573                              <1> 	;xor	eax, eax
  2574 0000B29D 668B4617            <1> 	mov	ax, [esi+LD_BPB+RootDirEnts]
  2575                              <1> 	;dec	ax
  2576 0000B2A1 48                  <1> 	dec	eax
  2577                              <1> 	;xor	dx, dx
  2578                              <1> 	;cmp	ax, cx ; cx = Directory Entry (Index) Number
  2579                              <1> 	; 29/07/2022
  2580 0000B2A2 39C8                <1> 	cmp	eax, ecx
  2581 0000B2A4 720E                <1> 	jb	short loc_lcde_stc_12h_retn
  2582 0000B2A6 66890D[88870100]    <1> 	mov	[LCDE_EntryIndex], cx
  2583 0000B2AD 31C0                <1> 	xor	eax, eax
  2584 0000B2AF E985000000          <1>         jmp     loc_lcde_check_dir_buffer_cluster
  2585                              <1> 
  2586                              <1> loc_lcde_stc_12h_retn:
  2587 0000B2B4 5E                  <1> 	pop	esi
  2588 0000B2B5 89CB                <1> 	mov	ebx, ecx
  2589 0000B2B7 89D1                <1> 	mov	ecx, edx
  2590                              <1> 	; 16/10/2016 (12h -> 12)
  2591 0000B2B9 B80C000000          <1> 	mov	eax, 12 ; No more files
  2592 0000B2BE C3                  <1> 	retn
  2593                              <1> 
  2594                              <1> loc_lcde_calc_dirbuff_cluster_offset:
  2595                              <1> 	;mov	bl, [esi+LD_BPB+SecPerClust]
  2596                              <1> 	;xor	bh, bh
  2597                              <1> 	;mov	ax, [esi+LD_BPB+BytesPerSec]
  2598                              <1> 	;mul	bx
  2599                              <1>  	;;or	dx, dx ; If bytes per cluster > 32KB it is invalid
  2600                              <1> 	;; 29/07/2022
  2601                              <1> 	;or	dl, dl
  2602                              <1> 	;jnz	short loc_lcde_invalid_format
  2603                              <1> 	; 29/07/2022
  2604 0000B2BF 31DB                <1> 	xor	ebx, ebx
  2605 0000B2C1 8A5E13              <1> 	mov	bl, [esi+LD_BPB+SecPerClust]
  2606 0000B2C4 668B4611            <1> 	mov	ax, [esi+LD_BPB+BytesPerSec]
  2607 0000B2C8 F7E3                <1> 	mul	ebx
  2608 0000B2CA 89C1                <1> 	mov	ecx, eax
  2609                              <1> 	;mov	cx, ax ; BYTES PER CLUSTER
  2610 0000B2CC A1[90870100]        <1> 	mov	eax, [LCDE_ByteOffset]
  2611                              <1> 	;sub	edx, edx
  2612 0000B2D1 F7F1                <1> 	div	ecx
  2613 0000B2D3 3DFFFF0000          <1> 	cmp	eax, 65535
  2614 0000B2D8 7746                <1> 	ja	short loc_lcde_invalid_format
  2615                              <1> 
  2616                              <1> 	; cluster sequence number of directory (< 65536)
  2617 0000B2DA 66A3[8A870100]      <1> 	mov	[LCDE_ClusterSN], ax
  2618                              <1> 
  2619                              <1> 	;mov	ax, dx ; byte offset in cluster (directory buffer)
  2620                              <1> 	; 29/07/2022
  2621 0000B2E0 89D0                <1> 	mov	eax, edx
  2622                              <1> 	;mov	bx, 32	; 1 dir entry = 32 bytes
  2623 0000B2E2 B320                <1>         mov	bl, 32
  2624                              <1> 	;sub	dx, dx	; 0
  2625                              <1> 	;div	bx
  2626 0000B2E4 29D2                <1> 	sub	edx, edx
  2627 0000B2E6 F7F3                <1> 	div	ebx
  2628 0000B2E8 66A3[88870100]      <1> 	mov	[LCDE_EntryIndex], ax ; dir entry index/sequence number
  2629                              <1> 				      ; (in directory buffer/cluster)
  2630                              <1> loc_lcde_get_current_sub_dir_fcluster:
  2631 0000B2EE A1[AC7D0100]        <1> 	mov	eax, [Current_Dir_FCluster]
  2632                              <1> 
  2633                              <1> loc_lcde_get_next_cluster:
  2634 0000B2F3 66833D[8A870100]00  <1> 	cmp	word [LCDE_ClusterSN], 0
  2635 0000B2FB 763C                <1> 	jna	short loc_lcde_check_dir_buffer_cluster
  2636 0000B2FD A3[8C870100]        <1> 	mov	[LCDE_Cluster], eax
  2637 0000B302 E865100000          <1> 	call	get_next_cluster
  2638 0000B307 721E                <1> 	jc	short loc_lcde_check_gnc_error
  2639 0000B309 66FF0D[8A870100]    <1>   	dec	word [LCDE_ClusterSN]
  2640 0000B310 EBE1                <1> 	jmp	short loc_lcde_get_next_cluster
  2641                              <1> 
  2642                              <1> loc_lcde_reload_current_directory:
  2643 0000B312 51                  <1> 	push	ecx
  2644 0000B313 E879F6FFFF          <1> 	call	reload_current_directory
  2645 0000B318 59                  <1> 	pop	ecx
  2646                              <1> 	;jnc	loc_lcde_cdl_check
  2647                              <1> 	;pop	esi
  2648                              <1> 	;retn
  2649                              <1> 	; 09/08/2022
  2650 0000B319 727E                <1> 	jc	short loc_lcde_retn
  2651 0000B31B E96CFFFFFF          <1> 	jmp	loc_lcde_cdl_check
  2652                              <1> 
  2653                              <1> loc_lcde_invalid_format:
  2654                              <1> 	; 15/10/2016 (0Bh -> 28)
  2655                              <1> 	;mov	eax, 28 ; Invalid Format !
  2656                              <1> 	; 29/07/2022
  2657 0000B320 29C0                <1> 	sub	eax, eax
  2658 0000B322 B01C                <1> 	mov	al, 28
  2659                              <1> loc_lcde_drive_not_ready_read_err:
  2660 0000B324 F9                  <1> 	stc
  2661 0000B325 5E                  <1> 	pop	esi
  2662 0000B326 C3                  <1> 	retn
  2663                              <1> 
  2664                              <1> loc_lcde_check_gnc_error:
  2665 0000B327 09C0                <1> 	or	eax, eax
  2666 0000B329 75F9                <1> 	jnz	short loc_lcde_drive_not_ready_read_err
  2667 0000B32B 66FF0D[8A870100]    <1> 	dec	word [LCDE_ClusterSN]
  2668 0000B332 75EC                <1> 	jnz	short loc_lcde_invalid_format
  2669 0000B334 A1[8C870100]        <1> 	mov	eax, [LCDE_Cluster]
  2670                              <1> 
  2671                              <1> loc_lcde_check_dir_buffer_cluster:
  2672 0000B339 3B05[DE840100]      <1> 	cmp	eax, [DirBuff_Cluster]
  2673 0000B33F 755A                <1> 	jne	short loc_lcde_load_dir_cluster
  2674 0000B341 803D[D9840100]00    <1> 	cmp	byte [DirBuff_ValidData], 0
  2675 0000B348 7726                <1> 	ja	short lcde_check_dir_buffer_cluster_next
  2676 0000B34A 803D[B07D0100]00    <1> 	cmp	byte [Current_Dir_Level], 0
  2677 0000B351 775D                <1> 	ja	short loc_lcde_load_dir_cluster_0
  2678                              <1> 	; 27/02/2016
  2679                              <1> 	; TRDOS v1 has bug here for FAT32 fs !
  2680 0000B353 807E0303            <1> 	cmp	byte [esi+LD_FATType], 3  ; FAT32
  2681 0000B357 7357                <1> 	jnb	short loc_lcde_load_dir_cluster_0
  2682                              <1> 	;
  2683 0000B359 0FB74E17            <1> 	movzx	ecx, word [esi+LD_BPB+RootDirEnts]
  2684 0000B35D 6683C10F            <1> 	add	cx, 15 ; round up (16 entries per sector)
  2685                              <1> 	;shr	cx, 4 ; 1 sector contains 16 dir entries
  2686                              <1> 	; 29/07/2022
  2687 0000B361 C1E904              <1> 	shr	ecx, 4
  2688 0000B364 8B4664              <1>         mov     eax, [esi+LD_ROOTBegin]
  2689 0000B367 EB52                <1> 	jmp	short loc_lcde_load_dir_cluster_1
  2690                              <1> 
  2691                              <1> loc_lcde_validate_dirBuff:
  2692 0000B369 C605[D9840100]01    <1> 	mov	byte [DirBuff_ValidData], 1
  2693                              <1> 
  2694                              <1> lcde_check_dir_buffer_cluster_next:
  2695 0000B370 0FB71D[88870100]    <1> 	movzx	ebx, word [LCDE_EntryIndex]
  2696 0000B377 663B1D[DC840100]    <1> 	cmp	bx, [DirBuff_LastEntry]
  2697 0000B37E 77A0                <1> 	ja	short loc_lcde_invalid_format
  2698                              <1> 	;mov	eax, 32
  2699                              <1> 	; 29/07/2022
  2700 0000B380 31C0                <1> 	xor	eax, eax
  2701 0000B382 B020                <1> 	mov	al, 32
  2702 0000B384 F7E3                <1> 	mul	ebx
  2703                              <1> 	;or	edx, edx
  2704                              <1> 	;jnz	short loc_lcde_invalid_format
  2705                              <1> 
  2706 0000B386 BF00000800          <1> 	mov	edi, Directory_Buffer
  2707 0000B38B 01C7                <1> 	add	edi, eax ; add entry offset to buffer address
  2708                              <1> 
  2709                              <1> loc_lcde_dir_buffer_last_check:
  2710 0000B38D A1[DE840100]        <1> 	mov	eax, [DirBuff_Cluster]
  2711 0000B392 0FB60D[D9840100]    <1> 	movzx	ecx, byte [DirBuff_ValidData]
  2712                              <1> 
  2713                              <1> loc_lcde_retn:
  2714 0000B399 5E                  <1> 	pop	esi
  2715 0000B39A C3                  <1> 	retn
  2716                              <1> 
  2717                              <1> loc_lcde_load_dir_cluster:
  2718                              <1> 	;cmp	byte [DirBuff_ValidData], 2
  2719                              <1> 	;jne	short loc_lcde_load_dir_cluster_n2
  2720 0000B39B 50                  <1> 	push	eax
  2721 0000B39C E8FBFCFFFF          <1> 	call	save_directory_buffer
  2722 0000B3A1 58                  <1> 	pop	eax
  2723 0000B3A2 72F5                <1> 	jc	short loc_lcde_retn
  2724                              <1> 
  2725                              <1> loc_lcde_load_dir_cluster_n2:
  2726 0000B3A4 C605[D9840100]00    <1> 	mov	byte [DirBuff_ValidData], 0
  2727 0000B3AB A3[DE840100]        <1> 	mov	[DirBuff_Cluster], eax
  2728                              <1> 
  2729                              <1> loc_lcde_load_dir_cluster_0:
  2730                              <1> 	;sub	eax, 2
  2731                              <1> 	; 30/07/2022
  2732 0000B3B0 48                  <1> 	dec	eax
  2733 0000B3B1 48                  <1> 	dec	eax
  2734 0000B3B2 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+SecPerClust]
  2735 0000B3B6 F7E1                <1> 	mul	ecx
  2736 0000B3B8 034668              <1>         add     eax, [esi+LD_DATABegin]
  2737                              <1> 
  2738                              <1> loc_lcde_load_dir_cluster_1:
  2739 0000B3BB BB00000800          <1> 	mov	ebx, Directory_Buffer
  2740                              <1> 	; ecx = sector count
  2741 0000B3C0 E86F6C0000          <1> 	call	disk_read
  2742 0000B3C5 73A2                <1> 	jnc	short loc_lcde_validate_dirBuff
  2743                              <1> 
  2744                              <1> 	; 15/10/2016
  2745                              <1> 	; (Disk read error instead of drv not ready err)
  2746 0000B3C7 B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error !
  2747 0000B3CC EBCB                <1> 	jmp	short loc_lcde_retn
  2748                              <1> 
  2749                              <1> remove_file:
  2750                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2751                              <1> 	; 15/10/2016
  2752                              <1> 	; 28/02/2016 (TRDOS 386 = TRDOS v2.0)
  2753                              <1> 	; 10/04/2011 (FILE.ASM, 'proc_delete_file')
  2754                              <1> 	; 09/08/2010
  2755                              <1> 	; INPUT ->
  2756                              <1> 	;	EDI = Directory Buffer Entry Address
  2757                              <1> 	;	 CX = Directory Buffer Entry Counter/Index
  2758                              <1> 	;	 BL = Longname Entry Length
  2759                              <1> 	;	 BH = Logical DOS Drive Number
  2760                              <1> 
  2761 0000B3CE 29C0                <1> 	sub	eax, eax
  2762 0000B3D0 88FC                <1> 	mov	ah, bh
  2763 0000B3D2 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  2764 0000B3D7 01C6                <1> 	add	esi, eax
  2765                              <1> 
  2766 0000B3D9 807E0301            <1> 	cmp	byte [esi+LD_FATType], 1
  2767 0000B3DD 7311                <1> 	jnb	short loc_del_fat_file
  2768                              <1> 
  2769 0000B3DF 807E04A1            <1> 	cmp	byte [esi+LD_FSType], 0A1h
  2770 0000B3E3 7406                <1> 	je	short loc_del_fs_file
  2771                              <1> 
  2772                              <1> loc_del_file_invalid_format:
  2773 0000B3E5 30E4                <1> 	xor	ah, ah
  2774                              <1> 	; 15/10/2016 (0Bh -> 28)
  2775 0000B3E7 B01C                <1> 	mov	al, 28  ; Invalid Format
  2776 0000B3E9 F9                  <1> 	stc 
  2777 0000B3EA C3                  <1> 	retn
  2778                              <1> 
  2779                              <1> loc_del_fs_file:
  2780                              <1> 	;call	delete_fs_file
  2781                              <1> 	;retn
  2782                              <1> 	; 29/07/2022
  2783 0000B3EB E97B0F0000          <1> 	jmp	delete_fs_file
  2784                              <1> 
  2785                              <1> loc_del_fat_file:
  2786 0000B3F0 E808000000          <1> 	call	delete_directory_entry
  2787 0000B3F5 7205                <1> 	jc	short loc_del_file_err_retn
  2788                              <1> 
  2789                              <1> loc_delfile_unlink_cluster_chain:
  2790 0000B3F7 E811170000          <1> 	call	truncate_cluster_chain
  2791                              <1> 	;jc	short loc_del_file_err_retn
  2792                              <1> 
  2793                              <1> loc_delfile_return:
  2794                              <1> loc_del_file_err_retn:
  2795 0000B3FC C3                  <1> 	retn
  2796                              <1> 
  2797                              <1> delete_directory_entry:
  2798                              <1> 	; 15/10/2016
  2799                              <1> 	; 28/02/2016 (TRDOS 386 = TRDOS v2.0)
  2800                              <1> 	; 01/08/2011 (DIR.ASM, 'proc_delete_directory_entry')
  2801                              <1> 	; 10/04/2011
  2802                              <1> 	; INPUT ->
  2803                              <1> 	; 	ESI = Logical Dos Drive Descripton Table Address 
  2804                              <1> 	;	EDI = Directory Buffer Entry Address
  2805                              <1> 	;	 CX = Directory Buffer Entry Counter/Index
  2806                              <1> 	;	 BL = Longname Entry Length
  2807                              <1> 	; OUTPUT ->
  2808                              <1> 	; 	ESI = Logical dos drive descripton table address 
  2809                              <1> 	;	EAX = First cluster to be truncated/unlinked
  2810                              <1> 	;       CF = 1 -> Error code in EAX (AL)
  2811                              <1> 	;       CF = 0 & BH <> 0 -> LMDT write error  (BH = 1)
  2812                              <1> 	;       CF = 0 & BL <> 0 -> Long name delete error (BL = FFh) 
  2813                              <1> 	;
  2814                              <1> 	;  (EDI, EBX, ECX register contents will be changed)
  2815                              <1> 
  2816 0000B3FD 881D[1A870100]      <1> 	mov	[DelFile_LNEL], bl
  2817 0000B403 66890D[18870100]    <1> 	mov	[DelFile_EntryCounter], cx
  2818                              <1> 
  2819 0000B40A 668B4714            <1> 	mov	ax, [edi+20] ; First Cluster High Word
  2820 0000B40E C1E010              <1> 	shl	eax, 16
  2821 0000B411 668B471A            <1> 	mov	ax, [edi+26] ; First Cluster Low Word
  2822                              <1> 
  2823 0000B415 A3[14870100]        <1> 	mov	[DelFile_FCluster], eax
  2824                              <1> 
  2825                              <1> loc_del_short_name:
  2826 0000B41A C607E5              <1> 	mov	byte [edi], 0E5h  ; Deleted sign
  2827                              <1> 
  2828 0000B41D C605[D9840100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  2829 0000B424 E873FCFFFF          <1> 	call	save_directory_buffer
  2830 0000B429 723D                <1> 	jc	short loc_delete_direntry_err_return
  2831                              <1> 
  2832                              <1> loc_del_long_name:
  2833 0000B42B 0FB615[1A870100]    <1> 	movzx	edx, byte [DelFile_LNEL]
  2834 0000B432 08D2                <1> 	or	dl, dl
  2835 0000B434 7416                <1> 	jz	short loc_del_dir_entry_update_parent_dir_lm_date
  2836                              <1> 
  2837 0000B436 8835[1A870100]      <1> 	mov	[DelFile_LNEL], dh ; 0
  2838                              <1> 
  2839 0000B43C 0FB705[18870100]    <1> 	movzx	eax, word [DelFile_EntryCounter]
  2840 0000B443 29D0                <1> 	sub	eax, edx
  2841                              <1> 	;jnc	short loc_del_long_name_continue
  2842 0000B445 7205                <1> 	jc	short loc_del_dir_entry_update_parent_dir_lm_date
  2843                              <1> 
  2844                              <1> ;loc_del_direntry_inv_data_return: ; 15/10/2016 (0Dh -> 29)
  2845                              <1> ;	mov	eax, 29 ; 0Dh (TRDOS 8086) ; Invalid data
  2846                              <1> ;	retn
  2847                              <1> 
  2848                              <1> loc_del_long_name_continue: 
  2849                              <1> 	; AX = Directory Entry Number of the long name last entry
  2850 0000B447 E8AAFDFFFF          <1> 	call	delete_longname
  2851                              <1> 	;jc	short loc_delete_direntry_err_return
  2852                              <1> 
  2853                              <1> loc_del_dir_entry_update_parent_dir_lm_date:
  2854 0000B44C 801D[1A870100]00    <1> 	sbb	byte [DelFile_LNEL], 0 ; 0FFh if cf = 1
  2855                              <1> 
  2856 0000B453 E8DCFCFFFF          <1> 	call	update_parent_dir_lmdt
  2857 0000B458 B700                <1> 	mov	bh, 0
  2858 0000B45A 80D700              <1> 	adc	bh, 0
  2859                              <1> 
  2860 0000B45D 8A1D[1A870100]      <1> 	mov	bl, byte [DelFile_LNEL]
  2861                              <1> 
  2862                              <1> loc_delete_direntry_return:
  2863 0000B463 A1[14870100]        <1> 	mov	eax, [DelFile_FCluster]
  2864                              <1> loc_delete_direntry_err_return:
  2865 0000B468 C3                  <1> 	retn
  2866                              <1> 
  2867                              <1> rename_directory_entry:
  2868                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2869                              <1> 	; 13/11/2017
  2870                              <1> 	; 15/10/2016
  2871                              <1> 	; 06/03/2016 (TRDOS 386 = TRDOS v2.0)
  2872                              <1> 	; 01/08/2011 (DIR.ASM, 'proc_rename_directory_entry')
  2873                              <1> 	; 19/11/2010
  2874                              <1> 	; INPUT -> (Current Directory)
  2875                              <1> 	;	CX = Directory Entry Number
  2876                              <1> 	;      EAX = First Cluster number of file or directory
  2877                              <1> 	;      EBX = Longname Length (dir entry count) (< 256)
  2878                              <1> 	;      ESI = New file (or directory) name (no path).
  2879                              <1> 	;           (ASCIIZ string)
  2880                              <1> 	; OUTPUT -> 
  2881                              <1> 	;      CF = 0 -> successfull
  2882                              <1> 	;      CF = 1 -> error code in EAX (AL)
  2883                              <1> 	;
  2884                              <1> 	; (EAX, EBX, ECX, EDX, ESI, EDI will be changed)
  2885                              <1> 
  2886 0000B469 803D[B17D0100]00    <1> 	cmp	byte [Current_FATType], 0
  2887 0000B470 7705                <1> 	ja	short loc_rename_directory_entry
  2888                              <1> 
  2889                              <1> 	;call	rename_fs_file_or_directory
  2890                              <1> 	;retn
  2891                              <1> 	; 29/07/2022
  2892 0000B472 E9F40E0000          <1>  	jmp	rename_fs_file_or_directory
  2893                              <1> 	
  2894                              <1> loc_rename_directory_entry:
  2895 0000B477 881D[1A870100]      <1> 	mov	[DelFile_LNEL], bl
  2896 0000B47D 66890D[18870100]    <1> 	mov	[DelFile_EntryCounter], cx
  2897 0000B484 A3[14870100]        <1> 	mov	[DelFile_FCluster], eax
  2898                              <1> 
  2899 0000B489 0FB7C1              <1> 	movzx	eax, cx
  2900 0000B48C E8CEFDFFFF          <1> 	call	locate_current_dir_entry
  2901 0000B491 7307                <1> 	jnc	short loc_rename_direntry_check_fcluster
  2902                              <1> 
  2903                              <1> loc_rename_direntry_pop_retn:
  2904 0000B493 C3                  <1> 	retn
  2905                              <1> 
  2906                              <1> loc_rename_direntry_pop_invd_retn:
  2907                              <1> 	; 29/07/2022
  2908                              <1> 	;stc
  2909                              <1> loc_rename_direntry_invd_retn:
  2910                              <1> 	; 15/10/2016 (0Dh -> 29)
  2911                              <1> 	;mov	eax, 29 ; Invalid data
  2912                              <1> 	; 29/07/2022
  2913 0000B494 29C0                <1> 	sub	eax, eax
  2914 0000B496 B01D                <1> 	mov	al, 29
  2915 0000B498 F9                  <1> 	stc
  2916                              <1> loc_rename_retn:
  2917 0000B499 C3                  <1> 	retn
  2918                              <1> 
  2919                              <1> loc_rename_direntry_check_fcluster:
  2920 0000B49A 668B5714            <1> 	mov	dx, [edi+20] ; First Cluster HW
  2921 0000B49E C1E210              <1> 	shl	edx, 16 ; 13/11/2017
  2922 0000B4A1 668B571A            <1> 	mov	dx, [edi+26] ; First Cluster LW
  2923 0000B4A5 3B15[14870100]      <1> 	cmp	edx, [DelFile_FCluster]
  2924 0000B4AB 75E7                <1> 	jne	short loc_rename_direntry_pop_invd_retn
  2925                              <1> 	; ESI = New file (or directory) name. (ASCIIZ string)
  2926                              <1> 	; 06/03/2016
  2927                              <1> 	; TRDOS v2 - NOTE: 'convert_file_name' procedure
  2928                              <1> 	; has been modified for eliminating following situation.
  2929                              <1> 	; 
  2930                              <1> 	; TRDOS v1 - NOTE: If file/dir name is more than 11 bytes
  2931                              <1> 	; without a dot, attributes (edi+11) byte will be overwritten !
  2932                              <1> 	; (Dot file name input must be proper for 11 byte dir entry
  2933                              <1> 	;  type file name output.)
  2934 0000B4AD E8E9F6FFFF          <1> 	call	convert_file_name
  2935                              <1> 
  2936 0000B4B2 C605[D9840100]02    <1>         mov     byte [DirBuff_ValidData], 2
  2937 0000B4B9 E8DEFBFFFF          <1> 	call	save_directory_buffer
  2938 0000B4BE 72D9                <1> 	jc	short loc_rename_retn
  2939                              <1> 
  2940                              <1> loc_rename_direntry_del_ln:
  2941 0000B4C0 0FB615[1A870100]    <1> 	movzx	edx, byte [DelFile_LNEL]
  2942 0000B4C7 08D2                <1> 	or	dl, dl
  2943 0000B4C9 7410                <1> 	jz	short loc_rename_direntry_update_parent_dir_lm_date
  2944                              <1> 
  2945 0000B4CB 0FB705[18870100]    <1> 	movzx	eax, word [DelFile_EntryCounter]
  2946 0000B4D2 29D0                <1> 	sub	eax, edx
  2947 0000B4D4 72BE                <1> 	jc	short loc_rename_direntry_invd_retn
  2948                              <1> 
  2949                              <1> loc_rename_direntry_del_ln_continue:
  2950                              <1> 	; EAX = Directory Entry Number of the long name last entry
  2951 0000B4D6 E81BFDFFFF          <1> 	call	delete_longname
  2952                              <1> 
  2953                              <1> loc_rename_direntry_update_parent_dir_lm_date:
  2954 0000B4DB E854FCFFFF          <1> 	call	update_parent_dir_lmdt
  2955 0000B4E0 31C0                <1> 	xor	eax, eax
  2956 0000B4E2 C3                  <1> 	retn
  2957                              <1> 
  2958                              <1> move_source_file_to_destination_file:
  2959                              <1> 	; 07/08/2022
  2960                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2961                              <1> 	; 15/10/2016
  2962                              <1> 	; 11/03/2016
  2963                              <1> 	; 10/03/2016 (TRDOS 386 = TRDOS v2.0)
  2964                              <1> 	; 01/08/2011 (FILE.ASM)
  2965                              <1> 	; 04/08/2010
  2966                              <1> 	;
  2967                              <1> 	;   Phase 1 -> Check destination file,
  2968                              <1> 	;              'not found' is required
  2969                              <1> 	;   Phase 2 -> Check source file
  2970                              <1> 	;              'found' and proper attributes is required
  2971                              <1> 	;   Phase 3 -> Make destination directory entry,
  2972                              <1> 	;           add new dir cluster or section if it is required
  2973                              <1> 	;   Phase 4 -> Delete source directory entry.
  2974                              <1> 	;       cf = 1 causes to return before the phase 4.
  2975                              <1> 	;    (source file protection against any possible errors)
  2976                              <1> 	;
  2977                              <1> 	; 08/05/2011 major modification
  2978                              <1> 	;            -> destination file deleting is removed
  2979                              <1> 	;            for msdos move/rename compatibility.
  2980                              <1> 	;            (Access denied error will return if
  2981                              <1> 	;            the destination file is found...)
  2982                              <1> 	; INPUT ->
  2983                              <1> 	;	 ESI = Source File Pathname (Asciiz)
  2984                              <1> 	;        EDI = Destination File Pathname (Asciiz)
  2985                              <1> 	;        AL = 0 --> Interrupt (System call)
  2986                              <1> 	;        AL > 0 --> Command Interpreter (Question)
  2987                              <1> 	;        AL = 1 --> Question Phase
  2988                              <1> 	;        AL = 2 --> Progress Phase
  2989                              <1> 	; OUTPUT ->
  2990                              <1> 	;	 cf = 0 -> OK
  2991                              <1> 	;        EAX = Destination directory first cluster
  2992                              <1> 	;        ESI = Logical DOS drive description table
  2993                              <1> 	;        EBX = Destination file structure offset
  2994                              <1> 	;        CX = 0 (CX > 0 --> calculate free space error)
  2995                              <1> 	;        cf = 1 -> Error code in EAX (AL) 
  2996                              <1> 	;
  2997                              <1> 	;  (EDX, ECX, EBX, ESI, EDI will be changed)
  2998                              <1> 
  2999 0000B4E3 3C02                <1> 	cmp	al, 2
  3000                              <1> 	;je	msftdf_df2_check_directory
  3001                              <1> 	; 29/07/2022
  3002 0000B4E5 7505                <1> 	jne	short msftdf
  3003 0000B4E7 E97B010000          <1> 	jmp	msftdf_df2_check_directory
  3004                              <1> msftdf:
  3005 0000B4EC A2[9E880100]        <1> 	mov	[move_cmd_phase], al
  3006                              <1> 
  3007                              <1> msftdf_parse_sf_path:
  3008                              <1> 	; ESI = ASCIIZ pathname (Source)
  3009 0000B4F1 57                  <1> 	push	edi 
  3010 0000B4F2 BF[9C870100]        <1> 	mov	edi, SourceFile_Drv
  3011 0000B4F7 E869F7FFFF          <1> 	call	parse_path_name
  3012 0000B4FC 5E                  <1> 	pop	esi
  3013 0000B4FD 7211                <1> 	jc	short msftdf_psf_retn
  3014                              <1> 
  3015                              <1> msftdf_parse_df_path:
  3016                              <1> 	; ESI = ASCIIZ pathname	(Destination)
  3017 0000B4FF BF[1C880100]        <1> 	mov	edi, DestinationFile_Drv
  3018 0000B504 E85CF7FFFF          <1> 	call	parse_path_name
  3019 0000B509 7306                <1> 	jnc	short msftdf_check_sf_drv
  3020                              <1> 
  3021 0000B50B 3C01                <1> 	cmp	al, 1 ; File or directory name is not existing
  3022 0000B50D 7602                <1> 	jna	short msftdf_check_sf_drv
  3023                              <1> 
  3024                              <1> msftdf_stc_retn:
  3025 0000B50F F9                  <1> 	stc
  3026                              <1> msftdf_psf_retn:
  3027 0000B510 C3                  <1> 	retn
  3028                              <1> 
  3029                              <1> msftdf_check_sf_drv:
  3030 0000B511 A0[9C870100]        <1> 	mov	al, [SourceFile_Drv]
  3031                              <1> 
  3032                              <1> msftdf_check_df_drv:
  3033 0000B516 8A15[1C880100]      <1> 	mov	dl, [DestinationFile_Drv]
  3034                              <1> 
  3035                              <1> msftdf_compare_sf_df_drv:
  3036 0000B51C 29DB                <1> 	sub	ebx, ebx
  3037 0000B51E 8A3D[B27D0100]      <1> 	mov	bh, [Current_Drv]
  3038 0000B524 38C2                <1> 	cmp	dl, al
  3039 0000B526 7408                <1> 	je	short msftdf_check_sf_df_drv_ok
  3040                              <1> 
  3041                              <1> msftdf_not_same_drv:
  3042                              <1>         ; DL = source file's drive number
  3043 0000B528 88C6                <1> 	mov	dh, al ; destination file's drive number
  3044                              <1> 	; 15/10/2016 (11h -> 21)
  3045                              <1> 	;mov	eax, 21 ; Not the same drive
  3046                              <1> 	; 29/07/2022
  3047 0000B52A 29C0                <1> 	sub	eax, eax
  3048 0000B52C B015                <1> 	mov	al, 21
  3049 0000B52E F9                  <1> 	stc
  3050 0000B52F C3                  <1> 	retn 
  3051                              <1> 
  3052                              <1> msftdf_check_sf_df_drv_ok:
  3053 0000B530 8815[9F880100]      <1> 	mov	[msftdf_sf_df_drv], dl
  3054                              <1> 
  3055 0000B536 29C0                <1>         sub	eax, eax
  3056 0000B538 88D4                <1> 	mov	ah, dl
  3057 0000B53A 0500010900          <1> 	add	eax, Logical_DOSDisks
  3058 0000B53F A3[A0880100]        <1> 	mov	[msftdf_drv_offset], eax
  3059                              <1> 
  3060 0000B544 38FA                <1> 	cmp	dl, bh ; byte [Current_Drv]
  3061 0000B546 7407                <1> 	je	short msftdf_df_check_directory
  3062                              <1> 
  3063                              <1> msftdf_change_drv:
  3064 0000B548 E830C3FFFF          <1> 	call 	change_current_drive
  3065 0000B54D 726D                <1> 	jc	short msftdf_df_error_retn
  3066                              <1> 	  
  3067                              <1> msftdf_check_destination_file:
  3068                              <1> msftdf_df_check_directory:
  3069 0000B54F BE[1D880100]        <1> 	mov	esi, DestinationFile_Directory
  3070 0000B554 803E20              <1> 	cmp	byte [esi], 20h
  3071 0000B557 760F                <1> 	jna	short msftdf_df_find_1
  3072                              <1> 
  3073                              <1> msftdf_df_change_directory:
  3074 0000B559 FE05[CF340100]      <1> 	inc	byte [Restore_CDIR]
  3075 0000B55F 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0
  3076 0000B561 E815F1FFFF          <1> 	call	change_current_directory
  3077 0000B566 7254                <1> 	jc	short msftdf_df_error_retn
  3078                              <1> 
  3079                              <1> ;msftdf_df_change_prompt_dir_string:
  3080                              <1> ;	call 	change_prompt_dir_string
  3081                              <1> 
  3082                              <1> msftdf_df_find_1:
  3083 0000B568 BE[5E880100]        <1>         mov     esi, DestinationFile_Name
  3084 0000B56D 803E20              <1> 	cmp	byte [esi], 20h
  3085 0000B570 7632                <1> 	jna	short msftdf_df_copy_sf_name
  3086                              <1> 
  3087                              <1> msftdf_df_find_2:
  3088 0000B572 6631C0              <1> 	xor	ax, ax ; DestinationFile_AttributesMask -> any/zero
  3089 0000B575 E8F0D5FFFF          <1> 	call	find_first_file
  3090                              <1> 	;jnc	msftdf_permission_denied_retn
  3091                              <1> 	; 29/07/2022
  3092 0000B57A 7205                <1> 	jc	short msftdf_df_check_error_code
  3093 0000B57C E98B000000          <1> 	jmp	msftdf_permission_denied_retn
  3094                              <1> 
  3095                              <1> msftdf_df_check_error_code:
  3096                              <1> 	;cmp	eax, 2 ; File not found error
  3097 0000B581 3C02                <1> 	cmp	al, 2
  3098 0000B583 7536                <1> 	jne	short msftdf_df_stc_retn
  3099                              <1> 
  3100                              <1> msftdf_df_check_fname:
  3101                              <1> 	; 15/10/2016
  3102 0000B585 BE[5E880100]        <1> 	mov	esi, DestinationFile_Name ; *
  3103 0000B58A E880D9FFFF          <1> 	call	check_filename
  3104 0000B58F 7307                <1> 	jnc	short msftdf_convert_df_direntry_name
  3105                              <1> 	; invalid file name chars !
  3106 0000B591 B81A000000          <1> 	mov	eax, ERR_INV_FILE_NAME  ; 26
  3107 0000B596 EB23                <1> 	jmp	short msftdf_df_stc_retn
  3108                              <1> 
  3109                              <1> msftdf_convert_df_direntry_name:
  3110                              <1> 	; mov	esi, DestinationFile_Name ; *
  3111 0000B598 BF[6E880100]        <1> 	mov	edi, DestinationFile_DirEntry
  3112 0000B59D E8F9F5FFFF          <1> 	call	convert_file_name
  3113 0000B5A2 EB19                <1>   	jmp	short msftdf_restore_current_dir_1
  3114                              <1> 
  3115                              <1> msftdf_df_copy_sf_name:
  3116 0000B5A4 89F7                <1> 	mov	edi, esi
  3117 0000B5A6 57                  <1> 	push	edi
  3118 0000B5A7 BE[DE870100]        <1>         mov     esi, SourceFile_Name
  3119                              <1> 	;mov	ecx, 12
  3120                              <1> 	; 29/07/2022
  3121 0000B5AC 29C9                <1> 	sub	ecx, ecx
  3122 0000B5AE B10C                <1> 	mov	cl, 12
  3123                              <1> msftdf_df_copy_sf_name_loop:
  3124 0000B5B0 AC                  <1> 	lodsb
  3125 0000B5B1 AA                  <1>         stosb
  3126 0000B5B2 08C0                <1> 	or	al, al
  3127 0000B5B4 7402                <1> 	jz	short msftdf_df_copy_sf_name_ok
  3128 0000B5B6 E2F8                <1>         loop    msftdf_df_copy_sf_name_loop
  3129                              <1> msftdf_df_copy_sf_name_ok:
  3130 0000B5B8 5E                  <1> 	pop	esi
  3131 0000B5B9 EBB7                <1> 	jmp	short msftdf_df_find_2
  3132                              <1> 
  3133                              <1> msftdf_df_stc_retn:
  3134 0000B5BB F9                  <1> 	stc
  3135                              <1> msftdf_restore_cdir_failed:
  3136                              <1> msftdf_df_error_retn:
  3137 0000B5BC C3                  <1> 	retn
  3138                              <1> 
  3139                              <1> msftdf_restore_current_dir_1:
  3140 0000B5BD 803D[CF340100]00    <1> 	cmp	byte [Restore_CDIR], 0
  3141 0000B5C4 760D                <1> 	jna	short msftdf_sf_check_directory
  3142 0000B5C6 8B35[A0880100]      <1> 	mov	esi, [msftdf_drv_offset] 
  3143 0000B5CC E862C3FFFF          <1> 	call	restore_current_directory
  3144 0000B5D1 72E9                <1> 	jc	short msftdf_restore_cdir_failed
  3145                              <1> 
  3146                              <1> msftdf_sf_check_directory:
  3147 0000B5D3 BE[9D870100]        <1> 	mov	esi, SourceFile_Directory
  3148 0000B5D8 803E20              <1> 	cmp	byte [esi], 20h
  3149 0000B5DB 760F                <1> 	jna	short msftdf_sf_find
  3150                              <1> msftdf_sf_change_directory:
  3151 0000B5DD FE05[CF340100]      <1> 	inc	byte [Restore_CDIR]
  3152 0000B5E3 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0
  3153 0000B5E5 E891F0FFFF          <1> 	call	change_current_directory
  3154 0000B5EA 7225                <1> 	jc	short msftdf_return
  3155                              <1> 
  3156                              <1> ;msftdf_sf_change_prompt_dir_string:
  3157                              <1> ;	call	change_prompt_dir_string
  3158                              <1> 
  3159                              <1> msftdf_sf_find:
  3160 0000B5EC BE[DE870100]        <1>         mov     esi, SourceFile_Name  ; Offset 66
  3161 0000B5F1 66B80018            <1> 	mov	ax, 1800h ; Only files
  3162 0000B5F5 E870D5FFFF          <1> 	call	find_first_file
  3163 0000B5FA 7215                <1> 	jc	short msftdf_return
  3164                              <1> 
  3165                              <1> msftdf_sf_ambgfn_check:
  3166 0000B5FC 6609D2              <1> 	or	dx, dx ; Ambiguous filename chars used sign (DX>0)
  3167 0000B5FF 7406                <1> 	jz	short msftdf_sf_found
  3168                              <1> 
  3169                              <1> msftdf_ambiguous_file_name_error:
  3170                              <1> 	;mov	eax, 2 ; File not found error
  3171                              <1> 	; 29/07/2022
  3172 0000B601 29C0                <1> 	sub	eax, eax
  3173 0000B603 B002                <1> 	mov	al, 2
  3174 0000B605 F9                  <1> 	stc
  3175 0000B606 C3                  <1> 	retn
  3176                              <1> 
  3177                              <1> msftdf_sf_found:
  3178 0000B607 80E31F              <1> 	and	bl, 1Fh ; Attributes, D-V-S-H-R
  3179 0000B60A 7415                <1> 	jz	short msftdf_save_sf_structure
  3180                              <1> 
  3181                              <1> msftdf_permission_denied_retn:
  3182                              <1> 	;mov	eax, 05h ; Access (Permission) denied !
  3183                              <1> 	; 29/07/2022
  3184 0000B60C 29C0                <1> 	sub	eax, eax
  3185 0000B60E B005                <1> 	mov	al, 5
  3186 0000B610 F9                  <1> 	stc
  3187                              <1> msftdf_rest_cdir_err_retn:
  3188                              <1> msftdf_return:
  3189 0000B611 C3                  <1> 	retn
  3190                              <1> 
  3191                              <1> msftdf_phase_1_return:
  3192 0000B612 31C0                <1> 	xor	eax, eax
  3193 0000B614 A2[9E880100]        <1> 	mov	[move_cmd_phase], al ; 0
  3194 0000B619 FEC0                <1> 	inc	al ; mov al, 1
  3195 0000B61B BB[67B60000]        <1> 	mov	ebx, msftdf_df2_check_directory
  3196                              <1> 	;mov	edx, 0FFFFFFFFh 
  3197 0000B620 C3                  <1> 	retn
  3198                              <1> 
  3199                              <1> msftdf_save_sf_structure:
  3200 0000B621 BE[A4860100]        <1> 	mov	esi, FindFile_DirEntry
  3201 0000B626 BF[EE870100]        <1> 	mov	edi, SourceFile_DirEntry
  3202                              <1> 	;mov	ecx, 8
  3203                              <1> 	; 29/07/2022
  3204 0000B62B 29C9                <1> 	sub	ecx, ecx
  3205 0000B62D B108                <1> 	mov	cl, 8
  3206 0000B62F F3A5                <1> 	rep	movsd
  3207                              <1> 
  3208                              <1> msftdf_df_copy_sf_parameters:
  3209 0000B631 BE0B000000          <1> 	mov	esi, 11
  3210 0000B636 89F7                <1> 	mov	edi, esi
  3211 0000B638 81C6[EE870100]      <1> 	add	esi, SourceFile_DirEntry
  3212 0000B63E 81C7[6E880100]      <1> 	add	edi, DestinationFile_DirEntry
  3213                              <1> 	;mov	ecx, 21
  3214 0000B644 B115                <1> 	mov	cl, 21
  3215 0000B646 F3A4                <1> 	rep	movsb
  3216                              <1> 
  3217                              <1> msftdf_restore_current_dir_2:
  3218 0000B648 803D[CF340100]00    <1> 	cmp	byte [Restore_CDIR], 0
  3219 0000B64F 760D                <1> 	jna	short msftdf_df2_check_move_cmd_phase
  3220 0000B651 8B35[A0880100]      <1>  	mov	esi, [msftdf_drv_offset]
  3221 0000B657 E8D7C2FFFF          <1> 	call	restore_current_directory
  3222 0000B65C 72B3                <1> 	jc	short msftdf_rest_cdir_err_retn
  3223                              <1> 
  3224                              <1> msftdf_df2_check_move_cmd_phase:
  3225 0000B65E 803D[9E880100]01    <1> 	cmp	byte [move_cmd_phase], 1
  3226 0000B665 74AB                <1> 	je	short msftdf_phase_1_return
  3227                              <1> 
  3228                              <1> msftdf_df2_check_directory:
  3229 0000B667 BE[1D880100]        <1> 	mov	esi, DestinationFile_Directory
  3230 0000B66C 803E20              <1> 	cmp	byte [esi], 20h
  3231 0000B66F 760F                <1> 	jna	short msftdf_make_dfde_locate_ffe_on_directory
  3232                              <1> msftdf_df2_change_directory:
  3233 0000B671 FE05[CF340100]      <1> 	inc	byte [Restore_CDIR]
  3234 0000B677 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0
  3235 0000B679 E8FDEFFFFF          <1> 	call	change_current_directory
  3236 0000B67E 7291                <1> 	jc	short msftdf_return
  3237                              <1> 
  3238                              <1> ;msftdf_df2_change_prompt_dir_string:
  3239                              <1> ;	call	change_prompt_dir_string
  3240                              <1> 
  3241                              <1> msftdf_make_dfde_locate_ffe_on_directory:
  3242                              <1> 	; Current directory fcluster <> Directory buffer cluster
  3243                              <1> 	; Current directory will be reloaded by
  3244                              <1> 	; 'locate_current_dir_file' procedure
  3245                              <1> 	;
  3246                              <1> 	;xor	ax, ax
  3247 0000B680 31C0                <1> 	xor	eax, eax
  3248 0000B682 89C1                <1> 	mov	ecx, eax
  3249 0000B684 6649                <1> 	dec	cx ; FFFFh
  3250                              <1> 		; CX = FFFFh -> find first deleted or free entry
  3251                              <1> 		; ESI would be ASCIIZ filename address if the call
  3252                              <1> 		; would not be for first free or deleted dir entry
  3253 0000B686 E843F2FFFF          <1> 	call	locate_current_dir_file
  3254                              <1> 	; 07/08/2022
  3255 0000B68B 733F                <1> 	jnc	short msftdf_make_dfde_set_ff_dir_entry
  3256                              <1> 
  3257                              <1> 	;cmp	eax, 2
  3258 0000B68D 3C02                <1>         cmp	al, 2
  3259 0000B68F 7537                <1> 	jne	short msftdf_error_retn
  3260                              <1> 
  3261                              <1> msftdf_add_new_dir_entry_check_fs:
  3262 0000B691 8B35[A0880100]      <1> 	mov	esi, [msftdf_drv_offset]
  3263 0000B697 A1[DE840100]        <1> 	mov 	eax, [DirBuff_Cluster]
  3264 0000B69C 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  3265 0000B6A0 7711                <1> 	ja	short msftdf_add_new_subdir_cluster
  3266                              <1> 
  3267                              <1> msftdf_add_new_fs_subdir_section:
  3268                              <1> 	;CL=0, CH=E5h --> deleted entry, CH=0 --> free entry
  3269                              <1>         ;xor	cx, cx
  3270 0000B6A2 30ED                <1> 	xor	ch, ch ; cx = 0 --> add a new subdir section
  3271 0000B6A4 E8C20C0000          <1> 	call	add_new_fs_section
  3272 0000B6A9 721E                <1>         jc	short msftdf_dsfde_error_retn
  3273                              <1> 	;mov	[createfile_LastDirCluster], eax
  3274                              <1> 
  3275 0000B6AB E8B20E0000          <1> 	call	load_FS_sub_directory
  3276                              <1> 	;mov	ebx, Directory_Buffer
  3277 0000B6B0 7318                <1> 	jnc	short msftdf_add_new_fs_subdir_section_ok
  3278 0000B6B2 C3                  <1> 	retn
  3279                              <1> 
  3280                              <1> msftdf_add_new_subdir_cluster:
  3281 0000B6B3 E843150000          <1> 	call	add_new_cluster
  3282 0000B6B8 720F                <1> 	jc	short msftdf_dsfde_error_retn
  3283                              <1> 
  3284                              <1> 	;mov	[createfile_LastDirCluster], eax
  3285                              <1> 
  3286 0000B6BA E8690E0000          <1> 	call	load_FAT_sub_directory
  3287 0000B6BF 7309                <1> 	jnc	short msftdf_add_new_subdir_cluster_ok
  3288                              <1> 	; EBX = Directory buffer address
  3289                              <1> 
  3290                              <1> msftdf_ansdc_update_parent_dir_lmdt:
  3291                              <1> msftdf_make_dfde_err_upd_pdir_lmdt:
  3292 0000B6C1 50                  <1> 	push	eax
  3293 0000B6C2 E86DFAFFFF          <1> 	call	update_parent_dir_lmdt
  3294 0000B6C7 58                  <1> 	pop	eax
  3295                              <1> 
  3296                              <1> msftdf_error_retn:
  3297 0000B6C8 F9                  <1> 	stc
  3298                              <1> msftdf_dsfde_restore_cdir_failed:
  3299                              <1> msftdf_dsfde_error_retn:
  3300 0000B6C9 C3                  <1> 	retn
  3301                              <1> 
  3302                              <1> msftdf_add_new_fs_subdir_section_ok:
  3303                              <1> msftdf_add_new_subdir_cluster_ok:
  3304 0000B6CA 89DF                <1> 	mov	edi, ebx ; Directory buffer address
  3305                              <1> 
  3306                              <1> msftdf_make_dfde_set_ff_dir_entry:
  3307 0000B6CC 8B15[AC7D0100]      <1> 	mov	edx, [Current_Dir_FCluster]
  3308 0000B6D2 8915[04890100]      <1> 	mov	[createfile_FFCluster], edx
  3309                              <1> 	; EDI = Directory entry offset
  3310 0000B6D8 BE[6E880100]        <1> 	mov	esi, DestinationFile_DirEntry
  3311                              <1> 	;mov	ecx, 8
  3312                              <1> 	; 29/07/2022
  3313 0000B6DD 29C9                <1> 	sub	ecx, ecx
  3314 0000B6DF B108                <1> 	mov	cl, 8
  3315 0000B6E1 F3A5                <1> 	rep	movsd
  3316                              <1> 
  3317 0000B6E3 C605[D9840100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  3318 0000B6EA E8ADF9FFFF          <1> 	call	save_directory_buffer
  3319 0000B6EF 72D0                <1> 	jc	short msftdf_make_dfde_err_upd_pdir_lmdt
  3320                              <1> 
  3321                              <1> msftdf_make_dfde_update_pdir_lmdt:
  3322 0000B6F1 E83EFAFFFF          <1> 	call	update_parent_dir_lmdt
  3323                              <1> 
  3324                              <1> msftdf_dsfde_restore_current_dir_1:
  3325 0000B6F6 803D[CF340100]00    <1> 	cmp	byte [Restore_CDIR], 0
  3326 0000B6FD 760D                <1> 	jna	short msftdf_dsfde_check_directory
  3327 0000B6FF 8B35[A0880100]      <1>  	mov	esi, [msftdf_drv_offset]
  3328 0000B705 E829C2FFFF          <1> 	call	restore_current_directory
  3329 0000B70A 72BD                <1> 	jc	short msftdf_dsfde_restore_cdir_failed
  3330                              <1> 
  3331                              <1> msftdf_dsfde_check_directory:
  3332 0000B70C BE[9D870100]        <1> 	mov	esi, SourceFile_Directory
  3333 0000B711 803E20              <1> 	cmp	byte [esi], 20h
  3334 0000B714 760F                <1> 	jna	short msftdf_dsfde_find_file
  3335                              <1> 
  3336                              <1> msftdf_dsfde_change_directory:
  3337 0000B716 FE05[CF340100]      <1> 	inc	byte [Restore_CDIR]
  3338 0000B71C 28E4                <1> 	sub	ah, ah ; CD_COMMAND sign -> 0
  3339 0000B71E E858EFFFFF          <1> 	call	change_current_directory
  3340 0000B723 72A4                <1> 	jc	short msftdf_dsfde_error_retn
  3341                              <1> 
  3342                              <1> ;msftdf_dsfde_sf_change_prompt_dir_string:
  3343                              <1> ;	call	change_prompt_dir_string
  3344                              <1> 
  3345                              <1> msftdf_dsfde_find_file:
  3346 0000B725 BE[DE870100]        <1> 	mov	esi, SourceFile_Name  ; Offset 66
  3347 0000B72A 668B460E            <1> 	mov	ax, [esi+14] ; 80 -> SourceFile_AttributesMask
  3348 0000B72E E837D4FFFF          <1> 	call	find_first_file
  3349 0000B733 7294                <1> 	jc	short msftdf_dsfde_error_retn
  3350                              <1> 
  3351                              <1> msftdf_dsfde_delete_direntry:
  3352 0000B735 8B35[A0880100]      <1> 	mov	esi, [msftdf_drv_offset]
  3353                              <1> 
  3354 0000B73B 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  3355 0000B73F 770A                <1> 	ja	short msftdf_delete_FAT_direntry
  3356                              <1> 
  3357 0000B741 30DB                <1> 	xor	bl, bl
  3358                              <1> 	; BL = 0 -> File
  3359                              <1> 	; EDI -> Directory buffer entry offset/address 
  3360 0000B743 E8230C0000          <1> 	call	delete_fs_directory_entry
  3361 0000B748 7315                <1> 	jnc	short msftdf_dsfde_restore_current_dir_2
  3362 0000B74A C3                  <1> 	retn
  3363                              <1> 
  3364                              <1> msftdf_delete_FAT_direntry:
  3365 0000B74B 8A1D[A1860100]      <1> 	mov	bl, [FindFile_LongNameEntryLength]
  3366 0000B751 668B0D[CC860100]    <1> 	mov	cx, [FindFile_DirEntryNumber]
  3367                              <1> 	; ESI = Logical DOS drive description table address
  3368                              <1> 	; EDI = Directory buffer entry offset/address
  3369 0000B758 E8A0FCFFFF          <1> 	call	delete_directory_entry
  3370 0000B75D 721C                <1> 	jc	short msftdf_retn
  3371                              <1> 
  3372                              <1> msftdf_dsfde_restore_current_dir_2:
  3373 0000B75F 803D[CF340100]00    <1> 	cmp	byte [Restore_CDIR], 0
  3374 0000B766 7607                <1> 	jna	short msftdf_new_dir_fcluster_retn
  3375                              <1> 	;mov	esi, [msftdf_drv_offset]
  3376 0000B768 E8C6C1FFFF          <1> 	call	restore_current_directory
  3377 0000B76D 720C                <1> 	jc	short msftdf_retn
  3378                              <1> 
  3379                              <1> msftdf_new_dir_fcluster_retn:
  3380 0000B76F 31C9                <1> 	xor	ecx, ecx 
  3381 0000B771 A1[04890100]        <1> 	mov	eax, [createfile_FFCluster]
  3382 0000B776 BB[1C880100]        <1> 	mov	ebx, DestinationFile_Drv
  3383                              <1> 
  3384                              <1> msftdf_retn:
  3385 0000B77B C3                  <1> 	retn
  3386                              <1> 
  3387                              <1> copy_source_file_to_destination_file:
  3388                              <1> 	; 31/08/2024
  3389                              <1> 	; 30/08/2024
  3390                              <1> 	; 29/08/2024
  3391                              <1> 	; 26/08/2024
  3392                              <1> 	; 25/08/2024 (TRDOS 386 v2.0.9)
  3393                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  3394                              <1> 	; 17/10/2016
  3395                              <1> 	; 16/10/2016
  3396                              <1> 	; 15/10/2016
  3397                              <1> 	; 30/03/2016, 31/03/2016
  3398                              <1> 	; 24/03/2016, 25/03/2016, 28/03/2016
  3399                              <1> 	; 21/03/2016, 22/03/2016, 23/03/2016
  3400                              <1> 	; 16/03/2016, 17/03/2016, 18/03/2016
  3401                              <1> 	; 15/03/2016 (TRDOS 386 = TRDOS v2.0)
  3402                              <1> 	; 02/09/2011 (FILE.ASM 'copy_source_file_to_destination_file')
  3403                              <1> 	; 01/08/2010 - 18/05/2011
  3404                              <1> 	;
  3405                              <1> 	;   Command Interpreter phase 1 enter ->
  3406                              <1> 	;           AL = 1 -> Caller is command interpreter
  3407                              <1> 	;           AL = 2 -> The second call, re-enter/continue
  3408                              <1> 	;   Phase 1 -> Check source file
  3409                              <1> 	;              'found' is required
  3410                              <1> 	;   Phase 2 -> Check destination file,
  3411                              <1> 	;              save 'found' or 'not found' status
  3412                              <1> 	;              'permission denied' error will be return
  3413                              <1> 	;              if attributes have not for ordinary file
  3414                              <1> 	;              without readonly attribute
  3415                              <1> 	;   Command Interpreter phase 1 return ->
  3416                              <1> 	;              DH = Source file attributes
  3417                              <1> 	;              DL = Destination file found status
  3418                              <1> 	;              EAX = 0
  3419                              <1> 	;   Command Interpreter phase 2 enter ->
  3420                              <1> 	;              AL = 2 -> Continue from the last position
  3421                              <1> 	;              AH =
  3422                              <1> 	;   Phase 3 -> Load source file or use read/write cluster method
  3423                              <1> 	;   Phase 4 -> Create destination file if it is not found
  3424                              <1> 	;   Phase 5 -> Open destination file
  3425                              <1> 	;   Phase 6 -> Read from source and write to destination
  3426                              <1> 	;   Phase 7 -> Unload source file, if it is loaded at memory
  3427                              <1> 	;       cf = 1 causes to return before the phase 7
  3428                              <1> 	;              but loaded file will be unloaded
  3429                              <1> 	;	       (allocated memory block will be deallocated)
  3430                              <1> 	;
  3431                              <1> 	; INPUT ->
  3432                              <1> 	;	 ESI = Source File Pathname (Asciiz)
  3433                              <1> 	;        EDI = Destination File Pathname (Asciiz)
  3434                              <1> 	;        AL = 0 --> Interrupt (System call)
  3435                              <1> 	;        AL > 0 --> Command Interpreter (Question)
  3436                              <1> 	;        AL = 1 --> Question Phase
  3437                              <1> 	;        AL = 2 --> Progress Phase
  3438                              <1> 	;
  3439                              <1> 	; OUTPUT ->
  3440                              <1> 	;	cf = 0 -> OK ; (*)
  3441                              <1> 	;	EAX = Destination file first cluster
  3442                              <1> 	;
  3443                              <1> 	;	31/08/2024 - TRDOS v2.0.9 ; (*)
  3444                              <1> 	; obsolete ;CL > 0 if there is file reading error before EOF
  3445                              <1> 	;          ;	        (incomplete copy) 
  3446                              <1> 	;          ;CH > 0 if file is (full) loaded at memory
  3447                              <1> 	;
  3448                              <1> 	;	cf = 1 -> Error code in AL (EAX) ; (*)
  3449                              <1> 	;
  3450                              <1> 	; (EBX, ECX, ESI, EDI register contents will be changed)
  3451                              <1> 
  3452 0000B77C 3C02                <1> 	cmp	al, 2
  3453                              <1> 	;je	csftdf2_check_cdrv
  3454                              <1> 	; 29/07/2022
  3455 0000B77E 7205                <1> 	jb	short csftdf_ph1
  3456                              <1> 	;jmp	csftdf2_check_cdrv
  3457 0000B780 E942020000          <1> 	jmp	csftdf_ph2
  3458                              <1> 
  3459                              <1> ; Phase 1
  3460                              <1> 	; 29/07/2022
  3461                              <1> csftdf_ph1:
  3462 0000B785 A2[C4880100]        <1> 	mov	byte [copy_cmd_phase], al
  3463                              <1> 
  3464 0000B78A 57                  <1> 	push	edi ; *
  3465                              <1> 
  3466                              <1> csftdf_parse_sf_path:
  3467 0000B78B BF[9C870100]        <1> 	mov	edi, SourceFile_Drv
  3468 0000B790 E8D0F4FFFF          <1> 	call	parse_path_name
  3469 0000B795 721C                <1> 	jc	short csftdf_parse_sf_path_failed
  3470                              <1> 
  3471                              <1> csftdf_parse_df_path:
  3472 0000B797 5E                  <1> 	pop	esi ; * (pushed edi)
  3473                              <1> 
  3474                              <1> csftdf_sf_check_filename_exists:
  3475 0000B798 803D[DE870100]21    <1> 	cmp	byte [SourceFile_Name], 21h
  3476 0000B79F 7214                <1> 	jb	short csftdf_sf_file_not_found_error
  3477                              <1> 
  3478 0000B7A1 BF[1C880100]        <1> 	mov	edi, DestinationFile_Drv
  3479 0000B7A6 E8BAF4FFFF          <1> 	call	parse_path_name
  3480 0000B7AB 730E                <1> 	jnc	short csftdf_check_sf_cdrv
  3481                              <1> 
  3482 0000B7AD 3C01                <1> 	cmp	al, 1 ; File or directory name is not existing
  3483 0000B7AF 760A                <1> 	jna	short csftdf_check_sf_cdrv
  3484                              <1> 
  3485                              <1> csftdf_parse_df_path_failed:
  3486 0000B7B1 F9                  <1> 	stc 
  3487                              <1> csftdf_sf_error_retn:
  3488 0000B7B2 C3                  <1> 	retn
  3489                              <1> 
  3490                              <1> csftdf_parse_sf_path_failed:
  3491 0000B7B3 5F                  <1> 	pop	edi ; *
  3492                              <1> 	;jmp	short csftdf_sf_error_retn
  3493                              <1> 	; 25/08/2024
  3494 0000B7B4 C3                  <1> 	retn
  3495                              <1> 
  3496                              <1> csftdf_sf_file_not_found_error:
  3497 0000B7B5 B802000000          <1> 	mov	eax, 2 ; File not found
  3498                              <1> 	;jmp	short csftdf_sf_error_retn
  3499                              <1> 	; 25/08/2024
  3500 0000B7BA C3                  <1> 	retn
  3501                              <1> 
  3502                              <1> csftdf_check_sf_cdrv:
  3503 0000B7BB 8A3D[B27D0100]      <1> 	mov	bh, [Current_Drv]
  3504                              <1> 
  3505 0000B7C1 883D[C7880100]      <1> 	mov	[csftdf_cdrv], bh ; 23/03/2016
  3506                              <1> 
  3507 0000B7C7 8A15[9C870100]      <1> 	mov	dl, [SourceFile_Drv]
  3508 0000B7CD 38FA                <1> 	cmp	dl, bh ; byte [Current_Drv]
  3509 0000B7CF 7407                <1> 	je	short csftdf_sf_check_directory
  3510                              <1> 
  3511 0000B7D1 E8A7C0FFFF          <1> 	call	change_current_drive
  3512 0000B7D6 72DA                <1> 	jc	short csftdf_sf_error_retn
  3513                              <1> 
  3514                              <1> csftdf_sf_check_directory:
  3515 0000B7D8 BE[9D870100]        <1> 	mov	esi, SourceFile_Directory
  3516 0000B7DD 803E20              <1> 	cmp	byte [esi], 20h
  3517 0000B7E0 760F                <1> 	jna	short csftdf_find_sf
  3518                              <1> 
  3519                              <1> csftdf_sf_change_directory:
  3520 0000B7E2 FE05[CF340100]      <1> 	inc	byte [Restore_CDIR]
  3521 0000B7E8 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0
  3522 0000B7EA E88CEEFFFF          <1> 	call	change_current_directory
  3523 0000B7EF 72C1                <1> 	jc	short csftdf_sf_error_retn
  3524                              <1> 
  3525                              <1> ;csftdf_sf_change_prompt_dir_string:
  3526                              <1> ;	call	change_prompt_dir_string
  3527                              <1> 
  3528                              <1> csftdf_find_sf:
  3529 0000B7F1 BE[DE870100]        <1> 	mov	esi, SourceFile_Name
  3530 0000B7F6 66B80018            <1> 	mov	ax, 1800h ; Except volume label and dirs
  3531 0000B7FA E86BD3FFFF          <1> 	call	find_first_file
  3532 0000B7FF 72B1                <1> 	jc	short csftdf_sf_error_retn
  3533                              <1> 
  3534                              <1> csftdf_sf_ambgfn_check:
  3535 0000B801 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
  3536 0000B804 7406                <1> 	jz	short csftdf_sf_found
  3537                              <1> 
  3538                              <1> csftdf_ambiguous_file_name_error:
  3539                              <1> 	;mov	eax, 2 ; File not found error
  3540                              <1> 	; 29/07/2022
  3541 0000B806 29C0                <1> 	sub	eax, eax
  3542 0000B808 B002                <1> 	mov	al, 2
  3543 0000B80A F9                  <1> 	stc
  3544 0000B80B C3                  <1> 	retn
  3545                              <1> 
  3546                              <1> csftdf_sf_found:
  3547 0000B80C A3[C8880100]        <1> 	mov	[csftdf_filesize], eax
  3548                              <1> 
  3549 0000B811 09C0                <1> 	or	eax, eax
  3550 0000B813 7504                <1> 	jnz	short csftdf_set_source_file_direntry
  3551                              <1> 
  3552                              <1> ;csftdf_sf_file_size_zero:
  3553                              <1> 	;mov	eax, 20 ; TRDOS zero length (file size) error
  3554                              <1> 	; 25/08/2024
  3555                              <1> 	; eax = 0
  3556                              <1> 	; 29/07/2022
  3557                              <1> 	;sub	eax, eax
  3558 0000B815 B014                <1> 	mov	al, 20
  3559 0000B817 F9                  <1> 	stc
  3560 0000B818 C3                  <1> 	retn
  3561                              <1> 
  3562                              <1> csftdf_set_source_file_direntry:
  3563 0000B819 BE[A4860100]        <1> 	mov	esi, FindFile_DirEntry
  3564 0000B81E BF[EE870100]        <1> 	mov	edi, SourceFile_DirEntry
  3565                              <1> 	;mov	ecx, 8
  3566                              <1> 	; 29/07/2022
  3567 0000B823 31C9                <1> 	xor	ecx, ecx
  3568 0000B825 B108                <1> 	mov	cl, 8
  3569 0000B827 F3A5                <1> 	rep	movsd
  3570                              <1> 
  3571                              <1> csftdf_sf_restore_cdrv:
  3572                              <1> 	; 22/03/2016
  3573 0000B829 8A15[C7880100]      <1> 	mov	dl, [csftdf_cdrv]
  3574 0000B82F 3A15[B27D0100]      <1> 	cmp	dl, [Current_Drv]
  3575 0000B835 7407                <1> 	je	short csftdf_sf_restore_cdir
  3576 0000B837 E841C0FFFF          <1> 	call	change_current_drive
  3577 0000B83C 724F                <1> 	jc	short csftdf_df_error_retn ; 30/03/2016
  3578                              <1> 
  3579                              <1> csftdf_sf_restore_cdir:
  3580 0000B83E 803D[CF340100]00    <1> 	cmp	byte [Restore_CDIR], 0
  3581 0000B845 7612                <1> 	jna	short csftdf_df_check_filename_exists
  3582 0000B847 29C0                <1> 	sub	eax, eax
  3583 0000B849 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  3584 0000B84E 88D4                <1> 	mov	ah, dl ; byte [csftdf_cdrv]
  3585 0000B850 01C6                <1> 	add	esi, eax
  3586 0000B852 E8DCC0FFFF          <1> 	call	restore_current_directory
  3587 0000B857 7234                <1> 	jc	short csftdf_df_error_retn
  3588                              <1> 
  3589                              <1> csftdf_df_check_filename_exists:
  3590 0000B859 803D[5E880100]20    <1> 	cmp	byte [DestinationFile_Name], 20h
  3591 0000B860 7716                <1> 	ja	short csftdf_check_df_cdrv
  3592                              <1> 
  3593                              <1> csftdf_copy_sf_name:
  3594 0000B862 BF[5E880100]        <1> 	mov	edi, DestinationFile_Name
  3595 0000B867 BE[DE870100]        <1> 	mov	esi, SourceFile_Name
  3596 0000B86C B10C                <1> 	mov	cl, 12
  3597                              <1> 
  3598                              <1> csftdf_df_copy_sf_name_loop:
  3599 0000B86E AC                  <1> 	lodsb
  3600 0000B86F AA                  <1> 	stosb
  3601 0000B870 08C0                <1> 	or	al, al
  3602 0000B872 7404                <1> 	jz	short csftdf_check_df_cdrv
  3603 0000B874 FEC9                <1> 	dec	cl
  3604 0000B876 75F6                <1> 	jnz	csftdf_df_copy_sf_name_loop
  3605                              <1> 
  3606                              <1> csftdf_check_df_cdrv:
  3607 0000B878 8A15[1C880100]      <1> 	mov	dl, [DestinationFile_Drv]
  3608 0000B87E 3A15[B27D0100]      <1> 	cmp	dl, [Current_Drv]
  3609 0000B884 7408                <1> 	je	short csftdf_df_check_directory
  3610                              <1> 
  3611 0000B886 E8F2BFFFFF          <1> 	call	change_current_drive
  3612 0000B88B 7301                <1> 	jnc	short csftdf_df_check_directory
  3613                              <1> 
  3614                              <1> csftdf_df_error_retn:
  3615 0000B88D C3                  <1> 	retn
  3616                              <1> 
  3617                              <1> csftdf_df_check_directory:
  3618 0000B88E BE[1D880100]        <1> 	mov	esi, DestinationFile_Directory
  3619 0000B893 803E20              <1>         cmp     byte [esi], 20h
  3620 0000B896 760F                <1> 	jna	short csftdf_find_df
  3621                              <1> 
  3622                              <1> csftdf_df_change_directory:
  3623 0000B898 FE05[CF340100]      <1> 	inc	byte [Restore_CDIR]
  3624 0000B89E 28E4                <1> 	sub	ah, ah ; CD_COMMAND sign -> 0
  3625 0000B8A0 E8D6EDFFFF          <1> 	call	change_current_directory
  3626 0000B8A5 72E6                <1> 	jc	short csftdf_df_error_retn
  3627                              <1> 
  3628                              <1> ;csftdf_df_change_prompt_dir_string:
  3629                              <1> ;	call	change_prompt_dir_string
  3630                              <1> 
  3631                              <1> csftdf_find_df:
  3632                              <1> 	; 23/03/2016
  3633 0000B8A7 29DB                <1> 	sub	ebx, ebx
  3634 0000B8A9 8A3D[1C880100]      <1> 	mov	bh, [DestinationFile_Drv]
  3635 0000B8AF 81C300010900        <1> 	add	ebx, Logical_DOSDisks
  3636 0000B8B5 891D[F4880100]      <1> 	mov	[csftdf_df_drv_dt], ebx
  3637                              <1> 
  3638 0000B8BB BE[5E880100]        <1> 	mov	esi, DestinationFile_Name
  3639                              <1> 	;xor	ax, ax
  3640                              <1> 	; 25/08/2024
  3641 0000B8C0 31C0                <1> 	xor	eax, eax
  3642                              <1> 		; DestinationFile_AttributesMask -> any/zero
  3643 0000B8C2 E8A3D2FFFF          <1> 	call	find_first_file
  3644 0000B8C7 7217                <1> 	jc	short csftdf_df_check_error_code
  3645                              <1> 
  3646                              <1> csftdf_df_ambgfn_check:
  3647 0000B8C9 6609D2              <1> 	or	dx, dx ; Ambiguous filename chars used sign (DX>0)
  3648 0000B8CC 7529                <1> 	jnz	short csftdf_df_error_inv_fname
  3649                              <1> 
  3650                              <1> csftdf_df_found:
  3651 0000B8CE C605[C6880100]01    <1> 	mov	byte [DestinationFileFound], 1
  3652                              <1> 	; 17/10/2016 (cl -> bl)
  3653 0000B8D5 80E31F              <1> 	and	bl, 1Fh ; Attributes, D-V-S-H-R
  3654 0000B8D8 7451                <1> 	jz	short csftdf_df_save_first_cluster
  3655                              <1> 
  3656                              <1> csftdf_df_permission_denied_retn:
  3657                              <1> 	;mov	eax, 05h ; Access/Permission denied.
  3658                              <1> 	; 29/07/2022
  3659 0000B8DA 29C0                <1> 	sub	eax, eax
  3660 0000B8DC B005                <1> 	mov	al, 5
  3661                              <1> csftdf_df_error_stc_retn:
  3662 0000B8DE F9                  <1> 	stc
  3663 0000B8DF C3                  <1> 	retn
  3664                              <1> 
  3665                              <1> csftdf_df_check_error_code:
  3666                              <1> 	;cmp	eax, 2
  3667 0000B8E0 3C02                <1> 	cmp	al, 2
  3668 0000B8E2 75FA                <1> 	jne	short csftdf_df_error_stc_retn
  3669                              <1> 
  3670 0000B8E4 C605[C6880100]00    <1> 	mov	byte [DestinationFileFound], 0
  3671                              <1> 
  3672                              <1> 	; 15/10/2016
  3673 0000B8EB BE[94860100]        <1> 	mov	esi, FindFile_Name ; *
  3674 0000B8F0 E81AD6FFFF          <1> 	call	check_filename
  3675 0000B8F5 7306                <1> 	jnc	short csftdf_df_valid_fname
  3676                              <1> csftdf_df_error_inv_fname: ; 'invalid file name !'
  3677                              <1> 	;mov 	eax, ERR_INV_FILE_NAME  ; 26
  3678                              <1> 	; 29/07/2022
  3679 0000B8F7 29C0                <1> 	sub	eax, eax
  3680 0000B8F9 B01A                <1> 	mov	al, ERR_INV_FILE_NAME ; 26
  3681 0000B8FB F9                  <1> 	stc
  3682 0000B8FC C3                  <1> 	retn
  3683                              <1> 
  3684                              <1> csftdf_df_valid_fname:
  3685                              <1> 	; 21/03/2016
  3686                              <1> 	; (Capitalized file name)
  3687                              <1> 	;mov	esi, FindFile_Name ; * ; 15/10/2016
  3688 0000B8FD BF[5E880100]        <1> 	mov	edi, DestinationFile_Name
  3689 0000B902 A5                  <1> 	movsd
  3690 0000B903 A5                  <1> 	movsd
  3691 0000B904 A5                  <1> 	movsd
  3692                              <1> 	;movsb
  3693                              <1> 
  3694                              <1> csftdf_check_disk_free_size_0:
  3695 0000B905 A1[0A880100]        <1> 	mov	eax, [SourceFile_DirEntry+DirEntry_FileSize]
  3696                              <1> 
  3697                              <1> csftdf_check_disk_free_size_1:
  3698                              <1> 	;sub	ebx, ebx
  3699                              <1> 	;mov 	esi, Logical_DOSDisks
  3700                              <1> 	;mov	bh,  [DestinationFile_Drv]
  3701                              <1> 	;add	esi, ebx
  3702                              <1> 
  3703 0000B90A 8B35[F4880100]      <1> 	mov	esi, [csftdf_df_drv_dt] ; 23/03/2016
  3704                              <1> 
  3705 0000B910 0FB74E11            <1> 	movzx	ecx, word [esi+LD_BPB+BytesPerSec] ; 17, LD_BPB + 0Bh
  3706 0000B914 01C8                <1> 	add	eax, ecx
  3707 0000B916 48                  <1> 	dec	eax  ; file size (additional bytes) + 511 (round up)
  3708                              <1> csftdf_check_disk_free_size_3: ; 16/03/2016
  3709 0000B917 29D2                <1> 	sub	edx, edx
  3710 0000B919 F7F1                <1> 	div	ecx ; bytes per sector
  3711                              <1> 
  3712                              <1> csftdf_check_disk_free_size:
  3713 0000B91B 3B4674              <1> 	cmp	eax, [esi+LD_FreeSectors]
  3714                              <1>         ;jb	csftdf_check_disk_free_size_ok
  3715                              <1> 	; 25/08/2024
  3716                              <1> 	; 29/07/2022
  3717                              <1> 	;jb	short csftdf_check_dfs_ok
  3718 0000B91E 7705                <1> 	ja	short csftdf_df_insufficient_disk_space
  3719                              <1> 
  3720                              <1> 	; 25/08/2024
  3721                              <1> 	;cmp	byte [esi+LD_FATType], 0 ; FS needs FDT sector also.
  3722                              <1> 	;;ja	csftdf_check_disk_free_size_ok
  3723                              <1> 	;; 29/07/2022
  3724                              <1> 	;jna	short csftdf_df_insufficient_disk_space
  3725                              <1> 
  3726                              <1> csftdf_check_dfs_ok:
  3727 0000B920 E985000000          <1> 	jmp	csftdf_check_disk_free_size_ok
  3728                              <1> 
  3729                              <1> csftdf_df_insufficient_disk_space:
  3730                              <1> 	;mov	eax, 27h ; insufficient disk space
  3731                              <1> 	; 29/07/2022
  3732 0000B925 29C0                <1> 	sub	eax, eax
  3733 0000B927 B027                <1> 	mov	al, 27h
  3734                              <1> 	;jmp	short csftdf_df_error_stc_retn
  3735                              <1> 	; 25/08/2024
  3736 0000B929 F9                  <1> 	stc
  3737 0000B92A C3                  <1> 	retn
  3738                              <1> 
  3739                              <1> csftdf_df_save_first_cluster:
  3740                              <1> 	; ESI = FindFile_DirEntry (for the old destination file)
  3741                              <1> 	; EAX = Old destination file size
  3742                              <1> 	; 24/03/2016
  3743                              <1> 	; EDI = Directory entry address (within Dir Buffer boundaries)
  3744 0000B92B 81EF00000800        <1> 	sub	edi, Directory_Buffer  ; (<65536)
  3745                              <1> 	;shr	di, 5 ; Convert entry offset to entry index/number
  3746                              <1> 	; 29/07/2022
  3747 0000B931 C1EF05              <1> 	shr	edi, 5
  3748 0000B934 66893D[96880100]    <1> 	mov	[DestinationFile_DirEntryNumber], di ; (<2048)
  3749                              <1> 
  3750                              <1> csftdf_df_check_sf_df_fcluster:
  3751 0000B93B 668B5614            <1> 	mov	dx, [esi+DirEntry_FstClusHI]
  3752 0000B93F C1E210              <1> 	shl	edx, 16
  3753 0000B942 668B561A            <1> 	mov	dx, [esi+DirEntry_FstClusLO]
  3754 0000B946 8915[D8880100]      <1> 	mov	[csftdf_df_cluster], edx
  3755                              <1> csftdf_df_check_sf_df_fcluster_1:
  3756 0000B94C 668B15[02880100]    <1> 	mov	dx, [SourceFile_DirEntry+DirEntry_FstClusHI]
  3757 0000B953 C1E210              <1> 	shl	edx, 16
  3758 0000B956 668B15[08880100]    <1> 	mov	dx, [SourceFile_DirEntry+DirEntry_FstClusLO]
  3759 0000B95D 3B15[D8880100]      <1> 	cmp	edx, [csftdf_df_cluster]
  3760 0000B963 7512                <1> 	jne	short csftdf_df_check_sf_df_fcluster_ok
  3761                              <1> csftdf_df_check_sf_df_drv:
  3762 0000B965 8A15[9C870100]      <1> 	mov	dl, [SourceFile_Drv]
  3763 0000B96B 3A15[1C880100]      <1> 	cmp	dl, [DestinationFile_Drv]
  3764 0000B971 7504                <1> 	jne	short csftdf_df_check_sf_df_fcluster_ok
  3765                              <1> 
  3766                              <1> 	; source and destination files are same !
  3767                              <1> 	; (they have same first cluster value on same logical disk)
  3768                              <1> 
  3769 0000B973 31C0                <1> 	xor	eax, eax ; mov eax, 0 -> Bad command or file name !
  3770 0000B975 F9                  <1> 	stc
  3771 0000B976 C3                  <1> 	retn
  3772                              <1> 
  3773                              <1> csftdf_df_check_sf_df_fcluster_ok:
  3774                              <1> csftdf_df_move_findfile_struct:
  3775                              <1> 	; mov	esi, FindFile_DirEntry
  3776 0000B977 BF[6E880100]        <1> 	mov	edi, DestinationFile_DirEntry
  3777                              <1> 	;mov	ecx, 8
  3778 0000B97C 31C9                <1> 	xor	ecx, ecx
  3779 0000B97E B108                <1> 	mov	cl, 8
  3780 0000B980 F3A5                <1> 	rep	movsd
  3781                              <1> 
  3782                              <1> ;csftdf_check_disk_free_size_2:
  3783 0000B982 89C2                <1> 	mov	edx, eax ; Old destination file size
  3784                              <1> 
  3785                              <1> 	;mov	eax, [SourceFile_DirEntry+DirEntry_FileSize]
  3786 0000B984 A1[C8880100]        <1> 	mov	eax, [csftdf_filesize] ; 23/03/2016
  3787                              <1> 
  3788                              <1> 	;;sub	ecx, ecx ; 0
  3789                              <1> 	;mov 	esi, Logical_DOSDisks
  3790                              <1> 	;mov	ch, [DestinationFile_Drv]
  3791                              <1> 	;add	esi, ecx
  3792                              <1> 	;
  3793                              <1> 	;mov	[csftdf_df_drv_dt], esi
  3794                              <1> 
  3795 0000B989 8B35[F4880100]      <1> 	mov	esi, [csftdf_df_drv_dt] ; 23/03/2016
  3796                              <1> 
  3797 0000B98F 668B4E11            <1> 	mov	cx, [esi+LD_BPB+BytesPerSec] ; 17, LD_BPB + 0Bh
  3798 0000B993 01CA                <1> 	add	edx, ecx ; + 512
  3799 0000B995 01C8                <1> 	add	eax, ecx ; + 512
  3800 0000B997 4A                  <1> 	dec	edx ; old file size + 511 (round up)
  3801 0000B998 48                  <1> 	dec	eax ; new file size + 511 (round up)
  3802 0000B999 F7D9                <1> 	neg	ecx ; -512 ; 0FFFFFE00h
  3803 0000B99B 21CA                <1> 	and	edx, ecx ; = old sector count * 512
  3804 0000B99D 21C8                <1> 	and	eax, ecx ; = new sector count * 512
  3805                              <1> 
  3806 0000B99F 29D0                <1> 	sub	eax, edx ; new file size - old file size (on disk)
  3807 0000B9A1 7607                <1> 	jna	short csftdf_check_disk_free_size_ok
  3808                              <1> 
  3809 0000B9A3 F7D9                <1> 	neg	ecx ; 512 (bytes per sector) ; 200h
  3810                              <1> 	; check free space for additional sectors
  3811                              <1> 	; eax = number of additional sectors * bytes per sector
  3812                              <1> 	; esi = Logical DOS drive number (of destination disk)
  3813 0000B9A5 E96DFFFFFF          <1>         jmp	csftdf_check_disk_free_size_3
  3814                              <1> 
  3815                              <1> csftdf_check_disk_free_size_ok:
  3816                              <1> 	; 18/03/2016
  3817                              <1> csftdf_df_check_copy_cmd_phase:
  3818 0000B9AA A0[C4880100]        <1> 	mov	al, [copy_cmd_phase]
  3819 0000B9AF 3C01                <1> 	cmp	al, 1
  3820 0000B9B1 7514                <1> 	jne	short csftdf2_check_cdrv
  3821                              <1> 
  3822 0000B9B3 31C0                <1> 	xor	eax, eax
  3823 0000B9B5 A2[C4880100]        <1> 	mov	[copy_cmd_phase], al ; 0
  3824                              <1> 
  3825 0000B9BA 8A15[C6880100]      <1> 	mov	dl, [DestinationFileFound]
  3826 0000B9C0 8A35[F9870100]      <1> 	mov	dh, [SourceFile_DirEntry+11] ; Attributes
  3827                              <1> 
  3828                              <1> csftdf_return:
  3829 0000B9C6 C3                  <1> 	retn
  3830                              <1> 
  3831                              <1> ; Phase 2
  3832                              <1> csftdf_ph2:
  3833                              <1> 	; 29/07/2022
  3834                              <1> csftdf2_check_cdrv:
  3835                              <1> 	; 18/03/2016
  3836                              <1> 	; Here, destination drive and directory are ready !
  3837                              <1> 	; (checking/restoring is not needed)
  3838                              <1> 	; (Since at the end of the phase 1)
  3839                              <1> 
  3840                              <1> ;	mov	dl, [DestinationFile_Drv]
  3841                              <1> ;	cmp	dl, [Current_Drv]
  3842                              <1> ;	je	short csftdf2_df_check_directory
  3843                              <1> ;
  3844                              <1> ;	call	change_current_drive
  3845                              <1> ;	jc	short csftdf2_read_error
  3846                              <1> ;
  3847                              <1> ;csftdf2_df_check_directory:
  3848                              <1> ;	mov	esi, DestinationFile_Directory
  3849                              <1> ;	cmp	byte [esi], 20h
  3850                              <1> ;	jna	short csftdf2_df_check_found_or_not
  3851                              <1> ;
  3852                              <1> ;csftdf2_df_change_directory:
  3853                              <1> ;	inc	byte [Restore_CDIR]
  3854                              <1> ;	xor	ah, ah ; CD_COMMAND sign -> 0
  3855                              <1> ;	call	change_current_directory
  3856                              <1> ;	jc	short csftdf2_stc_return
  3857                              <1> ;
  3858                              <1> ;;csftdf2_df_change_prompt_dir_string:
  3859                              <1> ;;	call	change_prompt_dir_string
  3860                              <1> 
  3861                              <1> csftdf2_df_check_found_or_not:
  3862                              <1> 	; 21/03/2016
  3863 0000B9C7 803D[C6880100]00    <1> 	cmp	byte [DestinationFileFound], 0
  3864 0000B9CE 7742                <1> 	ja	short csftdf2_set_sf_percentage
  3865                              <1> 
  3866                              <1> csftdf2_create_file:
  3867 0000B9D0 BE[5E880100]        <1> 	mov	esi, DestinationFile_Name
  3868 0000B9D5 A1[C8880100]        <1> 	mov	eax, [csftdf_filesize]
  3869 0000B9DA 30C9                <1> 	xor	cl, cl ; 0
  3870                              <1> 
  3871 0000B9DC 31DB                <1> 	xor	ebx, ebx ; 0
  3872 0000B9DE 4B                  <1> 	dec	ebx ; 0FFFFFFFFh 
  3873                              <1> 
  3874                              <1> 	; INPUT ->
  3875                              <1> 	; 	EAX -> File Size
  3876                              <1> 	; 	ESI = ASCIIZ File name
  3877                              <1> 	;	 CL = File attributes
  3878                              <1> 	;	EBX = FFFFFFFFh -> empty file sign for FAT fs
  3879                              <1> 	;	EBX <> FFFFFFFFh -> use file size for FAT fs 
  3880                              <1> 	;
  3881                              <1> 	; OUTPUT ->
  3882                              <1> 	;	EAX = New file's first cluster
  3883                              <1> 	;		 (0 for empty file) ; 29/08/2024
  3884                              <1> 	;	ESI = Logical Dos Drv Descr. Table Addr.
  3885                              <1> 	;	;EBX = CreateFile_Size address
  3886                              <1> 	;	;ECX = Sectors per cluster (<256)
  3887                              <1> 	;	;EDX = Directory Entry Index/Number (<65536)
  3888                              <1> 	;	; 29/08/2024
  3889                              <1> 	;	EBX = File Size (0 for a new, empty file)
  3890                              <1> 	;	ECX = Directory Entry Index/Number (<2048)
  3891                              <1> 	;	     (in directory cluster, not in directory)
  3892                              <1> 	;	EDX = Directory Cluster Number (of the file)
  3893                              <1> 	;	
  3894                              <1> 	;	cf = 1 -> error code in AL (EAX)
  3895                              <1> 
  3896 0000B9DF E84E060000          <1> 	call	create_file
  3897                              <1> 	;pop	esi
  3898                              <1> 	;jc	csftdf2_rw_error
  3899                              <1> 	; 29/07/2022
  3900 0000B9E4 7305                <1> 	jnc	short csftdf2_create_file_OK
  3901 0000B9E6 E9B9050000          <1> 	jmp	csftdf2_rw_error
  3902                              <1> 
  3903                              <1> csftdf2_create_file_OK:
  3904                              <1> 
  3905 0000B9EB A3[D8880100]        <1> 	mov	[csftdf_df_cluster], eax
  3906                              <1> 	; 27/08/2024
  3907                              <1> 	; eax = 0
  3908                              <1> 
  3909                              <1> 	; 24/03/2016
  3910                              <1> 	;mov	[DestinationFile_DirEntryNumber], dx
  3911                              <1> 	; 29/08/2024
  3912                              <1> 	; (these 3 parameters are needed for
  3913                              <1> 	;  loading same dir entry for first cluster update)
  3914 0000B9F0 8915[92880100]      <1> 	mov	[DestinationFile_DirCluster], edx
  3915 0000B9F6 66890D[96880100]    <1> 	mov	[DestinationFile_DirEntryNumber], cx
  3916                              <1> 
  3917                              <1> 	; 30/08/2024
  3918                              <1> 	; edx -> ecx
  3919                              <1> 	; 21/03/2016
  3920 0000B9FD BE00000800          <1> 	mov	esi, Directory_Buffer
  3921                              <1> 	;shl	edx, 5 ; 32 * index number
  3922 0000BA02 C1E105              <1> 	shl	ecx, 5
  3923                              <1> 	;add	esi, edx
  3924 0000BA05 01CE                <1> 	add	esi, ecx
  3925 0000BA07 BF[6E880100]        <1> 	mov	edi, DestinationFile_DirEntry
  3926                              <1> 	;mov	cl, 8 ; 32 bytes
  3927                              <1> 	; 29/08/2024
  3928 0000BA0C 29C9                <1> 	sub	ecx, ecx
  3929 0000BA0E B108                <1> 	mov	cl,8
  3930 0000BA10 F3A5                <1> 	rep	movsd
  3931                              <1> 
  3932                              <1> 	;mov	cl, [esi] ; L.D.D.D.T.
  3933                              <1> 	;mov	[DestinationFile_Drv], cl
  3934                              <1> 
  3935                              <1> csftdf2_set_sf_percentage:
  3936                              <1> 	; 17/03/2016
  3937 0000BA12 31C0                <1> 	xor	eax, eax
  3938 0000BA14 A2[EC880100]        <1> 	mov 	[csftdf_percentage], al ; 0, reset
  3939                              <1> 
  3940 0000BA19 A3[E4880100]        <1> 	mov	[csftdf_sf_rbytes], eax ; 0, reset
  3941 0000BA1E A3[E8880100]        <1> 	mov	[csftdf_df_wbytes], eax ; 0, reset
  3942                              <1> 
  3943 0000BA23 8A25[9C870100]      <1> 	mov	ah, [SourceFile_Drv]
  3944 0000BA29 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  3945 0000BA2E 01C6                <1> 	add	esi, eax
  3946                              <1> 
  3947 0000BA30 8935[F0880100]      <1> 	mov	[csftdf_sf_drv_dt], esi ; 23/03/2016
  3948                              <1> 
  3949 0000BA36 668B15[02880100]    <1> 	mov	dx, [SourceFile_DirEntry+DirEntry_FstClusHI]
  3950 0000BA3D C1E210              <1> 	shl	edx, 16
  3951 0000BA40 668B15[08880100]    <1> 	mov	dx, [SourceFile_DirEntry+DirEntry_FstClusLO]
  3952 0000BA47 8915[D4880100]      <1> 	mov	[csftdf_sf_cluster], edx
  3953                              <1> 
  3954                              <1> 	; 16/03/2016
  3955                              <1> 	; Note: Singlix FS boot sector parameters (for cluster
  3956                              <1> 	;	related calculations) has same offset
  3957                              <1> 	;	values from LD_BPB as in FAT file system.
  3958                              <1> 	;	[esi+LD_BPB+SecPerClust] is 1 for Singlix FS.
  3959                              <1> 	;
  3960 0000BA4D 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+SecPerClust]
  3961 0000BA51 880D[1A880100]      <1> 	mov	[SourceFile_SecPerClust], cl
  3962                              <1> 
  3963                              <1> 	; 17/03/2016
  3964 0000BA57 386E03              <1> 	cmp	[esi+LD_FATType], ch ; 0
  3965 0000BA5A 7707                <1> 	ja	short csftdf2_set_sf_percent_rsize1
  3966                              <1> 
  3967 0000BA5C B800000100          <1> 	mov	eax, 65536 ; read/write buffer size for Singlix FS
  3968 0000BA61 EB06                <1> 	jmp	short csftdf2_set_sf_percent_rsize2
  3969                              <1> 
  3970                              <1> csftdf2_set_sf_percent_rsize1:
  3971 0000BA63 668B4611            <1> 	mov	ax, [esi+LD_BPB+BytesPerSec]
  3972 0000BA67 F7E1                <1> 	mul	ecx
  3973                              <1> 	;sub	edx, edx
  3974                              <1> csftdf2_set_sf_percent_rsize2:
  3975 0000BA69 A3[DC880100]        <1> 	mov	[csftdf_r_size], eax
  3976                              <1> 
  3977                              <1> csftdf2_set_df_percentage:
  3978                              <1> 	;sub	eax, eax
  3979                              <1> 	;mov	ah, [DestinationFile_Drv]
  3980                              <1> 	;mov	edi, Logical_DOSDisks
  3981                              <1> 	;add	edi, eax
  3982                              <1> 	;mov	[csftdf_df_drv_dt], edi ; 17/03/2016
  3983                              <1> 
  3984 0000BA6E 8B3D[F4880100]      <1> 	mov	edi, [csftdf_df_drv_dt] ; 23/03/2016
  3985                              <1> 
  3986                              <1> 	; 16/03/2016
  3987                              <1> 	; Note: Singlix FS boot sector parameters (for cluster
  3988                              <1> 	;	related calculations) has same offset
  3989                              <1> 	;	values from LD_BPB as in FAT file system.
  3990                              <1> 	;	[edi+LD_BPB+SecPerClust] is 1 for Singlix FS.
  3991                              <1> 	;	
  3992                              <1> 	;movzx	ecx, byte [edi+LD_BPB+SecPerClust]
  3993 0000BA74 8A4F13              <1> 	mov	cl, [edi+LD_BPB+SecPerClust]
  3994 0000BA77 880D[9A880100]      <1> 	mov	[DestinationFile_SecPerClust], cl
  3995                              <1> 
  3996                              <1> 	; 17/03/2016
  3997 0000BA7D 386F03              <1> 	cmp	[edi+LD_FATType], ch ; 0
  3998 0000BA80 7707                <1> 	ja	short csftdf2_set_df_percent_wsize1
  3999                              <1> 
  4000 0000BA82 B800000100          <1> 	mov	eax, 65536 ; read/write buffer size for Singlix FS
  4001 0000BA87 EB06                <1> 	jmp	short csftdf2_set_df_percent_wsize2
  4002                              <1> 
  4003                              <1> csftdf2_set_df_percent_wsize1:
  4004 0000BA89 0FB74711            <1> 	movzx	eax, word [edi+LD_BPB+BytesPerSec]
  4005 0000BA8D F7E1                <1> 	mul	ecx
  4006                              <1> 	;sub	edx, edx
  4007                              <1> csftdf2_set_df_percent_wsize2:
  4008 0000BA8F A3[E0880100]        <1> 	mov	[csftdf_w_size], eax
  4009                              <1> 
  4010 0000BA94 A1[C8880100]        <1> 	mov	eax, [csftdf_filesize]
  4011                              <1> 
  4012 0000BA99 3D00000100          <1> 	cmp	eax, 65536 ; 64KB	; small file
  4013 0000BA9E 721F                <1> 	jb	short csftdf2_load_file ; do not display percentage
  4014                              <1> 
  4015                              <1> csftdf2_reset_wf_percent_ptr_chk_64k:
  4016 0000BAA0 B201                <1> 	mov	dl, 1 ; 25/03/2016
  4017                              <1> 
  4018 0000BAA2 3D00000400          <1> 	cmp	eax, 65536*4 ; 256KB
  4019 0000BAA7 7310                <1> 	jnb	short csftdf2_enable_percentage_display ; big file
  4020                              <1> 
  4021                              <1> 	; 64-128KB file size for floppy disks
  4022 0000BAA9 3815[9C870100]      <1> 	cmp	byte [SourceFile_Drv], dl ; 1 ; read from floppy disk ?
  4023 0000BAAF 7608                <1> 	jna	short csftdf2_enable_percentage_display
  4024                              <1> 
  4025 0000BAB1 3815[1C880100]      <1> 	cmp	byte [DestinationFile_Drv], dl ; 1 ; write to floppy disk ?
  4026 0000BAB7 7706                <1> 	ja	short csftdf2_load_file
  4027                              <1> 
  4028                              <1> csftdf2_enable_percentage_display:
  4029 0000BAB9 8815[EC880100]      <1> 	mov	[csftdf_percentage], dl ; 1
  4030                              <1> 
  4031                              <1> csftdf2_load_file:
  4032                              <1> 	; 13/05/2016
  4033                              <1> 	; 19/03/2016
  4034                              <1> 	; 18/03/2016
  4035                              <1> 	; 17/03/2016
  4036 0000BABF B40F                <1> 	mov	ah, 0Fh
  4037 0000BAC1 E85E5CFFFF          <1> 	call	_int10h
  4038                              <1> 	; 13/05/2016
  4039 0000BAC6 883D[ED880100]      <1> 	mov	[csftdf_videopage], bh ; active video page
  4040 0000BACC B403                <1> 	mov	ah, 03h
  4041 0000BACE E8515CFFFF          <1> 	call	_int10h
  4042 0000BAD3 668915[EE880100]    <1> 	mov	[csftdf_cursorpos], dx
  4043                              <1> 
  4044 0000BADA 29C0                <1> 	sub	eax, eax
  4045 0000BADC A2[C5880100]        <1> 	mov	[csftdf_rw_err], al ; 0
  4046                              <1> 
  4047                              <1> ; ///
  4048                              <1> csftdf_sf_amb: ; 15/03/2016
  4049 0000BAE1 8B0D[C8880100]      <1> 	mov	ecx, [csftdf_filesize]	; 23/03/2016
  4050                              <1> 
  4051                              <1> 	; TRDOS 386 (TRDOS v2.0)
  4052                              <1> 	; Allocate contiguous memory block for loading the file
  4053                              <1> 
  4054                              <1> 	;mov	ecx, [SourceFile_DirEntry+DirEntry_FileSize]
  4055                              <1> 
  4056                              <1> 	;sub	eax, eax ; First free memory aperture
  4057                              <1> 
  4058                              <1> 	; eax = 0 (Allocate memory from the beginning)
  4059                              <1> 	; ecx = File (Allocation) size in bytes
  4060                              <1> 
  4061                              <1> ; 31/08/2024 - temporary
  4062                              <1> ;%if 0
  4063 0000BAE7 E807A2FFFF          <1> 	call	allocate_memory_block
  4064 0000BAEC 7304                <1> 	jnc	short loc_check_sf_save_loading_parms
  4065                              <1> ;%endif
  4066                              <1> 
  4067                              <1> csftdf_use_cluster_buff: ; 27/08/2024
  4068                              <1> 
  4069 0000BAEE 29C0                <1> 	sub	eax, eax
  4070 0000BAF0 29C9                <1> 	sub	ecx, ecx
  4071                              <1> 
  4072                              <1> loc_check_sf_save_loading_parms:
  4073 0000BAF2 A3[CC880100]        <1> 	mov	[csftdf_sf_mem_addr], eax ; loading address
  4074 0000BAF7 890D[D0880100]      <1> 	mov	[csftdf_sf_mem_bsize], ecx ; block size
  4075                              <1> ; ///
  4076                              <1> 	; 19/03/2016
  4077 0000BAFD 8B35[F0880100]      <1> 	mov	esi, [csftdf_sf_drv_dt] ; logical dos drv desc. tbl.
  4078                              <1> 
  4079                              <1> 	; 17/03/2016
  4080 0000BB03 09C0                <1> 	or	eax, eax ; contiguous free memory block address
  4081                              <1> 	;jz	csftdf2_read_sf_cluster
  4082                              <1> 	; 29/07/2022
  4083 0000BB05 7505                <1> 	jnz	short csftdf2_1
  4084 0000BB07 E95E010000          <1> 	jmp	csftdf2_read_sf_cluster
  4085                              <1> 
  4086                              <1> csftdf2_1:
  4087                              <1> 	; 18/03/2016
  4088 0000BB0C 8B1D[CC880100]      <1> 	mov	ebx, [csftdf_sf_mem_addr] ; memory block address
  4089                              <1> 
  4090 0000BB12 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  4091                              <1>         ;jna	csftdf2_load_fs_file
  4092                              <1> 	; 29/07/2022
  4093 0000BB16 7705                <1> 	ja	short csftdf2_load_fat_file
  4094 0000BB18 E90F020000          <1> 	jmp	csftdf2_load_fs_file
  4095                              <1> 
  4096                              <1> csftdf2_load_fat_file:
  4097 0000BB1D 53                  <1> 	push	ebx ; *
  4098                              <1> 
  4099                              <1> csftdf2_load_fat_file_next:
  4100 0000BB1E BE[273B0100]        <1> 	mov	esi, msg_reading
  4101 0000BB23 E842B2FFFF          <1> 	call	print_msg
  4102                              <1> 
  4103 0000BB28 803D[EC880100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4104 0000BB2F 7605                <1> 	jna	short csftdf2_load_fat_file_1
  4105                              <1> 
  4106 0000BB31 E87E000000          <1> 	call	csftdf2_print_percentage ; 19/03/2016
  4107                              <1> 
  4108                              <1> csftdf2_load_fat_file_1:
  4109 0000BB36 8B35[F0880100]      <1> 	mov	esi, [csftdf_sf_drv_dt]
  4110 0000BB3C 5B                  <1> 	pop	ebx ; *
  4111                              <1> 
  4112                              <1> csftdf2_load_fat_file_2:
  4113 0000BB3D E8BA000000          <1> 	call	csftdf2_read_fat_file_sectors ; 19/03/2016
  4114                              <1> 	;jc	csftdf2_rw_error ; eocc! or disk error!
  4115                              <1> 	; 29/07/2022
  4116 0000BB42 7305                <1> 	jnc	short csftdf2_load_fat_file_3
  4117 0000BB44 E95B040000          <1> 	jmp	csftdf2_rw_error
  4118                              <1> csftdf2_load_fat_file_3:
  4119 0000BB49 09D2                <1> 	or	edx, edx ; edx > 0 -> EOF
  4120 0000BB4B 7520                <1> 	jnz	short csftdf2_load_fat_file_ok
  4121                              <1> 
  4122 0000BB4D 803D[EC880100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4123 0000BB54 76E7                <1> 	jna	short csftdf2_load_fat_file_2
  4124                              <1> 
  4125 0000BB56 53                  <1> 	push	ebx ; *
  4126                              <1> 
  4127                              <1> 	; Set cursor position
  4128                              <1> 	; AH= 02h, BH= Page Number, DH= Row, DL= Column
  4129 0000BB57 8A3D[ED880100]      <1> 	mov	bh, [csftdf_videopage]
  4130 0000BB5D 668B15[EE880100]    <1> 	mov	dx, [csftdf_cursorpos]
  4131 0000BB64 B402                <1> 	mov	ah, 2
  4132 0000BB66 E8B95BFFFF          <1> 	call	_int10h
  4133 0000BB6B EBB1                <1> 	jmp	short csftdf2_load_fat_file_next
  4134                              <1> 
  4135                              <1> csftdf2_load_fat_file_ok:
  4136 0000BB6D 803D[EC880100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4137                              <1> 	;jna	csftdf2_save_file ; 25/03/2016
  4138                              <1> 	; 29/07/2022
  4139 0000BB74 7705                <1> 	ja	short csftdf2_2
  4140 0000BB76 E955020000          <1> 	jmp	csftdf2_save_file
  4141                              <1> csftdf2_2:
  4142                              <1> 	; "Reading... 100%"
  4143 0000BB7B BF[3F3B0100]        <1> 	mov	edi, percentagestr
  4144 0000BB80 B031                <1> 	mov	al, '1'
  4145 0000BB82 AA                  <1> 	stosb
  4146 0000BB83 B030                <1> 	mov	al, '0'
  4147 0000BB85 AA                  <1> 	stosb
  4148 0000BB86 AA                  <1> 	stosb
  4149                              <1> 
  4150 0000BB87 8A3D[ED880100]      <1> 	mov	bh, [csftdf_videopage]
  4151 0000BB8D 668B15[EE880100]    <1> 	mov	dx, [csftdf_cursorpos]
  4152 0000BB94 B402                <1> 	mov	ah, 2
  4153 0000BB96 E8895BFFFF          <1> 	call	_int10h
  4154                              <1> 
  4155 0000BB9B BE[273B0100]        <1> 	mov	esi, msg_reading
  4156 0000BBA0 E8C5B1FFFF          <1> 	call	print_msg
  4157                              <1> 
  4158 0000BBA5 BE[3F3B0100]        <1> 	mov	esi, percentagestr
  4159 0000BBAA E8BBB1FFFF          <1> 	call	print_msg
  4160                              <1> 
  4161 0000BBAF E91C020000          <1>         jmp	csftdf2_save_file ; 25/03/2016
  4162                              <1> 
  4163                              <1> csftdf2_print_percentage:
  4164                              <1> 	; 09/12/2017
  4165                              <1> 	; 19/03/2016
  4166                              <1> 	; 18/03/2016
  4167 0000BBB4 B020                <1> 	mov	al, 20h
  4168 0000BBB6 BF[3F3B0100]        <1> 	mov	edi, percentagestr
  4169 0000BBBB AA                  <1> 	stosb
  4170 0000BBBC AA                  <1> 	stosb
  4171 0000BBBD A1[E4880100]        <1> 	mov	eax, [csftdf_sf_rbytes]
  4172                              <1> 	;mov	edx, 100
  4173                              <1> 	; 29/07/2022
  4174 0000BBC2 29D2                <1> 	sub	edx, edx
  4175 0000BBC4 B264                <1> 	mov	dl, 100
  4176 0000BBC6 F7E2                <1> 	mul	edx
  4177 0000BBC8 8B0D[C8880100]      <1> 	mov	ecx, [csftdf_filesize]
  4178 0000BBCE F7F1                <1> 	div	ecx
  4179 0000BBD0 B10A                <1> 	mov	cl, 10
  4180 0000BBD2 F6F1                <1> 	div	cl
  4181 0000BBD4 80C430              <1> 	add	ah, '0'
  4182 0000BBD7 8827                <1> 	mov	[edi], ah
  4183 0000BBD9 20C0                <1> 	and	al, al
  4184 0000BBDB 740A                <1> 	jz	short csftdf2_print_percent_1
  4185 0000BBDD 4F                  <1> 	dec	edi
  4186                              <1> 	;cbw
  4187 0000BBDE 28E4                <1> 	sub	ah, ah ; 09/12/2017
  4188 0000BBE0 F6F1                <1> 	div	cl
  4189 0000BBE2 80C430              <1> 	add	ah, '0'
  4190 0000BBE5 8827                <1> 	mov	[edi], ah
  4191                              <1> 	;and	al, al
  4192                              <1> 	;jz	short csftdf2_print_percent_1
  4193                              <1> 	;dec	edi
  4194                              <1> 	;mov	[edi], '1' ; 100%
  4195                              <1> 
  4196                              <1> csftdf2_print_percent_1:
  4197 0000BBE7 BE[3F3B0100]        <1> 	mov	esi, percentagestr
  4198                              <1> 	;call	print_msg
  4199                              <1> 	;retn
  4200 0000BBEC E979B1FFFF          <1> 	jmp	print_msg
  4201                              <1> 
  4202                              <1> csftdf2_read_file_sectors:
  4203                              <1> 	; 19/03/2016
  4204 0000BBF1 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  4205                              <1> 	;jna	csftdf2_read_fs_file_sectors
  4206                              <1> 	; 29/07/2022
  4207 0000BBF5 7705                <1> 	ja	short csftdf2_read_fat_file_sectors
  4208 0000BBF7 E96F070000          <1> 	jmp	csftdf2_read_fs_file_sectors
  4209                              <1> 
  4210                              <1> csftdf2_read_fat_file_sectors:
  4211                              <1> 	; 19/03/2016
  4212                              <1> 	; 18/03/2016
  4213                              <1> 	; return:
  4214                              <1> 	;   CF = 0 & EDX > 0 -> END OF FILE
  4215                              <1> 	;   CF = 0 & EDX = 0 -> not EOF
  4216                              <1> 	;   CF = 1 -> read error (error code in AL)
  4217                              <1> 
  4218                              <1> csftdf2_read_fat_file_secs_0:
  4219 0000BBFC 8B15[C8880100]      <1> 	mov	edx, [csftdf_filesize]
  4220 0000BC02 2B15[E4880100]      <1> 	sub	edx, [csftdf_sf_rbytes]
  4221 0000BC08 3B15[DC880100]      <1> 	cmp	edx, [csftdf_r_size]
  4222 0000BC0E 7306                <1> 	jnb	short csftdf2_read_fat_file_secs_1
  4223 0000BC10 8915[DC880100]      <1> 	mov	[csftdf_r_size], edx
  4224                              <1> 
  4225                              <1> csftdf2_read_fat_file_secs_1:
  4226 0000BC16 A1[DC880100]        <1> 	mov	eax, [csftdf_r_size]
  4227 0000BC1B 29D2                <1> 	sub	edx, edx
  4228 0000BC1D 0FB74E11            <1> 	movzx	ecx, word [esi+LD_BPB+BytesPerSec]
  4229 0000BC21 01C8                <1> 	add	eax, ecx
  4230 0000BC23 48                  <1> 	dec	eax
  4231 0000BC24 F7F1                <1> 	div	ecx
  4232 0000BC26 89C1                <1> 	mov	ecx, eax ; sector count
  4233 0000BC28 A1[D4880100]        <1> 	mov	eax, [csftdf_sf_cluster]
  4234                              <1> 
  4235                              <1> 	; EBX = memory block address (current)
  4236                              <1> 
  4237 0000BC2D E83A090000          <1> 	call	read_fat_file_sectors
  4238 0000BC32 7235                <1> 	jc	short csftdf2_read_fat_file_secs_3
  4239                              <1> 
  4240                              <1> 	; EBX = next memory address
  4241                              <1> 
  4242 0000BC34 A1[E4880100]        <1> 	mov	eax, [csftdf_sf_rbytes]
  4243 0000BC39 0305[DC880100]      <1> 	add	eax, [csftdf_r_size]
  4244 0000BC3F 8B15[C8880100]      <1> 	mov	edx, [csftdf_filesize]
  4245 0000BC45 39D0                <1> 	cmp	eax, edx
  4246 0000BC47 7320                <1> 	jnb	short csftdf2_read_fat_file_secs_3 ; edx > 0
  4247 0000BC49 A3[E4880100]        <1> 	mov	[csftdf_sf_rbytes], eax
  4248                              <1> 
  4249 0000BC4E 53                  <1> 	push	ebx ; *
  4250                              <1> 	; get next cluster (csftdf_r_size! bytes)
  4251 0000BC4F A1[D4880100]        <1> 	mov	eax, [csftdf_sf_cluster]
  4252 0000BC54 E813070000          <1> 	call	get_next_cluster
  4253 0000BC59 5B                  <1> 	pop	ebx ; *
  4254 0000BC5A 7306                <1> 	jnc	short csftdf2_read_fat_file_secs_2
  4255                              <1> 
  4256                              <1> 	; 15/10/2016
  4257                              <1> 	; Disk read error instead of drv not ready err
  4258 0000BC5C B811000000          <1> 	mov	eax, 17 ; Read error !
  4259 0000BC61 C3                  <1> 	retn
  4260                              <1> 
  4261                              <1> csftdf2_read_fat_file_secs_2:
  4262 0000BC62 29D2                <1> 	sub	edx, edx ; 0
  4263 0000BC64 A3[D4880100]        <1> 	mov	[csftdf_sf_cluster], eax ; next cluster
  4264                              <1> 
  4265                              <1> csftdf2_read_fat_file_secs_3:
  4266 0000BC69 C3                  <1> 	retn
  4267                              <1> 
  4268                              <1> csftdf2_read_sf_cluster:
  4269                              <1> 	; 19/03/2016
  4270 0000BC6A BB00000700          <1> 	mov	ebx, Cluster_Buffer ; buffer address (64KB)
  4271                              <1> 
  4272 0000BC6F 803D[EC880100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4273 0000BC76 760D                <1> 	jna	short csftdf2_read_sf_clust_2
  4274                              <1> 
  4275 0000BC78 53                  <1> 	push	ebx ; *
  4276                              <1> 
  4277                              <1> csftdf2_read_sf_clust_next:
  4278 0000BC79 E836FFFFFF          <1> 	call	csftdf2_print_percentage
  4279                              <1> 
  4280                              <1> csftdf2_read_sf_clust_0:
  4281 0000BC7E 8B35[F0880100]      <1> 	mov	esi, [csftdf_sf_drv_dt]
  4282                              <1> csftdf2_read_sf_clust_1:
  4283 0000BC84 5B                  <1> 	pop	ebx ; *
  4284                              <1> 
  4285                              <1> csftdf2_read_sf_clust_2:
  4286 0000BC85 89DA                <1> 	mov	edx, ebx
  4287 0000BC87 0315[DC880100]      <1> 	add	edx, [csftdf_r_size]
  4288 0000BC8D 81FA00000800        <1> 	cmp	edx, Cluster_Buffer + 65536
  4289 0000BC93 772B                <1> 	ja	short csftdf2_write_df_cluster
  4290                              <1> 
  4291 0000BC95 E857FFFFFF          <1> 	call	csftdf2_read_file_sectors ; 19/03/2016
  4292                              <1> 	;jc	csftdf2_save_fat_file_err2 ; eocc! or disk error!
  4293                              <1> 	; 29/07/2022
  4294 0000BC9A 723C                <1> 	jc	short csftdf2_3
  4295                              <1> 
  4296 0000BC9C 09D2                <1> 	or	edx, edx ; edx > 0 -> EOF
  4297 0000BC9E 7520                <1> 	jnz	short csftdf2_write_df_cluster
  4298                              <1> 
  4299 0000BCA0 803D[EC880100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4300 0000BCA7 76DC                <1> 	jna	short csftdf2_read_sf_clust_2
  4301                              <1> 
  4302 0000BCA9 53                  <1> 	push	ebx ; *
  4303                              <1> 
  4304                              <1> 	; Set cursor position
  4305                              <1> 	; AH= 02h, BH= Page Number, DH= Row, DL= Column
  4306 0000BCAA 8A3D[ED880100]      <1> 	mov	bh, [csftdf_videopage]
  4307 0000BCB0 668B15[EE880100]    <1> 	mov	dx, [csftdf_cursorpos]
  4308 0000BCB7 B402                <1> 	mov	ah, 2
  4309 0000BCB9 E8665AFFFF          <1> 	call	_int10h
  4310 0000BCBE EBB9                <1> 	jmp	short csftdf2_read_sf_clust_next
  4311                              <1> 
  4312                              <1> csftdf2_write_df_cluster:
  4313                              <1> 
  4314                              <1> ; 31/08/2024
  4315                              <1> %if 1
  4316                              <1> 	; 27/08/2024
  4317                              <1> 	; 19/03/2016
  4318                              <1> 	;mov	esi, [csftdf_df_drv_dt] ; (!)
  4319                              <1> 	;mov	ebx, Cluster_Buffer ; buffer address (64KB)
  4320                              <1> 	;;;
  4321                              <1> 	; 27/08/2024
  4322 0000BCC0 E814030000          <1> 	call	csftdf2_update_df_fclust
  4323                              <1> 	; 31/08/2024
  4324 0000BCC5 7305                <1> 	jnc	short csftdf2_update_df_fclust_ok
  4325 0000BCC7 E9D8020000          <1> 	jmp	csftdf2_rw_error
  4326                              <1> 
  4327                              <1> csftdf2_update_df_fclust_ok:
  4328                              <1> %endif
  4329                              <1> 	; esi = [csftdf_df_drv_dt]
  4330                              <1> 
  4331                              <1> 	;mov	esi, [csftdf_df_drv_dt]
  4332 0000BCCC BB00000700          <1> 	mov	ebx, Cluster_Buffer ; buffer address (64KB)
  4333                              <1> 
  4334                              <1> csftdf2_write_df_clust_next:
  4335 0000BCD1 E85B000000          <1> 	call	csftdf2_write_file_sectors ; 19/03/2016
  4336                              <1> 	;jc	csftdf2_save_fat_file_err2 ; eocc! or disk error!
  4337                              <1> 	; 29/07/2022
  4338 0000BCD6 7305                <1> 	jnc	short csftdf2_4
  4339                              <1> csftdf2_3:
  4340 0000BCD8 E94E020000          <1> 	jmp	csftdf2_save_fat_file_err2
  4341                              <1> csftdf2_4:
  4342 0000BCDD 09D2                <1> 	or	edx, edx ; edx > 0 -> EOF
  4343 0000BCDF 7513                <1> 	jnz	short csftdf2_rw_f_clust_ok
  4344                              <1> 
  4345 0000BCE1 81FB00000800        <1> 	cmp	ebx, Cluster_Buffer + 65536
  4346 0000BCE7 72E8                <1> 	jb	short csftdf2_write_df_clust_next
  4347                              <1> 
  4348                              <1> 	; 31/08/2024
  4349 0000BCE9 8B35[F0880100]      <1> 	mov	esi, [csftdf_sf_drv_dt]
  4350                              <1> 
  4351 0000BCEF E976FFFFFF          <1> 	jmp	csftdf2_read_sf_cluster ; 31/08/2024
  4352                              <1> 
  4353                              <1> csftdf2_rw_f_clust_ok:
  4354 0000BCF4 803D[EC880100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4355                              <1> 	;jna	csftdf2_save_fat_file_4 ; 25/03/2016
  4356                              <1> 	; 29/07/2022
  4357 0000BCFB 762A                <1> 	jna	short csftdf2_5
  4358                              <1> 
  4359                              <1> 	; "100%"
  4360 0000BCFD BF[3F3B0100]        <1> 	mov	edi, percentagestr
  4361 0000BD02 B031                <1> 	mov	al, '1'
  4362 0000BD04 AA                  <1> 	stosb
  4363 0000BD05 B030                <1> 	mov	al, '0'
  4364 0000BD07 AA                  <1> 	stosb
  4365 0000BD08 AA                  <1> 	stosb
  4366                              <1> 
  4367 0000BD09 8A3D[ED880100]      <1> 	mov	bh, [csftdf_videopage]
  4368 0000BD0F 668B15[EE880100]    <1> 	mov	dx, [csftdf_cursorpos]
  4369 0000BD16 B402                <1> 	mov	ah, 2
  4370 0000BD18 E8075AFFFF          <1> 	call	_int10h
  4371                              <1> 
  4372 0000BD1D BE[3F3B0100]        <1> 	mov	esi, percentagestr
  4373 0000BD22 E843B0FFFF          <1> 	call	print_msg
  4374                              <1> csftdf2_5:
  4375 0000BD27 E989010000          <1>         jmp     csftdf2_save_fat_file_4
  4376                              <1> 
  4377                              <1> csftdf2_load_fs_file:
  4378                              <1> 	; temporary - 18/03/2016
  4379 0000BD2C E971020000          <1>         jmp     csftdf2_read_error
  4380                              <1> 
  4381                              <1> csftdf2_write_file_sectors:
  4382                              <1> 	; 31/08/2024
  4383                              <1> 	; 30/08/2024
  4384                              <1> 	; 19/03/2016
  4385 0000BD31 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  4386                              <1> 	;jna	csftdf2_write_fs_file_sectors
  4387                              <1> 	; 29/07/2022
  4388 0000BD35 7705                <1> 	ja	short csftdf2_write_fat_file_sectors
  4389 0000BD37 E92F060000          <1> 	jmp	csftdf2_write_fs_file_sectors
  4390                              <1> 
  4391                              <1> csftdf2_write_fat_file_sectors:
  4392                              <1> 	; 30/08/2024
  4393                              <1> 	; 19/03/2016
  4394                              <1> 	; 18/03/2016
  4395                              <1> 	; return:
  4396                              <1> 	;   CF = 0 & EDX > 0 -> END OF FILE
  4397                              <1> 	;   CF = 0 & EDX = 0 -> not EOF
  4398                              <1> 	;   CF = 1 -> write error (error code in AL)
  4399                              <1> 
  4400                              <1> csftdf2_write_fat_file_secs_0:
  4401 0000BD3C 8B15[C8880100]      <1> 	mov	edx, [csftdf_filesize]
  4402 0000BD42 2B15[E8880100]      <1> 	sub	edx, [csftdf_df_wbytes]
  4403 0000BD48 3B15[E0880100]      <1> 	cmp	edx, [csftdf_w_size]
  4404 0000BD4E 7306                <1> 	jnb	short csftdf2_write_fat_file_secs_1
  4405 0000BD50 8915[E0880100]      <1> 	mov	[csftdf_w_size], edx
  4406                              <1> 
  4407                              <1> csftdf2_write_fat_file_secs_1:
  4408                              <1> 
  4409                              <1> ; 31/08/2024
  4410                              <1> %if 0
  4411                              <1> 	;;;
  4412                              <1> 	; 30/08/2024
  4413                              <1> 	mov	eax, [csftdf_df_cluster]
  4414                              <1> 	and	eax, eax
  4415                              <1> 	jnz	short csftdf2_write_fat_file_secs_@
  4416                              <1> 	push	ebx
  4417                              <1> 	call	add_new_cluster
  4418                              <1> 	pop	ebx
  4419                              <1> 	jc	short csftdf2_write_fat_file_secs_5
  4420                              <1> 	mov	[csftdf_df_cluster], eax
  4421                              <1> csftdf2_write_fat_file_secs_@:
  4422                              <1> 	;;;
  4423                              <1> %endif
  4424                              <1> 
  4425 0000BD56 A1[E0880100]        <1> 	mov	eax, [csftdf_w_size]
  4426 0000BD5B 29D2                <1> 	sub	edx, edx
  4427 0000BD5D 0FB74E11            <1> 	movzx	ecx, word [esi+LD_BPB+BytesPerSec]
  4428 0000BD61 01C8                <1> 	add	eax, ecx
  4429 0000BD63 48                  <1> 	dec	eax
  4430 0000BD64 F7F1                <1> 	div	ecx
  4431 0000BD66 89C1                <1> 	mov	ecx, eax ; sector count
  4432 0000BD68 A1[D8880100]        <1> 	mov	eax, [csftdf_df_cluster]
  4433                              <1> 
  4434                              <1> 	; EBX = memory block address (current)
  4435                              <1> 
  4436 0000BD6D E8200F0000          <1> 	call	write_fat_file_sectors
  4437 0000BD72 7254                <1> 	jc	short csftdf2_write_fat_file_secs_4
  4438                              <1> 
  4439                              <1> 	; EBX = next memory address
  4440                              <1> 
  4441 0000BD74 A1[E8880100]        <1> 	mov	eax, [csftdf_df_wbytes]
  4442 0000BD79 0305[E0880100]      <1> 	add	eax, [csftdf_w_size]
  4443 0000BD7F 8B15[C8880100]      <1> 	mov	edx, [csftdf_filesize]
  4444 0000BD85 39D0                <1> 	cmp	eax, edx
  4445 0000BD87 733F                <1> 	jnb	short csftdf2_write_fat_file_secs_4
  4446 0000BD89 A3[E8880100]        <1> 	mov	[csftdf_df_wbytes], eax
  4447                              <1> 	;
  4448 0000BD8E A3[8A880100]        <1> 	mov	[DestinationFile_DirEntry+DirEntry_FileSize], eax
  4449                              <1> 
  4450                              <1> 
  4451 0000BD93 53                  <1> 	push	ebx ; *
  4452                              <1> 
  4453                              <1> 	; 30/08/2024
  4454 0000BD94 A1[D8880100]        <1> 	mov	eax, [csftdf_df_cluster] ; last cluster
  4455                              <1> 
  4456 0000BD99 803D[C6880100]01    <1> 	cmp	byte [DestinationFileFound], 1
  4457 0000BDA0 720B                <1> 	jb	short csftdf2_write_fat_file_secs_2
  4458                              <1> 
  4459                              <1> 	; get next cluster (csftdf_w_size! bytes)
  4460                              <1> 	;mov	eax, [csftdf_df_cluster]
  4461 0000BDA2 E8C5050000          <1> 	call	get_next_cluster
  4462 0000BDA7 7317                <1> 	jnc	short csftdf2_write_fat_file_secs_3
  4463                              <1> 
  4464 0000BDA9 21C0                <1> 	and	eax, eax ; end of cluster chain!?
  4465 0000BDAB 751C                <1> 	jnz	short csftdf2_write_fat_file_secs_5 ; disk error !
  4466                              <1> 
  4467                              <1> csftdf2_write_fat_file_secs_2:
  4468                              <1> 	;mov	eax, [csftdf_df_cluster] ; last cluster
  4469                              <1> 	; 30/08/2024
  4470 0000BDAD E8490E0000          <1> 	call	add_new_cluster
  4471 0000BDB2 7215                <1> 	jc	short csftdf2_write_fat_file_secs_5
  4472                              <1> 
  4473                              <1> 	; NOTE: Destination file size may be bigger than
  4474                              <1> 	; source file size when the last reading fails after here.
  4475                              <1> 	; (The last -empty- cluster of destination file must be
  4476                              <1> 	; truncated and LMDT must be current date&time for partial
  4477                              <1> 	; copy result!)
  4478 0000BDB4 8B15[E0880100]      <1> 	mov	edx, [csftdf_w_size] ; < = bytes per cluster
  4479 0000BDBA 0115[8A880100]      <1> 	add	[DestinationFile_DirEntry+DirEntry_FileSize], edx
  4480                              <1> 
  4481                              <1> csftdf2_write_fat_file_secs_3:
  4482                              <1> 	; 30/08/2024
  4483                              <1> 	;pop	ebx ; *
  4484 0000BDC0 29D2                <1> 	sub	edx, edx ; 0
  4485 0000BDC2 A3[D8880100]        <1> 	mov	[csftdf_df_cluster], eax ; next cluster
  4486                              <1> 
  4487                              <1> 	; 30/08/2024
  4488 0000BDC7 5B                  <1> 	pop	ebx ; *
  4489                              <1> 
  4490                              <1> csftdf2_write_fat_file_secs_4:
  4491 0000BDC8 C3                  <1> 	retn
  4492                              <1> 
  4493                              <1> csftdf2_write_fat_file_secs_5:
  4494 0000BDC9 5B                  <1> 	pop	ebx ; *
  4495 0000BDCA B812000000          <1> 	mov	eax, 18 ; Write error !
  4496                              <1> 	; 16/10/2016 (1Dh -> 18)
  4497 0000BDCF C3                  <1> 	retn
  4498                              <1> 
  4499                              <1> csftdf2_save_file:
  4500                              <1> 	; 31/08/2024
  4501                              <1> 	; 26/08/2024, 30/08/2024
  4502                              <1> 	; 09/12/2017
  4503                              <1> 	; 19/03/2016, 25/03/2016
  4504                              <1> 	; 18/03/2016 
  4505 0000BDD0 8B35[F4880100]      <1> 	mov	esi, [csftdf_df_drv_dt] ; logical dos drv desc. tbl.
  4506 0000BDD6 8B1D[CC880100]      <1> 	mov	ebx, [csftdf_sf_mem_addr] ; memory block address
  4507                              <1> 
  4508 0000BDDC 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  4509                              <1> 	;jna	csftdf2_save_fs_file
  4510                              <1> 	; 29/07/2022
  4511 0000BDE0 7705                <1> 	ja	short csftdf2_save_fat_file
  4512 0000BDE2 E945020000          <1> 	jmp	csftdf2_save_fs_file
  4513                              <1> 
  4514                              <1> csftdf2_save_fat_file:
  4515                              <1> 
  4516                              <1> ; 31/08/2024
  4517                              <1> %if 1
  4518                              <1> 	; 30/08/2024
  4519 0000BDE7 53                  <1> 	push	ebx ; *
  4520                              <1> 	;;;
  4521                              <1> 	; 27/08/2024
  4522                              <1> 	;call	csftdf2_update_df_fclust
  4523 0000BDE8 E8F2010000          <1> 	call	csftdf2_update_df_fclust_@ ; 31/08/2024
  4524 0000BDED 5B                  <1> 	pop	ebx ; *
  4525 0000BDEE 7236                <1> 	jc	short csftdf2_save_fat_file_err
  4526                              <1> 	; esi = [csftdf_df_drv_dt] ; (*)
  4527                              <1> 	;;;
  4528                              <1> %endif
  4529                              <1> 
  4530 0000BDF0 803D[EC880100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4531 0000BDF7 7726                <1> 	ja	short csftdf2_save_fat_file_0 ; 30/08/2024
  4532                              <1> 
  4533 0000BDF9 53                  <1> 	push	ebx ; **
  4534                              <1> 
  4535                              <1> 	; Set cursor position
  4536                              <1> 	; AH= 02h, BH= Page Number, DH= Row, DL= Column
  4537 0000BDFA 8A3D[ED880100]      <1> 	mov	bh, [csftdf_videopage]
  4538 0000BE00 668B15[EE880100]    <1> 	mov	dx, [csftdf_cursorpos]
  4539 0000BE07 B402                <1> 	mov	ah, 2
  4540 0000BE09 E81659FFFF          <1> 	call	_int10h
  4541                              <1> 
  4542 0000BE0E BE[333B0100]        <1> 	mov	esi, msg_writing
  4543 0000BE13 E852AFFFFF          <1> 	call	print_msg
  4544                              <1> 
  4545                              <1> csftdf2_save_fat_file_next:
  4546 0000BE18 5B                  <1> 	pop	ebx ; **
  4547                              <1> 
  4548                              <1> 	; 31/08/2024
  4549 0000BE19 8B35[F4880100]      <1> 	mov	esi, [csftdf_df_drv_dt]
  4550                              <1> 
  4551                              <1> csftdf2_save_fat_file_0: ; 30/08/2024
  4552                              <1> 
  4553                              <1> csftdf2_save_fat_file_1:
  4554 0000BE1F E80DFFFFFF          <1> 	call	csftdf2_write_file_sectors ; 19/03/2016
  4555                              <1> 	;jc	csftdf2_rw_error ; eocc! or disk error!
  4556                              <1> 	; 29/07/2022
  4557 0000BE24 7305                <1> 	jnc	short csftdf2_6
  4558                              <1> csftdf2_save_fat_file_err: ; 27/08/2024
  4559 0000BE26 E979010000          <1> 	jmp	csftdf2_rw_error
  4560                              <1> 
  4561                              <1> csftdf2_6:
  4562 0000BE2B 09D2                <1> 	or	edx, edx ; edx > 0 -> EOF
  4563 0000BE2D 756C                <1>         jnz     short csftdf2_save_fat_file_3 ; 25/03/2016
  4564                              <1> 
  4565 0000BE2F 803D[EC880100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4566 0000BE36 76E7                <1> 	jna	short csftdf2_save_fat_file_1
  4567                              <1> 
  4568 0000BE38 B020                <1> 	mov	al, 20h
  4569 0000BE3A BF[3F3B0100]        <1> 	mov	edi, percentagestr
  4570 0000BE3F AA                  <1> 	stosb
  4571 0000BE40 AA                  <1> 	stosb
  4572 0000BE41 A1[E8880100]        <1> 	mov	eax, [csftdf_df_wbytes]
  4573                              <1> 	;mov	edx, 100
  4574                              <1> 	; 29/07/2022
  4575 0000BE46 31D2                <1> 	xor	edx, edx
  4576 0000BE48 B264                <1> 	mov	dl, 100
  4577 0000BE4A F7E2                <1> 	mul	edx
  4578 0000BE4C 8B0D[C8880100]      <1> 	mov	ecx, [csftdf_filesize]
  4579 0000BE52 F7F1                <1> 	div	ecx
  4580 0000BE54 B10A                <1> 	mov	cl, 10
  4581 0000BE56 F6F1                <1> 	div	cl
  4582 0000BE58 80C430              <1> 	add	ah, '0'
  4583 0000BE5B 8827                <1> 	mov	[edi], ah
  4584 0000BE5D 20C0                <1> 	and	al, al
  4585 0000BE5F 740A                <1> 	jz	short csftdf2_save_fat_file_2
  4586 0000BE61 4F                  <1> 	dec	edi
  4587                              <1> 	;cbw
  4588 0000BE62 30E4                <1> 	xor	ah, ah ; 09/12/2017
  4589 0000BE64 F6F1                <1> 	div	cl
  4590 0000BE66 80C430              <1> 	add	ah, '0'
  4591 0000BE69 8827                <1> 	mov	[edi], ah
  4592                              <1> 	;and	al, al
  4593                              <1> 	;jz	short csftdf2_save_fat_file_2
  4594                              <1> 	;dec	edi
  4595                              <1> 	;mov	[edi], '1' ; 100%
  4596                              <1> 
  4597                              <1> csftdf2_save_fat_file_2:
  4598 0000BE6B 53                  <1> 	push	ebx ; *
  4599                              <1> 
  4600 0000BE6C E802000000          <1> 	call	csftdf2_print_wr_percentage ; 25/03/2016
  4601                              <1> 
  4602 0000BE71 EBA5                <1>         jmp     csftdf2_save_fat_file_next
  4603                              <1> 
  4604                              <1> csftdf2_print_wr_percentage:
  4605                              <1> 	; Set cursor position
  4606                              <1> 	; AH= 02h, BH= Page Number, DH= Row, DL= Column
  4607 0000BE73 8A3D[ED880100]      <1> 	mov	bh, [csftdf_videopage]
  4608 0000BE79 668B15[EE880100]    <1> 	mov	dx, [csftdf_cursorpos]
  4609 0000BE80 B402                <1> 	mov	ah, 2
  4610 0000BE82 E89D58FFFF          <1> 	call	_int10h
  4611                              <1> 
  4612 0000BE87 BE[333B0100]        <1> 	mov	esi, msg_writing
  4613 0000BE8C E8D9AEFFFF          <1> 	call	print_msg
  4614                              <1> 
  4615 0000BE91 BE[3F3B0100]        <1> 	mov	esi, percentagestr
  4616                              <1> 	;call	print_msg
  4617                              <1> 	;retn
  4618 0000BE96 E9CFAEFFFF          <1> 	jmp	print_msg
  4619                              <1> 
  4620                              <1> csftdf2_save_fat_file_3:
  4621 0000BE9B 803D[EC880100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4622                              <1>         ;jna	csftdf2_save_fat_file_4 ; 25/03/2016
  4623                              <1> 	; 29/07/2022
  4624                              <1> 	;ja	short csftdf2_7
  4625                              <1> 	;jmp	csftdf2_save_fat_file_4
  4626                              <1> 	; 31/08/2024
  4627 0000BEA2 7611                <1> 	jna	short csftdf2_save_fat_file_4
  4628                              <1> 
  4629                              <1> csftdf2_7:
  4630                              <1> 	; "100%"
  4631 0000BEA4 BF[3F3B0100]        <1> 	mov	edi, percentagestr
  4632 0000BEA9 B031                <1> 	mov	al, '1'
  4633 0000BEAB AA                  <1> 	stosb
  4634 0000BEAC B030                <1> 	mov	al, '0'
  4635 0000BEAE AA                  <1> 	stosb
  4636 0000BEAF AA                  <1> 	stosb
  4637                              <1> 
  4638 0000BEB0 E8BEFFFFFF          <1> 	call	csftdf2_print_wr_percentage
  4639                              <1> 
  4640                              <1> csftdf2_save_fat_file_4:
  4641 0000BEB5 803D[C6880100]00    <1> 	cmp	byte [DestinationFileFound], 0
  4642 0000BEBC 7645                <1> 	jna	short csftdf2_save_fat_file_6
  4643                              <1> 
  4644 0000BEBE 8B35[F4880100]      <1> 	mov	esi, [csftdf_df_drv_dt] ; 31/03/2016
  4645                              <1> 
  4646 0000BEC4 A1[D8880100]        <1> 	mov	eax, [csftdf_df_cluster] ; last cluster
  4647 0000BEC9 E89E040000          <1> 	call	get_next_cluster
  4648 0000BECE 7233                <1> 	jc	short csftdf2_save_fat_file_6 ; eocc! or disk error!
  4649                              <1> 
  4650 0000BED0 A1[D8880100]        <1> 	mov	eax, [csftdf_df_cluster] ; last cluster
  4651                              <1> 	; 29/08/2024
  4652 0000BED5 31C9                <1> 	xor	ecx, ecx
  4653                              <1> 	;mov	[FAT_ClusterCounter], ecx ; 0 ; reset
  4654 0000BED7 49                  <1> 	dec	ecx ; 0FFFFFFFFh
  4655                              <1> 	;shr	ecx, 4 ; 28 bit ; 0FFFFFFFh
  4656                              <1> 	; 29/08/2024
  4657                              <1> 	; (update_cluster will save 28 bit cluster value)
  4658                              <1> 	;mov	ecx, 0FFFFFFFh
  4659 0000BED8 E87E070000          <1> 	call	update_cluster
  4660 0000BEDD 7224                <1> 	jc	short csftdf2_save_fat_file_6 ; really last cluster!?
  4661                              <1> 
  4662 0000BEDF A3[D8880100]        <1> 	mov	[csftdf_df_cluster], eax ; next cluster
  4663                              <1> 	
  4664                              <1> 	; byte [FAT_BuffValidData] = 2
  4665 0000BEE4 E8E6090000          <1> 	call	save_fat_buffer
  4666 0000BEE9 730E                <1> 	jnc	short csftdf2_save_fat_file_5
  4667                              <1> 	
  4668 0000BEEB 8B15[C8880100]      <1> 	mov	edx, [csftdf_filesize]
  4669 0000BEF1 8915[8A880100]      <1> 	mov	[DestinationFile_DirEntry+DirEntry_FileSize], edx
  4670 0000BEF7 EB57                <1> 	jmp	short csftdf2_save_fat_file_err3
  4671                              <1> 
  4672                              <1> csftdf2_save_fat_file_5:
  4673 0000BEF9 A1[D8880100]        <1> 	mov	eax, [csftdf_df_cluster]
  4674                              <1> 
  4675                              <1> 	; EAX = First cluster to be truncated/unlinked
  4676                              <1> 	; ESI = Logical dos drive description table address
  4677 0000BEFE E80A0C0000          <1> 	call	truncate_cluster_chain
  4678                              <1> 
  4679                              <1> csftdf2_save_fat_file_6:
  4680                              <1> 	; 28/03/2016
  4681 0000BF03 BE[F9870100]        <1> 	mov	esi, SourceFile_DirEntry+DirEntry_Attr ; +11 to + 18
  4682 0000BF08 BF[79880100]        <1> 	mov	edi, DestinationFile_DirEntry+DirEntry_Attr ; +11 to + 18
  4683 0000BF0D A4                  <1> 	movsb ; +11
  4684 0000BF0E A5                  <1> 	movsd ; +12 .. +15
  4685 0000BF0F 66A5                <1> 	movsw ; +16 .. +17
  4686                              <1> 		; + 18
  4687 0000BF11 83C604              <1> 	add	esi, 4
  4688 0000BF14 83C704              <1> 	add	edi, 4
  4689 0000BF17 A5                  <1> 	movsd	; DirEntry_WrtTime ; +22 .. +25
  4690                              <1> 
  4691 0000BF18 8B15[C8880100]      <1> 	mov	edx, [csftdf_filesize]
  4692 0000BF1E 8915[8A880100]      <1> 	mov	[DestinationFile_DirEntry+DirEntry_FileSize], edx
  4693                              <1> 
  4694 0000BF24 E8DEF0FFFF          <1> 	call	convert_current_date_time
  4695                              <1> 	; DX = Date in dos dir entry format
  4696                              <1> 	; AX = Time in dos dir entry format
  4697 0000BF29 EB4C                <1> 	jmp	short csftdf2_save_fat_file_7
  4698                              <1> 
  4699                              <1> 	; 31/08/2024
  4700                              <1> ;csftdf2_save_fat_file_err1:
  4701                              <1> 	;pop	ebx ; *
  4702                              <1> 
  4703                              <1> csftdf2_save_fat_file_err2:
  4704 0000BF2B A1[E8880100]        <1> 	mov	eax, [csftdf_df_wbytes]
  4705 0000BF30 8B15[8A880100]      <1> 	mov	edx, [DestinationFile_DirEntry+DirEntry_FileSize]
  4706 0000BF36 39C2                <1> 	cmp	edx, eax
  4707 0000BF38 7616                <1> 	jna	short csftdf2_save_fat_file_err3
  4708 0000BF3A A1[D8880100]        <1> 	mov	eax, [csftdf_df_cluster] ; last (empty) cluster
  4709                              <1> 	; ESI = Logical dos drive description table address
  4710 0000BF3F E8C90B0000          <1> 	call	truncate_cluster_chain
  4711 0000BF44 720A                <1> 	jc	short csftdf2_save_fat_file_err3
  4712 0000BF46 A1[E8880100]        <1> 	mov	eax, [csftdf_df_wbytes]
  4713 0000BF4B A3[8A880100]        <1> 	mov	[DestinationFile_DirEntry+DirEntry_FileSize], eax
  4714                              <1> csftdf2_save_fat_file_err3:
  4715 0000BF50 E8B2F0FFFF          <1> 	call	convert_current_date_time
  4716                              <1> 	; DX = Date in dos dir entry format
  4717                              <1> 	; AX = Time in dos dir entry format
  4718 0000BF55 C605[7B880100]00    <1> 	mov	byte [DestinationFile_DirEntry+DirEntry_CrtTimeTenth], 0
  4719 0000BF5C 66A3[7C880100]      <1> 	mov	[DestinationFile_DirEntry+DirEntry_CrtTime], ax
  4720 0000BF62 668915[7E880100]    <1> 	mov	[DestinationFile_DirEntry+DirEntry_CrtDate], dx
  4721 0000BF69 66A3[84880100]      <1> 	mov	[DestinationFile_DirEntry+DirEntry_WrtTime], ax
  4722 0000BF6F 668915[86880100]    <1> 	mov	[DestinationFile_DirEntry+DirEntry_WrtDate], dx
  4723 0000BF76 F9                  <1> 	stc
  4724                              <1> csftdf2_save_fat_file_7:
  4725 0000BF77 9C                  <1> 	pushf
  4726 0000BF78 668915[80880100]    <1> 	mov	[DestinationFile_DirEntry+DirEntry_LastAccDate], dx
  4727 0000BF7F BE[6E880100]        <1> 	mov	esi, DestinationFile_DirEntry
  4728 0000BF84 BF00000800          <1> 	mov	edi, Directory_Buffer
  4729 0000BF89 0FB70D[96880100]    <1> 	movzx	ecx, word [DestinationFile_DirEntryNumber] ; (<2048)
  4730                              <1> 	;shl	cx, 5 ; 32 * directory entry number
  4731                              <1> 	; 29/07/2022
  4732 0000BF90 C1E105              <1> 	shl	ecx, 5
  4733 0000BF93 01CF                <1> 	add	edi, ecx
  4734                              <1> 	;mov	ecx, 8
  4735                              <1> 	;mov	cx, 8
  4736                              <1> 	; 31/08/2024
  4737                              <1> 	; 29/07/2022
  4738 0000BF95 29C9                <1> 	sub	ecx, ecx
  4739                              <1> 	;sub	ch, ch
  4740 0000BF97 B108                <1> 	mov	cl, 8
  4741 0000BF99 F3A5                <1> 	rep	movsd
  4742 0000BF9B 9D                  <1> 	popf
  4743 0000BF9C 730B                <1> 	jnc	short csftdf2_write_file_OK
  4744                              <1> 
  4745                              <1> csftdf2_write_error:
  4746                              <1> 	; 18/03/2016
  4747                              <1> 	;mov	al, 1Dh ; write error
  4748                              <1> 	; 31/08/2024
  4749 0000BF9E B012                <1> 	mov	al, ERR_DRV_WRITE ; 18 ; write error
  4750 0000BFA0 EB02                <1> 	jmp	short csftdf2_rw_error
  4751                              <1> 
  4752                              <1> 	; 16/03/2016
  4753                              <1> csftdf2_read_error:
  4754 0000BFA2 B011                <1> 	mov	al, 17 ; ; Drive not ready or read error!
  4755                              <1> csftdf2_rw_error:
  4756 0000BFA4 A2[C5880100]        <1> 	mov	[csftdf_rw_err], al
  4757                              <1> 
  4758                              <1> csftdf2_write_file_OK:
  4759                              <1> 	; 18/03/2016
  4760 0000BFA9 C605[D9840100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  4761 0000BFB0 E8E7F0FFFF          <1> 	call	save_directory_buffer
  4762                              <1> 
  4763                              <1>  	; Update last modification date&time of destination
  4764                              <1> 	; file's (parent) directory
  4765 0000BFB5 E87AF1FFFF          <1> 	call	update_parent_dir_lmdt
  4766                              <1> 	;
  4767 0000BFBA A1[CC880100]        <1> 	mov	eax, [csftdf_sf_mem_addr] ; start address
  4768                              <1> 
  4769 0000BFBF 21C0                <1> 	and	eax, eax
  4770 0000BFC1 7509                <1> 	jnz	short csftdf2_dealloc_mblock
  4771                              <1> 
  4772                              <1> 	; 31/08/2024
  4773                              <1> 	;mov	ch, al ; 0 (Cluster r/w, not full loading)
  4774                              <1> csftdf2_dealloc_retn:
  4775                              <1> 	;mov	cl, [csftdf_rw_err]
  4776                              <1> 	;mov	eax, [csftdf_df_cluster]
  4777                              <1> 	; 31/08/2024
  4778 0000BFC3 A0[C5880100]        <1> 	mov	al, [csftdf_rw_err]
  4779 0000BFC8 3C01                <1> 	cmp	al, 1
  4780 0000BFCA F5                  <1> 	cmc
  4781                              <1> 	; if al > 0 -> cf = 1
  4782                              <1> csftdf2_write_df_error:	; 31/08/2024
  4783                              <1> csftdf2_write_df_clust_@@: ; 31/08/2024
  4784 0000BFCB C3                  <1> 	retn
  4785                              <1> 
  4786                              <1> csftdf2_dealloc_mblock:
  4787 0000BFCC 8B0D[D0880100]      <1> 	mov	ecx, [csftdf_sf_mem_bsize] ; block size
  4788 0000BFD2 E8369FFFFF          <1> 	call	deallocate_memory_block
  4789                              <1> 	; 31/08/2024
  4790                              <1>         ;mov	ch, 0FFh ; (File was full loaded at memory)
  4791 0000BFD7 EBEA                <1> 	jmp	short csftdf2_dealloc_retn
  4792                              <1> 
  4793                              <1> 	;;;;
  4794                              <1> csftdf2_update_df_fclust:
  4795                              <1> 	; 31/08/2024
  4796                              <1> 	; 27/08/2024 - TRDOS 386 v2.0.9
  4797                              <1> 	; update (directory entry of)
  4798                              <1> 	; the new (created) destination file
  4799                              <1> 	; with new first cluster (it was 0 before)
  4800                              <1> 	
  4801 0000BFD9 8B35[F4880100]      <1> 	mov	esi, [csftdf_df_drv_dt]	; (!)
  4802                              <1> 
  4803                              <1> csftdf2_update_df_fclust_@: ; 31/08/2024
  4804 0000BFDF A1[D8880100]        <1> 	mov	eax, [csftdf_df_cluster]
  4805 0000BFE4 21C0                <1> 	and	eax, eax
  4806 0000BFE6 75E3                <1> 	jnz	short csftdf2_write_df_clust_@@
  4807                              <1> 	; if eax = 0, add new cluster
  4808                              <1> ; 31/08/2024
  4809                              <1> %if 0
  4810                              <1> 	call	get_first_free_cluster
  4811                              <1> 	jc	short csftdf2_write_df_error
  4812                              <1> 	; EAX >= 2 and EAX < FFFFFFFFh is valid
  4813                              <1> 
  4814                              <1> 	cmp	eax, 0FFFFFFFFh ; no free space
  4815                              <1> 	jne	short csftdf2_write_df_clust_@
  4816                              <1> 	inc	eax ; 0
  4817                              <1> 	stc
  4818                              <1> 	mov	al, 27h ; insufficient disk space
  4819                              <1> csftdf2_write_df_error:
  4820                              <1> 	retn
  4821                              <1> %else
  4822                              <1> 	; 31/08/2024
  4823 0000BFE8 E80E0C0000          <1> 	call	add_new_cluster
  4824 0000BFED 72DC                <1> 	jc	short csftdf2_write_df_error
  4825                              <1> %endif
  4826                              <1> 
  4827                              <1> csftdf2_write_df_clust_@:
  4828                              <1> 	; 31/08/2024
  4829 0000BFEF A3[D8880100]        <1> 	mov	[csftdf_df_cluster], eax
  4830                              <1> 	;
  4831                              <1> 	; eax = (new) first cluster
  4832 0000BFF4 56                  <1> 	push	esi
  4833 0000BFF5 BE[6E880100]        <1> 	mov	esi, DestinationFile_DirEntry
  4834 0000BFFA 0FB73D[96880100]    <1> 	movzx	edi, word [DestinationFile_DirEntryNumber]
  4835 0000C001 C1E705              <1> 	shl	edi, 5 ; 32 * index number
  4836 0000C004 81C700000800        <1> 	add	edi, Directory_Buffer
  4837 0000C00A C1C010              <1> 	rol	eax, 16
  4838 0000C00D 66894614            <1> 	mov	[esi+DirEntry_FstClusHI],ax
  4839 0000C011 C1C810              <1> 	ror	eax, 16
  4840 0000C014 6689461A            <1> 	mov	[esi+DirEntry_FstClusLO],ax
  4841 0000C018 B908000000          <1> 	mov	ecx, 8 ; 32 bytes
  4842 0000C01D F3A5                <1> 	rep	movsd
  4843 0000C01F 5E                  <1> 	pop	esi
  4844                              <1> 	;
  4845 0000C020 C605[D9840100]02    <1> 	mov	byte [DirBuff_ValidData], 2 ; change sign
  4846                              <1> 
  4847                              <1> ; 31/08/2024
  4848                              <1> %if 0
  4849                              <1> 	call	save_directory_buffer
  4850                              <1> 	jc	short csftdf2_write_df_error
  4851                              <1> 	;
  4852                              <1> 	; +1 cluster is in use (as first cluster)
  4853                              <1> 	mov	ebx, [esi+LD_FreeSectors]
  4854                              <1> 	inc	ebx  ; 0FFFFFFFFh ? invalid ?
  4855                              <1> 	jz	short csftdf2_write_df_clust_@@ ; yes
  4856                              <1> 	xor	ebx, ebx
  4857                              <1> 	mov	bl, [esi+LD_BPB+BPB_SecPerClust]
  4858                              <1> 	sub	[esi+LD_FreeSectors], ebx
  4859                              <1> 	;
  4860                              <1> csftdf2_write_df_clust_@@:
  4861                              <1> 	retn
  4862                              <1> 	;;;;
  4863                              <1> %else
  4864                              <1> 	; 31/08/2024
  4865 0000C027 E970F0FFFF          <1> 	jmp	save_directory_buffer
  4866                              <1> %endif
  4867                              <1> 
  4868                              <1> csftdf2_save_fs_file:
  4869                              <1> 	; 16/10/2016 (1Dh -> 18)
  4870                              <1> 	; temporary - (21/03/2016)
  4871                              <1> 	;mov	eax, 18 ; write error
  4872                              <1> 	; 29/07/2022
  4873 0000C02C 31C0                <1> 	xor	eax, eax
  4874 0000C02E B012                <1> 	mov	al, 18
  4875 0000C030 F9                  <1> 	stc
  4876 0000C031 C3                  <1> 	retn
  4877                              <1> 
  4878                              <1> create_file:
  4879                              <1> 	; 31/08/2024
  4880                              <1> 	; 29/08/2024
  4881                              <1> 	; 27/08/2024
  4882                              <1> 	; 26/08/2024 (TRDOS 386 v2.0.9)
  4883                              <1> 	; 30/07/2022
  4884                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  4885                              <1> 	; 16/10/2016
  4886                              <1> 	; 24/03/2016, 31/03/2016
  4887                              <1> 	; 20/03/2016, 21/03/2016, 23/03/2016
  4888                              <1> 	; 19/03/2016 (TRDOS 396 = TRDOS v2.0)
  4889                              <1> 	; 03/09/2011 (FILE.ASM, 'proc_create_file')
  4890                              <1> 	; 09/08/2010
  4891                              <1> 	;
  4892                              <1> 	; INPUT ->
  4893                              <1> 	; 	EAX = File Size
  4894                              <1> 	; 	ESI = ASCIIZ File Name
  4895                              <1> 	; 	CL = File Attributes 
  4896                              <1> 	;	EBX = FFFFFFFFh -> create empty file
  4897                              <1> 	;			 (only for FAT fs)
  4898                              <1> 	; OUTPUT ->
  4899                              <1> 	;	EAX = New file's first cluster
  4900                              <1> 	;		 (0 for empty file) ; 29/08/2024
  4901                              <1> 	;	ESI = Logical Dos Drv Descr. Table Addr.
  4902                              <1> 	;	;EBX = CreateFile_Size address
  4903                              <1> 	;	;ECX = Sectors per cluster (<256)
  4904                              <1> 	;	;EDX = Directory Entry Index/Number (<65536)
  4905                              <1> 	;	; 29/08/2024
  4906                              <1> 	;	EBX = File Size (0 for a new, empty file)
  4907                              <1> 	;	ECX = Directory Entry Index/Number (<2048)
  4908                              <1> 	;	     (in directory cluster, not in directory)
  4909                              <1> 	;	EDX = Directory Cluster Number (of the file)
  4910                              <1> 	;	
  4911                              <1> 	;	cf = 1 -> error code in AL (EAX)
  4912                              <1> 	;
  4913                              <1> 	; (Modified registers: eax, ebx, ecx, edx, esi, edi)
  4914                              <1> 	;
  4915                              <1> 
  4916                              <1> ;	test	cl, 18h (directory or volume name)
  4917                              <1> ;	jnz	short loc_createfile_access_denied
  4918 0000C032 80E107              <1> 	and	cl, 07h ; S, H, R
  4919 0000C035 880D[14890100]      <1>         mov     [createfile_attrib], cl
  4920                              <1> 
  4921 0000C03B 89D9                <1> 	mov	ecx, ebx
  4922 0000C03D 89F3                <1> 	mov	ebx, esi ; ASCIIZ File Name address
  4923 0000C03F 29D2                <1> 	sub	edx, edx
  4924 0000C041 8A35[B27D0100]      <1>         mov     dh, [Current_Drv]
  4925 0000C047 BE00010900          <1>         mov     esi, Logical_DOSDisks
  4926 0000C04C 01D6                <1> 	add	esi, edx
  4927                              <1> 
  4928 0000C04E 8815[1F890100]      <1> 	mov	[createfile_UpdatePDir], dl ; 0 ; 31/03/2016
  4929                              <1> 
  4930                              <1> 	; LD_DiskType = 0 for write protection (read only)
  4931 0000C054 807E0101            <1> 	cmp	byte [esi+LD_DiskType], 1 ; 0 = Invalid
  4932 0000C058 7308                <1> 	jnb	short loc_createfile_check_file_sytem
  4933                              <1> 	; 16/10/2016 (TRDOS Error code: 30, disk write protected)
  4934                              <1> 	;mov	eax, 30 ; 13h, MSDOS err : Disk write-protected
  4935                              <1> 	;mov	dx, 0
  4936                              <1> 	; 29/07/2022
  4937 0000C05A 31D2                <1> 	xor	edx, edx ; 0
  4938 0000C05C 31C0                <1> 	xor	eax, eax ; 0
  4939 0000C05E B01E                <1> 	mov	al, 30
  4940 0000C060 F9                  <1> 	stc
  4941                              <1> 	; err retn: EDX = 0, EBX = File name offset
  4942                              <1> 	; ESI -> Dos drive description table address
  4943 0000C061 C3                  <1> 	retn
  4944                              <1> 
  4945                              <1> ;loc_createfile_access_denied:
  4946                              <1> ;	mov	eax, 05h ; access denied (invalid attributes input)
  4947                              <1> ;	stc
  4948                              <1> ;	retn
  4949                              <1> 
  4950                              <1> loc_createfile_check_file_sytem:
  4951                              <1> 	; 27/08/2024
  4952 0000C062 A3[00890100]        <1> 	mov	[createfile_size], eax
  4953                              <1> 	;
  4954 0000C067 807E0301            <1> 	cmp	byte [esi+LD_FATType], 1
  4955 0000C06B 7305                <1> 	jnb	short loc_createfile_chk_empty_FAT_file_sign1
  4956                              <1> 
  4957                              <1> 	; 27/08/2024
  4958                              <1> 	;mov	[createfile_size], eax
  4959                              <1> 	; ESI = Logical Dos Drive Description Table address
  4960                              <1> 	; EBX = ASCIIZ File Name address
  4961 0000C06D E9F9020000          <1> 	jmp	create_fs_file
  4962                              <1> 
  4963                              <1> loc_createfile_chk_empty_FAT_file_sign1:
  4964                              <1> 	; ECX = FFFFFFFFh -> create empty file if drive has FAT fs
  4965 0000C072 41                  <1> 	inc	ecx
  4966 0000C073 7506                <1> 	jnz	short loc_createfile_chk_empty_FAT_file_sign2
  4967                              <1> 
  4968 0000C075 890D[00890100]      <1> 	mov	[createfile_size], ecx ; 0  ; empty file
  4969                              <1> 
  4970                              <1> loc_createfile_chk_empty_FAT_file_sign2:
  4971                              <1> 	; 23/03/2016
  4972 0000C07B 668B4E11            <1> 	mov	cx, [esi+LD_BPB+BytesPerSec]
  4973 0000C07F 66890D[1C890100]    <1> 	mov	[createfile_BytesPerSec], cx
  4974                              <1> 
  4975                              <1> 	; EBX = ASCIIZ File Name address
  4976 0000C086 0FB65613            <1> 	movzx	edx, byte [esi+LD_BPB+SecPerClust]
  4977 0000C08A 8815[15890100]      <1> 	mov	[createfile_SecPerClust], dl
  4978 0000C090 8B4E74              <1> 	mov	ecx, [esi+LD_FreeSectors]
  4979 0000C093 39D1                <1> 	cmp	ecx, edx ; byte [createfile_SecPerClust]
  4980 0000C095 7306                <1> 	jnb	short loc_create_fat_file
  4981                              <1> 
  4982                              <1> loc_createfile_insufficient_disk_space:
  4983 0000C097 B827000000          <1> 	mov	eax, 27h
  4984                              <1> loc_createfile_gffc_retn:
  4985 0000C09C C3                  <1> 	retn
  4986                              <1> 
  4987                              <1> loc_create_fat_file:
  4988 0000C09D 891D[F8880100]      <1> 	mov	[createfile_Name_Offset], ebx
  4989 0000C0A3 890D[FC880100]      <1> 	mov	[createfile_FreeSectors], ecx
  4990                              <1> 
  4991                              <1> 	; 27/08/2024
  4992                              <1> ;loc_createfile_gffc_1:
  4993                              <1> 	;call	get_first_free_cluster
  4994                              <1> 	;jc	short loc_createfile_gffc_retn
  4995                              <1> 	;
  4996                              <1> 	;mov	[createfile_FFCluster], eax
  4997                              <1> 
  4998                              <1> loc_createfile_locate_ffe_on_directory:
  4999                              <1> 	; Current directory fcluster <> Directory buffer cluster
  5000                              <1> 	; Current directory will be reloaded by
  5001                              <1> 	; 'locate_current_dir_file' procedure
  5002                              <1> 	;
  5003                              <1> 	; ESI = Logical Dos Drv Desc. Table Adress
  5004 0000C0A9 56                  <1> 	push	esi ; *
  5005 0000C0AA 31C0                <1> 	xor	eax, eax
  5006                              <1> 
  5007 0000C0AC A3[CE840100]        <1> 	mov	[FAT_ClusterCounter], eax ; 0
  5008                              <1> 	; 21/03/2016
  5009 0000C0B1 A2[1E890100]        <1> 	mov	[createfile_wfc], al ; 0
  5010                              <1> 
  5011 0000C0B6 89C1                <1>  	mov	ecx, eax
  5012 0000C0B8 6649                <1> 	dec	cx ; FFFFh
  5013                              <1> 	; CX = FFFFh -> find first deleted or free entry
  5014                              <1> 	; ESI would be ASCIIZ filename address if the call
  5015                              <1> 	; would not be for first free or deleted dir entry
  5016 0000C0BA E80FE8FFFF          <1> 	call	locate_current_dir_file
  5017                              <1> 	;jnc	loc_createfile_set_ff_dir_entry
  5018                              <1> 	; 29/07/2022
  5019 0000C0BF 7205                <1> 	jc	short loc_createfile_locate_file_err
  5020                              <1> 	; 26/08/2024
  5021                              <1> 	; cl = 0FFh, ch=0 or ch=0E5h
  5022                              <1> 	; 27/08/2024
  5023                              <1> 	;xor	ecx, ecx ; 26/08/2024
  5024 0000C0C1 E9E5000000          <1> 	jmp	loc_createfile_set_ff_dir_entry
  5025                              <1> 
  5026                              <1> loc_createfile_locate_file_err: ; 29/07/2022
  5027 0000C0C6 5E                  <1> 	pop	esi ; *
  5028                              <1> 	; ESI = Logical DOS Drv. Description Table Address
  5029 0000C0C7 83F802              <1> 	cmp	eax, 2
  5030 0000C0CA 7402                <1> 	je	short loc_createfile_add_new_cluster
  5031                              <1> loc_createfile_locate_file_stc_retn:
  5032 0000C0CC F9                  <1> 	stc
  5033 0000C0CD C3                  <1> 	retn
  5034                              <1> 
  5035                              <1> loc_createfile_add_new_cluster:
  5036 0000C0CE 803D[B17D0100]02    <1> 	cmp	byte [Current_FATType], 2
  5037                              <1> 	;cmp	byte [esi+LD_FATType], 2
  5038 0000C0D5 770C                <1> 	ja	short loc_createfile_add_new_cluster_check_fsc
  5039 0000C0D7 803D[B07D0100]01    <1> 	cmp	byte [Current_Dir_Level], 1
  5040                              <1> 	;cmp	byte [esi+LD_CDirLevel], 1
  5041 0000C0DE 7303                <1> 	jnb	short loc_createfile_add_new_cluster_check_fsc
  5042                              <1> 
  5043                              <1> 	;mov	eax, 12
  5044 0000C0E0 B00C                <1> 	mov	al, 12 ; No more files 
  5045                              <1> 
  5046                              <1> loc_createfile_anc_retn:
  5047 0000C0E2 C3                  <1> 	retn
  5048                              <1> 
  5049                              <1> loc_createfile_add_new_cluster_check_fsc:
  5050 0000C0E3 8B0D[FC880100]      <1> 	mov	ecx, [createfile_FreeSectors]
  5051 0000C0E9 0FB605[15890100]    <1> 	movzx	eax, byte [createfile_SecPerClust]
  5052                              <1> 	;shl	ax, 1 ; AX = 2 * AX
  5053                              <1> 	; 29/07/2022
  5054 0000C0F0 D1E0                <1> 	shl	eax, 1
  5055 0000C0F2 39C1                <1> 	cmp	ecx, eax
  5056 0000C0F4 72A1                <1>         jb	short loc_createfile_insufficient_disk_space
  5057                              <1> 
  5058                              <1> loc_createfile_add_new_subdir_cluster:
  5059 0000C0F6 8B15[DE840100]      <1> 	mov	edx, [DirBuff_Cluster]
  5060 0000C0FC 8915[08890100]      <1> 	mov	[createfile_LastDirCluster], edx
  5061                              <1> 
  5062                              <1> 	; 27/08/2024
  5063                              <1> 	;;;
  5064 0000C102 E887040000          <1> 	call	get_first_free_cluster
  5065 0000C107 72D9                <1> 	jc	short loc_createfile_anc_retn
  5066 0000C109 A3[04890100]        <1> 	mov	[createfile_FFCluster], eax
  5067                              <1> 	;;;
  5068                              <1> 	; 27/08/2024
  5069                              <1> 	;;;
  5070                              <1> 	;mov	eax, [createfile_FFCluster]
  5071                              <1> 	; eax = cluster address of the new directory sector
  5072                              <1> 	;;;
  5073                              <1> 
  5074 0000C10E E815040000          <1> 	call	load_FAT_sub_directory
  5075 0000C113 72CD                <1> 	jc	short loc_createfile_anc_retn
  5076                              <1> 
  5077                              <1> 	; 27/08/2024
  5078                              <1> 	; [DirBuff_Cluster] = [createfile_FFCluster]
  5079                              <1> 
  5080                              <1> pass_createfile_add_new_subdir_cluster:
  5081                              <1> 	; clear directory buffer (new dir sector) ; 27/08/2024
  5082                              <1> 	;movzx	eax, word [esi+LD_BPB+BytesPerSec]
  5083 0000C115 0FB705[1C890100]    <1> 	movzx	eax, word [createfile_BytesPerSec] ; 23/03/2016
  5084                              <1> 	; ecx = directory buffer sector count 
  5085                              <1> 	;	(sectors per cluster)
  5086 0000C11C F7E1                <1> 	mul	ecx
  5087 0000C11E 89C1                <1> 	mov	ecx, eax 
  5088                              <1> 		; (bytes per cluster or directory buffer size)
  5089 0000C120 C1E902              <1> 	shr	ecx, 2 ; dword count
  5090 0000C123 29C0                <1> 	sub	eax, eax ; 0
  5091 0000C125 F3AB                <1> 	rep	stosd
  5092                              <1> 	;
  5093 0000C127 C605[D9840100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  5094 0000C12E E869EFFFFF          <1> 	call	save_directory_buffer
  5095 0000C133 72AD                <1> 	jc	short loc_createfile_anc_retn
  5096                              <1> 
  5097                              <1> loc_createfile_save_added_subdir_cluster:
  5098 0000C135 A1[08890100]        <1> 	mov	eax, [createfile_LastDirCluster]
  5099 0000C13A 8B0D[04890100]      <1> 	mov	ecx, [createfile_FFCluster]
  5100 0000C140 E816050000          <1> 	call	update_cluster
  5101 0000C145 7304                <1> 	jnc	short loc_createfile_save_fat_buffer_0
  5102 0000C147 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  5103 0000C149 7518                <1> 	jnz	short loc_createfile_save_fat_buffer_stc_retn
  5104                              <1> 
  5105                              <1> loc_createfile_save_fat_buffer_0:
  5106 0000C14B A1[04890100]        <1> 	mov	eax, [createfile_FFCluster]
  5107 0000C150 A3[08890100]        <1> 	mov	[createfile_LastDirCluster], eax
  5108                              <1> 	;mov	ecx, 0FFFFFFFh ; 28 bit
  5109                              <1> 	; 29/08/2024
  5110                              <1> 	; (update_cluster will save 28 bit cluster value)
  5111                              <1> 	;mov	ecx, 0FFFFFFFFh
  5112 0000C155 29C9                <1> 	sub	ecx, ecx
  5113 0000C157 49                  <1> 	dec	ecx ; 0FFFFFFFFh
  5114 0000C158 E8FE040000          <1> 	call	update_cluster
  5115 0000C15D 7306                <1> 	jnc	short loc_createfile_save_fat_buffer_1
  5116 0000C15F 09C0                <1> 	or	eax, eax ; Was it EOF ?
  5117 0000C161 7402                <1> 	jz	short loc_createfile_save_fat_buffer_1 ; yes
  5118                              <1> 
  5119                              <1> loc_createfile_save_fat_buffer_stc_retn:
  5120 0000C163 F9                  <1> 	stc
  5121                              <1> loc_createfile_save_fat_buffer_retn:
  5122                              <1> loc_createfile_gffc_2_stc_retn:
  5123 0000C164 C3                  <1> 	retn
  5124                              <1> 
  5125                              <1> loc_createfile_save_fat_buffer_1:
  5126                              <1> 	; byte [FAT_BuffValidData] = 2
  5127 0000C165 E865070000          <1> 	call	save_fat_buffer
  5128 0000C16A 72F8                <1> 	jc	short loc_createfile_save_fat_buffer_retn
  5129                              <1> 
  5130 0000C16C 803D[CE840100]01    <1> 	cmp	byte [FAT_ClusterCounter], 1
  5131 0000C173 7222                <1> 	jb	short loc_createfile_save_fat_buffer_2
  5132                              <1> 
  5133                              <1> 	; ESI = Logical DOS Drive Description Table address
  5134 0000C175 A1[CE840100]        <1> 	mov	eax, [FAT_ClusterCounter]
  5135                              <1> 
  5136 0000C17A C605[CE840100]00    <1> 	mov	byte [FAT_ClusterCounter], 0 ; 21/03/2016
  5137                              <1> 
  5138 0000C181 66BB01FF            <1> 	mov	bx, 0FF01h ; add free clusters 
  5139 0000C185 E8D6070000          <1> 	call	calculate_fat_freespace
  5140                              <1> 
  5141                              <1> 	;inc	eax ; 0FFFFFFFFh -> 0 ; recalculation is needed!
  5142                              <1> 	;jnz	short loc_createfile_save_fat_buffer_2
  5143                              <1> 
  5144                              <1> 	; ecx > 0 -> Recalculation is needed
  5145 0000C18A 09C9                <1> 	or	ecx, ecx 
  5146 0000C18C 7409                <1> 	jz	short loc_createfile_save_fat_buffer_2
  5147                              <1> 
  5148 0000C18E 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate free space
  5149 0000C192 E8C9070000          <1> 	call	calculate_fat_freespace
  5150                              <1> 
  5151                              <1> loc_createfile_save_fat_buffer_2:
  5152                              <1> 	;call	update_parent_dir_lmdt
  5153                              <1> 
  5154                              <1> 	; 27/08/2024
  5155                              <1> ;loc_createfile_gffc_2:
  5156                              <1> 	;call	get_first_free_cluster
  5157                              <1> 	;jc	short loc_createfile_gffc_2_stc_retn
  5158                              <1> 	;
  5159                              <1> 	;mov	[createfile_FFCluster], eax
  5160                              <1> 	;
  5161                              <1> 
  5162 0000C197 A1[08890100]        <1> 	mov	eax, [createfile_LastDirCluster]
  5163                              <1> 
  5164 0000C19C E887030000          <1> 	call	load_FAT_sub_directory
  5165 0000C1A1 72C1                <1> 	jc	short loc_createfile_gffc_2_stc_retn
  5166                              <1> 
  5167 0000C1A3 BF00000800          <1> 	mov	edi, Directory_Buffer
  5168                              <1> 
  5169                              <1> 	; 27/08/2024
  5170                              <1> 	;sub	bx, bx ; directory entry index/number = 0
  5171 0000C1A8 29DB                <1> 	sub	ebx, ebx
  5172                              <1> 	; 29/07/2022
  5173                              <1> 	;sub	ecx, ecx
  5174                              <1> 
  5175 0000C1AA 56                  <1> 	push	esi ; * ; 23/03/2016
  5176                              <1> 
  5177                              <1> loc_createfile_set_ff_dir_entry:
  5178                              <1> 	;;;
  5179                              <1> 	; 29/08/2024
  5180 0000C1AB A1[DE840100]        <1> 	mov	eax, [DirBuff_Cluster]
  5181 0000C1B0 A3[08890100]        <1> 	mov	[createfile_LastDirCluster], eax
  5182                              <1> 	;;;
  5183                              <1> 
  5184                              <1> 	; 27/08/2024
  5185 0000C1B5 66891D[16890100]    <1> 	mov	[createfile_DirIndex], bx
  5186                              <1> 	; 29/07/2022
  5187                              <1> 	;mov	[createfile_DirIndex], cx ; 0
  5188                              <1> 
  5189                              <1> 	;;;
  5190 0000C1BC A1[00890100]        <1> 	mov	eax, [createfile_size]
  5191 0000C1C1 09C0                <1> 	or	eax, eax 
  5192 0000C1C3 740A                <1> 	jz	short loc_createfile_sffc
  5193                              <1> 	; 31/08/2024
  5194 0000C1C5 8B3424              <1> 	mov	esi, [esp] ; * ; LDDDT address
  5195 0000C1C8 E8C1030000          <1> 	call	get_first_free_cluster
  5196 0000C1CD 7295                <1> 	jc	short loc_createfile_gffc_2_stc_retn
  5197                              <1> loc_createfile_sffc:
  5198 0000C1CF A3[04890100]        <1> 	mov	[createfile_FFCluster], eax
  5199 0000C1D4 29C9                <1> 	sub	ecx, ecx ; 0
  5200                              <1> 	;;;
  5201                              <1> 
  5202                              <1>         ; EDI = Directory entry address
  5203 0000C1D6 8B35[F8880100]      <1> 	mov	esi, [createfile_Name_Offset]
  5204                              <1> 	;;;
  5205                              <1> 	; 27/08/2024
  5206                              <1> 	;mov	eax, [createfile_FFCluster]
  5207                              <1> 	;;;
  5208 0000C1DC A3[0C890100]        <1> 	mov	[createfile_Cluster], eax ; 24/03/2016
  5209                              <1> 	;mov	ch, 0FFh
  5210                              <1>         ; 29/07/2022
  5211                              <1> 	; ecx = 0
  5212 0000C1E1 FECD                <1> 	dec	ch ; 0 -> 0FFh
  5213 0000C1E3 8A0D[14890100]      <1> 	mov	cl, [createfile_attrib] ; file attributes
  5214                              <1> 	; CH > 0 -> File size is in [EBX]
  5215 0000C1E9 BB[00890100]        <1> 	mov	ebx, createfile_size
  5216                              <1> 
  5217 0000C1EE E8D6EDFFFF          <1> 	call	make_directory_entry
  5218                              <1> 
  5219 0000C1F3 5E                  <1> 	pop	esi ; * ; ESI = Logical Dos Drv Desc. Table address
  5220                              <1> 
  5221 0000C1F4 C605[D9840100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  5222 0000C1FB E89CEEFFFF          <1> 	call	save_directory_buffer
  5223 0000C200 7213                <1> 	jc	short loc_createfile_set_ff_dir_entry_retn
  5224                              <1> 
  5225 0000C202 C605[1F890100]01    <1> 	mov	byte [createfile_UpdatePDir], 1 ; 31/03/2016
  5226                              <1> 
  5227                              <1> loc_createfile_get_set_write_file_cluster:
  5228 0000C209 A1[00890100]        <1> 	mov	eax, [createfile_size]
  5229 0000C20E 09C0                <1> 	or	eax, eax ; 0 ?
  5230 0000C210 755B                <1> 	jnz	short loc_createfile_get_set_wfc_cont ; no
  5231 0000C212 40                  <1> 	inc	eax ; eax = 1
  5232                              <1> 
  5233                              <1> 	; 27/08/2024 (empty file)
  5234                              <1> 	;;;
  5235                              <1> 	; 23/03/2016
  5236                              <1> 	;movzx	ebx, byte [createfile_SecPerClust]
  5237                              <1> 	;;movzx	ecx, word [esi+LD_BPB+BytesPerSec] ; 512
  5238                              <1>         ;movzx   ecx, word [createfile_BytesPerSec] ; 512
  5239                              <1> 	;;;
  5240 0000C213 EB74                <1> 	jmp	loc_createfile_set_cluster_count
  5241                              <1> 
  5242                              <1> loc_createfile_set_ff_dir_entry_retn:
  5243 0000C215 C3                  <1> 	retn
  5244                              <1> 
  5245                              <1> loc_createfile_write_fcluster_to_disk:
  5246 0000C216 034668              <1> 	add	eax, [esi+LD_DATABegin] ; convert to physical address
  5247 0000C219 BB00000700          <1> 	mov	ebx, Cluster_Buffer
  5248                              <1> 	; ESI = Logical DOS Drv. Desc. Tbl. address
  5249                              <1> 	; EAX = Disk address
  5250                              <1> 	; EBX = Sector Buffer
  5251                              <1> 	; ECX = sectors per cluster
  5252 0000C21E E8025E0000          <1> 	call	disk_write
  5253 0000C223 7211                <1> 	jc	short loc_createfile_dsk_wr_err
  5254                              <1> 
  5255                              <1> loc_createfile_update_fat_cluster:
  5256                              <1> 	; 21/03/2016
  5257 0000C225 803D[1E890100]00    <1> 	cmp	byte [createfile_wfc], 0
  5258 0000C22C 7711                <1> 	ja	short loc_createfile_update_fat_cluster_n1
  5259                              <1> 
  5260 0000C22E FE05[1E890100]      <1> 	inc	byte [createfile_wfc] ; 1
  5261 0000C234 EB1F                <1> 	jmp	short loc_createfile_update_fat_cluster_n2
  5262                              <1> 
  5263                              <1> loc_createfile_dsk_wr_err:
  5264                              <1> 	; 16/10/2016 (1Dh -> 18)
  5265                              <1> 	; 23/03/2016
  5266                              <1> 	;mov	eax, 18 ; Drive not ready or write error !
  5267                              <1> 	; 29/07/2022
  5268 0000C236 29C0                <1> 	sub	eax, eax
  5269 0000C238 B012                <1> 	mov	al, 18
  5270                              <1> loc_cf_stc_retn:
  5271 0000C23A E9BC000000          <1> 	jmp	loc_createfile_stc_retn
  5272                              <1> 
  5273                              <1> loc_createfile_update_fat_cluster_n1:
  5274 0000C23F A1[10890100]        <1> 	mov	eax, [createfile_PCluster]
  5275 0000C244 8B0D[0C890100]      <1> 	mov	ecx, [createfile_Cluster]
  5276 0000C24A E80C040000          <1> 	call	update_cluster
  5277 0000C24F 7304                <1> 	jnc	short loc_createfile_update_fat_cluster_n2
  5278 0000C251 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  5279                              <1> 	;jnz	loc_createfile_stc_retn
  5280                              <1> 	; 29/07/2022
  5281 0000C253 75E5                <1> 	jnz	short loc_cf_stc_retn
  5282                              <1> 
  5283                              <1> loc_createfile_update_fat_cluster_n2:
  5284 0000C255 A1[0C890100]        <1>         mov	eax, [createfile_Cluster]
  5285                              <1> 	;mov	ecx, 0FFFFFFFh
  5286                              <1> 	; 29/08/2024
  5287                              <1> 	; (update_cluster will save 28 bit cluster value)
  5288                              <1> 	;mov	ecx, 0FFFFFFFFh
  5289 0000C25A 29C9                <1> 	sub	ecx, ecx
  5290 0000C25C 49                  <1> 	dec	ecx
  5291 0000C25D E8F9030000          <1> 	call	update_cluster
  5292 0000C262 7355                <1> 	jnc	short loc_createfile_save_fat_buffer_3
  5293 0000C264 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  5294 0000C266 7451                <1> 	jz	short loc_createfile_save_fat_buffer_3
  5295                              <1> 
  5296                              <1> loc_cf_upd_fat_fcluster_stc_retn:
  5297 0000C268 E98E000000          <1> 	jmp	loc_createfile_stc_retn
  5298                              <1> 
  5299                              <1> loc_createfile_get_set_wfc_cont:
  5300                              <1> 	;movzx	ecx, word [esi+LD_BPB+BytesPerSec] ; 512
  5301 0000C26D 0FB70D[1C890100]    <1> 	movzx	ecx, word [createfile_BytesPerSec] ; 512
  5302 0000C274 01C8                <1> 	add	eax, ecx
  5303 0000C276 48                  <1> 	dec	eax  ; add eax, 511
  5304 0000C277 29D2                <1> 	sub	edx, edx
  5305 0000C279 F7F1                <1> 	div	ecx
  5306 0000C27B 0FB61D[15890100]    <1> 	movzx	ebx, byte [createfile_SecPerClust]
  5307 0000C282 01D8                <1> 	add	eax, ebx
  5308 0000C284 48                  <1> 	dec	eax  ; add eax, SecPerClust - 1
  5309                              <1> 	;xor	dx, dx
  5310                              <1> 	; 27/08/2024
  5311 0000C285 31D2                <1> 	xor	edx, edx
  5312 0000C287 F7F3                <1> 	div	ebx
  5313                              <1> 
  5314                              <1> loc_createfile_set_cluster_count:
  5315 0000C289 A3[18890100]        <1> 	mov 	[createfile_CCount], eax
  5316                              <1> 
  5317                              <1> 	; 31/08/2024
  5318                              <1> 	;;;
  5319 0000C28E 833D[00890100]00    <1> 	cmp	dword [createfile_size], 0 ; empty file ?
  5320 0000C295 7422                <1> 	jz	short loc_createfile_save_fat_buffer_3
  5321                              <1> 	;;;
  5322                              <1> 
  5323 0000C297 BF00000700          <1> 	mov	edi, Cluster_Buffer
  5324 0000C29C 89C8                <1> 	mov	eax, ecx ; Bytes per Sector
  5325 0000C29E F7E3                <1> 	mul	ebx ; Sectors per Cluster
  5326                              <1> 	; EAX = Bytes per Cluster
  5327 0000C2A0 89C1                <1> 	mov	ecx, eax
  5328 0000C2A2 C1E902              <1> 	shr	ecx, 2 ; dword count
  5329 0000C2A5 31C0                <1> 	xor	eax, eax
  5330 0000C2A7 F3AB                <1> 	rep	stosd ; clear cluster buffer
  5331                              <1> 
  5332 0000C2A9 A1[0C890100]        <1> 	mov	eax, [createfile_Cluster] ; 24/03/2016
  5333                              <1> 
  5334 0000C2AE 89D9                <1> 	mov	ecx, ebx
  5335                              <1> 
  5336                              <1> loc_createfile_get_set_wf_fclust_cont:
  5337                              <1> 	;sub	eax, 2
  5338                              <1> 	; 30/07/2022
  5339 0000C2B0 48                  <1> 	dec	eax
  5340 0000C2B1 48                  <1> 	dec	eax
  5341 0000C2B2 F7E1                <1> 	mul	ecx
  5342                              <1> 	; EAX = Logical DOS disk address (offset)
  5343 0000C2B4 E95DFFFFFF          <1>         jmp     loc_createfile_write_fcluster_to_disk
  5344                              <1> 
  5345                              <1> loc_createfile_save_fat_buffer_3:
  5346                              <1> 	; byte [FAT_BuffValidData] = 2
  5347 0000C2B9 E811060000          <1> 	call	save_fat_buffer
  5348                              <1> 	;jc	loc_createfile_stc_retn
  5349                              <1> 	; 29/07/2022
  5350 0000C2BE 72A8                <1> 	jc	short loc_cf_upd_fat_fcluster_stc_retn
  5351                              <1> 
  5352                              <1> 	; 21/03/2016
  5353                              <1> 	;cmp	byte [FAT_ClusterCounter], 1
  5354                              <1> 	;jb	short loc_createfile_save_fat_buffer_4
  5355                              <1> 	; 31/08/2024
  5356 0000C2C0 803D[CE840100]00    <1> 	cmp	byte [FAT_ClusterCounter], 0
  5357 0000C2C7 761B                <1> 	jna	short loc_createfile_save_fat_buffer_4 ; cf = 0
  5358                              <1> 
  5359                              <1> 	; ESI = Logical DOS Drive Description Table address
  5360 0000C2C9 A1[CE840100]        <1> 	mov	eax, [FAT_ClusterCounter]
  5361 0000C2CE 66BB01FF            <1> 	mov	bx, 0FF01h ; add free clusters
  5362 0000C2D2 E889060000          <1> 	call	calculate_fat_freespace
  5363                              <1> 
  5364                              <1> 	;inc	eax ; 0FFFFFFFFh -> 0 ; recalculation is needed!
  5365                              <1> 	;jnz	short loc_createfile_save_fat_buffer_4
  5366                              <1> 
  5367                              <1> 	; ecx > 0 -> Recalculation is needed
  5368 0000C2D7 09C9                <1> 	or	ecx, ecx 
  5369 0000C2D9 7409                <1> 	jz	short loc_createfile_save_fat_buffer_4
  5370                              <1> 
  5371 0000C2DB 66BB00FF            <1> 	mov	bx, 0FF00h ; ; recalculate free space
  5372 0000C2DF E87C060000          <1> 	call	calculate_fat_freespace
  5373                              <1> 
  5374                              <1> loc_createfile_save_fat_buffer_4:
  5375 0000C2E4 FF0D[18890100]      <1> 	dec	dword [createfile_CCount]
  5376                              <1> 	;jz	short loc_createfile_upd_dir_modif_date_time
  5377 0000C2EA 743D                <1> 	jz	short loc_createfile_stc_retn_cc ; 31/03/2016
  5378                              <1> 
  5379                              <1> loc_createfile_get_set_write_next_cluster:
  5380 0000C2EC E89D020000          <1> 	call	get_first_free_cluster
  5381 0000C2F1 7208                <1> 	jc	short loc_createfile_stc_retn
  5382                              <1> 
  5383                              <1> loc_createfile_get_set_write_next_cluster_1:
  5384 0000C2F3 83F8FF              <1> 	cmp	eax, 0FFFFFFFFh
  5385 0000C2F6 7211                <1> 	jb	short loc_createfile_get_set_write_next_cluster_2
  5386                              <1> 
  5387                              <1> ;loc_createfile_wnc_insufficient_disk_space:
  5388                              <1> 	;mov	eax, 27h ; Insufficient disk space
  5389                              <1> 	; 29/07/2022
  5390                              <1> 	;xor	eax, eax
  5391                              <1> 	; 29/08/2024
  5392                              <1> 	; eax = FFFFFFFFh
  5393 0000C2F8 40                  <1> 	inc	eax ; eax = 0
  5394 0000C2F9 B027                <1> 	mov	al, 27h
  5395                              <1> 
  5396                              <1> loc_createfile_stc_retn:
  5397 0000C2FB 803D[1E890100]01    <1> 	cmp	byte [createfile_wfc], 1
  5398 0000C302 7324                <1> 	jnb	short loc_createfile_err_retn
  5399 0000C304 C3                  <1> 	retn
  5400                              <1> 
  5401                              <1> loc_createfile_wnc_inv_format_retn:
  5402                              <1> 	;mov	eax, 28
  5403 0000C305 B01C                <1> 	mov	al, 28 ; Invalid format
  5404 0000C307 EBF2                <1> 	jmp	short loc_createfile_stc_retn
  5405                              <1> 
  5406                              <1> loc_createfile_get_set_write_next_cluster_2:
  5407 0000C309 83F802              <1> 	cmp	eax, 2
  5408 0000C30C 72F7                <1> 	jb	short loc_createfile_wnc_inv_format_retn
  5409                              <1> 
  5410                              <1> loc_createfile_get_set_write_next_cluster_3:
  5411 0000C30E 8B0D[0C890100]      <1> 	mov	ecx, [createfile_Cluster]
  5412 0000C314 A3[0C890100]        <1> 	mov	[createfile_Cluster], eax
  5413 0000C319 890D[10890100]      <1> 	mov	[createfile_PCluster], ecx
  5414 0000C31F 0FB60D[15890100]    <1> 	movzx	ecx, byte [createfile_SecPerClust]
  5415 0000C326 EB88                <1> 	jmp	short loc_createfile_get_set_wf_fclust_cont
  5416                              <1> 
  5417                              <1> loc_createfile_err_retn:
  5418 0000C328 F9                  <1> 	stc
  5419                              <1> 
  5420                              <1> ;loc_createfile_upd_dir_modif_date_time:
  5421                              <1> loc_createfile_stc_retn_cc: ; 31/03/2016
  5422 0000C329 9C                  <1> 	pushf	; cpu is here for an error return or completion
  5423 0000C32A 50                  <1> 	push	eax ; error code if cf = 1
  5424                              <1> 
  5425                              <1> 	;call	update_parent_dir_lmdt
  5426                              <1> 
  5427                              <1> ;loc_createfile_stc_retn_cc:
  5428 0000C32B A1[CE840100]        <1> 	mov	eax, [FAT_ClusterCounter]
  5429 0000C330 09C0                <1> 	or	eax, eax
  5430 0000C332 741A                <1> 	jz	short loc_createfile_stc_retn_pop_eax
  5431 0000C334 8A3D[B27D0100]      <1> 	mov	bh, [Current_Drv]
  5432 0000C33A B301                <1> 	mov	bl, 01h ; BL = 1 -> add clusters
  5433                              <1> 	; NOTE: EAX value will be added to Free Cluster Count
  5434                              <1> 	; (If EAX value is negative, Free Cluster Count will be decreased)
  5435 0000C33C E81F060000          <1>   	call	calculate_fat_freespace
  5436                              <1>         ; ESI = Logical DOS Drive Description Table Address
  5437                              <1>         ;jc	short loc_createfile_stc_retn_pop_eax_cf
  5438 0000C341 21C9                <1> 	and	ecx, ecx ; cx = 0 -> valid free sector count
  5439 0000C343 7409                <1> 	jz	short loc_createfile_stc_retn_pop_eax
  5440                              <1> 
  5441                              <1> loc_createfile_stc_retn_recalc_FAT_freespace:
  5442 0000C345 66BB00FF            <1> 	mov	bx, 0FF00h ; bh = 0FFh ->
  5443                              <1> 	; ESI = Logical DOS Drv DT Addr
  5444                              <1> 	; BL = 0 -> Recalculate 
  5445 0000C349 E812060000          <1> 	call	calculate_fat_freespace
  5446                              <1> 
  5447                              <1> loc_createfile_stc_retn_pop_eax:
  5448 0000C34E 58                  <1> 	pop	eax
  5449 0000C34F 9D                  <1> 	popf
  5450 0000C350 7218                <1> 	jc	short loc_createfile_retn
  5451                              <1> 
  5452                              <1> loc_createfile_retn_fcluster:
  5453 0000C352 A1[04890100]        <1> 	mov	eax, [createfile_FFCluster]
  5454                              <1> 	;mov	ebx, createfile_size
  5455                              <1> 	;;movzx	ecx, byte [esi+LD_BPB+SecPerClust]
  5456                              <1> 	;movzx	ecx, byte [createfile_SecPerClust] ; 23/03/2016
  5457                              <1> 	;movzx	edx, word [createfile_DirIndex]
  5458                              <1> 	; 29/08/2024 - TRDOS 386 v2.0.9
  5459 0000C357 8B1D[00890100]      <1> 	mov	ebx, [createfile_size]
  5460 0000C35D 0FB70D[16890100]    <1> 	movzx	ecx, word [createfile_DirIndex] ; = directory entry index
  5461 0000C364 8B15[08890100]      <1> 	mov	edx, [createfile_LastDirCluster] ; = [DirBuff_Cluster]
  5462                              <1> 	; esi = Logical DOS Drive Description Table address 
  5463                              <1> 	; byte [esi] = drive name ; 'A','B','C','D'
  5464                              <1> 
  5465                              <1> loc_createfile_retn:
  5466 0000C36A C3                  <1> 	retn
  5467                              <1> 
  5468                              <1> ; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  5469                              <1> 
  5470                              <1> create_fs_file:
  5471                              <1> 	; temporary (21/03/2016)
  5472                              <1> 	;retn
  5473                              <1> 
  5474                              <1> delete_fs_file:
  5475                              <1> 	; temporary (28/02/2016)
  5476                              <1> 	;retn
  5477                              <1> 
  5478                              <1> rename_fs_file_or_directory:
  5479                              <1> 	;retn
  5480                              <1> 
  5481                              <1> make_fs_directory:
  5482                              <1> 	; temporary (21/02/2016)
  5483                              <1> 	;retn
  5484                              <1> 
  5485                              <1> add_new_fs_section:
  5486                              <1> 	; temporary (11/03/2016)
  5487                              <1> 	;retn
  5488                              <1> 
  5489                              <1> delete_fs_directory_entry:
  5490                              <1> 	; temporary (11/03/2016)
  5491                              <1> 	;retn
  5492                              <1> 
  5493                              <1> csftdf2_read_fs_file_sectors:
  5494                              <1> 	; temporary (19/03/2016)
  5495                              <1> 	;retn
  5496                              <1> 
  5497                              <1> csftdf2_write_fs_file_sectors:
  5498                              <1> 	; temporary (19/03/2016)
  5499 0000C36B C3                  <1> 	retn
  3434                                  %include 'trdosk5.s' ; 24/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.9) - File System Procedures : trdosk5s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 31/08/2024 (Previous: 07/08/2022)
     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 0000C36C A3[C2840100]        <1> 	mov	[FAT_CurrentCluster], eax
    37                              <1> check_next_cluster_fat_type:
    38 0000C371 29D2                <1> 	sub	edx, edx ; 0
    39 0000C373 807E0302            <1> 	cmp     byte [esi+LD_FATType], 2
    40 0000C377 7243                <1> 	jb	short get_FAT12_next_cluster
    41                              <1> 	;ja	get_FAT32_next_cluster
    42                              <1> 	; 25/07/2022
    43 0000C379 7605                <1> 	jna	short get_FAT16_next_cluster
    44 0000C37B E9B2000000          <1> 	jmp	get_FAT32_next_cluster
    45                              <1> 
    46                              <1> get_FAT16_next_cluster:
    47 0000C380 BB00030000          <1> 	mov	ebx, 300h ;768
    48 0000C385 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 0000C387 D1E2                <1> 	shl	edx, 1
    54 0000C389 89D3                <1> 	mov	ebx, edx ; Byte Offset
    55 0000C38B 81C3001C0900        <1> 	add	ebx, FAT_Buffer
    56 0000C391 66BA0300            <1> 	mov	dx, 3
    57 0000C395 F7E2                <1> 	mul	edx
    58                              <1> 	; EAX = FAT Sector (<= 256)
    59                              <1> 	; EDX = 0
    60 0000C397 8A0E                <1> 	mov	cl, [esi+LD_Name]
    61                              <1> 	;cmp	byte [FAT_BuffValidData], 0
    62 0000C399 3815[C6840100]      <1>         cmp	[FAT_BuffValidData], dl ; 0
    63 0000C39F 7674                <1> 	jna	short load_FAT_sectors0
    64 0000C3A1 3A0D[C7840100]      <1> 	cmp	cl, [FAT_BuffDrvName]
    65 0000C3A7 756C                <1>         jne	short load_FAT_sectors0
    66 0000C3A9 3B05[CA840100]      <1> 	cmp	eax, [FAT_BuffSector]
    67 0000C3AF 756A                <1>         jne	short load_FAT_sectors1
    68                              <1> 	;movzx	eax, word [ebx]
    69 0000C3B1 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 0000C3B4 6683F8F7            <1> 	cmp	ax, 0FFF7h
    79 0000C3B8 724E                <1> 	jb	short loc_pass_gnc_FAT16_eoc_check
    80                              <1> 	; ax >= FFF7h (cluster 0002h to FFF6h is valid, in use)
    81 0000C3BA EB4A                <1> 	jmp	short loc_pass_gnc_FAT16_eoc_check_xor_eax
    82                              <1> 
    83                              <1> get_FAT12_next_cluster:
    84 0000C3BC BB00040000          <1> 	mov	ebx, 400h ;1024
    85 0000C3C1 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 0000C3C3 50                  <1> 	push	eax
    91                              <1> 	;mov	ax, 3
    92 0000C3C4 B003                <1> 	mov	al, 3
    93                              <1> 	;mul	dx    	; Multiply by 3
    94 0000C3C6 F7E2                <1> 	mul	edx
    95                              <1> 	;shr	ax, 1	; Divide by 2
    96 0000C3C8 D1E8                <1>         shr	eax, 1
    97                              <1> 	;mov	bx, ax 	; Byte Offset
    98 0000C3CA 89C3                <1> 	mov	ebx, eax
    99 0000C3CC 81C3001C0900        <1> 	add	ebx, FAT_Buffer
   100 0000C3D2 58                  <1> 	pop	eax
   101                              <1> 	;pop	ax
   102                              <1> 	;mov	dx, 3
   103 0000C3D3 B203                <1> 	mov	dl, 3
   104 0000C3D5 F7E2                <1> 	mul	edx
   105                              <1> 	; EAX = FAT Sector (<= 12)
   106                              <1> 	; EDX = 0
   107 0000C3D7 8A0E                <1> 	mov	cl, [esi+LD_Name]
   108                              <1> 	;cmp	byte [FAT_BuffValidData], 0
   109 0000C3D9 3815[C6840100]      <1> 	cmp	[FAT_BuffValidData], dl ; 0
   110 0000C3DF 7634                <1> 	jna	short load_FAT_sectors0
   111 0000C3E1 3A0D[C7840100]      <1> 	cmp	cl, [FAT_BuffDrvName]
   112 0000C3E7 752C                <1> 	jne	short load_FAT_sectors0
   113 0000C3E9 3B05[CA840100]      <1> 	cmp	eax, [FAT_BuffSector]
   114 0000C3EF 752A                <1> 	jne	short load_FAT_sectors1
   115 0000C3F1 A1[C2840100]        <1> 	mov	eax, [FAT_CurrentCluster]
   116                              <1> 	;shr	ax, 1
   117                              <1> 	; 25/07/2022
   118 0000C3F6 D1E8                <1> 	shr	eax, 1
   119                              <1> 	;movzx	eax, word [ebx]
   120 0000C3F8 668B03              <1> 	mov	ax, [ebx]
   121 0000C3FB 7313                <1> 	jnc	short get_FAT12_nc_even
   122                              <1> 	;shr	ax, 4
   123 0000C3FD 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 0000C400 663DF70F            <1> 	cmp	ax, 0FF7h
   130 0000C404 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 0000C406 31C0                <1> 	xor	eax, eax ; 0
   135                              <1> loc_pass_gnc_FAT16_eoc_check:
   136                              <1> loc_pass_gnc_FAT32_eoc_check:
   137 0000C408 8B0D[C2840100]      <1> 	mov	ecx, [FAT_CurrentCluster]
   138 0000C40E F5                  <1> 	cmc
   139 0000C40F C3                  <1> 	retn
   140                              <1> 
   141                              <1> get_FAT12_nc_even:
   142 0000C410 80E40F              <1> 	and	ah, 0Fh
   143 0000C413 EBEB                <1> 	jmp	short loc_gnc_fat12_eoc_check
   144                              <1> 
   145                              <1> load_FAT_sectors0:
   146 0000C415 880D[C7840100]      <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 0000C41B A3[CA840100]        <1> 	mov	[FAT_BuffSector], eax
   152 0000C420 89C3                <1> 	mov	ebx, eax
   153 0000C422 034660              <1>         add     eax, [esi+LD_FATBegin]
   154 0000C425 B202                <1> 	mov	dl, 2
   155                              <1> 	;cmp	byte [esi+LD_FATType], 2
   156 0000C427 385603              <1>         cmp	[esi+LD_FATType], dl ; 2
   157 0000C42A 7748                <1> 	ja      short load_FAT_sectors3
   158 0000C42C 0FB74E1C            <1> 	movzx	ecx, word [esi+LD_BPB+BPB_FATSz16]
   159 0000C430 EB45                <1> 	jmp	short load_FAT_sectors4
   160                              <1> 
   161                              <1> 	; 07/08/2022
   162                              <1> get_FAT32_next_cluster:
   163 0000C432 BB80010000          <1> 	mov	ebx, 180h ;384
   164 0000C437 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 0000C439 C1E202              <1> 	shl	edx, 2
   170 0000C43C 89D3                <1> 	mov	ebx, edx ; Byte Offset
   171 0000C43E 81C3001C0900        <1> 	add	ebx, FAT_Buffer
   172 0000C444 66BA0300            <1> 	mov	dx, 3
   173 0000C448 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 0000C44A 8A0E                <1> 	mov	cl, [esi+LD_Name]
   179                              <1> 	;cmp	byte [FAT_BuffValidData], 0
   180 0000C44C 3815[C6840100]      <1> 	cmp	[FAT_BuffValidData], dl ; 0
   181 0000C452 76C1                <1> 	jna	short load_FAT_sectors0
   182 0000C454 3A0D[C7840100]      <1> 	cmp	cl, [FAT_BuffDrvName]
   183 0000C45A 75B9                <1> 	jne	short load_FAT_sectors0
   184 0000C45C 3B05[CA840100]      <1> 	cmp	eax, [FAT_BuffSector] ; 0, 3, 6, 9 ...
   185 0000C462 75B7                <1> 	jne	short load_FAT_sectors1
   186 0000C464 8B03                <1> 	mov	eax, [ebx]
   187 0000C466 25FFFFFF0F          <1>  	and	eax, 0FFFFFFFh ; 28 bit Cluster
   188 0000C46B 3DF7FFFF0F          <1> 	cmp	eax, 0FFFFFF7h
   189 0000C470 7296                <1> 	jb	short loc_pass_gnc_FAT32_eoc_check
   190                              <1> 	; eax >= FFFFFF7h (cluster 0002h to FFFFFF6h is valid)
   191 0000C472 EB92                <1> 	jmp	short loc_pass_gnc_FAT16_eoc_check_xor_eax
   192                              <1> 
   193                              <1> load_FAT_sectors3:
   194 0000C474 8B4E2A              <1> 	mov	ecx, [esi+LD_BPB+BPB_FATSz32]
   195                              <1> load_FAT_sectors4:
   196 0000C477 29D9                <1> 	sub	ecx, ebx ; [FAT_BuffSector]
   197                              <1> 	; 25/07/2022
   198 0000C479 FEC2                <1> 	inc	dl
   199                              <1> 	; edx = 3
   200                              <1>         ;cmp	ecx, 3
   201 0000C47B 39D1                <1>         cmp	ecx, edx ; 3
   202 0000C47D 7602                <1> 	jna     short load_FAT_sectors5
   203                              <1> 	;mov	ecx, 3
   204                              <1> 	; 25/07/2022
   205 0000C47F 89D1                <1> 	mov	ecx, edx ; 3
   206                              <1> load_FAT_sectors5:
   207 0000C481 BB001C0900          <1> 	mov	ebx, FAT_Buffer
   208 0000C486 E8A95B0000          <1> 	call	disk_read
   209 0000C48B 730C                <1> 	jnc	short load_FAT_sectors_ok
   210                              <1> 	; 15/10/2016 (15h -> 17)
   211                              <1> 	; 23/03/2016 (15h)
   212 0000C48D B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error
   213                              <1> 	;mov	byte [FAT_BuffValidData], 0
   214                              <1> 	; 25/07/2022
   215 0000C492 8825[C6840100]      <1> 	mov	byte [FAT_BuffValidData], ah ; 0
   216 0000C498 C3                  <1> 	retn
   217                              <1> load_FAT_sectors_ok:
   218 0000C499 C605[C6840100]01    <1> 	mov	byte [FAT_BuffValidData], 1
   219 0000C4A0 A1[C2840100]        <1> 	mov	eax, [FAT_CurrentCluster]
   220 0000C4A5 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 0000C4AA 8A1E                <1> 	mov	bl, [esi+LD_Name]
   248 0000C4AC 8A7E03              <1> 	mov	bh, [esi+LD_FATType]
   249                              <1> 
   250                              <1> 	;mov	[DirBuff_DRV], bl
   251                              <1> 	;mov	[DirBuff_FATType], bh
   252 0000C4AF 66891D[D7840100]    <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 0000C4B6 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 0000C4BA 89D0                <1> 	mov	eax, edx
   265 0000C4BC 6681FA0002          <1> 	cmp	dx, 512 ; Number of Root Dir Entries
   266 0000C4C1 740B                <1> 	je	short lrd_mov_ecx_32
   267                              <1> 	;mov	eax, edx ; 25/07/2022
   268                              <1> 	; 23/10/2016
   269 0000C4C3 89C1                <1> 	mov	ecx, eax
   270 0000C4C5 6683C10F            <1> 	add	cx, 15 ; round up 
   271                              <1> 	;shr	cx, 4  ; 16 entries per sector (512/32)
   272                              <1> 	; 25/07/2022
   273 0000C4C9 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 0000C4CC 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 0000C4CE 29C9                <1> 	sub	ecx, ecx
   287 0000C4D0 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 0000C4D2 4A                  <1> 	dec	edx ; root dir entries - 1
   294 0000C4D3 C1E005              <1> 	shl	eax, 5 ; * 32
   295                              <1> 	;
   296 0000C4D6 29DB                <1> 	sub	ebx, ebx ; 0
   297 0000C4D8 881D[D9840100]      <1> 	mov	[DirBuff_ValidData], bl ; 0
   298 0000C4DE 668915[DC840100]    <1> 	mov	[DirBuff_LastEntry], dx
   299 0000C4E5 891D[DE840100]      <1> 	mov	[DirBuff_Cluster], ebx ; 0
   300 0000C4EB 66A3[E2840100]      <1> 	mov	[DirBuffer_Size], ax
   301                              <1> 
   302 0000C4F1 8B4664              <1> 	mov	eax, [esi+LD_ROOTBegin]
   303                              <1> read_directory:
   304 0000C4F4 BB00000800          <1> 	mov	ebx, Directory_Buffer
   305 0000C4F9 51                  <1> 	push	ecx ; Directory buffer sector count
   306 0000C4FA 53                  <1> 	push	ebx
   307 0000C4FB E8345B0000          <1> 	call	disk_read
   308 0000C500 5B                  <1> 	pop	ebx
   309 0000C501 720B                <1> 	jc	short load_DirBuff_error
   310                              <1> 
   311                              <1> validate_DirBuff_and_return:
   312 0000C503 59                  <1> 	pop	ecx ; Number of loaded sectors
   313 0000C504 C605[D9840100]01    <1> 	mov	byte [DirBuff_ValidData], 1
   314 0000C50B 31C0                <1> 	xor	eax, eax ; 0 = no error
   315 0000C50D C3                  <1> 	retn
   316                              <1> 
   317                              <1> load_DirBuff_error:
   318 0000C50E 89C8                <1> 	mov	eax, ecx ; remaining sectors
   319 0000C510 59                  <1> 	pop	ecx ; sector count
   320 0000C511 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 0000C513 B011                <1> 	mov	al, 17
   326 0000C515 F9                  <1> 	stc
   327 0000C516 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 0000C517 8A1E                <1> 	mov	bl, [esi+LD_Name]
   346 0000C519 8A7E03              <1> 	mov	bh, [esi+LD_FATType]
   347                              <1> 
   348                              <1> 	;mov	[DirBuff_DRV], bl
   349                              <1> 	;mov	[DirBuff_FATType], bh
   350 0000C51C 66891D[D7840100]    <1> 	mov	[DirBuff_DRV], bx
   351                              <1> 
   352                              <1> load_FAT32_root_dir0:
   353 0000C523 8B4632              <1> 	mov	eax, [esi+LD_BPB+FAT32_RootFClust]
   354 0000C526 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 0000C528 8A1E                <1> 	mov	bl, [esi+LD_Name]
   377 0000C52A 8A7E03              <1> 	mov	bh, [esi+LD_FATType]
   378                              <1> 
   379                              <1> 	;mov	[DirBuff_DRV], bl
   380                              <1> 	;mov	[DirBuff_FATType], bh
   381 0000C52D 66891D[D7840100]    <1> 	mov	[DirBuff_DRV], bx
   382                              <1> 
   383                              <1> load_FAT_sub_dir0:
   384 0000C534 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+SecPerClust]
   385                              <1> 
   386 0000C538 882D[D9840100]      <1> 	mov	[DirBuff_ValidData], ch ; 0
   387 0000C53E A3[DE840100]        <1> 	mov	[DirBuff_Cluster], eax
   388                              <1> 
   389 0000C543 0FB74611            <1> 	movzx	eax, word [esi+LD_BPB+BytesPerSec]
   390 0000C547 F7E1                <1> 	mul	ecx
   391 0000C549 C1E805              <1> 	shr	eax, 5 ; directory entry count (dir size / 32)
   392                              <1> 	;dec	ax ; last entry
   393                              <1> 	; 25/07/2022
   394 0000C54C 48                  <1> 	dec	eax
   395 0000C54D 66A3[DC840100]      <1> 	mov	[DirBuff_LastEntry], ax
   396                              <1> 
   397 0000C553 A1[DE840100]        <1> 	mov	eax, [DirBuff_Cluster]
   398 0000C558 83E802              <1> 	sub	eax, 2
   399 0000C55B F7E1                <1> 	mul	ecx
   400 0000C55D 034668              <1> 	add	eax, [esi+LD_DATABegin]
   401                              <1> 	; ecx = sectors per cluster (dir buffer size <= 128 sectors)
   402 0000C560 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 0000C562 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 0000C563 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 0000C567 386E03              <1> 	cmp	[esi+LD_FATType], ch ; 0
   443 0000C56A 761C                <1> 	jna	short read_fs_cluster
   444                              <1> 
   445                              <1> read_fat_file_sectors: ; 18/03/2016
   446 0000C56C 83E802              <1> 	sub	eax, 2 ; Beginning cluster number is always 2
   447 0000C56F 0FB65613            <1> 	movzx	edx, byte [esi+LD_BPB+BPB_SecPerClust] ; 18/03/2016 
   448 0000C573 F7E2                <1> 	mul	edx
   449 0000C575 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 0000C578 E8B75A0000          <1> 	call	disk_read
   458 0000C57D 7306                <1> 	jnc	short rclust_retn
   459                              <1> 	
   460                              <1> 	; 15/10/2016 (15h -> 17)
   461 0000C57F B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error !
   462 0000C584 C3                  <1> 	retn
   463                              <1> 
   464                              <1> rclust_retn:
   465 0000C585 29C0                <1> 	sub	eax, eax ; 0
   466 0000C587 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 0000C588 29C9                <1> 	sub	ecx, ecx
   484 0000C58A 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 0000C58C F9                  <1> 	stc
   492 0000C58D 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                              <1> 	; (Modified registers: eax, ebx, ecx, edx)
   511                              <1> 	;
   512                              <1> 
   513 0000C58E 8B4678              <1> 	mov	eax, [esi+LD_Clusters]
   514 0000C591 40                  <1> 	inc	eax ; add eax, 1
   515 0000C592 A3[64870100]        <1> 	mov	[gffc_last_free_cluster], eax
   516                              <1> 
   517 0000C597 31DB                <1> 	xor	ebx, ebx ; 0 ; 02/03/2016
   518                              <1> 
   519 0000C599 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
   520 0000C59D 760E                <1> 	jna	short loc_gffc_get_first_fat_free_cluster0
   521                              <1> 
   522                              <1> loc_gffc_get_first_fat32_free_cluster:
   523                              <1> 	; 02/03/2016
   524 0000C59F E802060000          <1> 	call	get_fat32_fsinfo_sector_parms
   525 0000C5A4 7207                <1> 	jc	short loc_gffc_get_first_fat_free_cluster0
   526                              <1> 
   527                              <1> loc_gffc_check_fsinfo_parms:
   528                              <1> 	;;mov	ebx, DOSBootSectorBuff
   529                              <1> 	;cmp	dword [ebx], 41615252h
   530                              <1> 	;jne	short loc_gffc_fat32_fsinfo_err
   531                              <1> 	;cmp	dword [ebx+484], 61417272h
   532                              <1> 	;jne	short loc_gffc_fat32_fsinfo_err
   533                              <1> 	;mov	eax, [ebx+492] ; FSI_Next_Free
   534                              <1> 	;EAX = First free cluster
   535                              <1> 	;(from FAT32 FSInfo sector)
   536 0000C5A6 89D0                <1> 	mov	eax, edx ; FSI_Next_Free (First Free Cluster)
   537 0000C5A8 83F8FF              <1> 	cmp	eax, 0FFFFFFFFh ; invalid (unknown) !
   538 0000C5AB 7204                <1> 	jb	short loc_gffc_get_first_fat_free_cluster1
   539                              <1> 
   540                              <1> 	; Start from the 1st cluster of the FAT(32) file system
   541                              <1> loc_gffc_get_first_fat_free_cluster0:
   542                              <1> 	;mov	eax, 2
   543                              <1> 	; 25/07/2022
   544 0000C5AD 29C0                <1> 	sub	eax, eax
   545 0000C5AF B002                <1> 	mov	al, 2
   546                              <1> 	;xor	edx, edx
   547                              <1> 
   548                              <1> loc_gffc_get_first_fat_free_cluster1:
   549 0000C5B1 53                  <1> 	push	ebx ; 02/03/2016
   550                              <1> 
   551                              <1> loc_gffc_get_first_fat_free_cluster2:
   552 0000C5B2 A3[60870100]        <1> 	mov	[gffc_first_free_cluster], eax
   553 0000C5B7 A3[5C870100]        <1> 	mov	[gffc_next_free_cluster], eax
   554                              <1> 
   555                              <1> 	; EBX = FAT32 FSINFO sector buffer address
   556                              <1> 	; (EBX = 0, if the drive has not got FAT32 fs or
   557                              <1> 	; FAT32 FSINFO sector buffer is invalid.)
   558                              <1> 
   559                              <1> loc_gffc_get_first_fat_free_cluster3:
   560 0000C5BC E8ABFDFFFF          <1> 	call	get_next_cluster
   561 0000C5C1 7307                <1> 	jnc	short loc_gffc_get_first_fat_free_cluster4
   562 0000C5C3 09C0                <1> 	or	eax, eax
   563 0000C5C5 740B                <1> 	jz	short loc_gffc_first_free_fat_cluster_next
   564 0000C5C7 5B                  <1> 	pop	ebx ; 02/03/2016
   565 0000C5C8 F5                  <1> 	cmc 	; stc
   566 0000C5C9 C3                  <1> 	retn
   567                              <1> 
   568                              <1> loc_gffc_get_first_fat_free_cluster4:
   569 0000C5CA 21C0                <1> 	and	eax, eax ; next cluster value
   570 0000C5CC 7504                <1> 	jnz	short loc_gffc_first_free_fat_cluster_next
   571 0000C5CE 89C8                <1> 	mov	eax, ecx ; current (previous cluster) value
   572 0000C5D0 EB22                <1> 	jmp	short loc_gffc_check_for_set
   573                              <1> 
   574                              <1> loc_gffc_first_free_fat_cluster_next:
   575 0000C5D2 A1[5C870100]        <1> 	mov	eax, [gffc_next_free_cluster]
   576 0000C5D7 3B05[64870100]      <1> 	cmp	eax, [gffc_last_free_cluster]
   577 0000C5DD 7308                <1> 	jnb	short retn_stc_from_get_first_free_cluster
   578                              <1> pass_gffc_last_cluster_eax_check:
   579 0000C5DF 40                  <1> 	inc	eax ; add eax, 1
   580 0000C5E0 A3[5C870100]        <1> 	mov	[gffc_next_free_cluster], eax
   581 0000C5E5 EBD5                <1> 	jmp	short loc_gffc_get_first_fat_free_cluster3
   582                              <1> 
   583                              <1> retn_stc_from_get_first_free_cluster:
   584 0000C5E7 A1[60870100]        <1> 	mov	eax, [gffc_first_free_cluster]
   585 0000C5EC 83F802              <1> 	cmp	eax, 2
   586 0000C5EF 7709                <1> 	ja	short loc_gffc_check_previous_clusters
   587 0000C5F1 29C0                <1> 	sub	eax, eax
   588 0000C5F3 48                  <1> 	dec	eax ; FFFFFFFFh
   589                              <1> 
   590                              <1> loc_gffc_check_for_set:
   591                              <1> 	; 02/03/2016
   592 0000C5F4 5B                  <1> 	pop	ebx
   593                              <1> 
   594                              <1> 	; EBX = FAT32 FSINFO sector buffer address
   595                              <1> 	; (EBX = 0, if the drive has not got FAT32 fs or
   596                              <1> 	; FAT32 FSINFO sector buffer is invalid.)
   597                              <1> 
   598 0000C5F5 09DB                <1> 	or	ebx, ebx
   599 0000C5F7 750D                <1> 	jnz	short loc_gffc_set_ffree_fat32_cluster
   600                              <1> 
   601                              <1> 	;cmp	byte [esi+LD_FATType], 3
   602                              <1> 	;jnb	short loc_gffc_set_ffree_fat32_cluster
   603                              <1> 
   604                              <1> 	;xor	ebx, ebx ; 0
   605                              <1> 
   606                              <1> loc_gffc_retn:
   607 0000C5F9 C3                  <1> 	retn
   608                              <1> 
   609                              <1> loc_gffc_check_previous_clusters:
   610 0000C5FA 48                  <1> 	dec	eax ; sub eax, 1
   611 0000C5FB A3[64870100]        <1> 	mov	[gffc_last_free_cluster], eax
   612                              <1> 	;mov	eax, 2
   613                              <1> 	; 25/07/2022
   614 0000C600 31C0                <1> 	xor	eax, eax
   615 0000C602 B002                <1> 	mov	al, 2
   616                              <1> 	; eax = 2
   617                              <1> 	;xor	edx, edx
   618 0000C604 EBAC                <1> 	jmp	short loc_gffc_get_first_fat_free_cluster2
   619                              <1> 
   620                              <1> loc_gffc_set_ffree_fat32_cluster:
   621                              <1> 	;call	set_first_free_cluster
   622                              <1> 	;retn
   623                              <1> 	;jmp	short set_first_free_cluster
   624                              <1> 
   625                              <1> set_first_free_cluster:
   626                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   627                              <1> 	; 15/10/2016
   628                              <1> 	; 23/03/2016
   629                              <1> 	; 02/03/2016
   630                              <1> 	; 29/02/2016
   631                              <1> 	; 26/02/2016
   632                              <1> 	; 21/02/2016 (TRDOS 386 = TRDOS v2.0)
   633                              <1> 	; 21/08/2011 (DRV_FAT.ASM, 'proc_set_first_free_cluster')
   634                              <1> 	; 11/07/2010
   635                              <1> 	; INPUT ->
   636                              <1> 	;	ESI = Logical DOS Drive Description Table address
   637                              <1> 	;	EAX = First free cluster
   638                              <1> 	;	EBX = FSINFO sector buffer address
   639                              <1> 	;  	;;If EBX > 0, it is FSINFO sector buffer address
   640                              <1> 	;	;;EBX = 0, if FSINFO sector is not loaded
   641                              <1> 	; OUTPUT->
   642                              <1> 	;	ESI = Logical DOS Drive Description Table address
   643                              <1> 	;  	If EBX > 0, it is FSINFO sector buffer address
   644                              <1> 	;	EBX = 0, if FSINFO sector could not be loaded
   645                              <1> 	; 	CF = 1 -> Error code in AL (EAX)
   646                              <1> 	;	CF = 0 -> first free cluster is successfully updated
   647                              <1> 
   648                              <1> 	;cmp	byte [esi+LD_FATType], 3
   649                              <1> 	;jb	short loc_sffc_invalid_drive
   650                              <1> 
   651                              <1> 	; Save First Free Cluster value for 'update_cluster'
   652 0000C606 89463E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], eax ; First free Cluster
   653                              <1> 
   654                              <1> 	;or	ebx, ebx
   655                              <1> 	;jnz	short loc_sffc_read_fsinfo_sector
   656                              <1> 
   657 0000C609 813B52526141        <1> 	cmp     dword [ebx], 41615252h
   658 0000C60F 753C                <1> 	jne	short loc_sffc_read_fsinfo_sector
   659 0000C611 81BBE4010000727241- <1> 	cmp	dword [ebx+484], 61417272h
   659 0000C61A 61                  <1>
   660 0000C61B 7530                <1> 	jne	short loc_sffc_read_fsinfo_sector
   661                              <1> 
   662 0000C61D 3B83EC010000        <1> 	cmp	eax, [ebx+492]  ; FSI_Next_Free
   663 0000C623 741E                <1> 	je	short loc_sffc_retn
   664                              <1> 
   665                              <1> loc_sffc_write_fsinfo_sector:
   666                              <1> 	; EBX = FSINFO sector buffer
   667                              <1> 	; [CFS_FAT32FSINFOSEC] is set in 'get_fat32_fsinfo_sector_parms'
   668 0000C625 8983EC010000        <1> 	mov	[ebx+492], eax
   669 0000C62B A1[74870100]        <1> 	mov	eax, [CFS_FAT32FSINFOSEC]
   670                              <1> 	;mov	ecx, 1
   671                              <1> 	; 25/07/2022
   672 0000C630 31C9                <1> 	xor	ecx, ecx
   673 0000C632 FEC1                <1> 	inc	cl
   674                              <1> 	; ecx = 1
   675 0000C634 53                  <1> 	push	ebx
   676 0000C635 E8EB590000          <1> 	call	disk_write
   677 0000C63A 7208                <1> 	jc      short loc_sffc_read_fsinfo_sector_err1
   678 0000C63C 5B                  <1> 	pop	ebx
   679                              <1> 
   680 0000C63D 8B83EC010000        <1> 	mov	eax, [ebx+492] ; First (Next) Free Cluster
   681                              <1> 
   682                              <1> loc_sffc_retn:
   683 0000C643 C3                  <1> 	retn
   684                              <1> 
   685                              <1> ;loc_sffc_invalid_drive:
   686                              <1> ;	mov	eax, 0Fh ; MSDOS Error : Invalid drive
   687                              <1> ;	push	edx
   688                              <1> 
   689                              <1> loc_sffc_read_fsinfo_sector_err1:
   690                              <1> 	; 25/07/2022
   691                              <1> 	;mov	ebx, 0
   692                              <1> 	; 15/10/2016 (1Dh -> 18)
   693                              <1> 	; 23/03/2016 (1Dh)
   694                              <1> 	;mov	eax, 18 ; Drive not ready or write error
   695 0000C644 31C0                <1> 	xor	eax, eax
   696 0000C646 89C3                <1> 	mov	ebx, eax ; 0
   697 0000C648 B012                <1> 	mov	al, 18
   698 0000C64A F9                  <1> 	stc
   699                              <1> loc_sffc_read_fsinfo_sector_err2:
   700 0000C64B 5A                  <1> 	pop	edx
   701 0000C64C C3                  <1> 	retn
   702                              <1> 	
   703                              <1> loc_sffc_read_fsinfo_sector:
   704 0000C64D 50                  <1> 	push	eax
   705                              <1> 
   706 0000C64E E853050000          <1> 	call	get_fat32_fsinfo_sector_parms
   707 0000C653 72F6                <1> 	jc	short loc_sffc_read_fsinfo_sector_err2
   708                              <1> 
   709 0000C655 58                  <1> 	pop	eax
   710                              <1> 	; EDX = First (Next) Free Cluster value from FSINFO sector
   711                              <1> 	; EAX = First Free Cluster value from 'get_next_cluster'
   712                              <1> 	; (edx = old value)
   713 0000C656 39D0                <1> 	cmp	eax, edx ; First free Cluster (eax = new value)
   714 0000C658 75CB                <1> 	jne	short loc_sffc_write_fsinfo_sector
   715                              <1> 
   716 0000C65A C3                  <1> 	retn
   717                              <1> 
   718                              <1> update_cluster:
   719                              <1> 	; 31/08/2024
   720                              <1> 	; 29/08/2024
   721                              <1> 	; 26/08/2024
   722                              <1> 	; 24/08/2024 (TRDOS 386 Kernel v2.0.9)
   723                              <1> 	; 07/08/2022
   724                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   725                              <1> 	; 23/10/2016
   726                              <1> 	; 23/03/2016
   727                              <1> 	; 02/03/2016
   728                              <1> 	; 01/03/2016
   729                              <1> 	; 29/02/2016
   730                              <1> 	; 27/02/2016
   731                              <1> 	; 26/02/2016
   732                              <1> 	; 22/02/2016 (TRDOS 386 = TRDOS v2.0)
   733                              <1> 	; 11/08/2011
   734                              <1> 	; 09/02/2005
   735                              <1> 	; INPUT ->
   736                              <1> 	;	EAX = Cluster Number
   737                              <1> 	;	ECX = New Cluster Value
   738                              <1> 	;	ESI = Logical Dos Drive Parameters Table
   739                              <1> 	;
   740                              <1> 	;	/// dword [FAT_ClusterCounter] ///
   741                              <1> 	;
   742                              <1> 	; OUTPUT ->
   743                              <1> 	;	cf = 0 -> No Error, EAX is valid
   744                              <1> 	;	cf = 1 & EAX = 0 -> End Of Cluster Chain
   745                              <1> 	; 	cf = 1 & EAX > 0 -> Error
   746                              <1> 	;		(ECX -> any value)
   747                              <1> 	; 	EAX = Next Cluster
   748                              <1> 	;	ECX = New Cluster Value
   749                              <1> 	;
   750                              <1> 	;	/// [FAT_ClusterCounter] is updated,
   751                              <1> 	;	/// decreased when a free cluster is assigned,
   752                              <1> 	;	/// increased if an assigned cluster is freed.
   753                              <1> 	;
   754                              <1> 	;
   755                              <1> 	; (Modified registers: EAX, EBX, -ECX-, EDX)
   756                              <1> 	
   757 0000C65B A3[C2840100]        <1> 	mov	[FAT_CurrentCluster], eax
   758 0000C660 890D[68870100]      <1> 	mov	[ClusterValue], ecx
   759                              <1> 
   760                              <1> loc_update_cluster_check_fat_buffer:
   761 0000C666 8A1E                <1> 	mov	bl, [esi+LD_Name]
   762 0000C668 381D[C7840100]      <1> 	cmp	[FAT_BuffDrvName], bl
   763 0000C66E 7418                <1> 	je	short loc_update_cluster_check_fat_type
   764 0000C670 803D[C6840100]02    <1> 	cmp	byte [FAT_BuffValidData], 2
   765                              <1> 	;je	loc_uc_save_fat_buffer
   766                              <1> 	; 25/07/2022
   767 0000C677 7502                <1> 	jne	short loc_uc_reset_fat_buffer_validation
   768 0000C679 EB66                <1> 	jmp	loc_uc_save_fat_buffer
   769                              <1> 
   770                              <1> loc_uc_reset_fat_buffer_validation:
   771 0000C67B C605[C6840100]00    <1> 	mov	byte [FAT_BuffValidData], 0
   772                              <1> 
   773                              <1> loc_uc_check_fat_type_reset_drvname:
   774 0000C682 881D[C7840100]      <1> 	mov	[FAT_BuffDrvName], bl
   775                              <1> 
   776                              <1> loc_update_cluster_check_fat_type:
   777 0000C688 29D2                <1> 	sub	edx, edx ; 26/02/2016
   778 0000C68A 8A5E03              <1> 	mov	bl, [esi+LD_FATType]
   779 0000C68D 83F802              <1> 	cmp	eax, 2
   780 0000C690 7218                <1>         jb	short update_cluster_inv_data
   781                              <1> 
   782                              <1> 	;;;
   783                              <1> 	; 24/08/2024
   784                              <1> 	; edx = 0 ; 24/08/2024
   785 0000C692 8B4E78              <1> 	mov	ecx, [esi+LD_Clusters]
   786 0000C695 41                  <1> 	inc	ecx
   787 0000C696 890D[D2840100]      <1> 	mov	[LastCluster], ecx
   788                              <1> 	;
   789 0000C69C 39C8                <1> 	cmp	eax, ecx
   790                              <1> 	;ja	short return_uc_fat32_stc ; 25/07/2022
   791                              <1> 	; edx = 0 ; (must be -1 or > 0 after here)
   792 0000C69E 7717                <1> 	ja	short return_uc_fat_stc
   793                              <1> 	;;;
   794                              <1> 
   795 0000C6A0 80FB02              <1> 	cmp	bl, 2
   796                              <1>         ;ja	update_fat32_cluster
   797                              <1> 	; 25/07/2022
   798 0000C6A3 7608                <1> 	jna	short loc_uc_check_fat_type_1
   799 0000C6A5 E97B010000          <1> 	jmp	update_fat32_cluster
   800                              <1> 
   801                              <1> ; 24/08/2024
   802                              <1> ;loc_uc_check_fat_type_1:
   803                              <1> ;	;cmp	bl, 1
   804                              <1> ;	;jb	short update_cluster_inv_data
   805                              <1> ;	mov	ecx, [esi+LD_Clusters]
   806                              <1> ;	inc	ecx  
   807                              <1> ;	mov	[LastCluster], ecx
   808                              <1> ;	cmp	eax, ecx ; dword [LastCluster]
   809                              <1> ;	;ja	return_uc_fat_stc
   810                              <1> ;	; 25/07/2022
   811                              <1> ;	jna	short loc_uc_check_fat_type_2
   812                              <1> ;	; 24/08/2024
   813                              <1> ;	; edx = 0 ; (must be -1 or > 0 after here)
   814                              <1> ;	jmp	return_uc_fat_stc
   815                              <1> 
   816                              <1> 	; 25/07/2022
   817                              <1> update_cluster_inv_data:
   818                              <1> 	;;mov	eax, 0Dh
   819                              <1> 	;mov	al, 0Dh  ; Invalid Data
   820                              <1> 	; 31/08/2024
   821 0000C6AA B01D                <1> 	mov	al, ERR_INV_DATA ; 29 ; Invalid Data
   822 0000C6AC C3                  <1> 	retn
   823                              <1> 
   824                              <1> 	; 24/08/2024
   825                              <1> loc_uc_check_fat_type_1:
   826                              <1> loc_uc_check_fat_type_2:
   827                              <1> 	; TRDOS v1 has a FATal bug here !
   828                              <1> 		; or bl, bl ; cmp bl, 0
   829                              <1> 		; jz short update_fat12_cluster
   830                              <1> 	; !! It would destroy FAT12 floppy disk fs here !!
   831                              <1> 	; ('A:' disks of TRDOS v1 operating system project
   832                              <1> 	; had 'singlix fs', so, I could not differ this mistake
   833                              <1> 	; on a drive 'A:')
   834 0000C6AD 80FB01              <1> 	cmp	bl, 1 ; correct comparison is this !
   835                              <1> 	;jna	update_fat12_cluster
   836                              <1> 	; 25/07/2022
   837 0000C6B0 770B                <1> 	ja	short update_fat16_cluster
   838 0000C6B2 E9CF000000          <1> 	jmp	update_fat12_cluster
   839                              <1> 
   840                              <1> 	; 24/08/2024
   841                              <1> ;return_uc_fat16_stc:
   842                              <1> 	; 25/07/2022
   843                              <1> return_uc_fat_stc:
   844                              <1> 	; 24/08/2024
   845                              <1> 	; edx = 0
   846 0000C6B7 4A                  <1> 	dec	edx
   847                              <1> 	; edx = -1 ; 0FFFFFFFFh
   848                              <1> 	; ecx > 0
   849                              <1> return_uc_fat16_stc:	; 24/08/2024
   850                              <1> loc_fat_buffer_stc_0:	; 24/08/2024
   851                              <1> 	; 01/03/2016
   852 0000C6B8 31C0                <1> 	xor	eax, eax
   853 0000C6BA F9                  <1> 	stc
   854 0000C6BB EB70                <1> 	jmp	short loc_fat_buffer_stc_1
   855                              <1> 
   856                              <1> update_fat16_cluster:
   857                              <1> pass_uc_fat16_errc:
   858                              <1> 	;sub	edx, edx
   859                              <1> 	; edx = 0
   860 0000C6BD BB00030000          <1> 	mov	ebx, 300h ; 768
   861 0000C6C2 F7F3                <1> 	div	ebx
   862                              <1> 	; EAX = Count of 3 FAT sectors
   863                              <1> 	; DX = Cluster index in FAT buffer
   864                              <1> 	;mov	bx, dx  
   865                              <1> 	; 25/07/2022
   866 0000C6C4 89D3                <1> 	mov	ebx, edx
   867                              <1> 	;shl	bx, 1 ; Multiply by 2
   868                              <1> 	; 25/07/2022
   869 0000C6C6 D1E3                <1> 	shl	ebx, 1
   870 0000C6C8 66BA0300            <1> 	mov	dx, 3
   871 0000C6CC F7E2                <1> 	mul	edx
   872                              <1> 	; EAX = FAT Sector
   873                              <1> 	; EDX = 0
   874                              <1> 	; EBX = Byte offset in FAT buffer
   875 0000C6CE 8A0D[C6840100]      <1> 	mov	cl, [FAT_BuffValidData]
   876 0000C6D4 80F902              <1> 	cmp	cl, 2
   877 0000C6D7 7518                <1> 	jne	short loc_uc_check_fat16_buff_sector_load
   878                              <1> 
   879                              <1> loc_uc_check_fat16_buff_sector_save:
   880 0000C6D9 3B05[CA840100]      <1> 	cmp	eax, [FAT_BuffSector]
   881                              <1> 	;jne	short loc_uc_save_fat_buffer
   882                              <1> 	;jmp	short loc_update_fat16_cell
   883                              <1> 	; 07/08/2022
   884 0000C6DF 741D                <1> 	je	short loc_update_fat16_cell
   885                              <1> 	;jmp	loc_uc_save_fat_buffer
   886                              <1> 
   887                              <1> 	; 07/08/2022
   888                              <1> loc_uc_save_fat_buffer:
   889                              <1> 	; byte [FAT_BuffValidData] = 2
   890 0000C6E1 E8E9010000          <1> 	call	save_fat_buffer
   891 0000C6E6 7267                <1>         jc	short loc_fat_sectors_rw_error2
   892                              <1> 	;mov	byte [FAT_BuffValidData], 1
   893 0000C6E8 A1[C2840100]        <1> 	mov	eax, [FAT_CurrentCluster]
   894                              <1> 	;mov	ecx, [ClusterValue]
   895                              <1> 	;jmp	short loc_update_cluster_check_fat_buffer
   896 0000C6ED 8A1E                <1> 	mov	bl, [esi+LD_Name] ; 01/03/2016
   897 0000C6EF EB8A                <1>         jmp	loc_uc_reset_fat_buffer_validation
   898                              <1> 
   899                              <1> loc_uc_check_fat16_buff_sector_load:
   900 0000C6F1 80F901              <1> 	cmp	cl, 1 ; byte [FAT_BuffValidData]
   901 0000C6F4 7560                <1>         jne	short loc_uc_load_fat_sectors
   902 0000C6F6 3B05[CA840100]      <1> 	cmp	eax, [FAT_BuffSector]
   903 0000C6FC 7558                <1>         jne	short loc_uc_load_fat_sectors
   904                              <1> 
   905                              <1> loc_update_fat16_cell:
   906                              <1> loc_update_fat16_buffer:
   907 0000C6FE 81C3001C0900        <1> 	add	ebx, FAT_Buffer ; 26/02/2016
   908                              <1> 	;movzx	eax, word [ebx]
   909 0000C704 668B03              <1> 	mov	ax, [ebx]
   910                              <1> 	; 01/03/2016
   911 0000C707 89C2                <1> 	mov	edx, eax ; old value of the cluster
   912 0000C709 A3[C2840100]        <1> 	mov	[FAT_CurrentCluster], eax
   913 0000C70E 8B0D[68870100]      <1> 	mov	ecx, [ClusterValue] ; 32 bits
   914 0000C714 66890B              <1> 	mov	[ebx], cx ; 16 bits !
   915                              <1> 
   916 0000C717 C605[C6840100]02    <1> 	mov	byte [FAT_BuffValidData], 2
   917                              <1> 	
   918 0000C71E 6683F802            <1> 	cmp	ax, 2
   919 0000C722 7294                <1> 	jb	short return_uc_fat16_stc
   920 0000C724 3B05[D2840100]      <1> 	cmp	eax, [LastCluster]
   921 0000C72A 778C                <1> 	ja	short return_uc_fat16_stc
   922                              <1> 
   923                              <1> loc_fat_buffer_updated:
   924                              <1> 	; 01/03/2016
   925 0000C72C F8                  <1> 	clc
   926                              <1> loc_fat_buffer_stc_1:
   927 0000C72D 9C                  <1> 	pushf
   928 0000C72E 21C9                <1> 	and	ecx, ecx
   929 0000C730 7506                <1> 	jnz	short loc_fat_buffer_updated_1
   930                              <1> 
   931                              <1> 	; 01/03/2016 
   932                              <1> 	; new value of the cluster = 0 (free)
   933                              <1> 	; increase free(d) cluster count
   934 0000C732 FF05[CE840100]      <1> 	inc	dword [FAT_ClusterCounter]
   935                              <1> 
   936                              <1> loc_fat_buffer_updated_1: ; new value of the cluster > 0
   937 0000C738 09D2                <1> 	or	edx, edx ; 02/03/2016
   938 0000C73A 7506                <1> 	jnz	short loc_fat_buffer_updated_2
   939                              <1> 	; old value of the cluster = 0 (it was free cluster)
   940                              <1> 	; decrease free(d) cluster count
   941 0000C73C FF0D[CE840100]      <1> 	dec	dword [FAT_ClusterCounter] ; it may be negative number
   942                              <1> 
   943                              <1> loc_fat_buffer_updated_2:
   944 0000C742 9D                  <1> 	popf
   945 0000C743 C3                  <1> 	retn
   946                              <1> 
   947                              <1> 	; 25/07/2022
   948                              <1> loc_fat_sectors_rw_error1:
   949                              <1> 	;mov	byte [FAT_BuffValidData], 0
   950                              <1> 	; 23/10/2016 (15h -> 17)
   951                              <1> 	; 23/03/2016
   952 0000C744 B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error
   953 0000C749 8825[C6840100]      <1> 	mov	[FAT_BuffValidData], ah ; 0
   954                              <1> 
   955                              <1> loc_fat_sectors_rw_error2:
   956                              <1> 	;mov	eax, error code
   957                              <1> 	;mov	edx, 0
   958 0000C74F 8B0D[68870100]      <1> 	mov	ecx, [ClusterValue]
   959 0000C755 C3                  <1> 	retn
   960                              <1> 
   961                              <1> 	; 25/07/2022
   962                              <1> loc_uc_load_fat_sectors:
   963 0000C756 A3[CA840100]        <1> 	mov	[FAT_BuffSector], eax
   964                              <1> 
   965                              <1> load_uc_fat_sectors_zero:
   966 0000C75B 034660              <1> 	add	eax, [esi+LD_FATBegin]
   967 0000C75E BB001C0900          <1> 	mov	ebx, FAT_Buffer
   968 0000C763 B903000000          <1> 	mov	ecx, 3
   969 0000C768 E8C7580000          <1> 	call	disk_read
   970 0000C76D 72D5                <1> 	jc	short loc_fat_sectors_rw_error1
   971                              <1> 
   972 0000C76F C605[C6840100]01    <1>         mov     byte [FAT_BuffValidData], 1
   973 0000C776 A1[C2840100]        <1> 	mov 	eax, [FAT_CurrentCluster]
   974 0000C77B 8B0D[68870100]      <1> 	mov	ecx, [ClusterValue]
   975 0000C781 E902FFFFFF          <1>         jmp     loc_update_cluster_check_fat_type
   976                              <1> 
   977                              <1> update_fat12_cluster:
   978                              <1> pass_uc_fat12_errc:
   979                              <1> 	;sub	edx, edx
   980 0000C786 BB00040000          <1> 	mov	ebx, 400h ; 1024
   981 0000C78B F7F3                <1> 	div	ebx
   982                              <1> 	; EAX = Count of 3 FAT sectors
   983                              <1> 	; DX = Cluster index in FAT buffer
   984                              <1> 	;mov	cx, 3
   985                              <1> 	; 25/07/2022
   986 0000C78D 29C9                <1> 	sub	ecx, ecx
   987 0000C78F B103                <1> 	mov	cl, 3
   988                              <1> 	; ecx = 3
   989                              <1> 	;mov	bx, ax
   990 0000C791 89C3                <1> 	mov	ebx, eax
   991                              <1> 	;mov	ax, cx ; 3
   992 0000C793 89C8                <1> 	mov	eax, ecx
   993                              <1> 	;mul	dx     ; Multiply by 3
   994 0000C795 F7E2                <1> 	mul	edx
   995                              <1> 	;shr	ax, 1  ; Divide by 2
   996 0000C797 D1E8                <1> 	shr	eax, 1
   997                              <1> 	;xchg	bx, ax
   998 0000C799 93                  <1> 	xchg	ebx, eax
   999                              <1> 	; EAX = Count of 3 FAT sectors
  1000                              <1> 	; EBX = Byte Offset in FAT buffer
  1001                              <1> 	;mul	cx  ; 3 * AX
  1002 0000C79A F7E1                <1> 	mul	ecx ; 3 * EAX
  1003                              <1> 	; EAX = FAT Beginning Sector
  1004                              <1> 	; EDX = 0
  1005 0000C79C 8A0D[C6840100]      <1> 	mov	cl, [FAT_BuffValidData]
  1006                              <1> 	; TRDOS v1 has a FATal bug here ! 
  1007                              <1> 	; (it does not have 'cmp cl, 2' instruction here !
  1008                              <1> 	;  while 'jne' is existing !)
  1009 0000C7A2 80F902              <1> 	cmp	cl, 2 ; 2 = dirty buffer (must be written to disk)
  1010 0000C7A5 750D                <1> 	jne	short loc_uc_check_fat12_buff_sector_load
  1011                              <1> 
  1012                              <1> loc_uc_check_fat12_buff_sector_save:
  1013 0000C7A7 3B05[CA840100]      <1> 	cmp	eax, [FAT_BuffSector]
  1014                              <1>         ;jne	short loc_uc_save_fat_buffer
  1015                              <1> 	;jmp	short loc_update_fat12_cell
  1016                              <1> 	; 07/08/2022
  1017 0000C7AD 7412                <1> 	je	short loc_update_fat12_cell
  1018 0000C7AF E92DFFFFFF          <1> 	jmp	loc_uc_save_fat_buffer
  1019                              <1> 
  1020                              <1> loc_uc_check_fat12_buff_sector_load:
  1021 0000C7B4 80F901              <1> 	cmp	cl, 1 ; byte ptr [FAT_BuffValidData]
  1022 0000C7B7 759D                <1>         jne     short loc_uc_load_fat_sectors
  1023 0000C7B9 3B05[CA840100]      <1> 	cmp	eax, [FAT_BuffSector]
  1024 0000C7BF 7595                <1> 	jne	short loc_uc_load_fat_sectors
  1025                              <1> 	; 07/08/2022
  1026                              <1> 	;je	short loc_update_fat12_cell
  1027                              <1> 	;jmp	loc_uc_load_fat_sectors
  1028                              <1> 
  1029                              <1> loc_update_fat12_cell:
  1030 0000C7C1 81C3001C0900        <1> 	add	ebx, FAT_Buffer ; 26/02/2016
  1031                              <1> 	;mov	cx, [FAT_CurrentCluster]
  1032                              <1> 	; 25/07/2022
  1033 0000C7C7 8B0D[C2840100]      <1> 	mov	ecx, [FAT_CurrentCluster]
  1034                              <1> 	;shr	cx, 1
  1035                              <1> 	; 25/07/2022
  1036 0000C7CD D1E9                <1> 	shr	ecx, 1
  1037 0000C7CF 668B03              <1> 	mov	ax, [ebx]
  1038                              <1> 	;mov	dx, ax
  1039 0000C7D2 89C2                <1> 	mov	edx, eax ; 25/07/2022
  1040                              <1> 	; 24/08/2024 (*)
  1041 0000C7D4 8B0D[68870100]      <1> 	mov	ecx, [ClusterValue] ; 32 bits
  1042 0000C7DA 7336                <1> 	jnc	short uc_fat12_nc_even
  1043                              <1> 
  1044                              <1> 	; 26/08/2024
  1045                              <1> 	; ODD cluster number
  1046                              <1> 	; eax = current value (before updated)
  1047                              <1> 	; ecx = new value of the cluster
  1048                              <1>  	; of the cluster
  1049                              <1> 	; low 4 bit of al is high 4 bit
  1050                              <1> 	; of the previous cluster
  1051                              <1> 	;	(it must not be overwritten)
  1052                              <1> 
  1053                              <1> 	;and	ax, 0Fh
  1054                              <1> 	; 25/07/2022
  1055 0000C7DC 240F                <1> 	and	al, 0Fh
  1056                              <1> 	; 24/08/2024 (*)
  1057                              <1> 	;mov	ecx, [ClusterValue] ; 32 bits
  1058                              <1> 	;shl	cx, 4
  1059 0000C7DE C1E104              <1> 	shl	ecx, 4
  1060                              <1> 	;or	cx, ax
  1061 0000C7E1 08C1                <1> 	or	cl, al ; 25/07/2022
  1062                              <1> 	;mov	ax, dx
  1063 0000C7E3 89D0                <1> 	mov	eax, edx
  1064 0000C7E5 66890B              <1> 	mov	[ebx], cx  ; 16 bits !
  1065                              <1> 	;shr	ax, 4 ; al(bit4..7)+ah(bit0..7)
  1066                              <1> 	; 25/07/2022
  1067 0000C7E8 C1E804              <1> 	shr	eax, 4
  1068                              <1> 
  1069                              <1> update_fat12_buffer:
  1070                              <1> 	;;;
  1071                              <1> 	; 24/08/2024
  1072 0000C7EB 8B0D[68870100]      <1> 	mov	ecx, [ClusterValue]
  1073                              <1> 	;;;
  1074 0000C7F1 A3[C2840100]        <1> 	mov	[FAT_CurrentCluster], eax
  1075 0000C7F6 89C2                <1> 	mov	edx, eax ; 01/03/2016
  1076 0000C7F8 C605[C6840100]02    <1> 	mov	byte [FAT_BuffValidData], 2
  1077 0000C7FF 6683F802            <1> 	cmp	ax, 2
  1078 0000C803 724A                <1>         jb      short return_uc_fat12_stc
  1079 0000C805 3B05[D2840100]      <1> 	cmp	eax, [LastCluster]
  1080 0000C80B 7742                <1>         ja      short return_uc_fat12_stc
  1081 0000C80D E91AFFFFFF          <1>         jmp     loc_fat_buffer_updated
  1082                              <1> 
  1083                              <1> uc_fat12_nc_even:
  1084                              <1> 	; 26/08/2024
  1085                              <1> 	; EVEN cluster number
  1086                              <1> 	; eax = current value (before updated)
  1087                              <1> 	; ecx = new value of the cluster
  1088                              <1>  	; of the cluster
  1089                              <1> 	; high 4 bit of ah is low 4 bit
  1090                              <1> 	; of the next cluster (it must not be overwritten)
  1091                              <1> 
  1092 0000C812 662500F0            <1> 	and	ax, 0F000h
  1093                              <1> 	; 24/08/2024 (*)
  1094                              <1> 	;mov	ecx, [ClusterValue] ; 32 bits
  1095 0000C816 80E50F              <1> 	and	ch, 0Fh
  1096                              <1> 	;or	cx, ax
  1097                              <1> 	; 25/07/2022
  1098 0000C819 09C1                <1> 	or	ecx, eax
  1099                              <1> 	;mov	ax, dx
  1100 0000C81B 89D0                <1> 	mov	eax, edx
  1101 0000C81D 66890B              <1> 	mov	[ebx], cx ; 16 bits !
  1102 0000C820 80E40F              <1> 	and	ah, 0Fh ; al(bit0..7)+ah(bit0..3)
  1103 0000C823 EBC6                <1> 	jmp	short update_fat12_buffer
  1104                              <1> 
  1105                              <1> update_fat32_cluster:
  1106                              <1> 	; edx = 0 ; 24/08/2024
  1107                              <1> 	;mov	ecx, [esi+LD_Clusters]
  1108                              <1> 	;inc	ecx
  1109                              <1> 	;mov	[LastCluster], ecx
  1110                              <1> 	; 24/08/2024
  1111                              <1> 	; ecx = [LastCluster]
  1112                              <1> 
  1113                              <1> 	; 24/08/2024
  1114                              <1> 	;cmp	eax, ecx
  1115                              <1> 	;;ja	short return_uc_fat32_stc ; 25/07/2022
  1116                              <1> 	;; 24/08/2024
  1117                              <1> 	;; edx = 0 ; (must be -1 or > 0 after here)
  1118                              <1> 	;ja	short return_uc_fat_stc
  1119                              <1> 
  1120                              <1> pass_uc_fat32_errc:
  1121                              <1> 	;sub	edx, edx
  1122 0000C825 BB80010000          <1> 	mov	ebx, 180h ; 384
  1123 0000C82A F7F3                <1> 	div	ebx
  1124                              <1> 	; EAX = Count of 3 FAT sectors
  1125                              <1> 	; DX = Cluster index in FAT buffer
  1126 0000C82C 89D3                <1> 	mov	ebx, edx
  1127 0000C82E C1E302              <1> 	shl	ebx, 2 ; Multiply by 4
  1128                              <1> 	;mov	edx, 3
  1129                              <1> 	; 25/07/2022
  1130                              <1> 	;xor	dh, dh
  1131                              <1> 	;mov	dl, 3
  1132 0000C831 66BA0300            <1> 	mov	dx, 3
  1133 0000C835 F7E2                <1> 	mul	edx
  1134                              <1> 	; EBX = Cluster Offset in FAT buffer
  1135                              <1> 	; EAX = FAT Sector
  1136                              <1> 	; EDX = 0
  1137 0000C837 8A0D[C6840100]      <1> 	mov	cl, [FAT_BuffValidData]
  1138 0000C83D 80F902              <1> 	cmp	cl, 2
  1139 0000C840 7512                <1> 	jne	short loc_uc_check_fat32_buff_sector_load
  1140                              <1> 
  1141                              <1> loc_uc_check_fat32_buff_sector_save:
  1142 0000C842 3B05[CA840100]      <1> 	cmp	eax, [FAT_BuffSector]
  1143                              <1> 	;jne	loc_uc_save_fat_buffer
  1144                              <1> 	;jmp	short loc_update_fat32_cell
  1145                              <1> 	; 25/07/2022
  1146 0000C848 741C                <1> 	je	short loc_update_fat32_cell
  1147 0000C84A E992FEFFFF          <1> 	jmp	loc_uc_save_fat_buffer
  1148                              <1> 
  1149                              <1> return_uc_fat12_stc:
  1150                              <1> return_uc_fat32_stc:
  1151                              <1> 	; 24/08/2024
  1152 0000C84F E964FEFFFF          <1> 	jmp	loc_fat_buffer_stc_0 ; (*)
  1153                              <1> 	; 25/07/2022
  1154                              <1> 	;sub	eax, eax
  1155                              <1> 	;stc
  1156                              <1> 	;jmp	loc_fat_buffer_stc_1 ; (*)
  1157                              <1> 
  1158                              <1> loc_uc_check_fat32_buff_sector_load:
  1159 0000C854 80F901              <1> 	cmp	cl, 1 ; byte [FAT_BuffValidData]
  1160                              <1> 	;jne	loc_uc_load_fat_sectors
  1161                              <1> 	; 25/07/2022
  1162 0000C857 7508                <1> 	jne	short loc_uc_load_fat_sects
  1163 0000C859 3B05[CA840100]      <1> 	cmp	eax, [FAT_BuffSector]
  1164                              <1> 	;jne	loc_uc_load_fat_sectors
  1165                              <1> 	; 25/07/2022
  1166 0000C85F 7405                <1> 	je	short loc_update_fat32_cell
  1167                              <1> loc_uc_load_fat_sects:
  1168 0000C861 E9F0FEFFFF          <1> 	jmp	loc_uc_load_fat_sectors
  1169                              <1> 
  1170                              <1> loc_update_fat32_cell:
  1171                              <1> loc_update_fat32_buffer:
  1172 0000C866 81C3001C0900        <1> 	add	ebx, FAT_Buffer ; 26/02/2016
  1173 0000C86C 8B03                <1> 	mov	eax, [ebx]
  1174 0000C86E 25FFFFFF0F          <1> 	and	eax, 0FFFFFFFh ; 28 bit cluster value
  1175                              <1> 	
  1176 0000C873 8B15[C2840100]      <1> 	mov	edx, [FAT_CurrentCluster] ; 01/03/2016
  1177                              <1> 
  1178 0000C879 A3[C2840100]        <1> 	mov 	[FAT_CurrentCluster], eax
  1179 0000C87E 8B0D[68870100]      <1> 	mov	ecx, [ClusterValue]
  1180                              <1> 	;;;
  1181                              <1> 	; 29/08/2024
  1182 0000C884 81E1FFFFFF0F        <1> 	and	ecx, 0FFFFFFFh ; 28 bit cluster value
  1183                              <1> 	;;; 
  1184 0000C88A 890B                <1> 	mov	[ebx], ecx ; 29/02/2016
  1185                              <1> 
  1186 0000C88C C605[C6840100]02    <1> 	mov	byte [FAT_BuffValidData], 2
  1187                              <1> 
  1188                              <1> 	; 01/03/2016
  1189 0000C893 21C0                <1> 	and	eax, eax ; was it free cluster ?
  1190 0000C895 7513                <1> 	jnz	short loc_upd_fat32_c0
  1191                              <1> 
  1192                              <1> 	;or	ecx, ecx ; it will be left free ?!
  1193                              <1> 	;jz	short loc_upd_fat32_c3
  1194                              <1> 
  1195 0000C897 3B563E              <1> 	cmp	edx, [esi+LD_BPB+BPB_Reserved+4] ; First free cluster
  1196 0000C89A 751F                <1> 	jne	short loc_upd_fat32_c3
  1197                              <1> 
  1198 0000C89C 3B15[D2840100]      <1> 	cmp	edx, [LastCluster]
  1199 0000C8A2 7206                <1> 	jb	short loc_upd_fat32_c0
  1200                              <1> 
  1201                              <1> 	;mov	edx, 2 ; rewind !
  1202                              <1> 	; 25/07/2022
  1203 0000C8A4 29D2                <1> 	sub	edx, edx
  1204 0000C8A6 B202                <1> 	mov	dl, 2
  1205 0000C8A8 EB0E                <1> 	jmp	short loc_upd_fat32_c2
  1206                              <1> 
  1207                              <1> loc_upd_fat32_c0:
  1208 0000C8AA FF463E              <1> 	inc	dword [esi+LD_BPB+BPB_Reserved+4] ; set it to next cluster
  1209 0000C8AD EB0C                <1> 	jmp	short loc_upd_fat32_c3
  1210                              <1> 
  1211                              <1> loc_upd_fat32_c1:
  1212 0000C8AF 09C9                <1> 	or	ecx, ecx ; will it be free cluster ?
  1213 0000C8B1 7508                <1> 	jnz	short loc_upd_fat32_c3
  1214                              <1> 
  1215 0000C8B3 3B563E              <1> 	cmp	edx, [esi+LD_BPB+BPB_Reserved+4] ; First free cluster
  1216 0000C8B6 7303                <1> 	jnb	short loc_upd_fat32_c3
  1217                              <1> 
  1218                              <1> loc_upd_fat32_c2:
  1219 0000C8B8 89563E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], edx
  1220                              <1> 
  1221                              <1> loc_upd_fat32_c3:
  1222 0000C8BB 89C2                <1> 	mov	edx, eax
  1223                              <1> 
  1224                              <1> loc_upd_fat32_c4:
  1225 0000C8BD 83F802              <1> 	cmp	eax, 2
  1226 0000C8C0 728D                <1> 	jb	short return_uc_fat32_stc ; 25/07/2022 
  1227                              <1> 
  1228                              <1> pass_uc_fat32_c_zero_check_2:
  1229 0000C8C2 3B05[D2840100]      <1> 	cmp	eax, [LastCluster]
  1230 0000C8C8 7785                <1> 	ja	short return_uc_fat32_stc ; 25/07/2022
  1231                              <1> 	
  1232 0000C8CA E95DFEFFFF          <1> 	jmp     loc_fat_buffer_updated
  1233                              <1> 
  1234                              <1> save_fat_buffer:
  1235                              <1> 	; 31/08/2024 (TRDOS 386 v2.0.9)
  1236                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  1237                              <1> 	; 15/10/2016
  1238                              <1> 	; 01/03/2016
  1239                              <1> 	; 22/02/2016 (TRDOS 386 = TRDOS v2.0)
  1240                              <1> 	; 11/08/2011
  1241                              <1> 	; 09/02/2005
  1242                              <1> 	; INPUT ->
  1243                              <1> 	;	None
  1244                              <1> 	; OUTPUT ->
  1245                              <1> 	;	cf = 0 -> OK.
  1246                              <1> 	;	cf = 1 -> error code in AL (EAX)
  1247                              <1> 	;
  1248                              <1> 	;	EBX = FAT_Buffer address
  1249                              <1> 	;
  1250                              <1> 	; (EAX, EDX, ECX, EBX will be modified)
  1251                              <1> 
  1252                              <1> 	;cmp	byte [FAT_BuffValidData], 2
  1253                              <1> 	;je	short loc_save_fat_buff
  1254                              <1> 
  1255                              <1> ;loc_save_fat_buffer_retn:
  1256                              <1> ;	xor	eax, eax
  1257                              <1> ;	retn
  1258                              <1> 
  1259                              <1> loc_save_fat_buff:
  1260 0000C8CF 31D2                <1> 	xor	edx, edx
  1261 0000C8D1 8A35[C7840100]      <1> 	mov	dh, [FAT_BuffDrvName]
  1262 0000C8D7 80FE41              <1> 	cmp	dh, 'A'
  1263 0000C8DA 7252                <1> 	jb	short loc_save_fat_buffer_inv_data_retn
  1264 0000C8DC 80EE41              <1> 	sub	dh, 'A'
  1265 0000C8DF 56                  <1> 	push	esi ; *
  1266 0000C8E0 BE00010900          <1>         mov     esi, Logical_DOSDisks
  1267 0000C8E5 01D6                <1> 	add	esi, edx
  1268                              <1> 
  1269 0000C8E7 8A5603              <1> 	mov	dl, [esi+LD_FATType]
  1270 0000C8EA 20D2                <1> 	and	dl, dl
  1271 0000C8EC 743F                <1> 	jz	short loc_save_fat_buffer_inv_data_pop_retn
  1272                              <1> 
  1273 0000C8EE A1[CA840100]        <1> 	mov	eax, [FAT_BuffSector]
  1274 0000C8F3 80FA02              <1> 	cmp	dl, 2
  1275 0000C8F6 772E                <1> 	ja	short loc_save_fat32_buff
  1276                              <1> 
  1277                              <1> loc_save_fat_12_16_buff:
  1278                              <1> 	; 01/03/2016
  1279                              <1> 	; TRDOS v1 has a FATal bug here!
  1280                              <1> 	; Correct code: mov dx, word ptr [FAT_BuffSector]+2
  1281                              <1> 	; (DX:AX in TRDOS v1 -> EAX in TRDOS v2)
  1282                              <1> 	;
  1283 0000C8F8 0FB74E1C            <1> 	movzx	ecx, word [esi+LD_BPB+FATSecs]
  1284 0000C8FC 29C1                <1> 	sub	ecx, eax
  1285                              <1> 	; TRDOS v1 has a bug here... ('pop esi' was forgotten!)
  1286                              <1> 	;jna	short loc_save_fat_buffer_inv_data_retn ; wrong addr!
  1287 0000C8FE 762D                <1> 	jna	short loc_save_fat_buffer_inv_data_pop_retn ; correct addr.
  1288                              <1> 	; 25/07/2022
  1289                              <1> 	;jmp	short loc_save_fat_buffer_check_rs3
  1290                              <1> 
  1291                              <1> loc_save_fat_buffer_check_rs3:
  1292                              <1> 	; 25/07/2022
  1293 0000C900 29DB                <1> 	sub	ebx, ebx
  1294 0000C902 B303                <1> 	mov	bl, 3
  1295                              <1> 	;cmp	ecx, 3
  1296 0000C904 39D9                <1> 	cmp	ecx, ebx ; 3
  1297 0000C906 7602                <1> 	jna	short loc_save_fat_buff_continue
  1298 0000C908 89D9                <1> 	mov	ecx, ebx ; mov ecx, 3
  1299                              <1> loc_save_fat_buff_continue:
  1300 0000C90A BB001C0900          <1> 	mov	ebx, FAT_Buffer
  1301 0000C90F 034660              <1> 	add	eax, [esi+LD_FATBegin]
  1302 0000C912 51                  <1> 	push	ecx
  1303 0000C913 E80D570000          <1> 	call	disk_write
  1304 0000C918 59                  <1> 	pop	ecx
  1305 0000C919 7239                <1> 	jc	short loc_save_FAT_buff_write_err
  1306                              <1> 
  1307 0000C91B 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
  1308 0000C91F 7613                <1> 	jna	short loc_calc_2nd_fat12_16_addr
  1309                              <1> 
  1310                              <1> loc_calc_2nd_fat32_addr:
  1311 0000C921 8B462A              <1> 	mov	eax, [esi+LD_BPB+FAT32_FAT_Size]
  1312 0000C924 EB12                <1> 	jmp	short loc_calc_2nd_fat_addr
  1313                              <1> 
  1314                              <1> 	; 25/07/2022
  1315                              <1> loc_save_fat32_buff:
  1316 0000C926 8B4E2A              <1> 	mov	ecx, [esi+LD_BPB+FAT32_FAT_Size]
  1317 0000C929 29C1                <1> 	sub	ecx, eax
  1318 0000C92B 77D3                <1> 	ja	short loc_save_fat_buffer_check_rs3
  1319                              <1> 
  1320                              <1> loc_save_fat_buffer_inv_data_pop_retn:
  1321 0000C92D 5E                  <1> 	pop	esi ; *
  1322                              <1> loc_save_fat_buffer_inv_data_retn:
  1323                              <1> 	;mov	eax, 0Dh ; Invalid DATA
  1324                              <1> 	; 25/07/2022
  1325 0000C92E 29C0                <1> 	sub	eax, eax
  1326                              <1> 	;mov	al, 0Dh  ; Invalid Data
  1327                              <1> 	; 31/08/2024
  1328 0000C930 B01D                <1> 	mov	al, ERR_INV_DATA ; 29 ; Invalid Data
  1329 0000C932 F9                  <1> 	stc	; cf = 1
  1330 0000C933 C3                  <1> 	retn
  1331                              <1> 
  1332                              <1> loc_calc_2nd_fat12_16_addr:
  1333 0000C934 0FB7461C            <1> 	movzx	eax, word [esi+LD_BPB+FATSecs]
  1334                              <1> 
  1335                              <1> loc_calc_2nd_fat_addr:
  1336 0000C938 034660              <1> 	add	eax, [esi+LD_FATBegin]
  1337 0000C93B 0305[CA840100]      <1> 	add	eax, [FAT_BuffSector]
  1338 0000C941 BB001C0900          <1> 	mov	ebx, FAT_Buffer
  1339                              <1> 	; ecx = 1 to 3
  1340 0000C946 E8DA560000          <1> 	call	disk_write
  1341 0000C94B 7207                <1> 	jc	short loc_save_FAT_buff_write_err
  1342                              <1>  	; Valid buffer (1 = valid but do not save)
  1343 0000C94D C605[C6840100]01    <1> 	mov	byte [FAT_BuffValidData], 1
  1344                              <1> 
  1345                              <1> loc_save_FAT_buff_write_err:
  1346 0000C954 5E                  <1> 	pop	esi ; *
  1347 0000C955 BB001C0900          <1> 	mov	ebx, FAT_Buffer
  1348                              <1> 	; 15/10/2016 (1Dh -> 18)
  1349                              <1> 	; 23/03/2016 (1Dh)
  1350 0000C95A B812000000          <1> 	mov	eax, 18 ; Drive not ready or write error
  1351 0000C95F C3                  <1> 	retn
  1352                              <1> 
  1353                              <1> calculate_fat_freespace:
  1354                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  1355                              <1> 	; 23/03/2016
  1356                              <1> 	; 02/03/2016
  1357                              <1> 	; 01/03/2016
  1358                              <1> 	; 29/02/2016
  1359                              <1> 	; 22/02/2016 (TRDOS 386 = TRDOS v2.0)
  1360                              <1> 	; 30/04/2011
  1361                              <1> 	; 03/04/2010
  1362                              <1> 	; 2005
  1363                              <1> 	; INPUT ->
  1364                              <1> 	;	EAX = Cluster count to be added or subtracted
  1365                              <1> 	; 	If BH = FFh, ESI = TR-DOS Logical Drive Description Table
  1366                              <1> 	; 	If BH < FFh, BH = TR-DOS Logical Drive Number
  1367                              <1> 	; 	BL: 
  1368                              <1> 	;	0 = Calculate, 1 = Add, 2 = Subtract, 3 = Get (Not Set/Calc)
  1369                              <1> 	; OUTPUT ->
  1370                              <1> 	;	EAX = Free Space in sectors
  1371                              <1> 	;	ESI = Logical Dos Drive Description Table address
  1372                              <1> 	;	BH = Logical Dos Drive Number (same with input value of BH)
  1373                              <1> 	;	BL = Type of operation (same with input value of BL)
  1374                              <1> 	;	ECX = 0 -> valid
  1375                              <1> 	;	ECX > 0 -> error or invalid
  1376                              <1> 	;	If EAX = FFFFFFFFh, it is 're-calculation needed'
  1377                              <1> 	;			          sign due to r/w error
  1378                              <1> 	;
  1379                              <1> 	; (Modifed registers: eax, ebx, ecx, edx, esi)
  1380                              <1> 	;
  1381                              <1> 
  1382 0000C960 66891D[6E870100]    <1> 	mov	[CFS_OPType], bx
  1383 0000C967 A3[70870100]        <1> 	mov	[CFS_CC], eax
  1384                              <1> 
  1385 0000C96C 80FFFF              <1> 	cmp	bh, 0FFh
  1386 0000C96F 740B                <1> 	je	short pass_calculate_freespace_get_drive_dt_offset
  1387                              <1> 
  1388                              <1> loc_calculate_freespace_get_drive_dt_offset:
  1389 0000C971 31C0                <1> 	xor	eax, eax
  1390 0000C973 88FC                <1>         mov     ah, bh
  1391 0000C975 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1392 0000C97A 01C6                <1>         add     esi, eax
  1393                              <1> 
  1394                              <1> pass_calculate_freespace_get_drive_dt_offset:
  1395 0000C97C 08DB                <1> 	or	bl, bl
  1396 0000C97E 7436                <1> 	jz	short loc_reset_fcc
  1397                              <1> 
  1398                              <1> loc_get_free_sectors:
  1399 0000C980 8B4674              <1> 	mov	eax, [esi+LD_FreeSectors]
  1400                              <1> 
  1401                              <1> 	;xor	ecx, ecx
  1402                              <1> 	;dec	ecx ; 0FFFFFFFFh
  1403                              <1> 	;cmp	eax, ecx ; 29/02/2016
  1404                              <1> 	;je	short loc_get_free_sectors_retn ; recalculation is needed!
  1405                              <1> 
  1406                              <1> 	; 23/03/2016
  1407 0000C983 8B4E70              <1> 	mov	ecx, [esi+LD_TotalSectors]
  1408 0000C986 39C1                <1> 	cmp	ecx, eax ; Total sectors must be greater than Free sectors !
  1409 0000C988 7707                <1> 	ja	short loc_get_free_sectors_check_optype
  1410                              <1> 
  1411 0000C98A 31C0                <1> 	xor	eax, eax
  1412 0000C98C 48                  <1> 	dec	eax ; 0FFFFFFFFh  ; recalculation is needed!
  1413 0000C98D 894674              <1> 	mov	[esi+LD_FreeSectors], eax ; reset (for recalculation)
  1414                              <1> 
  1415                              <1> loc_get_free_sectors_retn:
  1416 0000C990 C3                  <1> 	retn
  1417                              <1> 
  1418                              <1> loc_get_free_sectors_check_optype:
  1419 0000C991 80FB03              <1> 	cmp	bl, 3
  1420 0000C994 7203                <1> 	jb	short loc_set_fcc_1 ; 25/07/2022
  1421                              <1> 
  1422 0000C996 29C9                <1> 	sub	ecx, ecx ; 0
  1423                              <1> 
  1424 0000C998 C3                  <1> 	retn
  1425                              <1> 
  1426                              <1> loc_set_fcc_1:
  1427 0000C999 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
  1428                              <1> 	;ja	loc_update_FAT32_fs_info_fcc
  1429                              <1> 	; 25/07/2022
  1430 0000C99D 7605                <1> 	jna	short loc_set_fcc_2
  1431 0000C99F E9DD000000          <1> 	jmp	loc_update_FAT32_fs_info_fcc
  1432                              <1> 
  1433                              <1> loc_set_fcc_2:
  1434                              <1> 	;mov	eax, [esi+LD_FreeSectors]
  1435 0000C9A4 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+SecPerClust]
  1436 0000C9A8 29D2                <1> 	sub	edx, edx
  1437 0000C9AA F7F1                <1> 	div	ecx
  1438                              <1> 	;or	dx, dx
  1439                              <1> 	;	; DX -> Remain sectors < SecPerClust
  1440                              <1> 	;	; DX > 0 -> invalid free sector count
  1441                              <1> 	;jnz	short loc_reset_fcc
  1442                              <1> 
  1443                              <1> ;pass_set_fcc_div32:
  1444 0000C9AC A3[E4840100]        <1> 	mov	[FreeClusterCount], eax
  1445 0000C9B1 E986000000          <1>         jmp     loc_set_free_sectors_FAT12_FAT16
  1446                              <1> 
  1447                              <1> loc_reset_fcc:
  1448 0000C9B6 31C0                <1> 	xor	eax, eax
  1449 0000C9B8 A3[E4840100]        <1> 	mov	[FreeClusterCount], eax ; 0
  1450 0000C9BD 8B5678              <1> 	mov	edx, [esi+LD_Clusters]
  1451 0000C9C0 42                  <1> 	inc	edx
  1452 0000C9C1 8915[D2840100]      <1> 	mov	[LastCluster], edx
  1453                              <1> 
  1454 0000C9C7 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
  1455 0000C9CB 7645                <1> 	jna	short loc_count_free_fat_clusters_0
  1456                              <1> 
  1457 0000C9CD 48                  <1> 	dec	eax ; FFFFFFFFh
  1458 0000C9CE A3[78870100]        <1> 	mov	[CFS_FAT32FC], eax
  1459                              <1> 
  1460                              <1> 	; 29/02/2016
  1461 0000C9D3 89463A              <1> 	mov	[esi+LD_BPB+BPB_Reserved], eax ; reset
  1462 0000C9D6 89463E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], eax ; reset
  1463                              <1> 
  1464                              <1> 	;mov 	eax, 2
  1465                              <1> 	; 25/07/2022
  1466 0000C9D9 40                  <1> 	inc	eax ; eax = 0
  1467 0000C9DA B002                <1> 	mov	al, 2
  1468                              <1> 
  1469                              <1> loc_count_fc_next_cluster_0:
  1470 0000C9DC 50                  <1> 	push	eax
  1471 0000C9DD E88AF9FFFF          <1> 	call	get_next_cluster
  1472 0000C9E2 7310                <1> 	jnc	short loc_check_fat32_ff_cluster
  1473 0000C9E4 09C0                <1> 	or	eax, eax
  1474 0000C9E6 741E                <1> 	jz	short pass_inc_cfs_fcc_0
  1475                              <1> 
  1476                              <1> loc_put_fcc_unknown_sign:
  1477 0000C9E8 58                  <1> 	pop	eax
  1478                              <1> 	; "Free count is Unknown" sign
  1479                              <1> 	;mov	dword [FreeClusterCount], 0FFFFFFFFh
  1480                              <1> 
  1481                              <1> 	; 29/02/2016
  1482                              <1> 	; Save Free Cluster Count value in FAT32 'BPB_Reserved' area
  1483                              <1> 	;mov	[esi+LD_BPB+BPB_Reserved], 0FFFFFFFFh ; unknown!
  1484 0000C9E9 8B15[78870100]      <1> 	mov	edx, [CFS_FAT32FC] ; First Free Cluster
  1485                              <1> 	; Save First Free Cluster value in FAT32 'BPB_Reserved+4' area
  1486 0000C9EF 89563E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], edx
  1487                              <1> 
  1488 0000C9F2 EB7D                <1>         jmp     loc_put_fcc_invalid_sign
  1489                              <1> 
  1490                              <1> loc_check_fat32_ff_cluster:
  1491 0000C9F4 09C0                <1> 	or	eax, eax
  1492 0000C9F6 750E                <1> 	jnz	short pass_inc_cfs_fcc_0
  1493 0000C9F8 58                  <1> 	pop	eax
  1494 0000C9F9 A3[78870100]        <1> 	mov	[CFS_FAT32FC], eax
  1495                              <1> 	;mov	dword [FreeClusterCount], 1
  1496 0000C9FE FF05[E4840100]      <1> 	inc	dword [FreeClusterCount]
  1497 0000CA04 EB27                <1> 	jmp	short pass_inc_cfs_fcc_1
  1498                              <1> 
  1499                              <1> pass_inc_cfs_fcc_0:
  1500 0000CA06 58                  <1> 	pop	eax
  1501                              <1> 
  1502                              <1> pass_inc_cfs_fcc_0c:
  1503 0000CA07 40                  <1> 	inc	eax ; add eax, 1
  1504 0000CA08 3B05[D2840100]      <1> 	cmp	eax, [LastCluster]
  1505 0000CA0E 76CC                <1> 	jna 	short loc_count_fc_next_cluster_0
  1506 0000CA10 EB6F                <1> 	jmp	short loc_update_FAT32_fs_info_fcc
  1507                              <1> 
  1508                              <1> loc_count_free_fat_clusters_0:
  1509                              <1> 	;mov	eax, 2
  1510 0000CA12 B002                <1> 	mov	al, 2
  1511                              <1> 
  1512                              <1> loc_count_fc_next_cluster:
  1513 0000CA14 50                  <1> 	push	eax
  1514 0000CA15 E852F9FFFF          <1> 	call	get_next_cluster
  1515 0000CA1A 720C                <1> 	jc	short loc_count_fcc_stc
  1516                              <1> 
  1517                              <1> loc_count_free_clusters_1:
  1518 0000CA1C 21C0                <1> 	and	eax, eax
  1519 0000CA1E 750C                <1> 	jnz	short pass_inc_cfs_fcc
  1520                              <1> 
  1521 0000CA20 FF05[E4840100]      <1> 	inc	dword [FreeClusterCount]
  1522 0000CA26 EB04                <1> 	jmp	short pass_inc_cfs_fcc
  1523                              <1> 
  1524                              <1> loc_count_fcc_stc:
  1525 0000CA28 09C0                <1> 	or	eax, eax
  1526 0000CA2A 75BC                <1> 	jnz	short loc_put_fcc_unknown_sign ; 29/02/2016
  1527                              <1> 
  1528                              <1> pass_inc_cfs_fcc:
  1529 0000CA2C 58                  <1> 	pop	eax
  1530                              <1> 
  1531                              <1> pass_inc_cfs_fcc_1:
  1532 0000CA2D 40                  <1> 	inc	eax ; add eax, 1
  1533 0000CA2E 3B05[D2840100]      <1> 	cmp	eax, [LastCluster]
  1534 0000CA34 76DE                <1> 	jna	short loc_count_fc_next_cluster
  1535                              <1> 
  1536                              <1> loc_set_free_sectors:
  1537 0000CA36 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
  1538 0000CA3A 7745                <1> 	ja	short loc_update_FAT32_fs_info_fcc
  1539                              <1> 
  1540                              <1> loc_set_free_sectors_FAT12_FAT16:
  1541 0000CA3C 803D[6E870100]00    <1> 	cmp	byte [CFS_OPType], 0
  1542 0000CA43 761C                <1> 	jna	short pass_FAT_add_sub_fcc
  1543 0000CA45 A1[70870100]        <1> 	mov	eax, [CFS_CC]
  1544 0000CA4A 803D[6E870100]01    <1> 	cmp	byte [CFS_OPType], 1
  1545 0000CA51 7708                <1> 	ja	short pass_FAT_add_fcc
  1546 0000CA53 0105[E4840100]      <1> 	add 	[FreeClusterCount], eax
  1547 0000CA59 EB06                <1> 	jmp	short pass_FAT_add_sub_fcc
  1548                              <1> 
  1549                              <1> pass_FAT_add_fcc:
  1550 0000CA5B 2905[E4840100]      <1> 	sub	[FreeClusterCount], eax
  1551                              <1> 
  1552                              <1> pass_FAT_add_sub_fcc:
  1553 0000CA61 0FB64613            <1> 	movzx	eax, byte [esi+LD_BPB+SecPerClust]
  1554 0000CA65 8B15[E4840100]      <1> 	mov	edx, [FreeClusterCount]
  1555 0000CA6B F7E2                <1> 	mul	edx
  1556                              <1> 
  1557 0000CA6D 31C9                <1> 	xor	ecx, ecx 
  1558 0000CA6F EB05                <1> 	jmp	short loc_cfs_retn_params
  1559                              <1> 
  1560                              <1> loc_put_fcc_invalid_sign:
  1561 0000CA71 29C0                <1>        	sub	eax, eax ; 0
  1562 0000CA73 48                  <1> 	dec	eax ; FFFFFFFFh
  1563                              <1> loc_fat32_ffc_recalc_needed:
  1564 0000CA74 89C1                <1> 	mov	ecx, eax
  1565                              <1> 
  1566                              <1> loc_cfs_retn_params:
  1567 0000CA76 894674              <1> 	mov 	[esi+LD_FreeSectors], eax
  1568 0000CA79 0FB71D[6E870100]    <1> 	movzx	ebx, word [CFS_OPType]
  1569 0000CA80 C3                  <1> 	retn
  1570                              <1> 
  1571                              <1> loc_update_FAT32_fs_info_fcc:
  1572                              <1> loc_check_fcc_FSINFO_op:
  1573                              <1> 	; 29/02/2016
  1574                              <1> 	; EAX = Free cluster count (before this update) ; value from disk
  1575                              <1> 	; EDX = First Free Cluster (before this update) ; value from disk
  1576 0000CA81 803D[6E870100]01    <1> 	cmp	byte [CFS_OPType], 1
  1577 0000CA88 7221                <1> 	jb	short loc_cfs_FAT32_get_rcalc_parms ; 0 = recalculated
  1578 0000CA8A 7406                <1> 	je	short loc_check_fcc_FSINFO_op1 ; 1 = add
  1579                              <1> loc_check_fcc_FSINFO_op2: ; subtract
  1580 0000CA8C F71D[70870100]      <1> 	neg	dword [CFS_CC] ; prepare to subtract ; 2 = sub (add negative)
  1581                              <1> loc_check_fcc_FSINFO_op1:
  1582                              <1> 	; 01/03/2016
  1583 0000CA92 31D2                <1> 	xor	edx, edx ; 0
  1584 0000CA94 4A                  <1> 	dec	edx ; 0FFFFFFFFh
  1585 0000CA95 8B463A              <1> 	mov	eax, [esi+LD_BPB+BPB_Reserved]
  1586 0000CA98 39D0                <1> 	cmp	eax, edx
  1587 0000CA9A 73D5                <1> 	jnb	short loc_put_fcc_invalid_sign
  1588 0000CA9C 0305[70870100]      <1>         add     eax, [CFS_CC] ; free cluster count on disk + current count
  1589 0000CAA2 72CD                <1> 	jc	short loc_put_fcc_invalid_sign
  1590                              <1> 
  1591 0000CAA4 A3[E4840100]        <1> 	mov	[FreeClusterCount], eax
  1592 0000CAA9 EB0E                <1> 	jmp	short loc_cfs_write_FSINFO_sector
  1593                              <1> 
  1594                              <1> loc_cfs_FAT32_get_rcalc_parms:
  1595 0000CAAB 8B15[78870100]      <1> 	mov	edx, [CFS_FAT32FC]
  1596 0000CAB1 A1[E4840100]        <1> 	mov	eax, [FreeClusterCount]
  1597 0000CAB6 89563E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], edx ; First Free Cluster
  1598                              <1> loc_cfs_write_FSINFO_sector:
  1599 0000CAB9 89463A              <1> 	mov	[esi+LD_BPB+BPB_Reserved], eax ; Free cluster count
  1600                              <1> 	; 01/03/2016
  1601 0000CABC E8BC000000          <1> 	call	set_fat32_fsinfo_sector_parms
  1602 0000CAC1 72AE                <1>         jc      short loc_put_fcc_invalid_sign
  1603                              <1> 
  1604                              <1> loc_set_FAT32_free_sectors:
  1605                              <1> 	; 29/02/2016
  1606                              <1> 	;mov	eax, [FreeClusterCount]
  1607                              <1> 	;mov	ecx, eax
  1608                              <1> 	;cmp	eax, 0FFFFFFFFh ; Invalid !
  1609                              <1> 	;je	short loc_cfs_retn_params
  1610                              <1> 	;
  1611 0000CAC3 8B0D[E4840100]      <1> 	mov	ecx, [FreeClusterCount]
  1612 0000CAC9 0FB64613            <1> 	movzx	eax, byte [esi+LD_BPB+SecPerClust]
  1613 0000CACD F7E1                <1> 	mul	ecx
  1614                              <1> 	; 29/02/2016
  1615 0000CACF 31C9                <1> 	xor	ecx, ecx ; 0
  1616 0000CAD1 09D2                <1> 	or	edx, edx ; 0 ?
  1617 0000CAD3 759C                <1>         jnz	short loc_put_fcc_invalid_sign ; 25/07/2022
  1618 0000CAD5 394670              <1> 	cmp	[esi+LD_TotalSectors], eax ; Volume size in sectors
  1619 0000CAD8 7697                <1>         jna     short loc_put_fcc_invalid_sign
  1620                              <1> 	;
  1621                              <1> loc_set_FAT32_free_sectors_ok:
  1622 0000CADA 31D2                <1> 	xor	edx, edx ; 0
  1623 0000CADC EB98                <1>         jmp     short loc_cfs_retn_params
  1624                              <1> 	;
  1625                              <1> 
  1626                              <1> get_last_cluster:
  1627                              <1> 	; 22/10/2016
  1628                              <1> 	; 27/02/2016 (TRDOS 386 = TRDOS v2.0)
  1629                              <1> 	; 12/06/2010 (DRV_FAT.ASM, 'proc_get_last_custer')
  1630                              <1> 	; 06/06/2010
  1631                              <1> 	; INPUT ->
  1632                              <1> 	;	EAX = First Cluster Number
  1633                              <1> 	; 	ESI = Logical Dos Drive Parameters Table
  1634                              <1> 	; OUTPUT ->
  1635                              <1> 	;	cf = 0 -> No Error, EAX is valid
  1636                              <1> 	;	cf = 1 -> EAX > 0 -> Error
  1637                              <1> 	;	EAX = Last Cluster Number
  1638                              <1> 	;       ECX = Previous Cluster -just before the last cluster-
  1639                              <1> 	;       ; 22/10/2016
  1640                              <1> 	;	[glc_index] = cluster index number of the last cluster	
  1641                              <1> 	;
  1642                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
  1643                              <1> 
  1644 0000CADE 89C1                <1> 	mov	ecx, eax
  1645                              <1> 
  1646 0000CAE0 C705[80870100]FFFF- <1> 	mov	dword [glc_index], 0FFFFFFFFh ; 22/10/2016	
  1646 0000CAE8 FFFF                <1>
  1647                              <1> 
  1648                              <1> loc_glc_get_next_cluster_1:
  1649 0000CAEA 890D[7C870100]      <1> 	mov	[glc_prevcluster], ecx
  1650                              <1>  	; 22/10/2016
  1651 0000CAF0 FF05[80870100]      <1> 	inc	dword [glc_index]
  1652                              <1> 
  1653                              <1> loc_glc_get_next_cluster_2:
  1654 0000CAF6 E871F8FFFF          <1> 	call	get_next_cluster
  1655                              <1> 	; ecx = current/previous cluster 
  1656                              <1> 	; eax = next/last cluster
  1657 0000CAFB 73ED                <1> 	jnc	short loc_glc_get_next_cluster_1
  1658                              <1> 
  1659 0000CAFD 09C0                <1> 	or	eax, eax
  1660 0000CAFF 7509                <1> 	jnz	short loc_glc_stc_retn
  1661                              <1> 
  1662                              <1> 	; ecx = previous cluster
  1663 0000CB01 89C8                <1>         mov	eax, ecx
  1664                              <1> 
  1665                              <1> 	; previous cluster becomes last cluster (ecx -> eax)
  1666                              <1> 	; previous of previous cluster becomes previous cluster (ecx)
  1667                              <1> 
  1668                              <1> loc_glc_prev_cluster_retn:
  1669 0000CB03 8B0D[7C870100]      <1> 	mov	ecx, [glc_prevcluster] 
  1670 0000CB09 C3                  <1> 	retn
  1671                              <1> 
  1672                              <1> loc_glc_stc_retn:
  1673 0000CB0A F5                  <1> 	cmc	;stc
  1674 0000CB0B EBF6                <1>         jmp	short loc_glc_prev_cluster_retn
  1675                              <1> 
  1676                              <1> truncate_cluster_chain:
  1677                              <1> 	; 31/08/2024 - TRDOS 386 v2.0.9
  1678                              <1> 	; 01/03/2016
  1679                              <1> 	; 28/02/2016 (TRDOS 386 = TRDOS v2.0)
  1680                              <1> 	; 22/01/2011 (DRV_FAT.ASM, 'proc_truncate_cluster_chain')
  1681                              <1> 	; 11/09/2010
  1682                              <1> 	; INPUT ->
  1683                              <1> 	;	ESI = Logical dos drive description table address
  1684                              <1> 	;	EAX = First cluster to be truncated/unlinked 
  1685                              <1> 	; OUTPUT ->
  1686                              <1> 	;	ESI = Logical dos drive description table address
  1687                              <1> 	; 	ECX = Count of truncated/removed clusters
  1688                              <1> 	; 	CF = 0 -> EAX = Free sectors
  1689                              <1> 	; 	CF = 1 -> Error code in EAX (AL)
  1690                              <1> 
  1691                              <1> 	; NOTE: This procedure does not update lm date&time !
  1692                              <1> 	 
  1693                              <1> loc_truncate_cc:	
  1694 0000CB0D 31C9                <1> 	xor	ecx, ecx ; mov ecx, 0
  1695                              <1> 	;mov	byte [FAT_BuffValidData], 0
  1696 0000CB0F 890D[CE840100]      <1> 	mov	[FAT_ClusterCounter], ecx ; 0 ; reset
  1697                              <1> 
  1698                              <1> 	;;;
  1699                              <1> 	; 31/08/2024
  1700 0000CB15 21C0                <1> 	and	eax, eax ; 0
  1701 0000CB17 740D                <1> 	jz	short loc_tcc_unlink_zero_cluster  ; zero
  1702                              <1> 	;cmp	eax, 0FFFFFF7h
  1703 0000CB19 3DFFFFFF0F          <1> 	cmp	eax, 0FFFFFFFh ; 28 bit cluster number limit (EOF)
  1704 0000CB1E 7207                <1> 	jb	short loc_tcc_unlink_clusters
  1705                              <1> 
  1706                              <1> 	; (possible FAT32) EOF signature...
  1707                              <1> 	;	not a valid cluster number
  1708                              <1> 	;	
  1709                              <1> 	; NOTE: update_cluster returns EOF (if eax > [LastCluster])
  1710                              <1> 	;	instead of invalid data error
  1711                              <1> 
  1712 0000CB20 B81D000000          <1> 	mov	eax, ERR_INV_DATA  ; invalid cluster number
  1713 0000CB25 F9                  <1> 	stc
  1714                              <1> loc_tcc_unlink_zero_cluster:	; nothing to do
  1715 0000CB26 C3                  <1> 	retn
  1716                              <1> 	;;;
  1717                              <1> 
  1718                              <1> loc_tcc_unlink_clusters:
  1719 0000CB27 E82FFBFFFF          <1> 	call	update_cluster
  1720                              <1> 	; EAX = Next Cluster
  1721                              <1> 	; ECX = Cluster Value
  1722                              <1> 	; Note:
  1723                              <1> 	; Returns count of unlinked clusters in
  1724                              <1> 	; dword ptr FAT_ClusterCounter
  1725 0000CB2C 73F9                <1> 	jnc	short loc_tcc_unlink_clusters
  1726                              <1> 
  1727                              <1> 	; error or EOF (end of cluster chain) ; 31/08/2024
  1728                              <1> 
  1729                              <1> pass_tcc_unlink_clusters:
  1730 0000CB2E A2[87870100]        <1> 	mov	byte [TCC_FATErr], al
  1731 0000CB33 803D[C6840100]02    <1> 	cmp	byte [FAT_BuffValidData], 2
  1732 0000CB3A 750E                <1> 	jne	short loc_tcc_calculate_FAT_freespace
  1733 0000CB3C E88EFDFFFF          <1> 	call	save_fat_buffer
  1734 0000CB41 7307                <1> 	jnc	short loc_tcc_calculate_FAT_freespace
  1735 0000CB43 A2[87870100]        <1> 	mov	byte [TCC_FATErr], al ; Error
  1736                              <1> 	;mov	byte [FAT_BuffValidData], 0
  1737                              <1> 
  1738                              <1> 	; 01/03/2016
  1739 0000CB48 EB12                <1> 	jmp	short loc_tcc_recalculate_FAT_freespace
  1740                              <1> 
  1741                              <1> loc_tcc_calculate_FAT_freespace:
  1742 0000CB4A A1[CE840100]        <1> 	mov	eax, [FAT_ClusterCounter] ; signed (+-) number
  1743 0000CB4F 66BB01FF            <1> 	mov	bx, 0FF01h ; BH = FFh -> ESI = Dos drv desc. table
  1744                              <1> 			   ; BL = 1 -> add cluster(s)
  1745 0000CB53 E808FEFFFF          <1> 	call	calculate_fat_freespace
  1746 0000CB58 21C9                <1> 	and	ecx, ecx ; cx = 0 -> valid free sector count
  1747 0000CB5A 7409                <1> 	jz	short pass_truncate_cc_recalc_FAT_freespace
  1748                              <1> 
  1749                              <1> loc_tcc_recalculate_FAT_freespace:
  1750 0000CB5C 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate !
  1751 0000CB60 E8FBFDFFFF          <1> 	call	calculate_fat_freespace
  1752                              <1>               
  1753                              <1> loc_tcc_calculate_FAT_freespace_err:
  1754                              <1> pass_truncate_cc_recalc_FAT_freespace:
  1755 0000CB65 8B0D[CE840100]      <1> 	mov	ecx, [FAT_ClusterCounter]
  1756                              <1> 
  1757 0000CB6B 803D[87870100]00    <1> 	cmp	byte [TCC_FATErr], 0
  1758 0000CB72 7608                <1> 	jna	short loc_tcc_unlink_clusters_retn
  1759                              <1> 
  1760                              <1> loc_tcc_unlink_clusters_error:
  1761 0000CB74 0FB605[87870100]    <1> 	movzx	eax, byte [TCC_FATErr]
  1762 0000CB7B F9                  <1> 	stc
  1763                              <1> loc_tcc_unlink_clusters_retn:
  1764 0000CB7C C3                  <1> 	retn
  1765                              <1> 
  1766                              <1> set_fat32_fsinfo_sector_parms:
  1767                              <1> 	; 15/10/2016
  1768                              <1> 	; 23/03/2016
  1769                              <1> 	; 29/02/2016 (TRDOS 386 = TRDOS v2.0)
  1770                              <1> 	; INPUT ->
  1771                              <1> 	;	ESI = Logical dos drive description table address
  1772                              <1> 	;	[esi+LD_BPB+BPB_Reserved] = Free Cluster Count
  1773                              <1> 	;	[esi+LD_BPB+BPB_Reserved+4] = First Free Cluster 
  1774                              <1> 	; OUTPUT ->
  1775                              <1> 	;	ESI = Logical dos drive description table address
  1776                              <1> 	; 	CF = 0 -> OK..
  1777                              <1> 	; 	CF = 1 -> Error code in EAX (AL)
  1778                              <1> 	;
  1779                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX)
  1780                              <1> 
  1781 0000CB7D E824000000          <1> 	call	get_fat32_fsinfo_sector_parms
  1782 0000CB82 7221                <1> 	jc	short update_fat32_fsinfo_sector_retn
  1783                              <1> 
  1784 0000CB84 8B463A              <1> 	mov	eax, [esi+LD_BPB+BPB_Reserved] ; Free Cluster Count
  1785 0000CB87 8B563E              <1> 	mov	edx, [esi+LD_BPB+BPB_Reserved+4] ; First free Cluster	
  1786                              <1> 
  1787                              <1>         ;mov	ebx, DOSBootSectorBuff
  1788 0000CB8A 8983E8010000        <1> 	mov	[ebx+488], eax
  1789 0000CB90 8993EC010000        <1> 	mov	[ebx+492], edx	
  1790                              <1> 
  1791 0000CB96 A1[74870100]        <1> 	mov	eax, [CFS_FAT32FSINFOSEC]
  1792 0000CB9B B901000000          <1> 	mov	ecx, 1
  1793 0000CBA0 E880540000          <1> 	call	disk_write
  1794                              <1> 	;jnc	short update_fat32_fsinfo_sector_retn
  1795                              <1> 
  1796                              <1> 	; 15/10/2016 (1Dh -> 18)
  1797                              <1> 	; 23/03/2016 (1Dh)
  1798                              <1> 	;mov	eax, 18 ; Drive not ready or write error
  1799                              <1> 
  1800                              <1> update_fat32_fsinfo_sector_retn:
  1801 0000CBA5 C3                  <1> 	retn
  1802                              <1> 
  1803                              <1> get_fat32_fsinfo_sector_parms:
  1804                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  1805                              <1> 	; 15/10/2016
  1806                              <1> 	; 23/03/2016
  1807                              <1> 	; 01/03/2016
  1808                              <1> 	; 29/02/2016 (TRDOS 386 = TRDOS v2.0)
  1809                              <1> 	; INPUT ->
  1810                              <1> 	;	ESI = Logical dos drive description table address
  1811                              <1> 	; OUTPUT ->
  1812                              <1> 	;	ESI = Logical dos drive description table address
  1813                              <1> 	;	EBX = FSINFO sector buffer address (DOSBootSectorBuff)	
  1814                              <1> 	;	CF = 0 -> OK..
  1815                              <1> 	;	   EAX = FsInfo sector address
  1816                              <1> 	;	   ECX = Free cluster count
  1817                              <1> 	;	   EDX = First free cluster 	
  1818                              <1> 	;	CF = 1 -> Error code in AL (EAX)
  1819                              <1> 	;	   EBX = 0
  1820                              <1> 	;	
  1821                              <1> 	;	[CFS_FAT32FSINFOSEC] = FAT32 FSINFO sector address
  1822                              <1>         ;
  1823                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX)
  1824                              <1> 
  1825 0000CBA6 0FB74636            <1> 	movzx	eax, word [esi+LD_BPB+FAT32_FSInfoSec]
  1826 0000CBAA 03466C              <1> 	add	eax, [esi+LD_StartSector]
  1827 0000CBAD A3[74870100]        <1> 	mov	[CFS_FAT32FSINFOSEC], eax
  1828                              <1> 	
  1829 0000CBB2 BB[C2820100]        <1>         mov     ebx, DOSBootSectorBuff
  1830                              <1> 	;mov	ecx, 1
  1831                              <1> 	; 25/07/2022
  1832 0000CBB7 29C9                <1> 	sub	ecx, ecx
  1833 0000CBB9 FEC1                <1> 	inc	cl
  1834                              <1> 	; ecx = 1
  1835 0000CBBB E874540000          <1> 	call	disk_read
  1836 0000CBC0 722F                <1> 	jc	short loc_read_FAT32_fsinfo_sec_err
  1837                              <1> 
  1838 0000CBC2 BB[C2820100]        <1> 	mov	ebx, DOSBootSectorBuff
  1839                              <1> 
  1840 0000CBC7 813B52526141        <1> 	cmp	dword [ebx], 41615252h
  1841 0000CBCD 751E                <1> 	jne	short loc_read_FAT32_fsinfo_sec_stc
  1842                              <1> 
  1843 0000CBCF 81BBE4010000727241- <1> 	cmp	dword [ebx+484], 61417272h
  1843 0000CBD8 61                  <1>
  1844 0000CBD9 7512                <1> 	jne	short loc_read_FAT32_fsinfo_sec_stc
  1845                              <1> 
  1846 0000CBDB A1[74870100]        <1> 	mov	eax, [CFS_FAT32FSINFOSEC]
  1847 0000CBE0 8B8BE8010000        <1> 	mov	ecx, [ebx+488] ; free cluster count
  1848 0000CBE6 8B93EC010000        <1> 	mov	edx, [ebx+492] ; first (next) free cluster	
  1849                              <1> 
  1850 0000CBEC C3                  <1> 	retn
  1851                              <1> 
  1852                              <1> loc_read_FAT32_fsinfo_sec_stc: 
  1853                              <1> 	; 15/10/2016 (0Bh -> 28)
  1854                              <1> 	;mov	eax, 28 ; Invalid format!
  1855                              <1> 	; 25/07/2022
  1856 0000CBED B31C                <1> 	mov	bl, 28
  1857 0000CBEF EB02                <1> 	jmp	short loc_read_FAT32_fsinfo_sec_stc_retn
  1858                              <1> 
  1859                              <1> loc_read_FAT32_fsinfo_sec_err:
  1860                              <1> 	; 15/10/2016 (15h -> 17)
  1861                              <1> 	; 23/03/2016 (15h)
  1862                              <1> 	;mov	eax, 17 ; Drive not ready or read error
  1863                              <1> 	; 25/07/2022
  1864 0000CBF1 B311                <1> 	mov	bl, 17
  1865                              <1> loc_read_FAT32_fsinfo_sec_stc_retn:
  1866                              <1> 	; 25/07/2022
  1867 0000CBF3 29C0                <1> 	sub	eax, eax
  1868 0000CBF5 88D8                <1> 	mov	al, bl ; error code
  1869                              <1> 	; eax = error code
  1870 0000CBF7 29DB                <1> 	sub	ebx, ebx ; 0
  1871 0000CBF9 F9                  <1> 	stc
  1872 0000CBFA C3                  <1> 	retn
  1873                              <1> 
  1874                              <1> add_new_cluster:
  1875                              <1> 	; 30/08/2024
  1876                              <1> 	; 27/08/2024
  1877                              <1> 	; 25/08/2024 - TRDOS 386 v2.0.9
  1878                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  1879                              <1> 	; 15/10/2016
  1880                              <1> 	; 16/05/2016
  1881                              <1> 	; 18/03/2016, 24/03/2016
  1882                              <1> 	; 11/03/2016 (TRDOS 386 = TRDOS v2.0)
  1883                              <1> 	; 30/07/2011 (DRV_FAT.ASM)
  1884                              <1> 	; 11/09/2010
  1885                              <1> 	; INPUT ->
  1886                              <1> 	;	ESI = Logical dos drv desc. table address
  1887                              <1> 	;	EAX = Last cluster
  1888                              <1> 	; OUTPUT ->
  1889                              <1> 	;	ESI = Logical dos drv desc. table address
  1890                              <1> 	;	EAX = New Last cluster (next cluster)
  1891                              <1> 	;	cf = 1 -> error code in EAX (AL)
  1892                              <1> 	;	cf = 1 -> EBX = sectors per cluster
  1893                              <1> 	;	ECX = Free sectors
  1894                              <1> 	;;;	25/07/2022
  1895                              <1> 	;	(EBX = sectors per cluster -not used-)
  1896                              <1> 	;	EDX = 0 (if cf = 0)
  1897                              <1> 	; NOTE:
  1898                              <1> 	; This procedure does not update lm date&time !
  1899                              <1> 	;    ; 30/08/2024	
  1900                              <1> 	; and doesn't update 1st clust and file size fields !
  1901                              <1> 	;
  1902                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX, EDI)
  1903                              <1> 
  1904 0000CBFB A3[A4880100]        <1> 	mov	[FAT_anc_LCluster], eax
  1905                              <1> 
  1906 0000CC00 E889F9FFFF          <1> 	call	get_first_free_cluster
  1907 0000CC05 7206                <1> 	jc	short loc_add_new_cluster_retn
  1908                              <1> 	; EAX >= 2 and EAX < FFFFFFFFh is valid
  1909                              <1> 
  1910                              <1> 	;mov	edx, eax
  1911                              <1> 	;
  1912                              <1> 	;inc	edx
  1913                              <1> 	;;jnz	short loc_add_new_cluster_check_ffc_eax
  1914                              <1> 	;jnz	short loc_add_new_cluster_save_fcc
  1915                              <1> 
  1916                              <1> 	; 27/08/2024
  1917 0000CC07 40                  <1> 	inc	eax ; (*)
  1918 0000CC08 750D                <1> 	jnz	short loc_add_new_cluster_save_fcc
  1919                              <1> 
  1920                              <1> loc_add_new_cluster_no_disk_space_retn:
  1921                              <1> 	;mov	eax, 27h ; MSDOS err => insufficient disk space
  1922                              <1> 	; 27/08/2024
  1923                              <1> 	; eax = 0
  1924                              <1> 	; 25/07/2022
  1925                              <1> 	;xor	eax, eax
  1926 0000CC0A B027                <1> 	mov	al, 27h
  1927                              <1> loc_add_new_cluster_stc_retn:
  1928 0000CC0C F9                  <1> 	stc
  1929                              <1> loc_add_new_cluster_retn:
  1930                              <1> 	; 25/07/2022
  1931                              <1> 	;movzx	ebx, byte [esi+LD_BPB+SecPerClust]
  1932 0000CC0D 8B4E74              <1> 	mov	ecx, [esi+LD_FreeSectors]
  1933                              <1> 	;xor	edx, edx
  1934                              <1> 	;stc
  1935 0000CC10 C3                  <1> 	retn
  1936                              <1> 
  1937                              <1> loc_anc_invalid_format_stc_retn:
  1938                              <1> 	; 27/08/2024
  1939                              <1> 	;stc
  1940                              <1> loc_add_new_cluster_invalid_format_retn:
  1941                              <1> 	; 15/10/2016 (0Bh -> 28)
  1942                              <1> 	;mov	eax, 28 ; Invalid format
  1943                              <1> 	;jmp	short loc_add_new_cluster_retn
  1944                              <1> 	; 25/07/2022
  1945 0000CC11 29C0                <1> 	sub	eax, eax
  1946 0000CC13 B01C                <1> 	mov	al, 28
  1947 0000CC15 EBF5                <1> 	jmp	short loc_add_new_cluster_stc_retn
  1948                              <1> 
  1949                              <1> ;loc_add_new_cluster_check_ffc_eax:
  1950                              <1> ;	cmp	eax, 2
  1951                              <1> ;	jb	short loc_add_new_cluster_invalid_format_retn
  1952                              <1> 
  1953                              <1> loc_add_new_cluster_save_fcc:
  1954                              <1> 	;;;
  1955                              <1> 	; 27/08/2024
  1956 0000CC17 48                  <1> 	dec	eax ; (*)
  1957                              <1> 	;;;  
  1958 0000CC18 A3[A8880100]        <1> 	mov	[FAT_anc_FFCluster], eax
  1959                              <1> 
  1960                              <1> ; 27/08/2024 (TRDOS 386 v2.0.9)
  1961                              <1> %if 0
  1962                              <1> 	sub	eax, 2
  1963                              <1> 	movzx   ebx, byte [esi+LD_BPB+SecPerClust]
  1964                              <1> 	mul	ebx
  1965                              <1> 	or	edx, edx
  1966                              <1> 	jnz	short loc_anc_invalid_format_stc_retn
  1967                              <1> 
  1968                              <1> loc_add_new_cluster_allocate_cluster:
  1969                              <1> 	; 18/03/2016
  1970                              <1> 	xchg	edx, eax ; eax = 0
  1971                              <1> 	; 16/05/2016
  1972                              <1> 	;cmp	[ClusterBuffer_Valid], al ; 0
  1973                              <1> 	;jna	short loc_anc_clear_cluster_buffer
  1974                              <1> 	;; 'copy' command, 
  1975                              <1> 	;; writing destination file clust after reading source file clust
  1976                              <1> 	;mov	[ClusterBuffer_Valid], al ; 0 ; reset
  1977                              <1> 	;jmp	short loc_add_new_cluster_write_nc_to_disk
  1978                              <1> 
  1979                              <1> loc_anc_clear_cluster_buffer:
  1980                              <1> 	; 11/03/2016
  1981                              <1> 	; Clear buffer
  1982                              <1> 	mov	edi, Cluster_Buffer ; 70000h (for current TRDOS 386 version)
  1983                              <1> 	mov	ecx, ebx ; sector count
  1984                              <1> 	shl	ecx, 7 ; 1 sector = 512 bytes -> 128 double words
  1985                              <1> 	;xor	eax, eax ; 0
  1986                              <1> 	rep	stosd
  1987                              <1> 
  1988                              <1> loc_add_new_cluster_write_nc_to_disk:
  1989                              <1> 	; 11/03/2016
  1990                              <1> 	;xchg	eax, edx ; edx = 0, eax = sector offset
  1991                              <1> 	mov	eax, edx
  1992                              <1>         add     eax, [esi+LD_DATABegin]
  1993                              <1> 	jc	short loc_add_new_cluster_invalid_format_retn
  1994                              <1> 		
  1995                              <1> 	mov	ecx, ebx ; ECX = sectors per cluster (<256)
  1996                              <1> 	mov	ebx, Cluster_Buffer
  1997                              <1> 	call	disk_write
  1998                              <1> 	jnc	short loc_add_new_cluster_update_fat_nlc
  1999                              <1> 	
  2000                              <1> 	; 15/10/2016 (1Dh -> 18)
  2001                              <1> 	;mov	eax, 18 ; Write Error
  2002                              <1> 	; 25/07/2022
  2003                              <1> 	xor	eax, eax
  2004                              <1> 	mov	al, 18
  2005                              <1> 	jmp	short loc_add_new_cluster_stc_retn
  2006                              <1> 
  2007                              <1> loc_add_new_cluster_update_fat_nlc:
  2008                              <1> 	mov	eax, [FAT_anc_FFCluster]
  2009                              <1> %endif
  2010                              <1> 	; 30/08/2024
  2011                              <1> 	; eax = [FAT_anc_FFCluster] ; first free cluster
  2012 0000CC1D 31C9                <1> 	xor	ecx, ecx ; 0
  2013 0000CC1F 890D[CE840100]      <1> 	mov	[FAT_ClusterCounter], ecx ; 0 ; reset
  2014 0000CC25 49                  <1> 	dec	ecx ; -1 ; 0FFFFFFFFh
  2015 0000CC26 850D[A4880100]      <1> 	test	[FAT_anc_LCluster], ecx	; 0 ?
  2016 0000CC2C 7416                <1> 	jz	short loc_add_new_cluster_update_fat_fc ; yes
  2017                              <1> 
  2018                              <1> 	; 27/08/2024
  2019                              <1> 	; eax = (first free) cluster to be added as last cluster
  2020                              <1> 	;;;
  2021                              <1> 	;xor	ecx, ecx
  2022                              <1> 
  2023                              <1> loc_add_new_cluster_update_fat_nlc: ; 30/08/2024
  2024                              <1> 	;mov	[FAT_ClusterCounter], ecx ; 0 ; reset
  2025                              <1> 	;dec	ecx ; 0FFFFFFFFh ; last cluster
  2026 0000CC2E E828FAFFFF          <1> 	call	update_cluster
  2027 0000CC33 7304                <1> 	jnc	short loc_add_new_cluster_update_fat_plc
  2028 0000CC35 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  2029 0000CC37 75D3                <1> 	jnz	short loc_add_new_cluster_stc_retn
  2030                              <1> 
  2031                              <1> loc_add_new_cluster_update_fat_plc:
  2032 0000CC39 A1[A4880100]        <1> 	mov	eax, [FAT_anc_LCluster]
  2033 0000CC3E 8B0D[A8880100]      <1> 	mov	ecx, [FAT_anc_FFCluster]
  2034                              <1> loc_add_new_cluster_update_fat_fc: ; 30/08/2024
  2035 0000CC44 E812FAFFFF          <1> 	call	update_cluster
  2036 0000CC49 7311                <1> 	jnc	short loc_add_new_cluster_save_fat_buffer
  2037                              <1> 
  2038 0000CC4B 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  2039 0000CC4D 740D                <1> 	jz	short loc_add_new_cluster_save_fat_buffer
  2040                              <1> 
  2041                              <1> loc_anc_save_fat_buffer_err_retn:
  2042                              <1> 	;cmp	byte [FAT_ClusterCounter], 1
  2043                              <1> 	;jb	short loc_add_new_cluster_retn
  2044                              <1> 
  2045 0000CC4F 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate free space (BL = 0)
  2046                              <1> 			   ; (BH = FFh -> Use ESI as Drv Param. Tbl.)
  2047 0000CC53 50                  <1> 	push	eax
  2048 0000CC54 E807FDFFFF          <1> 	call	calculate_fat_freespace
  2049 0000CC59 58                  <1> 	pop	eax
  2050 0000CC5A EBB0                <1>         jmp     loc_add_new_cluster_stc_retn
  2051                              <1> 
  2052                              <1> loc_add_new_cluster_save_fat_buffer:
  2053                              <1> 	;cmp	byte [FAT_BuffValidData], 2
  2054                              <1> 	;jne	short loc_add_new_cluster_calc_FAT_freespace
  2055                              <1> 	;Byte [FAT_BuffValidData] = 2 
  2056 0000CC5C E86EFCFFFF          <1> 	call	save_fat_buffer
  2057 0000CC61 72EC                <1> 	jc	short loc_anc_save_fat_buffer_err_retn
  2058                              <1> 
  2059                              <1> loc_add_new_cluster_calc_FAT_freespace:
  2060                              <1> 	;mov	eax, 1 ; Only one Cluster
  2061 0000CC63 A1[CE840100]        <1> 	mov	eax, [FAT_ClusterCounter]
  2062 0000CC68 66BB01FF            <1> 	mov	bx, 0FF01h ; BH = FFh -> ESI -> Dos drv desc. table
  2063                              <1> 		; BL = 1 -> add cluster(s)
  2064                              <1> 	;mov	bl, 01h ; 27/08/2024
  2065                              <1> 	; NOTE: EAX value will be added to Free Cluster Count
  2066                              <1> 	; (Free Cluster Count is decreased when EAX value is negative)
  2067 0000CC6C E8EFFCFFFF          <1>         call    calculate_fat_freespace
  2068                              <1> 	; ECX = 0 -> no error, ECX > 0 -> error or invalid return
  2069 0000CC71 21C9                <1> 	and	ecx, ecx ; ECX = 0 -> valid free sector count
  2070 0000CC73 7409                <1> 	jz	short loc_add_new_cluster_return_cluster_number
  2071                              <1> 
  2072                              <1> loc_add_new_cluster_recalc_FAT_freespace:
  2073 0000CC75 66BB00FF            <1> 	mov	bx, 0FF00h  ; recalculate free space
  2074 0000CC79 E8E2FCFFFF          <1>         call    calculate_fat_freespace
  2075                              <1> 	; cf = 0
  2076                              <1> loc_add_new_cluster_return_cluster_number:
  2077 0000CC7E 89C1                <1> 	mov	ecx, eax ; Free sector count
  2078 0000CC80 A1[A8880100]        <1> 	mov	eax, [FAT_anc_FFCluster]
  2079                              <1> 	;mov	edi, Cluster_Buffer
  2080                              <1> 	; 25/07/2022 (EBX is not used by callers of this sprocedure)
  2081                              <1> 	;movzx	ebx, byte [esi+LD_BPB+SecPerClust]
  2082 0000CC85 31D2                <1> 	xor	edx, edx ; 0
  2083 0000CC87 C3                  <1>         retn
  2084                              <1> 
  2085                              <1> write_cluster:
  2086                              <1> 	; 31/08/2024 - TRDOS 386 v2.0.9
  2087                              <1> 	; 15/10/2016
  2088                              <1> 	; 21/03/2016 (TRDOS 386 = TRDOS v2.0)
  2089                              <1> 	;
  2090                              <1> 	; INPUT ->
  2091                              <1> 	;	EAX = Cluster Number (Sector index for SINGLIX FS)
  2092                              <1> 	;	ESI = Logical DOS Drive Description Table address
  2093                              <1> 	;	EBX = Cluster (File R/W) Buffer address (max. 64KB)
  2094                              <1> 	;	Only for SINGLIX FS:
  2095                              <1> 	;	EDX = File Number (The 1st FDT address) 
  2096                              <1> 	; OUTPUT ->
  2097                              <1> 	;	cf = 1 -> Cluster can not be written onto disk
  2098                              <1> 	;	    EAX > 0 -> Error number
  2099                              <1> 	;	cf = 0 -> Cluster has been written successfully
  2100                              <1> 	;
  2101                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
  2102                              <1> 	
  2103 0000CC88 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+BPB_SecPerClust] 
  2104                              <1> 	; CL = 1 = [esi+LD_FS_Reserved2] ; SectPerClust for Singlix FS
  2105                              <1> 
  2106                              <1> write_file_sectors: ; 16/03/2016
  2107 0000CC8C 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  2108 0000CC90 761C                <1> 	jna	short write_fs_cluster
  2109                              <1> 
  2110                              <1> write_fat_file_sectors:
  2111                              <1> 	; 31/08/2024
  2112                              <1> 	; ecx = sector count (may be different than sectors per cluster)
  2113 0000CC92 83E802              <1> 	sub	eax, 2 ; Beginning cluster number is always 2
  2114 0000CC95 0FB65613            <1> 	movzx	edx, byte [esi+LD_BPB+BPB_SecPerClust] ; 18/03/2016 
  2115 0000CC99 F7E2                <1> 	mul	edx
  2116 0000CC9B 034668              <1> 	add	eax, [esi+LD_DATABegin] ; absolute address of the cluster
  2117                              <1> 
  2118                              <1> 	; EAX = Disk sector address
  2119                              <1> 	; ECX = Sector count
  2120                              <1> 	; EBX = Buffer address
  2121                              <1> 	; (EDX = 0)
  2122                              <1> 	; ESI = Logical DOS drive description table address	
  2123                              <1> 
  2124 0000CC9E E882530000          <1> 	call	disk_write
  2125 0000CCA3 7306                <1> 	jnc	short wclust_retn
  2126                              <1> 	
  2127                              <1> 	; 15/10/2016 (1Dh -> 18)
  2128 0000CCA5 B812000000          <1> 	mov	eax, 18 ; Drive not ready or write error !
  2129 0000CCAA C3                  <1> 	retn
  2130                              <1> 
  2131                              <1> wclust_retn:
  2132 0000CCAB 29C0                <1> 	sub	eax, eax ; 0
  2133 0000CCAD C3                  <1> 	retn
  2134                              <1> 
  2135                              <1> write_fs_cluster:
  2136                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  2137                              <1> 	; 21/03/2016 (TRDOS 386 = TRDOS v2.0)
  2138                              <1> 	; Singlix FS
  2139                              <1> 	
  2140                              <1> 	; EAX = Cluster number is sector index number of the file (eax)
  2141                              <1> 	
  2142                              <1> 	; EDX = File number is the first File Descriptor Table address 
  2143                              <1> 	;	of the file. (Absolute address of the FDT).
  2144                              <1> 	
  2145                              <1> 	; eax = sector index (0 for the first sector)
  2146                              <1> 	; edx = FDT0 address
  2147                              <1> 		; 64 KB buffer = 128 sectors (limit) 
  2148                              <1> 	;mov	ecx, 128 ; maximum count of sectors (before eof) 
  2149                              <1> 	; 25/07/2022
  2150 0000CCAE 29C9                <1> 	sub	ecx, ecx
  2151 0000CCB0 B180                <1> 	mov	cl, 128
  2152                              <1> 	;call	write_fs_sectors
  2153                              <1> 	;retn
  2154                              <1> 	;jmp	short write_fs_sectors
  2155                              <1> 
  2156                              <1> write_fs_sectors:
  2157                              <1> 	; 21/03/2016 (TRDOS 386 = TRDOS v2.0)
  2158 0000CCB2 F9                  <1> 	stc
  2159 0000CCB3 C3                  <1> 	retn
  2160                              <1> 
  2161                              <1> get_cluster_by_index:
  2162                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  2163                              <1> 	; 29/04/2016 (TRDOS 386 = TRDOS v2.0)
  2164                              <1> 	; INPUT ->
  2165                              <1> 	; 	EAX = Beginning cluster
  2166                              <1> 	; 	EDX = Sector index in disk/file section
  2167                              <1> 	;	      (Only for SINGLIX file system!)
  2168                              <1> 	; 	ECX = Cluster sequence number after the beginning cluster
  2169                              <1> 	; 	ESI = Logical DOS Drive Description Table address
  2170                              <1> 	; OUTPUT ->
  2171                              <1> 	;	EAX = Cluster number 
  2172                              <1> 	;	cf = 1 -> Error code in AL (EAX)
  2173                              <1> 	;
  2174                              <1> 	;(Modified registers: EAX, ECX, EBX, EDX)
  2175                              <1> 	;	
  2176 0000CCB4 807E0301            <1> 	cmp	byte [esi+LD_FATType], 1
  2177 0000CCB8 721D                <1>         jb      short get_fs_section_by_index 
  2178                              <1> 
  2179 0000CCBA 3B4E78              <1> 	cmp	ecx, [esi+LD_Clusters]
  2180 0000CCBD 7206                <1> 	jb	short gcbi_1
  2181                              <1> gcbi_0:
  2182                              <1> 	;stc
  2183                              <1> 	;mov	eax, 23h ; Cluster not available ! 
  2184                              <1> 			 ; MSDOS error code: FCB unavailable
  2185                              <1> 	; 25/07/2022
  2186 0000CCBF 29C0                <1> 	sub	eax, eax
  2187                              <1> gcbi_4:
  2188 0000CCC1 B023                <1> 	mov	al, 23h
  2189 0000CCC3 F9                  <1> 	stc
  2190 0000CCC4 C3                  <1> 	retn
  2191                              <1> gcbi_1:
  2192 0000CCC5 51                  <1> 	push	ecx
  2193 0000CCC6 E8A1F6FFFF          <1> 	call	get_next_cluster
  2194 0000CCCB 59                  <1> 	pop	ecx
  2195 0000CCCC 7203                <1> 	jc	short gcbi_3
  2196 0000CCCE E2F5                <1> 	loop	gcbi_1
  2197                              <1> gcbi_2:
  2198 0000CCD0 C3                  <1> 	retn
  2199                              <1> gcbi_3:
  2200 0000CCD1 09C0                <1> 	or	eax, eax
  2201                              <1> 	;jz	short gcbi_0
  2202                              <1> 	; 25/07/2022
  2203 0000CCD3 74EC                <1> 	jz	short gcbi_4
  2204 0000CCD5 F5                  <1> 	cmc 	; stc
  2205 0000CCD6 C3                  <1> 	retn
  2206                              <1> 
  2207                              <1> get_fs_section_by_index:
  2208                              <1> 	; 29/04/2016 (TRDOS 386 = TRDOS v2.0)
  2209                              <1> 	; INPUT ->
  2210                              <1> 	; 	EAX = Beginning FDT number/address
  2211                              <1> 	; 	EDX = Sector index in disk/file section
  2212                              <1> 	; 	ECX = Sector sequence number after the beginning FDT
  2213                              <1> 	; 	ESI = Logical DOS Drive Description Table address
  2214                              <1> 	; OUTPUT ->
  2215                              <1> 	; 	EAX = FDT number/address
  2216                              <1> 	; 	EDX = Sector index of the section (0,1,2,3,4...)
  2217                              <1> 	;	cf = 1 -> Error code in AL (EAX)
  2218                              <1> 	;
  2219                              <1> 	;(Modified registers: EAX, ECX, EBX, EDX)
  2220                              <1> 	;
  2221 0000CCD7 B8FFFFFFFF          <1> 	mov	eax, 0FFFFFFFFh
  2222 0000CCDC C3                  <1> 	retn
  2223                              <1> 
  2224                              <1> get_last_section:
  2225                              <1> 	; 22/10/2016 (TRDOS 386 = TRDOS v2.0)	
  2226                              <1> 	; INPUT ->
  2227                              <1> 	; 	EAX = (The 1st) FDT number/address
  2228                              <1> 	; 	ESI = Logical DOS Drive Description Table address
  2229                              <1> 	; OUTPUT ->
  2230                              <1> 	; 	EAX = FDT number/address of the last section
  2231                              <1> 	; 	EDX = Last sector of the section (0,1,2,3,4...)
  2232                              <1> 	;	[glc_index] = sector index number of the last sector
  2233                              <1> 	;		      (for file, not for the last section)  	
  2234                              <1> 	;		   	
  2235                              <1> 	;	cf = 1 -> Error code in AL (EAX)
  2236                              <1> 	;
  2237                              <1> 	;(Modified registers: EAX, ECX, EBX, EDX)
  2238                              <1> 	;
  2239 0000CCDD B800000000          <1> 	mov	eax, 0
  2240 0000CCE2 BA00000000          <1> 	mov	edx, 0
  2241 0000CCE7 C3                  <1> 	retn
  3435                                  %include 'trdosk6.s' ; 24/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.10) - MAIN PROGRAM : trdosk6.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 17/07/2025  (Previous: 27/09/2024, v2.0.9)
     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 0000CCE8 368925[A4940100]    <1>         mov     [ss:u.sp], esp ; Kernel stack points to return address
    57                              <1> 
    58                              <1> 	; save user registers
    59 0000CCEF 1E                  <1> 	push	ds
    60 0000CCF0 06                  <1> 	push	es
    61 0000CCF1 0FA0                <1> 	push	fs
    62 0000CCF3 0FA8                <1> 	push	gs
    63 0000CCF5 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 0000CCF6 50                  <1> 	push	eax ; 01/07/2015
    70 0000CCF7 66B81000            <1> 	mov     ax, KDATA
    71 0000CCFB 8ED8                <1>         mov     ds, ax
    72 0000CCFD 8EC0                <1>         mov     es, ax
    73 0000CCFF 8EE0                <1>         mov     fs, ax
    74 0000CD01 8EE8                <1>         mov     gs, ax
    75 0000CD03 A1[F07C0100]        <1> 	mov	eax, [k_page_dir]
    76 0000CD08 0F22D8              <1> 	mov	cr3, eax
    77 0000CD0B 58                  <1> 	pop	eax ; 01/07/2015
    78                              <1> 	; 19/10/2015
    79 0000CD0C FC                  <1> 	cld
    80                              <1> 	;
    81 0000CD0D FE05[A0940100]      <1> 	inc	byte [sysflg]
    82                              <1> 		; incb sysflg / indicate a system routine is in progress
    83 0000CD13 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 0000CD14 7405                <1> 	jz	short sysent0
    89 0000CD16 E9AEA0FFFF          <1> 	jmp	panic
    90                              <1> ;1:
    91                              <1> sysent0:
    92                              <1> 	; 17/03/2017
    93 0000CD1B 80642438FE          <1> 	and	byte [esp+ESPACE+8], ~1 ; clear carry flag
    94                              <1> 
    95                              <1> 	; 16/04/2015
    96 0000CD20 A3[AC940100]        <1> 	mov	[u.r0], eax
    97 0000CD25 8925[A8940100]      <1> 	mov	[u.usp], esp ; kernel stack points to user's registers
    98                              <1> 
    99                              <1> 	; 13/01/2017 (TRDOS 386 Feaure only !)
   100 0000CD2B 803D[24950100]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 0000CD32 7605                <1> 	jna	short sysent1
   104 0000CD34 E902020000          <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
   123                              <1> 		; sub $sys,r0 / get xxx code
   124                              <1> sysent1:
   125 0000CD39 C1E002              <1> 	shl	eax, 2
   126                              <1> 		; asl r0 / multiply by 2 to jump indirect in bytes
   127 0000CD3C 3DBC000000          <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 0000CD41 F5                  <1> 	cmc
   132 0000CD42 9C                  <1> 	pushf
   133 0000CD43 50                  <1> 	push	eax
   134 0000CD44 8B2D[A4940100]      <1>  	mov 	ebp, [u.sp] ; Kernel stack at the beginning of sys call
   135 0000CD4A B0FE                <1> 	mov	al, 0FEh ; 11111110b
   136 0000CD4C 1400                <1> 	adc	al, 0 ; al = al + cf
   137 0000CD4E 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 0000CD51 5D                  <1> 	pop	ebp ; eax
   141 0000CD52 9D                  <1> 	popf
   142 0000CD53 720B                <1>         jc      short badsys ; 23/07/2022
   143 0000CD55 A1[AC940100]        <1> 	mov	eax, [u.r0]
   144                              <1> 	; system call registers: EAX, EDX, ECX, EBX, ESI, EDI
   145 0000CD5A FFA5[ADCD0000]      <1> 	jmp	dword [ebp+syscalls]
   146                              <1> 		; jmp *1f(r0) / jump indirect thru table of addresses
   147                              <1> 		            ; / to proper system routine.
   148                              <1> 
   149                              <1> 	; 20/08/2024 (exit code)
   150                              <1> 	; 30/07/2022
   151                              <1> 	; 23/07/2022
   152                              <1> badsys:
   153                              <1> 	; 25/12/2016
   154                              <1> 	; 18/04/2016 (TRDOS 386 = TRDOS v2.0)
   155                              <1> 	; 17/04/2011 (TRDOS v1.0, 'IFC.ASM')
   156                              <1> 	; 03/02/2011 ('trdos_ifc_routine')
   157                              <1> 	;
   158                              <1> 	; 16/04/2015 (Retro UNIX 386 v1, 'badsys')
   159                              <1> 	; (EIP, EAX values will be shown on screen with error message)
   160                              <1> 	; (EIP = 'CD 40h' instruction address -INT 40h-)
   161                              <1> 	; (EAX = Function number)  
   162                              <1> 	;
   163 0000CD60 FE05[FC940100]      <1> 	inc	byte [u.bsys]
   164                              <1> 	;
   165 0000CD66 8B1D[A4940100]      <1> 	mov	ebx, [u.sp] ; esp at the beginning of 'sysent'
   166 0000CD6C 8B03                <1> 	mov	eax, [ebx] ; EIP (return address, not 'INT 30h' address)
   167                              <1> 	;sub	eax, 2 ; CDh, ##h
   168                              <1> 	; 30/07/2022
   169 0000CD6E 48                  <1> 	dec	eax
   170 0000CD6F 48                  <1> 	dec	eax
   171 0000CD70 E84074FFFF          <1> 	call	dwordtohex
   172 0000CD75 8915[E53B0100]      <1> 	mov	[eip_str], edx
   173 0000CD7B A3[E93B0100]        <1> 	mov	[eip_str+4], eax
   174 0000CD80 A1[AC940100]        <1> 	mov	eax, [u.r0]
   175 0000CD85 E82B74FFFF          <1> 	call	dwordtohex
   176 0000CD8A 8915[D43B0100]      <1> 	mov	[eax_str], edx
   177 0000CD90 A3[D83B0100]        <1> 	mov	[eax_str+4], eax
   178                              <1> 
   179 0000CD95 66C705[C93B0100]34- <1> 	mov	word [int_num_str], SYSCALL_INT_NUM ; 25/12/2016
   179 0000CD9D 30                  <1>
   180                              <1> 
   181 0000CD9E BE[9B3B0100]        <1> 	mov	esi, ifc_msg ; "invalid function call !" msg (trdosk9.s)
   182                              <1> 
   183 0000CDA3 E8C29FFFFF          <1> 	call	print_msg
   184                              <1> 
   185                              <1> ;; 20/08/2024 - temporary
   186                              <1> ;	mov	ebx, 07h
   187                              <1> ;	mov	ah, 0Eh
   188                              <1> ;p_fc_msg:
   189                              <1> ;	lodsb
   190                              <1> ;	and	al, al
   191                              <1> ;	jz	short p_fc_ms_ok
   192                              <1> ;	call	_int10h
   193                              <1> ;	jmp	short p_fc_msg
   194                              <1> ;p_fc_ms_ok:
   195                              <1> 
   196                              <1> 	;jmp	sysexit
   197                              <1> 
   198                              <1> 	; 20/08/2024 (exit code)
   199                              <1> 	;mov	bl, 0FFh ; -1
   200                              <1> 	;jmp	sysexit
   201                              <1> 	;
   202 0000CDA8 E92C020000          <1> 	jmp	sysexit_0FFh
   203                              <1> 
   204                              <1> syscalls: ; 1:
   205                              <1> 	; 20/08/2024 - TRDOS 386 v2.0.9
   206                              <1> 	; 31/12/2017
   207                              <1> 	; 28/02/2017
   208                              <1> 	; 20/02/2017
   209                              <1> 	; 19/02/2017
   210                              <1> 	; 15/10/2016
   211                              <1> 	; 20/05/2016
   212                              <1> 	; 19/05/2016
   213                              <1> 	; 16/05/2016
   214                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   215                              <1> 	; 21/09/2015
   216                              <1> 	; 01/07/2015
   217                              <1> 	; 16/04/2015 (32 bit address modification) 
   218 0000CDAD [FC0E0100]          <1> 	dd sysver	; 0 ; Get TRDOS 386 version number (v2.0)
   219 0000CDB1 [DECF0000]          <1> 	dd sysexit 	; 1
   220 0000CDB5 [07D20000]          <1> 	dd sysfork 	; 2
   221 0000CDB9 [DDD50000]          <1> 	dd sysread 	; 3
   222 0000CDBD [FCD50000]          <1> 	dd syswrite 	; 4
   223 0000CDC1 [F1D30000]          <1> 	dd sysopen 	; 5
   224 0000CDC5 [B3D50000]          <1> 	dd sysclose 	; 6
   225 0000CDC9 [6BD10000]          <1> 	dd syswait 	; 7
   226 0000CDCD [14D30000]          <1> 	dd syscreat 	; 8
   227 0000CDD1 [881D0100]          <1> 	dd sysrename	; 9  ; TRDOS 386, Rename File (31/12/2017)
   228 0000CDD5 [01190100]          <1> 	dd sysdelete	; 10 ; TRDOS 386, Delete File (29/12/2017)
   229 0000CDD9 [23030100]          <1> 	dd sysexec 	; 11
   230 0000CDDD [311A0100]          <1> 	dd syschdir 	; 12
   231 0000CDE1 [F21B0100]          <1> 	dd systime 	; 13 ; TRDOS 386, Get Sys Date&Time (30/12/2017)
   232 0000CDE5 [76D50000]          <1> 	dd sysmkdir 	; 14
   233 0000CDE9 [651A0100]          <1> 	dd syschmod 	; 15 ; TRDOS 386, Change Attributes (30/12/2017)
   234 0000CDED [68190100]          <1> 	dd sysrmdir 	; 16 ; TRDOS 386, Remove Directory (29/12/2017)
   235 0000CDF1 [AB070100]          <1> 	dd sysbreak 	; 17
   236 0000CDF5 [471B0100]          <1> 	dd sysdrive 	; 18 ; TRDOS 386, Get/Set Current Drv (30/12/2017)
   237 0000CDF9 [1A080100]          <1> 	dd sysseek 	; 19
   238 0000CDFD [2C080100]          <1> 	dd systell 	; 20
   239 0000CE01 [9E1E0100]          <1> 	dd sysmem 	; 21 ; TRDOS 386, Get Total&Free Mem (31/12/2017)
   240 0000CE05 [D41E0100]          <1> 	dd sysprompt 	; 22 ; TRDOS 386, Change Cmd Prompt (31/12/2017)
   241 0000CE09 [151F0100]          <1> 	dd syspath 	; 23 ; TRDOS 386, Get/Set Run Path (31/12/2017)
   242 0000CE0D [7A1F0100]          <1> 	dd sysenv 	; 24 ; TRDOS 386, Get/Set Env Vars (31/12/2017)
   243 0000CE11 [731C0100]          <1> 	dd sysstime 	; 25 ; TRDOS 386, Set Sys Date&Time (30/12/2017)
   244 0000CE15 [8E080100]          <1> 	dd sysquit 	; 26
   245 0000CE19 [77080100]          <1> 	dd sysintr 	; 27
   246 0000CE1D [961B0100]          <1> 	dd sysdir 	; 28 ; TRDOS 386, Get Curr Drive&Dir (30/12/2017)
   247 0000CE21 [69CE0000]          <1> 	dd sysemt 	; 29
   248 0000CE25 [D11B0100]          <1> 	dd sysldrvt	; 30 ; TRDOS 386, Get Logical DOS DDT (30/12/2017)
   249 0000CE29 [F7D70000]          <1> 	dd sysvideo 	; 31 ; TRDOS 386 Video Functions (16/05/2016)
   250 0000CE2D [A3260100]          <1> 	dd sysaudio 	; 32 ; TRDOS 386 Audio Functions (16/05/2016)
   251 0000CE31 [62D60000]          <1> 	dd systimer 	; 33 ; TRDOS 386 Timer Functions (18/05/2016)
   252 0000CE35 [AA080100]          <1> 	dd syssleep 	; 34 ; Retro UNIX 8086 v1 feature only !
   253                              <1> 			     ; 11/06/2014
   254 0000CE39 [EA080100]          <1> 	dd sysmsg	; 35 ; Retro UNIX 386 v1 feature only !
   255                              <1> 			     ; 01/07/2015
   256 0000CE3D [050A0100]          <1> 	dd sysgeterr	; 36 ; Retro UNIX 386 v1 feature only !
   257                              <1> 			     ; 21/09/2015 - get last error number
   258 0000CE41 [D8180100]          <1> 	dd sysfpstat	; 37 ; TRDOS 386 FPU state option (28/02/2017)
   259 0000CE45 [0B0F0100]          <1> 	dd syspri 	; 38 ; change priority - TRDOS 386 (20/05/2016)
   260 0000CE49 [3BCF0000]          <1> 	dd sysrele	; 39 ; TRDOS 386 (19/05/2016) (0 -> 39)
   261 0000CE4D [36100100]          <1> 	dd sysfff	; 40 ; Find First File - TRDOS 386 (15/10/2016)
   262 0000CE51 [10110100]          <1> 	dd sysfnf	; 41 ; Find Next File - TRDOS 386 (15/10/2016)
   263 0000CE55 [C6170100]          <1> 	dd sysalloc	; 42 ; Allocate contiguous memory block/pages
   264                              <1> 			     ; TRDOS 386 (19/02/2017) DMA buff fuctions
   265 0000CE59 [80180100]          <1> 	dd sysdalloc	; 43 ; Deallocate contiguous memory block/pages
   266                              <1> 			     ; TRDOS 386 (19/02/2017) DMA buff fuctions
   267 0000CE5D [BB180100]          <1> 	dd syscalbac	; 44 ; IRQ Callback and Signal Response Byte
   268                              <1> 			     ; service setup - TRDOS 386 (20/02/2017)
   269                              <1> 			     ; 28/08/2017 (20/08/2017)
   270 0000CE61 [842F0100]          <1> 	dd sysdma	; 45 ; TRDOS 386 - (ISA) DMA service
   271 0000CE65 [C0320100]          <1> 	dd sysstdio	; 46 ; TRDOS 386 v2.0.9 (STDIN/STDOUT functions)
   272                              <1> 
   273                              <1> end_of_syscalls:
   274                              <1> 
   275                              <1> sysemt: ; enable (or disable) multi tasking -time sharing-
   276                              <1> 	;
   277                              <1> 	; 08/08/2022
   278                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
   279                              <1> 	; 23/05/2016 - TRDOS 386 (TRDOS v2.0)
   280                              <1> 	; 14/05/2015 (Retro UNIX 386 v1)
   281                              <1> 	; 10/12/2013 - 20/04/2014 (Retro UNIX 8086 v1)
   282                              <1> 	;
   283                              <1> 	; Retro UNIX 8086 v1 modification:
   284                              <1> 	;	'Enable Multi Tasking'  system call instead
   285                              <1> 	;	of 'Emulator Trap' in original UNIX v1 for PDP-11.
   286                              <1> 	;
   287                              <1> 	; Retro UNIX 8086 v1 feature only!
   288                              <1> 	;	Using purpose: Kernel will start without time-out
   289                              <1> 	;	(internal clock/timer) functionality.
   290                              <1> 	;	Then etc/init will enable clock/timer for
   291                              <1> 	;	multi tasking.
   292                              <1> 	;
   293                              <1> 	; INPUT ->
   294                              <1> 	;	BL = 0 -> disable multi tasking
   295                              <1> 	;	BL > 1 -> enable multi tasking (time sharing)
   296                              <1> 	; OUTPUT ->
   297                              <1> 	;	none
   298                              <1> 	;
   299                              <1> 	;  Note: Multi tasking is disabled during system
   300                              <1> 	;	 initialization, it must be enabled by using
   301                              <1> 	;	 this system call. (Otherwise, running proces 
   302                              <1> 	;	 will not be changed by another process within
   303                              <1> 	;	 run time sequence/schedule, if running process
   304                              <1> 	;	 will not 'release' itself. Only 'wakeup' procedure
   305                              <1> 	;	 for waiting processes and programmed timer events
   306                              <1> 	;	 for other processes can change running process 
   307                              <1> 	;	 while multi tasking is disabled.) ** 23/05/2016 **
   308                              <1> 
   309 0000CE69 803D[FE940100]00    <1> 	cmp	byte [u.uid], 0 ; root ?
   310                              <1> 	;ja	short error
   311                              <1> 	; 23/07/2022
   312                              <1> 	;ja	short badsys ; 14/05/2015
   313                              <1> 	; 08/08/2022
   314 0000CE70 7605                <1> 	jna	short sysemt_root
   315 0000CE72 E9E9FEFFFF          <1> 	jmp	badsys
   316                              <1> sysemt_root:	; 08/08/2022
   317 0000CE77 FA                  <1> 	cli
   318 0000CE78 881D[8A890100]      <1> 	mov	[multi_tasking], bl ; 0 to disable, >0 to enable
   319 0000CE7E EB20                <1> 	jmp	sysret
   320                              <1> 
   321                              <1> error:
   322                              <1> 	; 18/05/2016
   323                              <1> 	; 13/05/2016
   324                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   325                              <1> 	; 16/04/2015 - 17/09/2015 (Retro UNIX 386 v1)
   326                              <1> 	; 10/04/2013 - 07/08/2013 (Retro UNIX 8086 v1)
   327                              <1> 	;
   328                              <1> 	; 'error' merely sets the error bit off the processor status (c-bit)
   329                              <1> 	; then falls right into the 'sysret', 'sysrele' return sequence.
   330                              <1> 	;
   331                              <1> 	; INPUTS -> none
   332                              <1> 	; OUTPUTS ->
   333                              <1> 	;	processor status - carry (c) bit is set (means error)
   334                              <1> 	;
   335                              <1> 	; 26/05/2013 (Stack pointer must be reset here!
   336                              <1> 	; 	      Because, jumps to error procedure
   337                              <1> 	;	      disrupts push-pop nesting balance)
   338                              <1> 	;
   339 0000CE80 8B2D[A4940100]      <1> 	mov	ebp, [u.sp] ; interrupt (system call) return (iretd) address
   340 0000CE86 804D0801            <1> 	or	byte [ebp+8], 1  ; set carry bit of flags register
   341                              <1> 				 ; (system call will return with cf = 1)
   342                              <1> 		; bis $1,20.(r1) / set c bit in processor status word below
   343                              <1> 		               ; / users stack
   344                              <1> 	; 17/09/2015
   345 0000CE8A 83ED30              <1> 	sub	ebp, ESPACE ; 48 ; total size of stack frame ('sysdefs.inc')
   346                              <1> 				 ; for saving/restoring user registers
   347                              <1> 	;cmp	ebp, [u.usp]
   348                              <1> 	;je	short err0
   349 0000CE8D 892D[A8940100]      <1> 	mov	[u.usp], ebp
   350                              <1> ;err0:
   351                              <1> 	; 01/09/2015
   352 0000CE93 8B25[A8940100]      <1> 	mov	esp, [u.usp] 	    ; Retro Unix 8086 v1 modification!
   353                              <1> 				    ; 10/04/2013
   354                              <1> 				    ; (If an I/O error occurs during disk I/O,
   355                              <1> 				    ; related procedures will jump to 'error'
   356                              <1> 				    ; procedure directly without returning to
   357                              <1> 				    ; the caller procedure. So, stack pointer
   358                              <1>                                     ; must be restored here.)
   359                              <1> 	; 13/05/2016
   360                              <1> 	; NOTE: (The last) error code is in 'u.error', it can be retrieved by
   361                              <1> 	;	'get last error' system call later.
   362                              <1> 
   363                              <1> 	; 03/09/2015 - 09/06/2015 - 07/08/2013
   364 0000CE99 C605[12950100]00    <1> 	mov 	byte [u.kcall], 0 ; namei_r, mkdir_w reset
   365                              <1> 
   366                              <1> sysret: ; < return from system call>
   367                              <1> 	; 28/08/2024 - TRDOS 386 Kernel v2.0.9
   368                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
   369                              <1> 	; 01/03/2017
   370                              <1> 	; 28/02/2017
   371                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   372                              <1> 	; 16/04/2015 - 10/09/2015 (Retro UNIX 386 v1)
   373                              <1> 	; 10/04/2013 - 23/02/2014 (Retro UNIX 8086 v1)
   374                              <1> 	;
   375                              <1> 	; 'sysret' first checks to see if process is about to be
   376                              <1> 	; terminated (u.bsys). If it is, 'sysexit' is called.
   377                              <1> 	; If not, following happens:
   378                              <1> 	; 	1) The user's stack pointer is restored.
   379                              <1> 	;	2) r1=0 and 'iget' is called to see if last mentioned
   380                              <1> 	;	   i-node has been modified. If it has, it is written out
   381                              <1> 	;	   via 'ppoke'.
   382                              <1> 	;	3) If the super block has been modified, it is written out
   383                              <1> 	;	   via 'ppoke'.
   384                              <1> 	;	4) If the dismountable file system's super block has been
   385                              <1> 	;	   modified, it is written out to the specified device
   386                              <1> 	;	   via 'ppoke'.
   387                              <1> 	;	5) A check is made if user's time quantum (uquant) ran out
   388                              <1> 	;	   during his execution. If so, 'tswap' is called to give
   389                              <1> 	;	   another user a chance to run.
   390                              <1> 	;	6) 'sysret' now goes into 'sysrele'.
   391                              <1> 	;	    (See 'sysrele' for conclusion.)
   392                              <1> 	;
   393                              <1> 	; Calling sequence:
   394                              <1> 	;	jump table or 'br sysret'
   395                              <1> 	; Arguments: 
   396                              <1> 	;	-
   397                              <1> 	; ...............................................................
   398                              <1> 	;
   399                              <1> 	; ((AX=r1 for 'iget' input))
   400                              <1> 	;
   401 0000CEA0 31C0                <1> 	xor	eax, eax ; 28/02/2017
   402                              <1> sysret0: ; 29/07/2015 (eax = 0, jump from sysexec)
   403 0000CEA2 FEC0                <1> 	inc	al ; 04/05/2013
   404 0000CEA4 3805[FC940100]      <1> 	cmp	[u.bsys], al ; 1
   405                              <1> 		; tstb u.bsys / is a process about to be terminated because
   406                              <1>         ;jnb	sysexit ; 04/05/2013
   407                              <1> 		; bne sysexit / of an error? yes, go to sysexit
   408                              <1> 	; 23/07/2022
   409 0000CEAA 7205                <1> 	jb	short sysret1
   410                              <1> 	;jmp	sysexit
   411                              <1> 	; 22/08/2024
   412 0000CEAC E92B010000          <1> 	jmp	sysexit_@ ; BL = 0FFh ; -1
   413                              <1> sysret1:	; 23/07/2022
   414                              <1> 	;mov	esp, [u.usp] ; 24/05/2013 (that is not needed here)
   415                              <1> 		; mov u.sp,sp / no point stack to users stack
   416 0000CEB1 FEC8                <1> 	dec 	al ; mov ax, 0
   417                              <1> 		; clr r1 / zero r1 to check last mentioned i-node
   418 0000CEB3 E86C510000          <1> 	call	iget
   419                              <1> 		; jsr r0,iget / if last mentioned i-node has been modified
   420                              <1> 		            ; / it is written out
   421                              <1> 	; 10/01/2017
   422                              <1> 	; 09/01/2017
   423                              <1> ;sysrele: ; < release >
   424                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   425                              <1> 	; 16/04/2015 - 14/10/2015 (Retro UNIX 386 v1)
   426                              <1> 	; 10/04/2013 - 07/03/2014 (Retro UNIX 8086 v1)
   427                              <1> 	;
   428                              <1> 	; 'sysrele' first calls 'tswap' if the time quantum for a user is
   429                              <1> 	;  zero (see 'sysret'). It then restores the user's registers and
   430                              <1> 	; turns off the system flag. It then checked to see if there is
   431                              <1> 	; an interrupt from the user by calling 'isintr'. If there is,
   432                              <1> 	; the output gets flashed (see isintr) and interrupt action is
   433                              <1> 	; taken by a branch to 'intract'. If there is no interrupt from
   434                              <1> 	; the user, a rti is made.
   435                              <1> 	;
   436                              <1> 	; Calling sequence:
   437                              <1> 	;	Fall through a 'bne' in 'sysret' & ?
   438                              <1> 	; Arguments:
   439                              <1> 	;	-
   440                              <1> 	; ...............................................................
   441                              <1> 	;
   442                              <1> 	; 23/02/2014 (swapret)
   443                              <1> 	; 22/09/2013
   444                              <1> sysrel0: ;1:
   445 0000CEB8 803D[F4940100]00    <1> 	cmp	byte [u.quant], 0 ; 16/05/2013
   446                              <1> 		; tstb uquant / is the time quantum 0?
   447 0000CEBF 7705                <1>         ja      short swapret
   448                              <1> 		; bne 1f / no, don't swap it out
   449                              <1> sysrelease: ; 07/12/2013 (jump from 'clock')
   450 0000CEC1 E8FF3E0000          <1> 	call	tswap
   451                              <1> 		; jsr r0,tswap / yes, swap it out
   452                              <1> 
   453                              <1> ; Retro Unix 8086 v1 feature: return from 'swap' to 'swapret' address.
   454                              <1> swapret: ;1:
   455                              <1> 	; 10/09/2015
   456                              <1> 	; 01/09/2015
   457                              <1> 	; 14/05/2015
   458                              <1> 	; 16/04/2015 (Retro UNIX 386 v1 - 32 bit, pm modifications)
   459                              <1> 	; 26/05/2013 (Retro UNIX 8086 v1)
   460                              <1> 	; cli
   461                              <1> 	; 24/07/2015
   462                              <1> 	;
   463                              <1> 	;; 'esp' must be already equal to '[u.usp]' here !
   464                              <1> 	;; mov	esp, [u.usp]
   465                              <1> 
   466                              <1> 	; 22/09/2013
   467 0000CEC6 E851510000          <1> 	call	isintr
   468                              <1> 	; 20/10/2013
   469 0000CECB 7405                <1> 	jz	short sysrel1
   470 0000CECD E8F4000000          <1> 	call	intract
   471                              <1> 		; jsr r0,isintr / is there an interrupt from the user
   472                              <1> 		;     br intract / yes, output gets flushed, take interrupt
   473                              <1> 		               ; / action
   474                              <1> sysrel1:
   475 0000CED2 FA                  <1> 	cli	; 14/10/2015
   476                              <1> sysrel2:
   477                              <1> 	; 28/02/2017
   478                              <1> 	; Check if there is a (delayed) callback for current user/process
   479 0000CED3 A0[27950100]        <1> 	mov	al, [u.irqwait]
   480 0000CED8 240F                <1> 	and	al, 0Fh ; is there a waiting IRQ callback service ?
   481 0000CEDA 7444                <1> 	jz	short sysrel8 ; no
   482                              <1> 
   483                              <1> 	; Set return to IRQ callback service and return from the service
   484 0000CEDC 0FB6D8              <1> 	movzx	ebx, al
   485 0000CEDF 883D[27950100]      <1> 	mov 	[u.irqwait], bh ; 0 ; reset
   486 0000CEE5 8A9B[F23B0100]      <1> 	mov	bl, [ebx+IRQenum] ; (available) IRQ index +1 (1 to 9)
   487                              <1> 	; 01/03/2017
   488 0000CEEB FECB                <1> 	dec	bl ; IRQ index number, 0 to 8
   489 0000CEED 7831                <1> 	js	short sysrel8 ; 0 -> FFh (not in use!?) 
   490                              <1> 	;
   491 0000CEEF A0[FD940100]        <1> 	mov 	al, [u.uno] ; current process (user) number 
   492 0000CEF4 3883[D88E0100]      <1> 	cmp	[ebx+IRQ.owner], al
   493 0000CEFA 7524                <1> 	jne	short sysrel8 ; it is not the current user/process !?
   494 0000CEFC F683[EA8E0100]01    <1> 	test	byte [ebx+IRQ.method], 1 ; callback ?
   495 0000CF03 741B                <1> 	jz	short sysrel8 ; not a callback method !?
   496                              <1> 
   497 0000CF05 8B93[FC8E0100]      <1> 	mov	edx, [ebx+IRQ.addr] ; IRQ callback service address (virtual)
   498 0000CF0B C605[28950100]01    <1> 	mov	byte [u.r_lock], 1 ; IRQ callback service in progress flag
   499                              <1> 
   500 0000CF12 E8553F0000          <1> 	call	wswap ; save user's registers & status 
   501                              <1> 		      ;	(for return from IRQ callback service)
   502                              <1> 
   503 0000CF17 8B2D[A4940100]      <1> 	mov	ebp, [u.sp]; kernel's stack, points to EIP (user)
   504 0000CF1D 895500              <1> 	mov	[ebp], edx ; IRQ call back service address
   505                              <1> sysrel8:
   506 0000CF20 FE0D[A0940100]      <1> 	dec	byte [sysflg]
   507                              <1> 		; decb sysflg / turn system flag off
   508                              <1> 
   509 0000CF26 A1[04950100]        <1> 	mov	eax, [u.pgdir]
   510 0000CF2B 0F22D8              <1> 	mov	cr3, eax  ; 1st PDE points to Kernel Page Table 0 (1st 4 MB)
   511                              <1> 			  ; (others are different than kernel page tables)
   512                              <1> 	; 10/09/2015
   513 0000CF2E 61                  <1> 	popad ; edi, esi, ebp, temp (icrement esp by 4), ebx, edx, ecx, eax
   514                              <1> 		; mov (sp)+,sc / restore user registers
   515                              <1> 		; mov (sp)+,mq
   516                              <1> 		; mov (sp)+,ac
   517                              <1> 		; mov (sp)+,r5
   518                              <1> 		; mov (sp)+,r4
   519                              <1> 		; mov (sp)+,r3
   520                              <1> 		; mov (sp)+,r2
   521                              <1> 	;
   522 0000CF2F A1[AC940100]        <1> 	mov	eax, [u.r0]  ; ((return value in EAX))
   523 0000CF34 0FA9                <1> 	pop	gs
   524 0000CF36 0FA1                <1> 	pop	fs
   525 0000CF38 07                  <1> 	pop	es
   526 0000CF39 1F                  <1> 	pop	ds
   527                              <1> 	;or	word [esp+8], 200h ; 22/01/2017 ; force enabling interrupts
   528 0000CF3A CF                  <1> 	iretd
   529                              <1> 		; rti / no, return from interrupt
   530                              <1> 
   531                              <1> sysrele:
   532                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
   533                              <1> 	; 24/03/2017
   534                              <1> 	; 28/02/2017
   535                              <1> 	; 27/02/2017
   536                              <1> 	; 29/01/2017
   537                              <1> 	; 14/01/2017
   538                              <1> 	; 13/01/2017
   539                              <1> 	; 09/01/2017 - 10/01/2017 - 12/01/2017
   540                              <1> 	; Major modification for TRDOS 386 (CallBack return)
   541                              <1> 	;
   542                              <1> 	; 'sysrele' system call restores previously saved
   543                              <1> 	; registers and addresses of the process
   544                              <1> 	; (Main purpose -in TRDOS 386- is to return from
   545                              <1> 	; timer callback service routine in ring 3 -user mode-.)
   546                              <1> 	;
   547                              <1> 	; check if the process is in timer callback phase
   548 0000CF3B 803D[24950100]00    <1> 	cmp	byte [u.t_lock], 0 ; TIMER INT LOCK
   549                              <1> 	;je	short sysrel0 ; classic (Retro UNIX 386 type) sysrele
   550 0000CF42 7735                <1> 	ja	short sysrel3
   551                              <1> 	; 27/02/2017
   552 0000CF44 803D[28950100]00    <1> 	cmp	byte [u.r_lock], 0 ; IRQ callback lock	
   553                              <1> 	;jna	sysrel0 ; classic sysrele ; 24/03/2017
   554                              <1> 	; 23/07/2022
   555 0000CF4B 7705                <1> 	ja	short sysrel9
   556 0000CF4D E966FFFFFF          <1> 	jmp	sysrel0
   557                              <1> sysrel9:	; 23/07/2022
   558 0000CF52 E859000000          <1> 	call	sysrel7
   559 0000CF57 803D[28950100]00    <1> 	cmp	byte [u.r_lock], 0 ; IRQ callback service lock
   560 0000CF5E 7628                <1> 	jna	short sysrel4
   561 0000CF60 C605[28950100]00    <1> 	mov	byte [u.r_lock], 0 ; reset
   562                              <1> 	;mov	byte [u.irqwait], 0 ; reset ; 28/02/2017
   563 0000CF67 A0[29950100]        <1> 	mov	al, [u.r_mode]
   564 0000CF6C 08C0                <1> 	or	al, al
   565 0000CF6E 7518                <1> 	jnz	short sysrel4
   566 0000CF70 FEC8                <1> 	dec	al
   567 0000CF72 A2[29950100]        <1> 	mov	[u.r_mode], al ; 0FFh ; not necessary !?
   568 0000CF77 EB32                <1> 	jmp	short sysrel6
   569                              <1> sysrel3:
   570                              <1> 	; 27/02/2017
   571 0000CF79 E832000000          <1> 	call	sysrel7
   572                              <1> 	; 14/01/2017
   573 0000CF7E 28C0                <1> 	sub	al, al
   574 0000CF80 3805[24950100]      <1> 	cmp	[u.t_lock], al ; 0 ; TIMER INT LOCK
   575 0000CF86 770E                <1> 	ja	short sysrel5 ; yes
   576                              <1> sysrel4:
   577                              <1> 	; 29/01/2017
   578 0000CF88 8B44241C            <1> 	mov	eax, [esp+28] ; eax
   579 0000CF8C A3[AC940100]        <1> 	mov	[u.r0], eax
   580 0000CF91 E93DFFFFFF          <1> 	jmp	sysrel2
   581                              <1> sysrel5:
   582 0000CF96 A2[24950100]        <1> 	mov	[u.t_lock], al ; 0 ; reset
   583 0000CF9B A0[25950100]        <1> 	mov	al, [u.t_mode]
   584 0000CFA0 20C0                <1> 	and	al, al
   585                              <1> 	;jnz	short sysrel2 ; 0FFh ; user mode
   586 0000CFA2 75E4                <1> 	jnz	short sysrel4 ; 29/01/2017
   587 0000CFA4 FEC8                <1> 	dec	al
   588 0000CFA6 A2[25950100]        <1> 	mov	[u.t_mode], al ; 0FFh ; not necessary !?
   589                              <1> sysrel6:
   590                              <1> 	; cpu will continue from the interrupted sytem call addr
   591 0000CFAB 61                  <1> 	popad		; edi, esi, ebp, esp, ebx, edx, ecx, eax
   592 0000CFAC 83C410              <1> 	add	esp, 16	; pass segment segisters: ds, es, fs, gs
   593 0000CFAF CF                  <1> 	iretd		; eip, cs, eflags
   594                              <1> 
   595                              <1> sysrel7:
   596 0000CFB0 0FB61D[FD940100]    <1> 	movzx	ebx, byte [u.uno] ; current process number
   597                              <1> 	;shl	bx, 2
   598                              <1> 	; 23/07/2022
   599 0000CFB7 C1E302              <1> 	shl	ebx, 2
   600                              <1> 	;cmp	[ebx+p.tcb-4], eax ; 0 ; is there callback address ?
   601                              <1> 	;jna	short sysrel0 
   602                              <1> 	; yes, reset callback address then restore process registers
   603                              <1> 	;mov	[ebx+p.tcb-4], eax ; 0 ; reset
   604 0000CFBA 8B83[EC930100]      <1> 	mov     eax, [ebx+p.upage-4] ; UPAGE address
   605 0000CFC0 FA                  <1> 	cli	; disable interrupts till 'iretd'
   606 0000CFC1 E9DE3E0000          <1> 	jmp	rswap ; restore process 'u' structure
   607                              <1> 
   608                              <1> intract: ; / interrupt action
   609                              <1> 	; 14/10/2015
   610                              <1> 	; 16/04/2015 (Retro UNIX 386 v1 - Beginning)
   611                              <1> 	; 09/05/2013 - 07/12/2013 (Retro UNIX 8086 v1)
   612                              <1> 	;
   613                              <1> 	; Retro UNIX 8086 v1 modification !
   614                              <1> 	; (Process/task switching and quit routine by using
   615                              <1> 	; Retro UNIX 8086 v1 keyboard interrupt output.))
   616                              <1> 	;
   617                              <1> 	; input -> 'u.quit' (also value of 'u.intr' > 0)
   618                              <1> 	; output -> If value of 'u.quit' = FFFFh ('ctrl+brk' sign)
   619                              <1> 	;		'intract' will jump to 'sysexit'.
   620                              <1> 	;	    Intract will return to the caller
   621                              <1> 	;		if value of 'u.quit' <> FFFFh.
   622                              <1> 	; 14/10/2015
   623 0000CFC6 FB                  <1> 	sti
   624                              <1> 	; 07/12/2013
   625 0000CFC7 66FF05[FA940100]    <1> 	inc 	word [u.quit]
   626 0000CFCE 7408                <1> 	jz	short intrct0 ; FFFFh -> 0
   627 0000CFD0 66FF0D[FA940100]    <1> 	dec	word [u.quit]
   628                              <1> 	; 16/04/2015
   629 0000CFD7 C3                  <1> 	retn
   630                              <1> intrct0:
   631 0000CFD8 58                  <1> 	pop	eax ; call intract -> retn
   632                              <1> 	;
   633                              <1> 	; 20/08/2024
   634                              <1> 	;xor 	eax, eax
   635                              <1> 	;inc	al  ; mov ax, 1
   636                              <1> ;;;
   637                              <1> 	; UNIX v1 original 'intract' routine...
   638                              <1> 	; / interrupt action
   639                              <1> 		;cmp *(sp),$rti / are you in a clock interrupt?
   640                              <1> 		; bne 1f / no, 1f
   641                              <1> 		; cmp (sp)+,(sp)+ / pop clock pointer
   642                              <1> 	; 1: / now in user area
   643                              <1> 		; mov r1,-(sp) / save r1
   644                              <1> 		; mov u.ttyp,r1 
   645                              <1> 			; / pointer to tty buffer in control-to r1
   646                              <1> 		; cmpb 6(r1),$177
   647                              <1> 			; / is the interrupt char equal to "del"
   648                              <1> 		; beq 1f / yes, 1f
   649                              <1> 		; clrb 6(r1) 
   650                              <1> 		        ; / no, clear the byte 
   651                              <1> 			; / (must be a quit character)
   652                              <1> 		; mov (sp)+,r1 / restore r1
   653                              <1> 		; clr u.quit / clear quit flag
   654                              <1> 		; bis $20,2(sp) 
   655                              <1> 		    	; / set trace for quit (sets t bit of
   656                              <1> 			; / ps-trace trap)
   657                              <1> 		; rti   ;  / return from interrupt
   658                              <1> 	; 1: / interrupt char = del
   659                              <1> 		; clrb 6(r1) / clear the interrupt byte
   660                              <1> 			   ; / in the buffer
   661                              <1> 		; mov (sp)+,r1 / restore r1
   662                              <1> 		; cmp u.intr,$core / should control be
   663                              <1> 				; / transferred to loc core?
   664                              <1> 		; blo 1f
   665                              <1> 		; jmp *u.intr / user to do rti yes, 
   666                              <1> 				; / transfer to loc core
   667                              <1> 	; 1:
   668                              <1> 		; sys 1 / exit
   669                              <1> 
   670                              <1> 	; 20/08/2024
   671                              <1> 	; ctrl+break -> exit code = -1
   672                              <1> sysexit_0FFh:
   673                              <1> 	; 20/08/2024
   674 0000CFD9 31C0                <1> 	xor 	eax, eax
   675 0000CFDB 40                  <1> 	inc	eax	; mov eax, 1
   676                              <1> sysexit_@:	; 22/08/2024
   677 0000CFDC B3FF                <1> 	mov	bl, 0FFh ;  exit code ; -1
   678                              <1> 
   679                              <1> sysexit: ; <terminate process>
   680                              <1> 	; 22/08/2024
   681                              <1> 	; 20/08/2024
   682                              <1> 	; 18/08/2024 - TRDOS 386 v2.0.9 
   683                              <1> 	; 30/07/2022
   684                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
   685                              <1> 	; 14/11/2017
   686                              <1> 	; 27/05/2017
   687                              <1> 	; 10/04/2017
   688                              <1> 	; 26/02/2017 - 28/02/2017
   689                              <1> 	; 02/01/2017 - 23/01/2017
   690                              <1> 	; 06/06/2016 - 10/06/2016
   691                              <1> 	; 19/05/2016 - 23/05/2016
   692                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   693                              <1> 	; 16/04/2015 - 01/09/2015 (Retro UNIX 386 v1)
   694                              <1> 	; 19/04/2013 - 14/02/2014 (Retro UNIX 8086 v1)
   695                              <1> 	;
   696                              <1> 	; 'sysexit' terminates a process. First each file that
   697                              <1> 	; the process has opened is closed by 'flose'. The process
   698                              <1> 	; status is then set to unused. The 'p.pid' table is then
   699                              <1> 	; searched to find children of the dying process. If any of
   700                              <1> 	; children are zombies (died by not waited for), they are
   701                              <1> 	; set free. The 'p.pid' table is then searched to find the
   702                              <1> 	; dying process's parent. When the parent is found, it is
   703                              <1> 	; checked to see if it is free or it is a zombie. If it is
   704                              <1> 	; one of these, the dying process just dies. If it is waiting
   705                              <1> 	; for a child process to die, it notified that it doesn't 
   706                              <1> 	; have to wait anymore by setting it's status from 2 to 1
   707                              <1> 	; (waiting to active). It is awakened and put on runq by
   708                              <1> 	; 'putlu'. The dying process enters a zombie state in which
   709                              <1> 	; it will never be run again but stays around until a 'wait'
   710                              <1> 	; is completed by it's parent process. If the parent is not
   711                              <1> 	; found, process just dies. This means 'swap' is called with
   712                              <1> 	; 'u.uno=0'. What this does is the 'wswap' is not called
   713                              <1> 	; to write out the process and 'rswap' reads the new process
   714                              <1> 	; over the one that dies..i.e., the dying process is 
   715                              <1> 	; overwritten and destroyed.
   716                              <1>  	;
   717                              <1> 	; Calling sequence:
   718                              <1> 	;	sysexit or conditional branch.
   719                              <1> 	; Arguments:
   720                              <1> 	;	-
   721                              <1> 	; ...............................................................
   722                              <1> 	;
   723                              <1> 	; Retro UNIX 8086 v1 modification: 
   724                              <1> 	;       System call number (=1) is in EAX register.
   725                              <1> 	;
   726                              <1> 	;       Other parameters are in EDX, EBX, ECX, ESI, EDI, EBP
   727                              <1> 	;       registers depending of function details.
   728                              <1> 	;
   729                              <1> 	; ('swap' procedure is mostly different than original UNIX v1.)
   730                              <1> 	;
   731                              <1> ; / terminate process
   732                              <1> 	; AX = 1
   733                              <1> 	;dec 	ax ; 0
   734                              <1> 	; 18/08/2024
   735 0000CFDE 48                  <1> 	dec	eax
   736 0000CFDF 66A3[F8940100]      <1> 	mov	[u.intr], ax ; 0
   737                              <1> 		; clr u.intr / clear interrupt control word
   738                              <1> 		; clr r1 / clear r1
   739                              <1> 	; 18/08/2024 - exit code (in EBX, BL)
   740 0000CFE5 881D[2A950100]      <1> 	mov	[u.exit], bl
   741                              <1> sysexit_0:
   742                              <1> 	; 30/07/2022
   743                              <1> 	; 23/01/2017
   744                              <1> 	; 02/01/2017
   745                              <1> 	; 10/06/2016
   746                              <1> 	; 06/06/2016
   747                              <1> 	; 23/05/2016
   748                              <1> 	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
   749                              <1> 	; Check and stop/clear timer event(s) of this (dying) process
   750                              <1> 	; if there is.
   751                              <1> 
   752                              <1> 	; 02/01/2017
   753 0000CFEB FA                  <1> 	cli	; disable interrupts
   754                              <1> 	; 23/01/2017 - reset timer frequency (to 18.2Hz)
   755 0000CFEC B036                <1> 	mov	al, 00110110b ; 36h
   756 0000CFEE E643                <1>  	out	43h, al
   757 0000CFF0 28C0                <1> 	sub	al, al ; 0
   758 0000CFF2 E640                <1> 	out	40h, al ; LB
   759 0000CFF4 E640                <1> 	out	40h, al ; HB
   760                              <1>  	; 
   761 0000CFF6 0FB61D[FD940100]    <1> 	movzx	ebx, byte [u.uno]
   762                              <1> 	;mov	bl, [u.uno] ; process number of dying process
   763 0000CFFD 3883[2F940100]      <1> 	cmp	byte [ebx+p.timer-1], al ; 0
   764 0000D003 7639                <1> 	jna	short sysexit_12 ; no timer events for this process
   765 0000D005 8883[2F940100]      <1> 	mov	byte [ebx+p.timer-1], al ; 0 ; reset
   766                              <1> 	;mov	al, [timer_events]
   767                              <1> 	;or	al, al
   768                              <1>  	;jz	short sysexit_12 ; no timer events
   769                              <1> 	;mov	cl, al
   770 0000D00B 8A0D[8B890100]      <1> 	mov	cl, [timer_events] ; 14/11/2017
   771                              <1> 	;cli	; disable interrupts 
   772 0000D011 B410                <1> 	mov	ah, 16 ; number of available timer events
   773 0000D013 BE[C0950100]        <1> 	mov	esi, timer_set ; beginning address of timer events
   774                              <1> sysexit_7:
   775 0000D018 8A06                <1> 	mov	al, [esi] ; process number (of timer event)
   776 0000D01A 38D8                <1> 	cmp	al, bl ; process number comparison
   777 0000D01C 7411                <1> 	je	short sysexit_10
   778 0000D01E 20C0                <1> 	and	al, al
   779 0000D020 7404                <1> 	jz	short sysexit_9
   780                              <1> sysexit_8:
   781 0000D022 FEC9                <1> 	dec	cl
   782 0000D024 7416                <1> 	jz	short sysexit_11
   783                              <1> sysexit_9:
   784 0000D026 FECC                <1> 	dec	ah
   785 0000D028 7414                <1> 	jz	short sysexit_12
   786 0000D02A 83C610              <1> 	add	esi, 16
   787 0000D02D EBE9                <1> 	jmp	short sysexit_7
   788                              <1> 
   789                              <1> sysexit_10:
   790                              <1> 	;mov	byte [esi], 0
   791 0000D02F 66C7060000          <1> 	mov	word [esi], 0
   792                              <1> 	;mov	dword [esi+12], 0
   793                              <1> 	;
   794 0000D034 FE0D[8B890100]      <1> 	dec	byte [timer_events] ; 02/01/2017
   795                              <1> 	;
   796 0000D03A EBE6                <1> 	jmp	short sysexit_8
   797                              <1> 
   798                              <1> sysexit_11:
   799                              <1> 	;sub	ax, ax ; 0 ; 26/02/2017
   800                              <1> 	; 30/07/2022
   801 0000D03C 29C0                <1> 	sub	eax, eax ; 0
   802                              <1> sysexit_12:
   803                              <1> 	; 26/02/2017 (Unlink IRQ callbacks belong to the user)
   804 0000D03E 803D[26950100]00    <1> 	cmp	byte [u.irqc], 0 ; Count of IRQ callbacks
   805 0000D045 7E53                <1> 	jng	short sysexit_16 ; zero or invalid
   806                              <1> 	; 28/02/2017
   807                              <1> 	; clear IRQ callback flags (for 'sysrele' and 'sysret')
   808 0000D047 A2[27950100]        <1> 	mov	[u.irqwait], al ; 0 ; force to clear waiting flag
   809 0000D04C A2[28950100]        <1> 	mov	[u.r_lock], al ; 0 ; force to clear busy flag
   810 0000D051 BE[D88E0100]        <1> 	mov	esi, IRQ.owner
   811                              <1> sysexit_13:
   812 0000D056 AC                  <1> 	lodsb
   813 0000D057 3A05[FD940100]      <1> 	cmp	al, [u.uno] ; owner = current user ?
   814 0000D05D 7531                <1> 	jne	short sysexit_14
   815 0000D05F C646FF00            <1> 	mov	byte [esi-1], 0 ; owner = 0 : Free
   816                              <1> 
   817                              <1> 	;;;
   818                              <1> 	; 22/08/2024 - Reset Hardware Interrupt Handler
   819 0000D063 89F1                <1> 	mov	ecx, esi
   820 0000D065 81E9[D88E0100]      <1> 	sub	ecx, IRQ.owner
   821                              <1> 	; CL = (user configurable) IRQ index + 1 (1 to 9)
   822 0000D06B B8[F23B0100]        <1> 	mov	eax, IRQenum
   823                              <1> sysexit_18:
   824 0000D070 3A08                <1> 	cmp	cl, [eax]
   825 0000D072 740A                <1> 	je	short sysexit_19
   826 0000D074 3D[013C0100]        <1> 	cmp	eax, IRQenum+15
   827 0000D079 730D                <1> 	jnb	short sysexit_20
   828 0000D07B 40                  <1> 	inc	eax
   829 0000D07C EBF2                <1> 	jmp	short sysexit_18
   830                              <1> sysexit_19:
   831 0000D07E 2D[F23B0100]        <1> 	sub	eax, IRQenum
   832                              <1> 	; AL = IRQ number (will be reset to system's IRQ handler)
   833                              <1> 	; AH = 0
   834                              <1> 	;mov	ah, 0 ; reset
   835 0000D083 E8D5530000          <1> 	call	set_hardware_int_vector
   836                              <1> sysexit_20:
   837                              <1> 	;;;
   838                              <1> 
   839 0000D088 FE0D[26950100]      <1> 	dec	byte [u.irqc]
   840 0000D08E 7408                <1> 	jz	short sysexit_15
   841                              <1> sysexit_14:
   842 0000D090 81FE[E08E0100]      <1> 	cmp	esi, IRQ.owner + 8 ; the last IRQ index number ?
   843 0000D096 76BE                <1> 	jna	short sysexit_13 ; no
   844                              <1> sysexit_15:
   845                              <1> 	;xor	al, al ; 0
   846                              <1> 	; 22/08/2024
   847 0000D098 31C0                <1> 	xor	eax, eax
   848                              <1> sysexit_16: ; 2:
   849 0000D09A FB                  <1> 	sti	; enable interrupts
   850                              <1> 	;
   851                              <1> 	; AX = 0
   852                              <1> sysexit_1: ; 1:
   853                              <1> 	; AX = File descriptor
   854                              <1> 		; / r1 has file descriptor (index to u.fp list)
   855                              <1> 		; / Search the whole list
   856 0000D09B E850360000          <1> 	call	fclose
   857                              <1> 		; jsr r0,fclose / close all files the process opened
   858                              <1> 	;; ignore error return
   859                              <1> 		; br .+2 / ignore error return
   860                              <1> 	;;inc	ax
   861                              <1> 	;inc	al
   862                              <1> 	; 22/08/2024
   863 0000D0A0 40                  <1> 	inc	eax
   864                              <1> 		; inc r1 / increment file descriptor
   865                              <1> 	;cmp	ax, 10
   866 0000D0A1 3C0A                <1> 	cmp	al, 10
   867                              <1> 		; cmp r1,$10. / end of u.fp list?
   868 0000D0A3 72F6                <1> 	jb	short sysexit_1
   869                              <1> 		; blt 1b / no, go back
   870                              <1> 
   871                              <1> 	; 22/08/2024
   872                              <1> 	; reset IRQs if owned by the current (dying) process
   873 0000D0A5 BE[D88E0100]        <1> 	mov	esi, IRQ.owner
   874                              <1> 
   875                              <1> 	;movzx	ebx, byte [u.uno]
   876 0000D0AA 8A1D[FD940100]      <1> 	mov	bl, [u.uno] ; 02/01/2017
   877                              <1> 		; movb	u.uno,r1 / yes, move dying process's number to r1
   878 0000D0B0 88A3[DF930100]      <1> 	mov	[ebx+p.stat-1], ah ; 0, SFREE
   879                              <1> 		; clrb p.stat-1(r1) / free the process
   880                              <1> 	; 10/04/2017
   881 0000D0B6 381D[558F0100]      <1> 	cmp	[audio_user], bl
   882 0000D0BC 7518                <1> 	jne	short sysexit_17
   883                              <1> 	; reset audio device (current) owner and 'initializated' flag
   884 0000D0BE 883D[558F0100]      <1> 	mov	[audio_user], bh ; 0
   885                              <1> 	; 27/05/2017
   886 0000D0C4 8B0D[3C8F0100]      <1> 	mov	ecx, [audio_buffer]
   887 0000D0CA 09C9                <1> 	or	ecx, ecx
   888 0000D0CC 7408                <1> 	jz	short sysexit_17
   889                              <1> 	; 'deallocate_user_pages' is not necessary in sysexit !!!
   890                              <1> 	;push	ebx
   891                              <1> 	;mov	ebx, ecx
   892                              <1> 	;mov	ecx, [audio_buff_size]
   893                              <1> 	;call	deallocate_user_pages
   894                              <1> 	;; (Modified Registers -> EAX, EDX, ESI, EDI, EBX, ECX, EBP)
   895 0000D0CE 29C9                <1> 	sub	ecx, ecx
   896 0000D0D0 890D[3C8F0100]      <1> 	mov	[audio_buffer], ecx ; 0
   897                              <1> 	;pop	ebx
   898                              <1> sysexit_17:
   899                              <1> 	;shl	bx, 1
   900 0000D0D6 D0E3                <1> 	shl	bl, 1
   901                              <1> 	; 22/08/2024
   902                              <1> 	;shl	ebx, 1
   903                              <1> 		; asl r1 / use r1 for index into the below tables
   904 0000D0D8 668B8B[7E930100]    <1> 	mov	cx, [ebx+p.pid-2]
   905                              <1> 		; mov p.pid-2(r1),r3 / move dying process's name to r3
   906 0000D0DF 668B93[9E930100]    <1> 	mov	dx, [ebx+p.ppid-2]
   907                              <1> 		; mov p.ppid-2(r1),r4 / move its parents name to r4
   908                              <1> 	;xor 	bx, bx ; 0
   909 0000D0E6 30DB                <1> 	xor	bl, bl ; 0
   910                              <1> 		; clr r2
   911 0000D0E8 31F6                <1> 	xor	esi, esi ; 0
   912                              <1> 		; clr r5 / initialize reg
   913                              <1> sysexit_2: ; 1:
   914                              <1> 	        ; / find children of this dying process,
   915                              <1> 		; / if they are zombies, free them
   916                              <1> 	;add	bx, 2
   917 0000D0EA 80C302              <1> 	add	bl, 2
   918                              <1> 		; add $2,r2 / search parent process table
   919                              <1> 		          ; / for dying process's name
   920 0000D0ED 66398B[9E930100]    <1> 	cmp	[ebx+p.ppid-2], cx
   921                              <1> 		; cmp p.ppid-2(r2),r3 / found it?
   922 0000D0F4 7513                <1> 	jne	short sysexit_4
   923                              <1> 		; bne 3f / no
   924                              <1> 	;shr	bx, 1
   925 0000D0F6 D0EB                <1> 	shr	bl, 1
   926                              <1> 		; asr r2 / yes, it is a parent
   927 0000D0F8 80BB[DF930100]03    <1> 	cmp	byte [ebx+p.stat-1], 3 ; SZOMB
   928                              <1> 		; cmpb p.stat-1(r2),$3 / is the child of this
   929                              <1> 				     ; / dying process a zombie
   930 0000D0FF 7506                <1> 	jne	short sysexit_3
   931                              <1> 		; bne 2f / no
   932 0000D101 88A3[DF930100]      <1> 	mov	[ebx+p.stat-1], ah ; 0, SFREE
   933                              <1> 		; clrb p.stat-1(r2) / yes, free the child process
   934                              <1> sysexit_3: ; 2:
   935                              <1> 	;shr	bx, 1
   936 0000D107 D0E3                <1> 	shl	bl, 1
   937                              <1> 		; asl r2
   938                              <1> sysexit_4: ; 3:
   939                              <1> 		; / search the process name table 
   940                              <1> 		; / for the dying process's parent
   941 0000D109 663993[7E930100]    <1> 	cmp	[ebx+p.pid-2], dx
   942                              <1> 		; cmp p.pid-2(r2),r4 / found it?
   943 0000D110 7502                <1> 	jne	short sysexit_5
   944                              <1> 		; bne 3f / no
   945 0000D112 89DE                <1> 	mov	esi, ebx
   946                              <1> 		; mov r2,r5 / yes, put index to p.pid table (parents
   947                              <1> 		          ; / process # x2) in r5
   948                              <1> sysexit_5: ; 3:
   949                              <1> 	;cmp	bx, nproc + nproc
   950 0000D114 80FB20              <1> 	cmp	bl, nproc + nproc
   951                              <1> 		; cmp r2,$nproc+nproc / has whole table been searched?
   952 0000D117 72D1                <1> 	jb	short sysexit_2
   953                              <1> 		; blt 1b / no, go back
   954                              <1> 		; mov r5,r1 / yes, r1 now has parents process # x2
   955 0000D119 21F6                <1> 	and	esi, esi ; r5=r1
   956 0000D11B 743F                <1> 	jz	short sysexit_6
   957                              <1> 		; beq 2f / no parent has been found.
   958                              <1> 		       ; / The process just dies
   959                              <1> 	;shr	si, 1
   960                              <1> 	; 23/07/2022
   961 0000D11D D1EE                <1> 	shr	esi, 1
   962                              <1> 		; asr r1 / set up index to p.stat
   963 0000D11F 8A86[DF930100]      <1> 	mov	al, [esi+p.stat-1]
   964                              <1> 		; movb p.stat-1(r1),r2 / move status of parent to r2
   965 0000D125 20C0                <1> 	and	al, al
   966 0000D127 7433                <1> 	jz	short sysexit_6
   967                              <1> 		; beq 2f / if its been freed, 2f
   968 0000D129 3C03                <1> 	cmp	al, 3
   969                              <1> 		; cmp r2,$3 / is parent a zombie?
   970 0000D12B 742F                <1> 	je	short sysexit_6
   971                              <1> 		; beq 2f / yes, 2f
   972                              <1> 
   973                              <1> 	; BH = 0
   974 0000D12D 8A1D[FD940100]      <1> 	mov	bl, [u.uno]
   975                              <1> 		; movb u.uno,r3 / move dying process's number to r3
   976 0000D133 C683[DF930100]03    <1> 	mov	byte [ebx+p.stat-1], 3 ; SZOMB
   977                              <1> 		; movb $3,p.stat-1(r3) / make the process a zombie
   978                              <1> 
   979 0000D13A 3C01                <1> 	cmp	al, 1 ; SRUN
   980 0000D13C 741E                <1> 	je	short sysexit_6
   981                              <1> 	;cmp	al, 2
   982                              <1> 		; cmp r2,$2 / is the parent waiting for 
   983                              <1> 			  ; / this child to die
   984                              <1> 	;jne	short sysexit_6	
   985                              <1> 		; bne 2f / yes, notify parent not to wait any more
   986                              <1> 	; p.stat = 2 --> waiting
   987                              <1> 	; p.stat = 4 --> sleeping
   988 0000D13E C686[DF930100]01    <1> 	mov	byte [esi+p.stat-1], 1 ; SRUN
   989                              <1> 	;;;
   990                              <1> 	; 18/08/2024 - exit code
   991 0000D145 A0[2A950100]        <1> 	mov	al, [u.exit] ; exit code of the child
   992                              <1> 	; 20/08/2024
   993 0000D14A 8883[7F940100]      <1> 	mov	[ebx+p.exitc-1], al ; save it to use by the parent
   994                              <1> 	;;;
   995                              <1> 	;dec	byte [esi+p.stat-1]
   996                              <1> 		; decb	p.stat-1(r1) / awaken it by putting it (parent)
   997                              <1> 	;;;
   998                              <1> 	;mov	ax, si ; r1  (process number in AL)
   999                              <1> 	; 18/08/2024
  1000 0000D150 89F0                <1> 	mov	eax, esi
  1001                              <1> 	;;;
  1002                              <1> 	;mov	ebx, runq + 4
  1003                              <1> 		; mov $runq+4,r2 / on the runq
  1004 0000D152 BB[9C940100]        <1> 	mov	ebx, runq+2 ; normal run queue ; 02/01/2017
  1005 0000D157 E8803D0000          <1> 	call	putlu
  1006                              <1> 		; jsr r0, putlu
  1007                              <1> sysexit_6:
  1008                              <1> 		; / the process dies
  1009 0000D15C C605[FD940100]00    <1> 	mov	byte [u.uno], 0
  1010                              <1> 		; clrb u.uno / put zero as the process number,
  1011                              <1> 	           ; / so "swap" will
  1012 0000D163 E8773C0000          <1> 	call	swap
  1013                              <1> 		; jsr r0,swap / overwrite process with another process
  1014                              <1> hlt_sys:
  1015                              <1> 	;sti
  1016                              <1> hlts0:
  1017 0000D168 F4                  <1> 	hlt
  1018 0000D169 EBFD                <1> 	jmp	short hlts0
  1019                              <1> 		; 0 / and thereby kill it; halt?
  1020                              <1> 
  1021                              <1> syswait: ; < wait for a processs to die >
  1022                              <1> 	; 20/08/2024
  1023                              <1> 	; 30/07/2022
  1024                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
  1025                              <1> 	; 17/09/2015
  1026                              <1> 	; 02/09/2015
  1027                              <1> 	; 01/09/2015
  1028                              <1> 	; 16/04/2015 (Retro UNIX 386 v1 - Beginning)
  1029                              <1> 	; 24/05/2013 - 05/02/2014 (Retro UNIX 8086 v1)
  1030                              <1> 	;
  1031                              <1> 	; 'syswait' waits for a process die.
  1032                              <1> 	; It works in following way:
  1033                              <1> 	;    1) From the parent process number, the parent's 
  1034                              <1> 	; 	process name is found. The p.ppid table of parent
  1035                              <1> 	;	names is then searched for this process name.
  1036                              <1> 	;	If a match occurs, r2 contains child's process
  1037                              <1> 	;	number. The child status is checked to see if it is
  1038                              <1> 	;	a zombie, i.e; dead but not waited for (p.stat=3)
  1039                              <1> 	;	If it is, the child process is freed and it's name
  1040                              <1> 	;	is put in (u.r0). A return is then made via 'sysret'.
  1041                              <1> 	;	If the child is not a zombie, nothing happens and
  1042                              <1> 	;	the search goes on through the p.ppid table until
  1043                              <1> 	;	all processes are checked or a zombie is found.
  1044                              <1> 	;    2) If no zombies are found, a check is made to see if
  1045                              <1> 	;	there are any children at all. If there are none,
  1046                              <1> 	;	an error return is made. If there are, the parent's
  1047                              <1> 	;	status is set to 2 (waiting for child to die),
  1048                              <1> 	;	the parent is swapped out, and a branch to 'syswait'
  1049                              <1> 	;	is made to wait on the next process.
  1050                              <1> 	;
  1051                              <1> 	; Calling sequence:
  1052                              <1> 	;	?
  1053                              <1> 	; Arguments:
  1054                              <1> 	;	-
  1055                              <1> 	; Inputs: - 
  1056                              <1> 	; Outputs: if zombie found, it's name put in u.r0.
  1057                              <1> 	; ...............................................................
  1058                              <1> 	;
  1059                              <1> 
  1060                              <1> ; / wait for a process to die
  1061                              <1> 
  1062                              <1> syswait_0:
  1063 0000D16B 0FB61D[FD940100]    <1> 	movzx	ebx, byte [u.uno] ; 01/09/2015
  1064                              <1> 		; movb u.uno,r1 / put parents process number in r1
  1065 0000D172 D0E3                <1> 	shl	bl, 1
  1066                              <1> 	;shl	bx, 1
  1067                              <1> 		; asl r1 / x2 to get index into p.pid table
  1068 0000D174 668B83[7E930100]    <1> 	mov	ax, [ebx+p.pid-2]
  1069                              <1> 		; mov p.pid-2(r1),r1 / get the name of this process
  1070 0000D17B 31F6                <1> 	xor	esi, esi
  1071                              <1> 		; clr r2
  1072 0000D17D 31C9                <1> 	xor	ecx, ecx ; 30/10/2013
  1073                              <1> 	;xor 	cl, cl
  1074                              <1> 		; clr r3 / initialize reg 3
  1075                              <1> syswait_1: ; 1:
  1076                              <1> 	;add	si, 2
  1077                              <1> 	; 23/07/2022
  1078 0000D17F 46                  <1> 	inc	esi
  1079 0000D180 46                  <1> 	inc	esi
  1080                              <1> 		; add $2,r2 / use r2 for index into p.ppid table
  1081                              <1> 			  ; / search table of parent processes
  1082                              <1> 			  ; / for this process name
  1083 0000D181 663B86[9E930100]    <1> 	cmp	ax, [esi+p.ppid-2]
  1084                              <1> 		; cmp p.ppid-2(r2),r1 / r2 will contain the childs
  1085                              <1> 			            ; / process number
  1086 0000D188 7542                <1> 	jne	short syswait_3
  1087                              <1> 		;bne 3f / branch if no match of parent process name
  1088                              <1> 	;inc	cx
  1089 0000D18A FEC1                <1> 	inc	cl
  1090                              <1> 		;inc r3 / yes, a match, r3 indicates number of children
  1091                              <1> 	;shr	si, 1
  1092                              <1> 	; 23/07/2022
  1093 0000D18C D1EE                <1> 	shr	esi, 1
  1094                              <1> 		; asr r2 / r2/2 to get index to p.stat table
  1095                              <1> 	; The possible states ('p.stat' values) of a process are:
  1096                              <1> 	;	0 = free or unused
  1097                              <1> 	;	1 = active
  1098                              <1> 	;	2 = waiting for a child process to die
  1099                              <1> 	;	3 = terminated, but not yet waited for (zombie).
  1100 0000D18E 80BE[DF930100]03    <1> 	cmp	byte [esi+p.stat-1], 3 ; SZOMB, 05/02/2014
  1101                              <1> 		; cmpb p.stat-1(r2),$3 / is the child process a zombie?
  1102 0000D195 7533                <1> 	jne	short syswait_2
  1103                              <1> 		; bne 2f / no, skip it
  1104 0000D197 88BE[DF930100]      <1> 	mov	[esi+p.stat-1], bh ; 0
  1105                              <1> 		; clrb p.stat-1(r2) / yes, free it
  1106                              <1> 
  1107                              <1> 	; 20/08/2024 (ebx = child's exit code)
  1108 0000D19D 31C0                <1> 	xor	eax, eax
  1109 0000D19F 8A86[7F940100]      <1> 	mov	al, [esi+p.exitc-1] ; exit code
  1110 0000D1A5 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]
  1111                              <1> 	; 22/08/2024
  1112 0000D1AB 894510              <1> 	mov	[ebp+16], eax ; ebx
  1113                              <1> 
  1114                              <1> 	;shl	si, 1
  1115                              <1> 	; 23/07/2022
  1116 0000D1AE D1E6                <1> 	shl	esi, 1
  1117                              <1> 		; asl r2 / r2x2 to get index into p.pid table
  1118                              <1> 	;movzx	eax, word [esi+p.pid-2]
  1119                              <1> 	; 20/08/2024
  1120 0000D1B0 668B86[7E930100]    <1> 	mov	ax, [esi+p.pid-2]
  1121 0000D1B7 A3[AC940100]        <1> 	mov	[u.r0], eax
  1122                              <1> 		; mov p.pid-2(r2),*u.r0 
  1123                              <1> 			      ; / put childs process name in (u.r0)
  1124                              <1> 	;
  1125                              <1> 	; Retro UNIX 386 v1 modification ! (17/09/2015)
  1126                              <1> 	;
  1127                              <1> 	; Parent process ID -p.ppid- field (of the child process)
  1128                              <1> 	; must be cleared in order to prevent infinitive 'syswait'
  1129                              <1> 	; system call loop from the application/program if it calls
  1130                              <1> 	; 'syswait' again (mistakenly) while there is not a zombie
  1131                              <1> 	; or running child process to wait. ('forktest.s', 17/09/2015)
  1132                              <1> 	;
  1133                              <1> 	; Note: syswait will return with error if there is not a
  1134                              <1> 	;       zombie or running process to wait.
  1135                              <1> 
  1136                              <1> 	;sub	ax, ax
  1137                              <1> 	; 30/07/2022
  1138 0000D1BC 29C0                <1> 	sub	eax, eax ; 0
  1139 0000D1BE 668986[9E930100]    <1> 	mov 	[esi+p.ppid-2], ax ; 0 ; 17/09/2015
  1140 0000D1C5 E9D8FCFFFF          <1> 	jmp	sysret0 ; ax = 0
  1141                              <1> 	;
  1142                              <1> 	;jmp	sysret
  1143                              <1> 		; br sysret1 / return cause child is dead
  1144                              <1> syswait_2: ; 2:
  1145                              <1> 	;shl	si, 1
  1146                              <1> 	; 23/07/2022
  1147 0000D1CA D1E6                <1> 	shl	esi, 1
  1148                              <1> 		; asl r2 / r2x2 to get index into p.ppid table
  1149                              <1> syswait_3: ; 3:
  1150 0000D1CC 6683FE20            <1> 	cmp	si, nproc+nproc
  1151                              <1> 		; cmp r2,$nproc+nproc / have all processes been checked?
  1152 0000D1D0 72AD                <1> 	jb	short syswait_1
  1153                              <1> 		; blt 1b / no, continue search
  1154                              <1> 	;and	cx, cx
  1155 0000D1D2 20C9                <1> 	and	cl, cl
  1156                              <1> 		; tst r3 / one gets here if there are no children
  1157                              <1> 		       ; / or children that are still active
  1158                              <1> 	; 30/10/2013
  1159 0000D1D4 7515                <1> 	jnz	short syswait_4
  1160                              <1> 	;jz	error
  1161                              <1> 		; beq error1 / there are no children, error
  1162 0000D1D6 890D[AC940100]      <1> 	mov	[u.r0], ecx ; 0
  1163                              <1> 
  1164                              <1> 	; 20/08/2024 (ebx = child's exit code)
  1165 0000D1DC 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]
  1166 0000D1E2 49                  <1> 	dec	ecx ; -1 ; 0FFFFFFFFh
  1167                              <1> 	; 22/08/2024
  1168 0000D1E3 894D10              <1> 	mov	[ebp+16], ecx ; ebx
  1169                              <1> 
  1170 0000D1E6 E995FCFFFF          <1> 	jmp	error
  1171                              <1> syswait_4:
  1172 0000D1EB 8A1D[FD940100]      <1> 	mov	bl, [u.uno]
  1173                              <1> 		; movb u.uno,r1 / there are children so put 
  1174                              <1> 			      ; / parent process number in r1
  1175 0000D1F1 FE83[DF930100]      <1> 	inc	byte [ebx+p.stat-1] ; 2, SWAIT, 05/02/2014
  1176                              <1> 		; incb p.stat-1(r1) / it is waiting for
  1177                              <1> 				  ; / other children to die
  1178                              <1> 	; 04/11/2013
  1179 0000D1F7 E8E33B0000          <1> 	call	swap
  1180                              <1> 		; jsr r0,swap / swap it out, because it's waiting
  1181                              <1> 
  1182                              <1> 	; 23/08/2024 - bugfix
  1183                              <1> 	; restore [u.usp]
  1184                              <1> 	; (swap above changes [u.usp] just before wswap)
  1185 0000D1FC 8925[A8940100]      <1> 	mov	[u.usp], esp
  1186                              <1> 		; points to user's regs on top ofn system stack
  1187                              <1> 
  1188 0000D202 E964FFFFFF          <1> 	jmp	syswait_0
  1189                              <1> 		; br syswait / wait on next process
  1190                              <1> 
  1191                              <1> sysfork: ; < create a new process >
  1192                              <1> 	; 19/08/2024 - TRDOS 386 Kernel v2.0.9 (STDIN/STDOUT)
  1193                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
  1194                              <1> 	; 02/01/2017 (TRDOS 386 modification)
  1195                              <1> 	; 04/09/2015 - 18/05/2015
  1196                              <1> 	; 28/08/2015 - 01/09/2015 - 02/09/2015
  1197                              <1> 	; 09/05/2015 - 10/05/2015 - 14/05/2015
  1198                              <1> 	; 06/05/2015 (Retro UNIX 386 v1 - Beginning)
  1199                              <1> 	; 24/05/2013 - 14/02/2014 (Retro UNIX 8086 v1)
  1200                              <1> 	;
  1201                              <1> 	; 'sysfork' creates a new process. This process is referred
  1202                              <1> 	; to as the child process. This new process core image is
  1203                              <1> 	; a copy of that of the caller of 'sysfork'. The only
  1204                              <1> 	; distinction is the return location and the fact that (u.r0)
  1205                              <1> 	; in the old process (parent) contains the process id (p.pid)
  1206                              <1> 	; of the new process (child). This id is used by 'syswait'.
  1207                              <1> 	; 'sysfork' works in the following manner:
  1208                              <1> 	;    1) The process status table (p.stat) is searched to find
  1209                              <1> 	;	a process number that is unused. If none are found
  1210                              <1> 	;	an error occurs.
  1211                              <1> 	;    2) when one is found, it becomes the child process number
  1212                              <1> 	;	and it's status (p.stat) is set to active.
  1213                              <1> 	;    3) If the parent had a control tty, the interrupt
  1214                              <1> 	;	character in that tty buffer is cleared.
  1215                              <1> 	;    4) The child process is put on the lowest priority run
  1216                              <1> 	;	queue via 'putlu'.
  1217                              <1> 	;    5) A new process name is gotten from 'mpid' (actually
  1218                              <1> 	;	it is a unique number) and is put in the child's unique
  1219                              <1> 	;	identifier; process id (p.pid).
  1220                              <1> 	;    6) The process name of the parent is then obtained and
  1221                              <1> 	;	placed in the unique identifier of the parent process
  1222                              <1> 	;	name is then put in 'u.r0'.
  1223                              <1> 	;    7) The child process is then written out on disk by
  1224                              <1> 	;	'wswap',i.e., the parent process is copied onto disk
  1225                              <1> 	;	and the child is born. (The child process is written
  1226                              <1> 	;	out on disk/drum with 'u.uno' being the child process
  1227                              <1> 	;	number.)
  1228                              <1> 	;    8) The parent process number is then restored to 'u.uno'.
  1229                              <1> 	;    9) The child process name is put in 'u.r0'.
  1230                              <1> 	;   10) The pc on the stack sp + 18 is incremented by 2 to
  1231                              <1> 	;	create the return address for the parent process.
  1232                              <1> 	;   11) The 'u.fp' list as then searched to see what files
  1233                              <1> 	;	the parent has opened. For each file the parent has
  1234                              <1> 	;	opened, the corresponding 'fsp' entry must be updated
  1235                              <1> 	;	to indicate that the child process also has opened
  1236                              <1> 	;	the file. A branch to 'sysret' is then made.
  1237                              <1> 	;
  1238                              <1> 	; Calling sequence:
  1239                              <1> 	;	from shell ?
  1240                              <1> 	; Arguments:
  1241                              <1> 	;	-
  1242                              <1> 	; Inputs: -
  1243                              <1> 	; Outputs: *u.r0 - child process name
  1244                              <1> 	; ...............................................................
  1245                              <1> 	;	
  1246                              <1> 	; Retro UNIX 8086 v1 modification: 
  1247                              <1> 	;	AX = r0 = PID (>0) (at the return of 'sysfork')
  1248                              <1> 	;	= process id of child a parent process returns
  1249                              <1> 	;	= process id of parent when a child process returns
  1250                              <1> 	;
  1251                              <1> 	;       In original UNIX v1, sysfork is called and returns as
  1252                              <1> 	;	in following manner: (with an example: c library, fork)
  1253                              <1> 	;
  1254                              <1> 	;	1:
  1255                              <1> 	;		sys	fork
  1256                              <1> 	;			br 1f  / child process returns here
  1257                              <1> 	;		bes	2f     / parent process returns here
  1258                              <1> 	;		/ pid of new process in r0
  1259                              <1> 	;		rts	pc
  1260                              <1> 	;	2: / parent process condionally branches here
  1261                              <1> 	;		mov	$-1,r0 / pid = -1 means error return
  1262                              <1> 	;		rts	pc
  1263                              <1> 	;
  1264                              <1> 	;	1: / child process brances here
  1265                              <1> 	;		clr	r0   / pid = 0 in child process
  1266                              <1> 	;		rts	pc
  1267                              <1> 	;
  1268                              <1> 	;	In UNIX v7x86 (386) by Robert Nordier (1999)
  1269                              <1> 	;		// pid = fork();
  1270                              <1> 	;		//
  1271                              <1> 	;		// pid == 0 in child process; 
  1272                              <1> 	;		// pid == -1 means error return
  1273                              <1> 	;		// in child, 
  1274                              <1> 	;		//	parents id is in par_uid if needed
  1275                              <1> 	;
  1276                              <1> 	;		_fork:
  1277                              <1> 	;			mov	$.fork,eax
  1278                              <1> 	;			int	$0x30
  1279                              <1> 	;			jmp	1f
  1280                              <1> 	;			jnc	2f
  1281                              <1> 	;			jmp	cerror
  1282                              <1> 	;		1:
  1283                              <1> 	;			mov	eax,_par_uid
  1284                              <1> 	;			xor	eax,eax
  1285                              <1> 	;		2:
  1286                              <1> 	;			ret
  1287                              <1> 	;
  1288                              <1> 	;	In Retro UNIX 8086 v1,
  1289                              <1> 	;	'sysfork' returns in following manner:
  1290                              <1> 	;
  1291                              <1> 	;		mov	ax, sys_fork
  1292                              <1> 	;		mov	bx, offset @f ; routine for child
  1293                              <1> 	;		int	20h
  1294                              <1> 	;		jc	error
  1295                              <1> 	;
  1296                              <1> 	;	; Routine for parent process here (just after 'jc')
  1297                              <1> 	;		mov	word ptr [pid_of_child], ax
  1298                              <1> 	;		jmp	next_routine_for_parent	
  1299                              <1> 	;
  1300                              <1> 	;	@@: ; routine for child process here
  1301                              <1> 	;		....
  1302                              <1> 	;	NOTE: 'sysfork' returns to specified offset
  1303                              <1> 	;	       for child process by using BX input.
  1304                              <1> 	;	      (at first, parent process will return then
  1305                              <1> 	;	      child process will return -after swapped in-
  1306                              <1> 	;	      'syswait' is needed in parent process
  1307                              <1> 	;	      if return from child process will be waited for.)
  1308                              <1> 	;
  1309                              <1> 
  1310                              <1> ; / create a new process
  1311                              <1> 	; EBX = return address for child process
  1312                              <1> 	     ; (Retro UNIX 8086 v1 modification !)
  1313 0000D207 31F6                <1> 	xor 	esi, esi
  1314                              <1> 		; clr r1
  1315                              <1> sysfork_1: ; 1: / search p.stat table for unused process number
  1316 0000D209 46                  <1> 	inc	esi
  1317                              <1> 		; inc r1
  1318 0000D20A 80BE[DF930100]00    <1> 	cmp	byte [esi+p.stat-1], 0 ; SFREE, 05/02/2014
  1319                              <1> 		; tstb p.stat-1(r1) / is process active, unused, dead
  1320 0000D211 760B                <1> 	jna	short sysfork_2	
  1321                              <1> 		; beq 1f / it's unused so branch
  1322 0000D213 6683FE10            <1> 	cmp	si, nproc
  1323                              <1> 		; cmp r1,$nproc / all processes checked
  1324 0000D217 72F0                <1> 	jb	short sysfork_1
  1325                              <1> 		; blt 1b / no, branch back
  1326                              <1> 	;
  1327                              <1> 	; Retro UNIX 8086 v1. modification:
  1328                              <1> 	;	Parent process returns from 'sysfork' to address 
  1329                              <1> 	;	which is just after 'sysfork' system call in parent
  1330                              <1> 	;	process. Child process returns to address which is put
  1331                              <1> 	;	in BX register by parent process for 'sysfork'. 
  1332                              <1> 	;
  1333                              <1> 		; add $2,18.(sp) / add 2 to pc when trap occured, points
  1334                              <1> 		             ; / to old process return
  1335                              <1> 		; br error1 / no room for a new process
  1336                              <1> sysfork_err:
  1337 0000D219 E962FCFFFF          <1> 	jmp	error
  1338                              <1> sysfork_2: ; 1:
  1339 0000D21E E8BD85FFFF          <1> 	call	allocate_page
  1340                              <1> 	;jc	error
  1341                              <1> 	; 23/07/2022
  1342 0000D223 72F4                <1> 	jc	short sysfork_err
  1343 0000D225 50                  <1> 	push	eax   ; UPAGE (user structure page) address
  1344                              <1> 	; Retro UNIX 386 v1 modification!
  1345 0000D226 E8A587FFFF          <1> 	call	duplicate_page_dir
  1346                              <1> 		; EAX = New page directory
  1347 0000D22B 730B                <1> 	jnc	short sysfork_3
  1348 0000D22D 58                  <1> 	pop	eax   ; UPAGE (user structure page) address
  1349 0000D22E E86C87FFFF          <1> 	call 	deallocate_page
  1350 0000D233 E948FCFFFF          <1> 	jmp	error
  1351                              <1> sysfork_3:
  1352                              <1> 	; Retro UNIX 386 v1 modification !
  1353 0000D238 56                  <1> 	push	esi
  1354 0000D239 E82E3C0000          <1> 	call	wswap ; save current user (u) structure, user registers
  1355                              <1> 		      ; and interrupt return components (for IRET)
  1356 0000D23E 8705[04950100]      <1> 	xchg	eax, [u.pgdir] ; page directory of the child process
  1357 0000D244 A3[08950100]        <1> 	mov	[u.ppgdir], eax ; page directory of the parent process
  1358 0000D249 5E                  <1> 	pop	esi
  1359 0000D24A 58                  <1> 	pop	eax   ; UPAGE (user structure page) address
  1360                              <1> 		; [u.usp] = esp
  1361 0000D24B 89F7                <1> 	mov	edi, esi
  1362                              <1> 	;shl	di, 2
  1363                              <1> 	; 23/07/2022
  1364 0000D24D C1E702              <1> 	shl	edi, 2
  1365 0000D250 8987[EC930100]      <1> 	mov	[edi+p.upage-4], eax ; memory page for 'user' struct
  1366 0000D256 A3[00950100]        <1> 	mov	[u.upage], eax ; memory page for 'user' struct (child)
  1367                              <1> 	;;;
  1368                              <1> 	; 19/08/2024 - reset STDIN/STDOUT redirections (and ungetchar)
  1369 0000D25B 31C0                <1> 	xor	eax, eax ; 0
  1370                              <1> 	; 19/08/2024
  1371                              <1> 	;mov	[u.stdin], al ; 0
  1372                              <1> 	;mov	[u.stdout], al ; 0
  1373                              <1> 	;mov	[u.ungetc], al ; 0
  1374                              <1> 	;mov	[u.getc], al ; 0
  1375 0000D25D A3[14950100]        <1> 	mov	[u.stdin], eax ; 0
  1376                              <1> 	;;;
  1377                              <1> 
  1378                              <1> 	; 28/08/2015
  1379                              <1> 	;movzx	eax, byte [u.uno] ; parent process number
  1380                              <1> 	; 19/08/2024
  1381                              <1> 	; eax = 0
  1382 0000D262 A0[FD940100]        <1> 	mov	al, [u.uno] ; parent process number
  1383                              <1> 		; movb u.uno,-(sp) / save parent process number
  1384 0000D267 89C7                <1> 	mov	edi, eax
  1385 0000D269 50                  <1>         push	eax ; **
  1386 0000D26A 8A87[BF930100]      <1> 	mov     al, [edi+p.ttyc-1] ; console tty (parent)
  1387                              <1> 	; 18/09/2015
  1388                              <1> 	;;mov	[esi+p.ttyc-1], al ; set child's console tty
  1389                              <1> 	;;mov	[esi+p.waitc-1], ah ; 0 ; reset child's wait channel
  1390                              <1> 	;mov    [esi+p.ttyc-1], ax ; al - set child's console tty
  1391                              <1> 				   ; ah - reset child's wait channel
  1392                              <1> 	; 23/07/2022
  1393 0000D270 8886[BF930100]      <1> 	mov	[esi+p.ttyc-1], al ; set child's console tty
  1394 0000D276 89F0                <1> 	mov	eax, esi
  1395 0000D278 A2[FD940100]        <1> 	mov	[u.uno], al ; child process number
  1396                              <1> 		;movb r1,u.uno / set child process number to r1
  1397 0000D27D FE86[DF930100]      <1>         inc     byte [esi+p.stat-1] ; 1, SRUN, 05/02/2014
  1398                              <1> 		; incb p.stat-1(r1) / set p.stat entry for child 
  1399                              <1> 				; / process to active status
  1400                              <1> 		; mov u.ttyp,r2 / put pointer to parent process' 
  1401                              <1> 			      ; / control tty buffer in r2
  1402                              <1>                 ; beq 2f / branch, if no such tty assigned
  1403                              <1> 		; clrb 6(r2) / clear interrupt character in tty buffer
  1404                              <1> 	; 2:
  1405 0000D283 53                  <1> 	push	ebx  ; * return address for the child process
  1406                              <1> 		     ; * Retro UNIX 8086 v1 feature only !
  1407                              <1> 	; (Retro UNIX 8086 v1 modification!)
  1408                              <1> 		; mov $runq+4,r2
  1409 0000D284 BB[9C940100]        <1> 	mov	ebx, runq+2 ; normal run queue ; 02/01/2017
  1410 0000D289 E84E3C0000          <1> 	call	putlu
  1411                              <1>  		; jsr r0,putlu / put child process on lowest priority
  1412                              <1> 			   ; / run queue
  1413                              <1> 	; 23/07/2022
  1414 0000D28E D1E6                <1> 	shl	esi, 1
  1415                              <1> 	;shl	si, 1
  1416                              <1> 		; asl r1 / multiply r1 by 2 to get index 
  1417                              <1> 		       ; / into p.pid table
  1418 0000D290 66FF05[94940100]    <1> 	inc	word [mpid]
  1419                              <1> 		; inc mpid / increment m.pid; get a new process name
  1420 0000D297 66A1[94940100]      <1> 	mov	ax, [mpid]
  1421 0000D29D 668986[7E930100]    <1> 	mov	[esi+p.pid-2], ax
  1422                              <1> 		;mov mpid,p.pid-2(r1) / put new process name 
  1423                              <1> 				    ; / in child process' name slot
  1424 0000D2A4 5A                  <1> 	pop	edx  ; * return address for the child process
  1425                              <1> 		     ; * Retro UNIX 8086 v1 feature only !
  1426 0000D2A5 5B                  <1>   	pop	ebx  ; **
  1427                              <1> 	;mov	ebx, [esp] ; ** parent process number
  1428                              <1> 		; movb (sp),r2 / put parent process number in r2
  1429                              <1> 	; 23/07/2022
  1430 0000D2A6 D1E3                <1> 	shl	ebx, 1
  1431                              <1> 	;shl 	bx, 1
  1432                              <1> 		;asl r2 / multiply by 2 to get index into below tables
  1433                              <1> 	;movzx eax, word [ebx+p.pid-2]
  1434 0000D2A8 668B83[7E930100]    <1> 	mov	ax, [ebx+p.pid-2]
  1435                              <1> 		; mov p.pid-2(r2),r2 / get process name of parent
  1436                              <1> 				   ; / process
  1437 0000D2AF 668986[9E930100]    <1> 	mov	[esi+p.ppid-2], ax
  1438                              <1> 		; mov r2,p.ppid-2(r1) / put parent process name
  1439                              <1> 			  ; / in parent process slot for child
  1440 0000D2B6 A3[AC940100]        <1> 	mov	[u.r0], eax
  1441                              <1> 		; mov r2,*u.r0 / put parent process name on stack
  1442                              <1> 			     ; / at location where r0 was saved
  1443 0000D2BB 8B2D[A4940100]      <1> 	mov 	ebp, [u.sp] ; points to return address (EIP for IRET)
  1444 0000D2C1 895500              <1> 	mov	[ebp], edx ; *, CS:EIP -> EIP
  1445                              <1> 			   ; * return address for the child process
  1446                              <1> 		; mov $sysret1,-(sp) /
  1447                              <1> 		; mov sp,u.usp / contents of sp at the time when 
  1448                              <1> 			      ; / user is swapped out
  1449                              <1> 		; mov $sstack,sp / point sp to swapping stack space
  1450                              <1> 	; 04/09/2015 - 01/09/2015
  1451                              <1> 	; [u.usp] = esp
  1452 0000D2C4 68[A0CE0000]        <1> 	push	sysret ; ***
  1453 0000D2C9 8925[A8940100]      <1> 	mov	[u.usp], esp ; points to 'sysret' address (***)
  1454                              <1> 			     ; (for child process)
  1455 0000D2CF 31C0                <1> 	xor 	eax, eax
  1456 0000D2D1 66A3[E0940100]      <1> 	mov 	[u.ttyp], ax ; 0
  1457                              <1> 	;
  1458 0000D2D7 E8903B0000          <1> 	call	wswap ; Retro UNIX 8086 v1 modification !
  1459                              <1> 		; jsr r0,wswap / put child process out on drum
  1460                              <1> 		; jsr r0,unpack / unpack user stack
  1461                              <1> 		; mov u.usp,sp / restore user stack pointer
  1462                              <1> 		; tst (sp)+ / bump stack pointer
  1463                              <1> 	; Retro UNIX 386 v1 modification !
  1464 0000D2DC 58                  <1> 	pop	eax ; ***
  1465                              <1> 	;shl	bx, 1
  1466                              <1> 	; 23/07/2022
  1467 0000D2DD D1E3                <1> 	shl	ebx, 1
  1468 0000D2DF 8B83[EC930100]      <1> 	mov     eax, [ebx+p.upage-4] ; UPAGE address ; 14/05/2015
  1469 0000D2E5 E8BA3B0000          <1> 	call	rswap ; restore parent process 'u' structure,
  1470                              <1> 		      ; registers and return address (for IRET)
  1471                              <1> 		;movb (sp)+,u.uno / put parent process number in u.uno
  1472 0000D2EA 0FB705[94940100]    <1>         movzx   eax, word [mpid]
  1473 0000D2F1 A3[AC940100]        <1> 	mov	[u.r0], eax
  1474                              <1> 		; mov mpid,*u.r0 / put child process name on stack
  1475                              <1> 			       ; / where r0 was saved
  1476                              <1> 		; add $2,18.(sp) / add 2 to pc on stack; gives parent
  1477                              <1> 			          ; / process return
  1478                              <1> 	;xor	ebx, ebx
  1479 0000D2F6 31F6                <1> 	xor     esi, esi
  1480                              <1> 		;clr r1
  1481                              <1> sysfork_4: ; 1: / search u.fp list to find the files
  1482                              <1> 	      ; / opened by the parent process
  1483                              <1> 	; 01/09/2015
  1484                              <1> 	;xor	bh, bh
  1485                              <1> 	;mov 	bl, [esi+u.fp]
  1486 0000D2F8 8A86[B6940100]      <1> 	mov 	al, [esi+u.fp]
  1487                              <1> 		; movb u.fp(r1),r2 / get an open file for this process
  1488                              <1>         ;or	bl, bl
  1489 0000D2FE 08C0                <1> 	or	al, al
  1490 0000D300 7406                <1> 	jz	short sysfork_5	
  1491                              <1> 		; beq 2f / file has not been opened by parent,
  1492                              <1> 		       ; / so branch
  1493                              <1> 	;mov	ah, 10 ; Retro UNIX 386 v1 fsp structure size = 10 bytes
  1494                              <1> 	;mul	ah
  1495                              <1> 	; 23/07/2022
  1496                              <1> 	; Retro UNIX 386 v2 & TRDOS 386 v2.0.5 fsp struc size = 16 bytes
  1497                              <1> 	;mov	ebx, eax
  1498                              <1> 	;shl	ebx, 4 ; * 16
  1499                              <1> 	;inc	byte [ebx+fsp-10]
  1500                              <1> 
  1501                              <1> 	; 23/07/2022 (BugFix)
  1502 0000D302 FE80[9C8A0100]      <1> 	inc	byte [OF_OPENCOUNT+eax]
  1503                              <1> 
  1504                              <1> 	;;movzx	ebx, ax
  1505                              <1> 	;mov	bx, ax
  1506                              <1> 	;shl	bx, 3
  1507                              <1> 		; asl r2 / multiply by 8
  1508                              <1>        		; asl r2 / to get index into fsp table
  1509                              <1>        		; asl r2
  1510                              <1>   	;inc	byte [ebx+fsp-2]
  1511                              <1> 		; incb fsp-2(r2) / increment number of processes
  1512                              <1> 			     ; / using file, because child will now be
  1513                              <1> 			     ; / using this file
  1514                              <1> sysfork_5: ; 2:
  1515 0000D308 46                  <1>         inc     esi
  1516                              <1> 		; inc r1 / get next open file
  1517                              <1> 	; 23/07/2022
  1518 0000D309 6683FE20            <1> 	cmp	si, OPENFILES ; = 10
  1519                              <1> 	;cmp	si, 10
  1520                              <1> 		; cmp r1,$10. / 10. files is the maximum number which
  1521                              <1> 			    ; / can be opened
  1522 0000D30D 72E9                <1> 	jb	short sysfork_4	
  1523                              <1> 		; blt 1b / check next entry
  1524 0000D30F E98CFBFFFF          <1> 	jmp	sysret
  1525                              <1> 		; br sysret1
  1526                              <1> 
  1527                              <1> syscreat: ; < create file >
  1528                              <1> 	; 29/08/2024
  1529                              <1> 	; 25/08/2024 - TRDOS 386 v2.0.9	
  1530                              <1> 	; 08/08/2022
  1531                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
  1532                              <1> 	; 13/11/2017
  1533                              <1> 	; 27/10/2016
  1534                              <1> 	; 25/10/2016 - 26/10/2016
  1535                              <1> 	; 15/10/2016 - 16/10/2016 - 17/10/2016
  1536                              <1> 	; 10/10/2016 (TRDOS 386 = TRDOS v2.0)
  1537                              <1> 	;	     -derived from INT_21H.ASM-
  1538                              <1> 	;            ("loc_INT21h_create_file")
  1539                              <1>         ; 	10/07/2011 (12/03/2011)
  1540                              <1>         ;	INT 21h Function AH = 3Ch
  1541                              <1>         ;	Create File
  1542                              <1>         ;	INPUT
  1543                              <1>         ;	   CX = Attributes
  1544                              <1>         ;          DS:DX= Address of zero terminaned path name
  1545                              <1>         ;
  1546                              <1> 	; 27/12/2015 (Retro UNIX 386 v1.1)
  1547                              <1> 	; 14/05/2015 (Retro UNIX 386 v1 - Beginning)
  1548                              <1> 	; 27/05/2013 (Retro UNIX 8086 v1)
  1549                              <1> 	;
  1550                              <1> 	; 'syscreat' called with two arguments; name and mode.
  1551                              <1> 	; u.namep points to name of the file and mode is put
  1552                              <1> 	; on the stack. 'namei' is called to get i-number of the file.
  1553                              <1> 	; If the file aready exists, it's mode and owner remain 
  1554                              <1> 	; unchanged, but it is truncated to zero length. If the file
  1555                              <1> 	; did not exist, an i-node is created with the new mode via
  1556                              <1> 	; 'maknod' whether or not the file already existed, it is
  1557                              <1> 	; open for writing. The fsp table is then searched for a free
  1558                              <1> 	; entry. When a free entry is found, proper data is placed
  1559                              <1> 	; in it and the number of this entry is put in the u.fp list.
  1560                              <1> 	; The index to the u.fp (also know as the file descriptor)
  1561                              <1> 	; is put in the user's r0.
  1562                              <1> 	;
  1563                              <1> 	; Calling sequence:
  1564                              <1> 	;	syscreate; name; mode
  1565                              <1> 	; Arguments:
  1566                              <1> 	;	name - name of the file to be created
  1567                              <1> 	;	mode - mode of the file to be created
  1568                              <1> 	; Inputs: (arguments)
  1569                              <1> 	; Outputs: *u.r0 - index to u.fp list 
  1570                              <1> 	;		   (the file descriptor of new file)
  1571                              <1> 	; ...............................................................
  1572                              <1> 	;
  1573                              <1> 	; Retro UNIX 8086 v1 modification:
  1574                              <1> 	;       'syscreate' system call has two arguments; so,
  1575                              <1> 	;	* 1st argument, name is pointed to by BX register
  1576                              <1> 	;	* 2nd argument, mode is in CX register
  1577                              <1> 	;
  1578                              <1> 	;	AX register (will be restored via 'u.r0') will return
  1579                              <1> 	;	to the user with the file descriptor/number 
  1580                              <1> 	;	(index to u.fp list).
  1581                              <1> 	;
  1582                              <1> 	;call	arg2
  1583                              <1> 	; * name - 'u.namep' points to address of file/path name
  1584                              <1> 	;          in the user's program segment ('u.segmnt')
  1585                              <1> 	;          with offset in BX register (as sysopen argument 1).
  1586                              <1> 	; * mode - sysopen argument 2 is in CX register 
  1587                              <1> 	;          which is on top of stack.
  1588                              <1> 	;
  1589                              <1> 	; TRDOS 386 (10/10/2016)
  1590                              <1> 	;
  1591                              <1>         ; INPUT ->
  1592                              <1>         ;	   CL = File Attributes
  1593                              <1> 	;     	      bit 0 (1) - Read only file (R)
  1594                              <1> 	;             bit 1 (1) - Hidden file (H)
  1595                              <1>         ;             bit 2 (1) - System file (R)
  1596                              <1> 	;             bit 3 (1) - Volume label/name (V)
  1597                              <1>         ;             bit 4 (1) - Subdirectory (D)
  1598                              <1> 	;	      bit 5 (1) - File has been archived (A)
  1599                              <1>         ;          EBX = Pointer to filename (ASCIIZ) -path-
  1600                              <1> 	;
  1601                              <1> 	; OUTPUT ->
  1602                              <1> 	;          eax = File/Device Handle/Number (index) (AL)
  1603                              <1> 	;          cf = 1 -> Error code in AL
  1604                              <1> 	;
  1605                              <1> 	; Modified Registers: EAX (at the return of system call)
  1606                              <1> 	; 
  1607                              <1> 	; Note: If the file is existing and it has not any one
  1608                              <1> 	;	of S,H,R,V,D attributes, it will be truncated
  1609                              <1> 	;	to zero length; otherwise, access error will be
  1610                              <1> 	;	returned.
  1611                              <1> 
  1612                              <1> sysmkdir_0:
  1613 0000D314 F6C108              <1> 	test	cl, 08h ; Volume name
  1614 0000D317 740A                <1> 	jz	short syscreat_0
  1615                              <1> 
  1616                              <1> 	; Volume name or long name creation
  1617                              <1> 	; is not permitted (in TRDOS 386)!
  1618 0000D319 B80B000000          <1> 	mov	eax, ERR_FILE_ACCESS  ; 11 ; 'permission denied !'
  1619 0000D31E E9D8000000          <1>         jmp	sysopen_dev_err ; 08/08/2022
  1620                              <1> syscreat_0:
  1621                              <1>         ;mov	[u.namep], ebx
  1622 0000D323 51                  <1> 	push	ecx
  1623 0000D324 89DE                <1> 	mov	esi, ebx
  1624                              <1> 	; file name is forced, change directory as temporary
  1625                              <1> 	;mov	ax, 1
  1626                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset ; 17/10/2016
  1627                              <1> 	;call	set_working_path 
  1628 0000D326 E8EB4F0000          <1> 	call	set_working_path_x ; 17/10/2016	
  1629                              <1> 	;jc	short syscreat_err
  1630                              <1> 	; 23/07/2022
  1631 0000D32B 7305                <1> 	jnc	short syscreat_3
  1632 0000D32D E9E2000000          <1> 	jmp	syscreat_err
  1633                              <1> 
  1634                              <1> syscreat_3:
  1635                              <1> 	; 16/10/2016
  1636 0000D332 803D[B3890100]00    <1> 	cmp	byte [SWP_inv_fname], 0
  1637 0000D339 7776                <1> 	ja	short syscreat_inv_fname ; invalid file name !
  1638                              <1> 
  1639                              <1> 	; Here, we have a valid path and also a valid file name
  1640                              <1> 	; (Working dir has been changed if the path
  1641                              <1> 	;  -file name string- had contained a dir name.)
  1642                              <1> 
  1643                              <1> 	;xor	ax, ax
  1644                              <1> 	; 25/08/2024
  1645 0000D33B 31C0                <1> 	xor	eax, eax
  1646                              <1> 	;mov	esi, FindFile_Name
  1647 0000D33D E828B8FFFF          <1> 	call	find_first_file
  1648 0000D342 59                  <1> 	pop	ecx
  1649                              <1> 		; ESI = Directory Entry (FindFile_DirEntry) Location
  1650                              <1> 		; EDI = Directory Buffer Directory Entry Location
  1651                              <1> 		; EAX = File Size
  1652                              <1> 		;  BL = Attributes of The File/Directory
  1653                              <1> 		;  BH = Long Name Yes/No Status (>0 is YES)
  1654                              <1> 		;  DX > 0 : Ambiguous filename chars are used
  1655 0000D343 7274                <1> 	jc	short syscreat_1 ; file not found (the good!)
  1656                              <1> 				 ; or another error (the bad!)
  1657                              <1> 
  1658                              <1> 	; (& the uggly!) truncate file to zero length before open
  1659                              <1> 
  1660                              <1> 	;'*' and '?' already checked at 'set_working_path' stage
  1661                              <1> 	;and	dx, dx
  1662                              <1> 	;jnz	short sysmkdir_err ; permission denied
  1663                              <1> 				   ; invalid filename chars
  1664                              <1> 
  1665                              <1> 	;test	cl, 10h ; subdirectory ?
  1666                              <1> 	;jnz	short sysmkdir_err
  1667                              <1> 
  1668                              <1> 	; BL = File Attributes:
  1669                              <1> 	;     	      bit 0 (1) - Read only file (R)
  1670                              <1> 	;             bit 1 (1) - Hidden file (H)
  1671                              <1>         ;             bit 2 (1) - System file (R)
  1672                              <1> 	;             bit 3 (1) - Volume label/name (V)
  1673                              <1>         ;             bit 4 (1) - Subdirectory (D)
  1674                              <1> 	;	      bit 5 (1) - File has been archived
  1675                              <1> 
  1676                              <1> 	; * existing directory must not be truncated
  1677                              <1> 	;   (we don't know it is empty or not, at this stage)
  1678                              <1> 	; * existing volume name (or a long name) can not be
  1679                              <1> 	;   re-created or truncated by 'syscreat'
  1680                              <1> 	; * A file with S, H, R attributes must not be truncated
  1681                              <1> 	;   (change attributes to normal, if you need truncate it)
  1682                              <1> 
  1683 0000D345 F6C31F              <1> 	test	bl, 00011111b  ; check attributes of existing file
  1684 0000D348 7559                <1> 	jnz	short sysmkdir_err
  1685                              <1> 
  1686                              <1> 	;; normal file, OK to continue...
  1687                              <1> 
  1688                              <1> 	; ESI = FindFile_DirEntry
  1689 0000D34A 668B4614            <1> 	mov	ax, [esi+DirEntry_FstClusHI] ; 20
  1690 0000D34E C1E010              <1> 	shl	eax, 16 ; 13/11/2017
  1691 0000D351 668B461A            <1> 	mov	ax, [esi+DirEntry_FstClusLO] ; 26
  1692                              <1> 
  1693                              <1> 	; 24/08/2024
  1694 0000D355 21C0                <1> 	and	eax, eax
  1695 0000D357 7426                <1> 	jz	short skip_truncate ; first cluster is 0 !
  1696                              <1> 
  1697                              <1> 	; EAX = First cluster to be truncated/unlinked
  1698 0000D359 57                  <1> 	push	edi
  1699 0000D35A 51                  <1> 	push	ecx
  1700 0000D35B BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1701 0000D360 29C9                <1> 	sub	ecx, ecx
  1702                              <1> 	;mov	ch, [Current_Drv] ; = [FindFile_Drv]
  1703                              <1> 	; 03/09/2024
  1704 0000D362 8A2D[52860100]      <1> 	mov	ch, [FindFile_Drv]
  1705 0000D368 01CE                <1> 	add	esi, ecx
  1706                              <1> 	; ESI = Logical dos drive description table address
  1707 0000D36A E89EF7FFFF          <1> 	call	truncate_cluster_chain
  1708 0000D36F 59                  <1> 	pop	ecx
  1709 0000D370 5F                  <1> 	pop	edi
  1710 0000D371 7237                <1> 	jc	short syscreate_truncate_err
  1711                              <1> 
  1712                              <1> 	; 03/09/2024
  1713 0000D373 66C747140000        <1> 	mov	word [edi+DirEntry_FstClusHI], 0
  1714 0000D379 66C7471A0000        <1> 	mov	word [edi+DirEntry_FstClusLO], 0
  1715                              <1> 
  1716                              <1> 	; 24/08/2024
  1717                              <1> skip_truncate:
  1718                              <1> 	; 26/10/2016
  1719                              <1> 	; EDI = Directory entry address in directory buffer
  1720                              <1> 	; Update directory entry
  1721 0000D37F E883DCFFFF          <1> 	call	convert_current_date_time
  1722                              <1> 	; OUTPUT -> DX = Date in dos dir entry format
  1723                              <1>         ; 	    AX = Time in dos dir entry format
  1724 0000D384 66894716            <1> 	mov	[edi+DirEntry_WrtTime], ax
  1725 0000D388 66895718            <1> 	mov	[edi+DirEntry_WrtDate], dx
  1726 0000D38C 66895712            <1> 	mov	[edi+DirEntry_LastAccDate], dx
  1727 0000D390 31C0                <1> 	xor	eax, eax ; file size = 0 
  1728 0000D392 89471C              <1> 	mov	[edi+DirEntry_FileSize], eax ; 0
  1729 0000D395 C605[D9840100]02    <1> 	mov	byte [DirBuff_ValidData], 2 ; data changed sign	
  1730                              <1> 	;mov	esi, FindFile_DirEntry
  1731                              <1> 	; 03/09/2024
  1732 0000D39C B201                <1> 	mov	dl, 1 ; open file for writing
  1733 0000D39E E9AB000000          <1> 	jmp	sysopen_2 ; 08/08/2022
  1734                              <1> 
  1735                              <1> sysmkdir_err:
  1736                              <1> 	; 1 = write, 2 = read & write, >2 = invalid
  1737 0000D3A3 B80B000000          <1>         mov	eax, ERR_FILE_ACCESS  ; 11 ; 'permission denied !'
  1738 0000D3A8 EB74                <1>         jmp	short sysopen_err
  1739                              <1> 
  1740                              <1> syscreate_truncate_err:
  1741 0000D3AA B812000000          <1> 	mov	eax, ERR_DRV_WRITE ; 18 ; 'disk write error !'
  1742 0000D3AF EB6D                <1>         jmp	short sysopen_err
  1743                              <1> 
  1744                              <1> syscreat_inv_fname:  ; invalid file name chars
  1745                              <1> 	; 16/10/2016
  1746 0000D3B1 B81A000000          <1> 	mov	eax, ERR_INV_FILE_NAME  ; 26 ; invalid file name chars 
  1747 0000D3B6 59                  <1> 	pop	ecx
  1748 0000D3B7 EB65                <1> 	jmp	short sysopen_err
  1749                              <1> 
  1750                              <1> syscreat_1:
  1751                              <1> 	; Error code in EAX
  1752 0000D3B9 3C02                <1>         cmp	al, 02h ; 'File not found' error
  1753 0000D3BB 7561                <1>         jne	short sysopen_err
  1754                              <1> 
  1755 0000D3BD F6C110              <1> 	test	cl, 10h ; Directory
  1756                              <1> 	;jnz	sysmkdir_2
  1757                              <1> 	; 23/07/2022
  1758 0000D3C0 7405                <1> 	jz	short syscreat_2
  1759 0000D3C2 E9CC010000          <1> 	jmp	sysmkdir_2
  1760                              <1> 
  1761                              <1> syscreat_2:
  1762 0000D3C7 BE[94860100]        <1> 	mov	esi, FindFile_Name
  1763                              <1>         ;xor	edx, edx
  1764 0000D3CC 31C0                <1>         xor	eax, eax ; File Size  = 0
  1765 0000D3CE 31DB                <1> 	xor	ebx, ebx
  1766 0000D3D0 4B                  <1> 	dec 	ebx ; FFFFFFFFh -> create empty file
  1767                              <1> 	            ;              (only for FAT fs)
  1768                              <1> 	; CL = File Attributes
  1769 0000D3D1 E85CECFFFF          <1> 	call	create_file
  1770 0000D3D6 7246                <1> 	jc	short sysopen_err
  1771                              <1> 		; EAX = New file's first cluster
  1772                              <1> 		; ESI = Logical Dos Drv Descr. Table Addr.
  1773                              <1> 		; EBX = offset CreateFile_Size
  1774                              <1> 		; ECX = Sectors per cluster (<256) 
  1775                              <1> 		; EDX = Directory entry index/number (<65536)
  1776                              <1> 		; 29/08/2024
  1777                              <1> 		; EBX = File Size (0 for a new, empty file)
  1778                              <1> 		; ECX = Directory Entry Index/Number (<2048)
  1779                              <1> 		;      (in directory cluster, not in directory)
  1780                              <1> 		; EDX = Directory Cluster Number (of the file)
  1781                              <1> 
  1782                              <1> 	; 26/10/2016
  1783                              <1> 	;mov	esi, Directory_Buffer
  1784                              <1> 	;shl	dx, 5 ; *32
  1785                              <1> 	;add	esi, edx
  1786                              <1> 	;; esi = directory entry address in directory buffer
  1787                              <1> 
  1788                              <1> 	; Here, directory entry has been created but last
  1789                              <1> 	; modification date & time of the parent dir has not
  1790                              <1> 	; been updated, yet! 
  1791                              <1> 	; (Note: Directory and FAT buffers have been updated...)
  1792                              <1> 
  1793 0000D3D8 E857DDFFFF          <1> 	call	update_parent_dir_lmdt ; now, it is OK too!
  1794                              <1> 
  1795                              <1> 	; 25/10/2016
  1796 0000D3DD 66B80018            <1> 	mov	ax, 1800h
  1797 0000D3E1 BE[94860100]        <1> 	mov	esi, FindFile_Name
  1798 0000D3E6 E87FB7FFFF          <1> 	call	find_first_file
  1799 0000D3EB 7231                <1> 	jc	short sysopen_err
  1800                              <1> 
  1801                              <1> 	; Only possible error after here is
  1802                              <1> 	; "too many open files !" error.
  1803                              <1> 	;
  1804                              <1> 	; If "syscreat" will return with that error,
  1805                              <1> 	; (the file has been created but it could not be opened)
  1806                              <1> 	; the user must retry to open this file again
  1807                              <1> 	; or must close another file before using 
  1808                              <1> 	; "sysopen" system call.
  1809                              <1> 
  1810 0000D3ED B201                <1> 	mov	dl, 1 ; open file for writing
  1811                              <1> 	; ESI = Directory Entry (FindFile_DirEntry) Location
  1812                              <1> 	; EAX = File Size (= 0)
  1813 0000D3EF EB5D                <1> 	jmp	short sysopen_2
  1814                              <1> 
  1815                              <1> sysopen: ;<open file>
  1816                              <1> 	; 03/09/2024
  1817                              <1> 	; 19/08/2024 - TRDOS 386 v2.0.9
  1818                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
  1819                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
  1820                              <1> 	;	(temporary modifications)
  1821                              <1> 	; 26/10/2016
  1822                              <1> 	; 24/10/2016
  1823                              <1> 	; 17/10/2016
  1824                              <1> 	; 15/10/2016
  1825                              <1> 	; 06/10/2016, 07/10/2016, 08/10/2016
  1826                              <1> 	; 05/10/2016 (TRDOS 386 = TRDOS v2.0)
  1827                              <1> 	;	     -derived from INT_21H.ASM-
  1828                              <1> 	;            ("loc_INT21h_open_file")
  1829                              <1>         ; 	26/02/2011 
  1830                              <1>         ;	INT 21h Function AH = 3Dh
  1831                              <1>         ;	Open File
  1832                              <1>         ;	INPUT
  1833                              <1>         ;	   AL= File Access Value
  1834                              <1> 	;     	     0- Open for reading
  1835                              <1> 	;            1- Open for writing
  1836                              <1>         ;            2- Open for reading and writing
  1837                              <1>         ;          DS:DX= Pointer to filename (ASCIIZ)
  1838                              <1>         ;
  1839                              <1> 	; 14/05/2015 (Retro UNIX 386 v1 - Beginning)
  1840                              <1> 	; 22/05/2013 - 27/05/2013 (Retro UNIX 8086 v1)
  1841                              <1> 	;
  1842                              <1> 	; 'sysopen' opens a file in following manner:
  1843                              <1> 	;    1) The second argument in a sysopen says whether to
  1844                              <1> 	;	open the file ro read (0) or write (>0).
  1845                              <1> 	;    2) I-node of the particular file is obtained via 'namei'.
  1846                              <1> 	;    3) The file is opened by 'iopen'.
  1847                              <1> 	;    4) Next housekeeping is performed on the fsp table
  1848                              <1> 	;	and the user's open file list - u.fp.
  1849                              <1> 	;	a) u.fp and fsp are scanned for the next available slot.
  1850                              <1> 	;	b) An entry for the file is created in the fsp table.
  1851                              <1> 	;	c) The number of this entry is put on u.fp list.
  1852                              <1> 	;	d) The file descriptor index to u.fp list is pointed
  1853                              <1> 	;	   to by u.r0.
  1854                              <1> 	;
  1855                              <1> 	; Calling sequence:
  1856                              <1> 	;	sysopen; name; mode
  1857                              <1> 	; Arguments:
  1858                              <1> 	;	name - file name or path name
  1859                              <1> 	;	mode - 0 to open for reading
  1860                              <1> 	;	       1 to open for writing
  1861                              <1> 	; Inputs: (arguments)
  1862                              <1> 	; Outputs: *u.r0 - index to u.fp list (the file descriptor)
  1863                              <1> 	;		  is put into r0's location on the stack.
  1864                              <1> 	; ...............................................................
  1865                              <1> 	;
  1866                              <1> 	; Retro UNIX 8086 v1 modification:
  1867                              <1> 	;       'sysopen' system call has two arguments; so,
  1868                              <1> 	;	* 1st argument, name is pointed to by BX register
  1869                              <1> 	;	* 2nd argument, mode is in CX register
  1870                              <1> 	;
  1871                              <1> 	;	AX register (will be restored via 'u.r0') will return
  1872                              <1> 	;	to the user with the file descriptor/number 
  1873                              <1> 	;	(index to u.fp list).
  1874                              <1> 	;
  1875                              <1> 	;call	arg2
  1876                              <1> 	; * name - 'u.namep' points to address of file/path name
  1877                              <1> 	;          in the user's program segment ('u.segmnt')
  1878                              <1> 	;          with offset in BX register (as sysopen argument 1).
  1879                              <1> 	; * mode - sysopen argument 2 is in CX register 
  1880                              <1> 	;          which is on top of stack.
  1881                              <1> 	;
  1882                              <1> 	; jsr r0,arg2 / get sys args into u.namep and on stack
  1883                              <1> 	;
  1884                              <1>        	; system call registers: ebx, ecx (through 'sysenter')
  1885                              <1> 	;
  1886                              <1> 	; TRDOS 386 (05/10/2016)
  1887                              <1> 	;
  1888                              <1>         ; INPUT ->
  1889                              <1>         ;	   CL = File Access Value (Open Mode)
  1890                              <1> 	;     	      0 - Open file for reading
  1891                              <1> 	;             1 - Open file for writing
  1892                              <1>         ;             2 - Open device for reading
  1893                              <1> 	;	      3 - Open device for writing
  1894                              <1>         ;          EBX = Pointer to filename/devicename (ASCIIZ)
  1895                              <1> 	; OUTPUT ->
  1896                              <1> 	;          eax = File/Device Handle/Number (index) (AL)
  1897                              <1> 	;          cf = 1 -> Error code in AL
  1898                              <1> 	;
  1899                              <1> 	; Modified Registers: EAX (at the return of system call)
  1900                              <1> 	;
  1901                              <1> 
  1902 0000D3F1 80F901              <1> 	cmp	cl, 1 ; read file (0), write file (1)
  1903 0000D3F4 7614                <1> 	jna	short sysopen_0
  1904                              <1> 
  1905                              <1> 	; 17/04/2021 (temporary)
  1906                              <1> 	;cmp	cl, 3
  1907                              <1> 	;jna	sysopen_device
  1908                              <1> 
  1909                              <1> 	; Invalid access code
  1910 0000D3F6 B817000000          <1> 	mov	eax, ERR_INV_PARAMETER
  1911                              <1> 	;jmp	sysopen_dev_err
  1912                              <1> 
  1913                              <1> sysopen_dev_err:
  1914 0000D3FB A3[AC940100]        <1> 	mov	[u.r0], eax
  1915 0000D400 A3[18950100]        <1> 	mov	[u.error], eax
  1916 0000D405 E976FAFFFF          <1> 	jmp	error
  1917                              <1> 
  1918                              <1> sysopen_0:
  1919                              <1> 	;mov	[u.namep], ebx
  1920 0000D40A 51                  <1> 	push	ecx
  1921 0000D40B 89DE                <1> 	mov	esi, ebx
  1922                              <1> 	; file name is forced, change directory as temporary
  1923                              <1> 	;mov	ax, 1
  1924                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset ; 17/10/2016
  1925                              <1> 	;call	set_working_path
  1926 0000D40D E8044F0000          <1> 	call	set_working_path_x ; 17/10/2016	
  1927 0000D412 731E                <1> 	jnc	short sysopen_1
  1928                              <1> 
  1929                              <1> syscreat_err: ; ecx = file attributes (for 'syscreat')
  1930 0000D414 59                  <1> 	pop	ecx ; open mode  
  1931 0000D415 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!
  1932 0000D417 7505                <1> 	jnz	short sysopen_err
  1933                              <1> 	; eax = 0
  1934 0000D419 B80C000000          <1> 	mov	eax, ERR_DIR_NOT_FOUND ; Directory not found !
  1935                              <1> sysopen_err:
  1936 0000D41E A3[AC940100]        <1> 	mov	[u.r0], eax
  1937 0000D423 A3[18950100]        <1> 	mov	[u.error], eax
  1938 0000D428 E8BE4F0000          <1> 	call 	reset_working_path
  1939 0000D42D E94EFAFFFF          <1> 	jmp	error
  1940                              <1> 
  1941                              <1> sysopen_1:
  1942                              <1> 	;mov	esi, FindFile_Name
  1943 0000D432 66B80018            <1>         mov	ax, 1800h ; Only files
  1944 0000D436 E82FB7FFFF          <1> 	call	find_first_file
  1945 0000D43B 5A                  <1> 	pop	edx
  1946 0000D43C 72E0                <1> 	jc	short sysopen_err ; eax = 2 (File not found !)
  1947                              <1> 
  1948                              <1> 	; check_open_file_attr_access_code
  1949                              <1> 
  1950 0000D43E F6C307              <1>         test	bl, 7  ; system, hidden, readonly
  1951 0000D441 740B                <1>         jz	short sysopen_2
  1952                              <1> 
  1953 0000D443 20D2                <1> 	and	dl, dl ; 0 = read mode
  1954 0000D445 7407                <1> 	jz	short sysopen_2
  1955                              <1> 
  1956                              <1> sysopen_access_err:
  1957                              <1> 	; 1 = write, 2 = read & write, >2 = invalid
  1958 0000D447 B80B000000          <1>         mov	eax, ERR_FILE_ACCESS ; 11 = 'permission denied !'
  1959 0000D44C EBD0                <1>         jmp	short sysopen_err
  1960                              <1> 
  1961                              <1> sysopen_2:
  1962                              <1> 	; esi = Directory Entry (FindFile_DirEntry) Location
  1963                              <1> 	;mov	ebx, esi
  1964                              <1>         ; 03/09/2024
  1965 0000D44E 89FB                <1> 	mov	ebx, edi ; Directory entry in directory buffer
  1966 0000D450 31F6                <1> 	xor     esi, esi ; 0
  1967 0000D452 31FF                <1>         xor     edi, edi ; 0
  1968                              <1> sysopen_3: ; scan the list of entries in fsp table
  1969 0000D454 80BE[B6940100]00    <1>         cmp     byte [esi+u.fp], 0
  1970 0000D45B 760E                <1>         jna     short sysopen_4 ; empty slot
  1971                              <1>         ;inc	si
  1972                              <1> 	; 19/08/2024
  1973 0000D45D 46                  <1> 	inc	esi
  1974 0000D45E 6683FE0A            <1>         cmp     si, 10
  1975 0000D462 72F0                <1> 	jb	short sysopen_3
  1976                              <1> toomanyf:
  1977 0000D464 B80D000000          <1> 	mov	eax, ERR_TOO_MANY_FILES ; too many open files !
  1978 0000D469 EBB3                <1> 	jmp	short sysopen_err
  1979                              <1> 
  1980                              <1> sysopen_4: 
  1981 0000D46B 80BF[5C8A0100]00    <1>         cmp     byte [edi+OF_MODE], 0 ; Scan open files table
  1982 0000D472 7609                <1> 	jna     short sysopen_5
  1983                              <1> 
  1984                              <1> 	;inc	di
  1985                              <1> 	; 19/08/2024
  1986 0000D474 47                  <1> 	inc	edi
  1987 0000D475 6683FF20            <1> 	cmp     di, OPENFILES ; max. number of open files (sytem)
  1988 0000D479 72F0                <1> 	jb	short sysopen_4
  1989 0000D47B EBE7                <1> 	jmp	short toomanyf
  1990                              <1> 
  1991                              <1> sysopen_5:
  1992                              <1> 	; 19/08/2024
  1993                              <1> 	;;;
  1994 0000D47D 50                  <1> 	push	eax ; size
  1995 0000D47E 668B4314            <1>         mov 	ax, [ebx+DirEntry_FstClusHI]
  1996 0000D482 C1E010              <1> 	shl	eax, 16
  1997 0000D485 668B431A            <1> 	mov 	ax, [ebx+DirEntry_FstClusLO]
  1998 0000D489 5B                  <1> 	pop	ebx ; size
  1999                              <1> 	; eax = First Cluster
  2000                              <1> 	; ebx = File Size
  2001 0000D48A 80FA01              <1> 	cmp	dl, 1 ; is open mode = open for write ?
  2002 0000D48D 7535                <1> 	jne	short sysopen_8
  2003                              <1> 	; check if the file is already open for write
  2004 0000D48F 57                  <1> 	push	edi
  2005 0000D490 29FF                <1> 	sub	edi, edi
  2006 0000D492 8A15[52860100]      <1> 	mov	dl, [FindFile_Drv]
  2007                              <1> sysopen_5_@:
  2008 0000D498 80BF[5C8A0100]02    <1> 	cmp 	byte [edi+OF_MODE], 2 ; open for write
  2009 0000D49F 7519                <1> 	jne	short sysopen_5_@@@
  2010 0000D4A1 3A97[3C8A0100]      <1> 	cmp	dl, [edi+OF_DRIVE]
  2011 0000D4A7 7511                <1> 	jne	short sysopen_5_@@@
  2012 0000D4A9 C1E702              <1> 	shl 	edi, 2
  2013 0000D4AC 3B87[BC890100]      <1> 	cmp	eax, [edi+OF_FCLUSTER]
  2014 0000D4B2 7503                <1> 	jne	short sysopen_5_@@
  2015 0000D4B4 5F                  <1> 	pop	edi
  2016 0000D4B5 EB90                <1> 	jmp	short sysopen_access_err
  2017                              <1> sysopen_5_@@:
  2018 0000D4B7 C1EF02              <1> 	shr 	edi, 2
  2019                              <1> 	;;;
  2020                              <1> sysopen_5_@@@:
  2021 0000D4BA 47                  <1> 	inc	edi
  2022 0000D4BB 6683FF20            <1> 	cmp	di, OPENFILES
  2023 0000D4BF 72D7                <1> 	jb	short sysopen_5_@
  2024 0000D4C1 5F                  <1> 	pop	edi
  2025 0000D4C2 B201                <1> 	mov	dl, 1 ; open for write
  2026                              <1> sysopen_8:
  2027 0000D4C4 FEC2                <1> 	inc	dl
  2028 0000D4C6 8897[5C8A0100]      <1>         mov     [edi+OF_MODE], dl
  2029 0000D4CC 8A15[52860100]      <1> 	mov	dl, [FindFile_Drv]
  2030 0000D4D2 8897[3C8A0100]      <1>         mov     [edi+OF_DRIVE], dl ; Logical DOS drive number
  2031                              <1> 	;shl	di, 2 ; *4 (dword offset)
  2032                              <1> 	; 23/07/2022
  2033 0000D4D8 C1E702              <1> 	shl	edi, 2
  2034                              <1> 
  2035                              <1> 	; 19/08/2024
  2036                              <1> 	;mov	[edi+OF_SIZE], eax ; File size in bytes
  2037 0000D4DB 899F[3C8B0100]      <1> 	mov	[edi+OF_SIZE], ebx ; File size in bytes
  2038                              <1> 
  2039                              <1> 	; 19/08/2024
  2040                              <1> 	; eax = Fist Cluster
  2041                              <1>         ;mov 	ax, [ebx+DirEntry_FstClusHI]
  2042                              <1> 	;shl	eax, 16
  2043                              <1> 	;mov 	ax, [ebx+DirEntry_FstClusLO]
  2044                              <1> 
  2045 0000D4E1 8987[BC890100]      <1> 	mov     [edi+OF_FCLUSTER], eax ; First cluster
  2046 0000D4E7 8987[3C8D0100]      <1> 	mov     [edi+OF_CCLUSTER], eax ; Current cluster
  2047                              <1> 
  2048 0000D4ED 31DB                <1>         xor	ebx, ebx
  2049 0000D4EF 899F[BC8A0100]      <1>         mov     [edi+OF_POINTER], ebx ; offset pointer (0)
  2050 0000D4F5 899F[BC8D0100]      <1>         mov     [edi+OF_CCINDEX], ebx ; cluster index (0)
  2051                              <1> 
  2052 0000D4FB A1[C4860100]        <1> 	mov	eax, [FindFile_DirFirstCluster]
  2053 0000D500 8987[BC8B0100]      <1> 	mov	[edi+OF_DIRFCLUSTER], eax
  2054                              <1> 
  2055 0000D506 A1[C8860100]        <1> 	mov	eax, [FindFile_DirCluster]
  2056 0000D50B 8987[3C8C0100]      <1> 	mov	[edi+OF_DIRCLUSTER], eax
  2057                              <1> 
  2058                              <1> 	; Get (& Save) Volume ID
  2059                              <1> 	; Important for files of removable drives
  2060                              <1> 	; (In order to check the drive has same volume/disk)
  2061 0000D511 88D7                <1> 	mov	bh, dl
  2062 0000D513 81C300010900        <1>         add	ebx, Logical_DOSDisks
  2063 0000D519 8A4303              <1>         mov	al, [ebx+LD_FATType]
  2064 0000D51C 3C01                <1>         cmp	al, 1
  2065 0000D51E 7209                <1>         jb	short sysopen_6_fs
  2066 0000D520 3C02                <1>         cmp	al, 2
  2067 0000D522 770A                <1>         ja	short sysopen_6_fat32
  2068                              <1> sysopen_6_fat:
  2069 0000D524 8B432D              <1>         mov	eax, [ebx+LD_BPB+VolumeID]
  2070 0000D527 EB08                <1>         jmp	short sysopen_7
  2071                              <1> sysopen_6_fs:
  2072 0000D529 8B4328              <1>         mov	eax, [ebx+LD_FS_VolumeSerial]
  2073 0000D52C EB03                <1>         jmp	short sysopen_7
  2074                              <1> sysopen_6_fat32:
  2075 0000D52E 8B4349              <1>         mov	eax, [ebx+LD_BPB+FAT32_VolID]
  2076                              <1> sysopen_7:
  2077 0000D531 A3[A87D0100]        <1>         mov	[Current_VolSerial], eax
  2078                              <1> 
  2079 0000D536 8987[BC8C0100]      <1> 	mov	[edi+OF_VOLUMEID], eax
  2080                              <1> 
  2081                              <1> 	; 24/10/2016
  2082                              <1> 	;shr	di, 1 ; 4/2, word offset
  2083                              <1> 	; 23/07/2022
  2084 0000D53C D1EF                <1> 	shr	edi, 1
  2085 0000D53E 668B1D[CC860100]    <1> 	mov	bx, [FindFile_DirEntryNumber]
  2086 0000D545 66899F[3C8E0100]    <1> 	mov	[edi+OF_DIRENTRY], bx
  2087                              <1> 
  2088 0000D54C 31D2                <1> 	xor	edx, edx
  2089                              <1> 	;;shr	di, 2 ; /4 (byte offset)
  2090                              <1> 	;shr	di, 1 ; 2/2, byte offset
  2091                              <1> 	; 23/07/2022
  2092 0000D54E D1EF                <1> 	shr	edi, 1
  2093 0000D550 8897[9C8A0100]      <1> 	mov	byte [edi+OF_OPENCOUNT], dl ; 0
  2094 0000D556 8897[7C8A0100]      <1> 	mov	byte [edi+OF_STATUS], dl ; 0
  2095                              <1> 
  2096 0000D55C 89FB                <1> 	mov	ebx, edi
  2097 0000D55E FEC3                <1> 	inc	bl
  2098                              <1> 
  2099 0000D560 889E[B6940100]      <1>         mov     [esi+u.fp], bl ; Open File Entry Number
  2100 0000D566 8935[AC940100]      <1> 	mov     [u.r0], esi ; move index to u.fp list
  2101                              <1> 			    ; into eax on stack
  2102                              <1> 
  2103 0000D56C E87A4E0000          <1> 	call 	reset_working_path
  2104                              <1> 
  2105 0000D571 E92AF9FFFF          <1> 	jmp	sysret
  2106                              <1> 
  2107                              <1> 
  2108                              <1> ; fsp table (original UNIX v1)
  2109                              <1> ;
  2110                              <1> ;Entry
  2111                              <1> ;          15                                      0
  2112                              <1> ;  1     |---|---------------------------------------|
  2113                              <1> ;        |r/w|       i-number of open file           |
  2114                              <1> ;        |---|---------------------------------------|
  2115                              <1> ;        |               device number               |
  2116                              <1> ;        |-------------------------------------------|
  2117                              <1> ;    (*) | offset pointer, i.e., r/w pointer to file |
  2118                              <1> ;        |-------------------------------------------|
  2119                              <1> ;        |  flag that says    | number of processes  |
  2120                              <1> ;        |   file deleted     | that have file open  |
  2121                              <1> ;        |-------------------------------------------|
  2122                              <1> ;  2     |                                           |
  2123                              <1> ;        |-------------------------------------------|
  2124                              <1> ;        |                                           |
  2125                              <1> ;        |-------------------------------------------|
  2126                              <1> ;        |                                           |
  2127                              <1> ;        |-------------------------------------------|
  2128                              <1> ;        |                                           |
  2129                              <1> ;        |-------------------------------------------|
  2130                              <1> ;  3     |                                           |
  2131                              <1> ;        |                                           |
  2132                              <1> ;
  2133                              <1> ; (*) Retro UNIX 386 v1 modification: 32 bit offset pointer
  2134                              <1> 
  2135                              <1> ; 27/03/2020 - Retro UNIX 386 v2 - FSP (OPEN FILES) TABLE
  2136                              <1> 
  2137                              <1> ;Entry
  2138                              <1> ;         15                    7                   0
  2139                              <1> ;  1     |-------------------------------------------|
  2140                              <1> ;        |   	     i-number of open file           |
  2141                              <1> ;        |-------------------------------------------|
  2142                              <1> ;        |        high word of 32 bit i-number       |
  2143                              <1> ;        |-------------------------------------------|
  2144                              <1> ;        | open mode & status  |   device number     |
  2145                              <1> ;        |-------------------------------------------|
  2146                              <1> ;        |    reserved byte    |     open count      |
  2147                              <1> ;        |-------------------------------------------|
  2148                              <1> ;        | offset pointer, i.e., r/w pointer to file |
  2149                              <1> ;        |-------------------------------------------|
  2150                              <1> ;        |   64 bit file offset pointer (bit 16-31)  |
  2151                              <1> ;        |-------------------------------------------|
  2152                              <1> ;        |   64 bit file offset pointer (bit 32-47)  |
  2153                              <1> ;        |-------------------------------------------|
  2154                              <1> ;        |   64 bit file offset pointer (bit 48-63)  |
  2155                              <1> ;        |-------------------------------------------|
  2156                              <1> ;  2     |                                           |
  2157                              <1> ;        |-------------------------------------------|
  2158                              <1> ;        |                                           |
  2159                              <1> ;        |-------------------------------------------|
  2160                              <1> ;        |                                           |
  2161                              <1> ;        |-------------------------------------------|
  2162                              <1> ;        |                                           |
  2163                              <1> ;        |-------------------------------------------|
  2164                              <1> ;        |                                           |
  2165                              <1> 
  2166                              <1> ; 23/07/2022 - TRDOS 386 Kernel v2.0.5
  2167                              <1> ; OPENFILES equ 10 (sysdefs.s)
  2168                              <1> ;; 06/10/2016
  2169                              <1> ;; Open File Parameters (trdoskx.s)
  2170                              <1> ;OF_FCLUSTER:	resd OPENFILES  ; First clusters of open files
  2171                              <1> ;OF_DRIVE:	resb OPENFILES  ; Logical DOS drive numbers of open files
  2172                              <1> ;OF_MODE:	resb OPENFILES  ; Open mode (1 = read, 2 = write, 3 = r&w)
  2173                              <1> ;OF_STATUS:	resb OPENFILES  ; (bit 0 = read, bit 1 = write)
  2174                              <1> ;OF_OPENCOUNT:	resb OPENFILES  ; Open counts of open files
  2175                              <1> ;OF_POINTER:	resd OPENFILES	; File seek/read/write pointer
  2176                              <1> ;OF_SIZE:	resd OPENFILES	; File sizes of open files (in bytes)
  2177                              <1> ;OF_DIRFCLUSTER: resd OPENFILES  ; Directory First Clusters of open files
  2178                              <1> ;OF_DIRCLUSTER:	resd OPENFILES  ; Directory (Entry) Clusters of open files
  2179                              <1> ;OF_VOLUMEID:	resd OPENFILES  ; Vol ID for removable drives of open files
  2180                              <1> ;OF_CCLUSTER:	resd OPENFILES  ; Current clusters of open files
  2181                              <1> ;OF_CCINDEX:	resd OPENFILES  ; Cluster index numbers of current clusters
  2182                              <1> ;; 24/10/2016
  2183                              <1> ;OF_DIRENTRY:	resw OPENFILES  ; Directory entry index no. in dir cluster
  2184                              <1> 
  2185                              <1> ; 17/04/2021
  2186                              <1> ; ('sysopen_device' procedure is disabled as temporary)
  2187                              <1> 
  2188                              <1> ;sysopen_device:
  2189                              <1> ;	; 15/10/2016
  2190                              <1> ;	; 08/10/2016
  2191                              <1> ;	; 07/10/2016 (TRDOS 386 = TRDOS v2.0)
  2192                              <1> ;	push	ecx ; open mode
  2193                              <1> ;	mov	ebp, esp
  2194                              <1> ;	mov	ecx, 16 ; transfer length = 16 bytes
  2195                              <1> ;	sub	esp, ecx
  2196                              <1> ;	mov	edi, esp ; destination address
  2197                              <1> ;	mov 	esi, ebx ; dev name in user's memory space
  2198                              <1> ;	call	transfer_from_user_buffer
  2199                              <1> ;	jnc	short sysopen_dev_0
  2200                              <1> ;	; eax = ERR_OUT_OF_MEMORY = 4 = ERR_MINOR_IM
  2201                              <1> ;	pop	ecx
  2202                              <1> ;sysopen_dev_err:
  2203                              <1> ;	mov	[u.r0], eax
  2204                              <1> ;	mov	[u.error], eax
  2205                              <1> ;	jmp	error
  2206                              <1> ;sysopen_dev_0:
  2207                              <1> ;	mov	esi, edi ; Device name addr (max. 16 bytes, ASCIIZ)
  2208                              <1> ;			 ; for example: "tty, TTY, /dev/tty"
  2209                              <1> ;	call	get_device_number
  2210                              <1> ;	mov	esp, ebp
  2211                              <1> ;	pop	ecx
  2212                              <1> ;	jnc	short sysopen_dev_1
  2213                              <1> ;	mov	eax, ERR_INV_DEV_NAME ; 24 ; 'invalid device name !'
  2214                              <1> ;	jmp	short sysopen_dev_err
  2215                              <1> ;sysopen_dev_1:
  2216                              <1> ;	; eax = Device Number (AL)
  2217                              <1> ;	;  cl = Open mode (2 = device read, 3 = device write)
  2218                              <1> ;       xor     ebx, ebx ; 0
  2219                              <1> ;sysopen_dev_2: ; scan the list of entries
  2220                              <1> ;       cmp     [ebx+u.fp], bl ; 0
  2221                              <1> ;       jna     short sysopen_dev_3 ; empty slot
  2222                              <1> ;       inc     bl
  2223                              <1> ;       cmp     bl, 10
  2224                              <1> ;	jb	short sysopen_dev_2
  2225                              <1> ;	;
  2226                              <1> ;	mov	eax, ERR_TOO_MANY_FILES ; too many open files !
  2227                              <1> ;	jmp	short sysopen_dev_err
  2228                              <1> ;sysopen_dev_3:
  2229                              <1> ;	mov 	[u.r0], ebx ; File/Device index/handle/descriptor
  2230                              <1> ;	; eax = device number (entry offset)
  2231                              <1> ;	mov	ch, [eax+DEV_ACCESS] ; bit 0 = accessable by users
  2232                              <1> ;				     ; bit 1 = read access perm
  2233                              <1> ;				     ; bit 2 = write access perm
  2234                              <1> ;				     ; bit 3 = IOCTL permit to users
  2235                              <1> ;				     ; bit 4 = block device if set
  2236                              <1> ;				     ; bit 5 = 16 bit or 1024 byte
  2237                              <1> ;				     ; bit 6 = 32 bit or 2048 byte
  2238                              <1> ;				     ; bit 7 = installable device drv
  2239                              <1> ;	test 	ch, 1 ; accessable by normal users (except root)
  2240                              <1> ;	jnz	short sysopen_dev_4 ; yes, permission has been given
  2241                              <1> ;	cmp	byte [u.uid], 0 ; root?
  2242                              <1> ;	jna	short sysopen_dev_4 ; superuser can open all devices
  2243                              <1> ;sysopen_dev_perm_err:
  2244                              <1> ;	mov	eax, ERR_DEV_ACCESS  ; 11 = 'permission denied !'
  2245                              <1> ;	jmp	short sysopen_dev_err
  2246                              <1> ;sysopen_dev_4:
  2247                              <1> ;	shr	ch, 1 ; result: 1 = read, 2 = write, 3 = r & w
  2248                              <1> ;	dec	cl  ; result: 1 = read, 2 = write
  2249                              <1> ;	test	cl, ch
  2250                              <1> ;	jz	short sysopen_dev_perm_err
  2251                              <1> ;
  2252                              <1> ;	shl	ch, 1 ; bit 0 = 0
  2253                              <1> ;	; eax = device number (entry offset)
  2254                              <1> ;	call	device_open
  2255                              <1> ;	jc	short sysopen_dev_perm_err
  2256                              <1> ;
  2257                              <1> ;	; eax = device number (entry offset)
  2258                              <1> ;	or	al, 80h ; set device bit (set bit 7 to 1)
  2259                              <1> ;	mov	ebx, [u.r0]
  2260                              <1> ;	mov	[ebx+u.fp], al	; bit 7 (=1) points to device
  2261                              <1> ;
  2262                              <1> ;	jmp	sysret
  2263                              <1> 
  2264                              <1> sysmkdir: ; < make directory >
  2265                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
  2266                              <1> 	; 15/10/2016
  2267                              <1> 	; 10/10/2016 (TRDOS 386 = TRDOS v2.0)
  2268                              <1> 	;	     -derived from INT_21H.ASM-
  2269                              <1> 	;            ("loc_INT21h_create_file")
  2270                              <1>         ; 	10/07/2011 (12/03/2011)
  2271                              <1>         ;	INT 21h Function AH = 3Ch
  2272                              <1>         ;	Create File
  2273                              <1>         ;	INPUT
  2274                              <1>         ;	   CX = Attributes
  2275                              <1>         ;          DS:DX= Address of zero terminaned path name
  2276                              <1>         ;
  2277                              <1>         ;
  2278                              <1> 	; 14/05/2015 (Retro UNIX 386 v1 - Beginning)
  2279                              <1> 	; 27/05/2013 - 02/08/2013 (Retro UNIX 8086 v1)
  2280                              <1> 	;
  2281                              <1> 	; 'sysmkdir' creates an empty directory whose name is
  2282                              <1> 	; pointed to by arg 1. The mode of the directory is arg 2.
  2283                              <1> 	; The special entries '.' and '..' are not present.
  2284                              <1> 	; Errors are indicated if the directory already exists or
  2285                              <1> 	; user is not the super user. 
  2286                              <1> 	;
  2287                              <1> 	; Calling sequence:
  2288                              <1> 	;	sysmkdir; name; mode
  2289                              <1> 	; Arguments:
  2290                              <1> 	;	name - points to the name of the directory
  2291                              <1> 	;	mode - mode of the directory
  2292                              <1> 	; Inputs: (arguments)
  2293                              <1> 	; Outputs: -
  2294                              <1> 	;    (sets 'directory' flag to 1; 
  2295                              <1> 	;    'set user id on execution' and 'executable' flags to 0)
  2296                              <1> 	; ...............................................................
  2297                              <1> 	;
  2298                              <1> 	; Retro UNIX 8086 v1 modification: 
  2299                              <1> 	;       'sysmkdir' system call has two arguments; so,
  2300                              <1> 	;	* 1st argument, name is pointed to by BX register
  2301                              <1> 	;	* 2nd argument, mode is in CX register
  2302                              <1> 	;
  2303                              <1> 	; TRDOS 386 (10/10/2016)
  2304                              <1> 	;
  2305                              <1>         ; INPUT ->
  2306                              <1>         ;	   CL = Directory Attributes
  2307                              <1> 	;     	      bit 0 (1) - Read only file/dir (R)
  2308                              <1> 	;             bit 1 (1) - Hidden file/dir (H)
  2309                              <1>         ;             bit 2 (1) - System file/dir (R)
  2310                              <1> 	;             bit 3 (1) - Volume label/name (V)
  2311                              <1>         ;             bit 4 (1) - Subdirectory (D)
  2312                              <1> 	;	      bit 5 (1) - File/Dir has been archived (A)
  2313                              <1> 	;	   CX = 0 -> create normal directory
  2314                              <1>         ;          EBX = Pointer to directory name (ASCIIZ) -path-
  2315                              <1> 	;
  2316                              <1> 	; OUTPUT ->
  2317                              <1> 	;          eax = First cluster of the new directory
  2318                              <1> 	;          cf = 1 -> Error code in AL
  2319                              <1> 	;
  2320                              <1> 	; Modified Registers: EAX (at the return of system call)
  2321                              <1> 	;
  2322                              <1> 	; Note: If the file or directory is existing
  2323                              <1> 	;	an access error will be returned.
  2324                              <1> 
  2325 0000D576 6621C9              <1> 	and	cx, cx ; if cx = 0 -> create a normal subdir
  2326 0000D579 7414                <1> 	jz	short sysmkdir_1
  2327                              <1> 
  2328 0000D57B F6C110              <1> 	test	cl, 10h ; if dir flags set, also use other flags
  2329                              <1> 	;jnz	sysmkdir_0 ; jump to head of 'syscreat'
  2330                              <1> 	; 23/07/2022
  2331 0000D57E 7405                <1> 	jz	short sysmkdir_invf
  2332                              <1> sysmkdir_3:
  2333 0000D580 E98FFDFFFF          <1> 	jmp	sysmkdir_0
  2334                              <1> 
  2335                              <1> sysmkdir_invf:
  2336                              <1> 	; CX has wrong flags
  2337 0000D585 B817000000          <1> 	mov 	eax, ERR_INV_FLAGS
  2338 0000D58A E96CFEFFFF          <1> 	jmp	sysopen_dev_err
  2339                              <1> 
  2340                              <1> sysmkdir_1:
  2341 0000D58F B110                <1> 	mov	cl, 10h ; set subdir flag and reset other flags
  2342                              <1> 	;jmp	sysmkdir_0
  2343                              <1> 	; 23/07/2022
  2344 0000D591 EBED                <1> 	jmp	short sysmkdir_3 ; jump to head of 'syscreat'
  2345                              <1> sysmkdir_2: 
  2346                              <1> 	; jump from 'syscreat' ; from 'syscreat_1'
  2347                              <1> 	;  CL = Directory attributes/flags
  2348 0000D593 BE[94860100]        <1> 	mov	esi, FindFile_Name 
  2349 0000D598 E8B7D7FFFF          <1> 	call	make_sub_directory
  2350                              <1> 	;jc	sysopen_err       ; NOTE: Old type (TRDOS 8086)
  2351                              <1> 				  ; error codes must be modified
  2352                              <1> 				  ; for next TRDOS 386 versions
  2353                              <1> 				  ; (10/10/2016)
  2354                              <1> 				  ; Old (MSDOS type)
  2355                              <1> 				  ; error codes (2011):
  2356                              <1> 				  ;  2 = file not found
  2357                              <1> 				  ;  3 = directory not found
  2358                              <1> 				  ;  5 = access denied
  2359                              <1> 				  ; 12 = no more files
  2360                              <1> 			          ; 19 = disk write protected
  2361                              <1> 				  ; 39 = insufficient disk space
  2362                              <1> 				  ; 'sysdefs.s' ; 10/10/2016
  2363                              <1> 	; 23/07/2022
  2364 0000D59D 7305                <1> 	jnc	short sysmkdir_4
  2365 0000D59F E97AFEFFFF          <1> 	jmp	sysopen_err
  2366                              <1> 
  2367                              <1> sysmkdir_4:	
  2368 0000D5A4 A3[AC940100]        <1> 	mov	[u.r0], eax ; New sub dir's first cluster
  2369 0000D5A9 E83D4E0000          <1>         call 	reset_working_path
  2370 0000D5AE E9EDF8FFFF          <1> 	jmp	sysret
  2371                              <1> 
  2372                              <1> sysclose: ;<close file>
  2373                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
  2374                              <1> 	; 06/10/2016 (TRDOS 386 = TRDOS v2.0)
  2375                              <1> 	;
  2376                              <1> 	; 14/05/2015 (Retro UNIX 386 v1 - Beginning)
  2377                              <1> 	; 22/05/2013 - 26/05/2013 (Retro UNIX 8086 v1)
  2378                              <1> 	;
  2379                              <1> 	; 'sysclose', given a file descriptor in 'u.r0', closes the
  2380                              <1> 	; associated file. The file descriptor (index to 'u.fp' list)
  2381                              <1> 	; is put in r1 and 'fclose' is called.
  2382                              <1> 	;
  2383                              <1> 	; Calling sequence:
  2384                              <1> 	;	sysclose
  2385                              <1> 	; Arguments:
  2386                              <1> 	;	-  
  2387                              <1> 	; Inputs: *u.r0 - file descriptor
  2388                              <1> 	; Outputs: -
  2389                              <1> 	; ...............................................................
  2390                              <1> 	;
  2391                              <1> 	; Retro UNIX 8086 v1 modification:
  2392                              <1> 	;	 The user/application program puts file descriptor
  2393                              <1> 	;        in BX register as 'sysclose' system call argument.
  2394                              <1> 	; 	 (argument transfer method 1)
  2395                              <1> 
  2396                              <1> 	; TRDOS 386 (06/10/2016)
  2397                              <1> 	;
  2398                              <1>         ; INPUT ->
  2399                              <1>         ;	   EBX = File Handle/Number (file index) (AL)
  2400                              <1> 	; OUTPUT ->
  2401                              <1> 	;          cf = 0 -> EAX = 0
  2402                              <1> 	;          cf = 1 -> Error code in EAX (ERR_FILE_NOT_OPEN)
  2403                              <1> 	;
  2404                              <1> 	; Modified Registers: EAX (at the return of system call)
  2405                              <1> 	;
  2406                              <1> 
  2407 0000D5B3 89D8                <1> 	mov 	eax, ebx
  2408 0000D5B5 31DB                <1> 	xor	ebx, ebx
  2409 0000D5B7 891D[AC940100]      <1> 	mov	[u.r0], ebx ; 0  ; return value of EAX
  2410 0000D5BD E82E310000          <1> 	call 	fclose
  2411                              <1> 	;jnc	sysret
  2412                              <1> 	; 23/07/2022
  2413 0000D5C2 7205                <1> 	jc	short sysclose_err
  2414 0000D5C4 E9D7F8FFFF          <1> 	jmp	sysret
  2415                              <1> sysclose_err:
  2416                              <1> 	; 24/04/2025
  2417                              <1> seektell_err:
  2418                              <1> device_rw_err:
  2419 0000D5C9 B80A000000          <1> 	mov	eax, ERR_FILE_NOT_OPEN ; file not open !
  2420 0000D5CE A3[18950100]        <1> 	mov	[u.error], eax ;
  2421 0000D5D3 A3[AC940100]        <1> 	mov	[u.r0], eax ; ! invalid handle !
  2422 0000D5D8 E9A3F8FFFF          <1> 	jmp	error
  2423                              <1> 
  2424                              <1> sysread: ; < read from file >
  2425                              <1> 	; 27/09/2024
  2426                              <1> 	; 18/09/2024
  2427                              <1> 	; 03/09/2024 (TRDOS v2.0.9)
  2428                              <1> 	; 11/10/2016 (TRDOS 386 = TRDOS v2.0)
  2429                              <1> 	;	     -derived from INT_21H.ASM-
  2430                              <1> 	;            ("loc_INT21h_read_file")
  2431                              <1>         ; 	13/03/2011 (05/03/2011)
  2432                              <1>         ;	INT 21h Function AH = 3Fh
  2433                              <1>         ;	Read from a File
  2434                              <1>         ;	INPUT
  2435                              <1> 	;	   BX = File Handle
  2436                              <1>         ;	   CX = Number of bytes to read
  2437                              <1>         ;          DS:DX= Buffer address
  2438                              <1>         ;
  2439                              <1> 	; Note: TRDOS 386 'sysread' has been derived from 
  2440                              <1> 	;	Retro UNIX 386 v1 'sysread', except a few 
  2441                              <1> 	;	code modifications.
  2442                              <1> 	;
  2443                              <1> 	; 13/05/2015 (Retro UNIX 386 v1)
  2444                              <1> 	; 11/05/2015 (Retro UNIX 386 v1 - Beginning)
  2445                              <1> 	; 23/05/2013 (Retro UNIX 8086 v1)
  2446                              <1> 	;
  2447                              <1> 	; 'sysread' is given a buffer to read into and the number of
  2448                              <1> 	; characters to be read. If finds the file from the file
  2449                              <1> 	; descriptor located in *u.r0 (r0). This file descriptor
  2450                              <1> 	; is returned from a successful open call (sysopen).
  2451                              <1> 	; The i-number of file is obtained via 'rw1' and the data
  2452                              <1> 	; is read into core via 'readi'.
  2453                              <1> 	;
  2454                              <1> 	; Calling sequence:
  2455                              <1> 	;	sysread; buffer; nchars
  2456                              <1> 	; Arguments:
  2457                              <1> 	;	buffer - location of contiguous bytes where 
  2458                              <1> 	;		 input will be placed.
  2459                              <1> 	;	nchars - number of bytes or characters to be read.
  2460                              <1> 	; Inputs: *u.r0 - file descriptor (& arguments)
  2461                              <1> 	; Outputs: *u.r0 - number of bytes read.
  2462                              <1> 	; ...............................................................
  2463                              <1> 	;				
  2464                              <1> 	; Retro UNIX 8086 v1 modification: 
  2465                              <1> 	;       'sysread' system call has three arguments; so,
  2466                              <1> 	;	* 1st argument, file descriptor is in BX register
  2467                              <1> 	;	* 2nd argument, buffer address/offset in CX register
  2468                              <1> 	;	* 3rd argument, number of bytes is in DX register
  2469                              <1> 	;
  2470                              <1> 	;	AX register (will be restored via 'u.r0') will return
  2471                              <1> 	;	to the user with number of bytes read. 
  2472                              <1> 	;
  2473                              <1> 	; TRDOS 386 (05/10/2016)
  2474                              <1> 	;
  2475                              <1>         ; INPUT ->
  2476                              <1>         ;	   EBX = File handle (descriptor/index)
  2477                              <1> 	;	   ECX = Buffer address
  2478                              <1>         ;          EDX = Number of bytes
  2479                              <1> 	; OUTPUT ->
  2480                              <1> 	;          EAX = Number of bytes have been read
  2481                              <1> 	;          cf = 1 -> Error code in AL
  2482                              <1> 	;
  2483                              <1> 	; Modified Registers: EAX (at the return of system call)
  2484                              <1> 	;
  2485                              <1> 
  2486                              <1> 	; EBX = File descriptor
  2487 0000D5DD E853310000          <1> 	call	getf1 
  2488 0000D5E2 723A                <1> 	jc	short device_read ; read data from device
  2489                              <1> 
  2490                              <1> 	; EAX = First cluster of the file
  2491                              <1> 
  2492 0000D5E4 E837000000          <1> 	call	rw1	; 03/09/2024 (major modification)
  2493 0000D5E9 730A                <1> 	jnc	short sysread_0
  2494                              <1> 
  2495                              <1> sysrw_err:	; 03/09/2024
  2496 0000D5EB A3[AC940100]        <1> 	mov	[u.r0], eax ; error code
  2497 0000D5F0 E98BF8FFFF          <1> 	jmp	error
  2498                              <1> 	 
  2499                              <1> sysread_0:
  2500 0000D5F5 E8FD340000          <1> 	call	readi
  2501 0000D5FA EB13                <1> 	jmp	short rw0
  2502                              <1> 
  2503                              <1> syswrite: ; < write to file >
  2504                              <1> 	; 27/09/2024
  2505                              <1> 	; 18/09/2024
  2506                              <1> 	; 03/09/2024
  2507                              <1> 	; 25/08/2024 - TRDOS 386 v2.0.9
  2508                              <1> 	; 23/10/2016
  2509                              <1> 	; 11/10/2016 (TRDOS 386 = TRDOS v2.0)
  2510                              <1> 	;	     -derived from INT_21H.ASM-
  2511                              <1> 	;            ("loc_INT21h_write_file")
  2512                              <1>         ; 	13/03/2011 (05/03/2011)
  2513                              <1>         ;	INT 21h Function AH = 40h
  2514                              <1>         ;	Write to a File
  2515                              <1>         ;	INPUT
  2516                              <1> 	;	   BX = File Handle
  2517                              <1>         ;	   CX = Number of bytes to write
  2518                              <1>         ;          DS:DX= Buffer address
  2519                              <1>         ;
  2520                              <1> 	; Note: TRDOS 386 'sysrwrite' has been derived from
  2521                              <1> 	;	Retro UNIX 386 v1 'syswrite', except a few
  2522                              <1> 	;	code modifications.
  2523                              <1> 	;
  2524                              <1> 
  2525                              <1> 	; 13/05/2015 (Retro UNIX 386 v1)
  2526                              <1> 	; 11/05/2015 (Retro UNIX 386 v1 - Beginning)
  2527                              <1> 	; 23/05/2013 (Retro UNIX 8086 v1)
  2528                              <1> 	;
  2529                              <1> 	; 'syswrite' is given a buffer to write onto an output file
  2530                              <1> 	; and the number of characters to write. If finds the file
  2531                              <1> 	; from the file descriptor located in *u.r0 (r0). This file
  2532                              <1> 	; descriptor is returned from a successful open or create call
  2533                              <1> 	; (sysopen or syscreat). The i-number of file is obtained via
  2534                              <1> 	; 'rw1' and buffer is written on the output file via 'write'.
  2535                              <1> 	;
  2536                              <1> 	; Calling sequence:
  2537                              <1> 	;	syswrite; buffer; nchars
  2538                              <1> 	; Arguments:
  2539                              <1> 	;	buffer - location of contiguous bytes to be writtten.
  2540                              <1> 	;	nchars - number of characters to be written.
  2541                              <1> 	; Inputs: *u.r0 - file descriptor (& arguments)
  2542                              <1> 	; Outputs: *u.r0 - number of bytes written.
  2543                              <1> 	; ...............................................................
  2544                              <1> 	;
  2545                              <1> 	; Retro UNIX 8086 v1 modification: 
  2546                              <1> 	;       'syswrite' system call has three arguments; so,
  2547                              <1> 	;	* 1st argument, file descriptor is in BX register
  2548                              <1> 	;	* 2nd argument, buffer address/offset in CX register
  2549                              <1> 	;	* 3rd argument, number of bytes is in DX register
  2550                              <1> 	;
  2551                              <1> 	;	AX register (will be restored via 'u.r0') will return
  2552                              <1> 	;	to the user with number of bytes written. 
  2553                              <1> 	;
  2554                              <1> 	; INPUT ->
  2555                              <1>         ;	   EBX = File handle (descriptor/index)
  2556                              <1> 	;	   ECX = Buffer address
  2557                              <1>         ;          EDX = Number of bytes
  2558                              <1> 	; OUTPUT ->
  2559                              <1> 	;          EAX = Number of bytes have been written
  2560                              <1> 	;          cf = 1 -> Error code in AL
  2561                              <1> 	;
  2562                              <1> 	; Modified Registers: EAX (at the return of system call)
  2563                              <1> 	;
  2564                              <1> 
  2565                              <1> 	; EBX = File descriptor
  2566 0000D5FC E834310000          <1> 	call	getf1
  2567 0000D601 721B                <1> 	jc	short device_write ; write data to device
  2568                              <1> 	; EAX = First cluster of the file
  2569                              <1> 	; EBX = File number (Open file number) ; 23/10/2016
  2570                              <1> 
  2571 0000D603 E818000000          <1> 	call	rw1	; 03/09/2024 (major modification)
  2572                              <1> 	; 03/09/2024
  2573 0000D608 72E1                <1> 	jc	short sysrw_err
  2574                              <1> 
  2575                              <1> 	; 25/08/2024 (*)
  2576                              <1> 	;jnc	short syswrite_0
  2577                              <1> 	;mov	[u.r0], eax ; error code
  2578                              <1> 	;jmp	error
  2579                              <1> 
  2580                              <1> 	; 25/08/2024 - TRDOS 386 v2.0.9 (bugfix) (*)
  2581                              <1> 	; (if eax = 0, lets add a cluster at 'mget_w_0')
  2582                              <1> 	; ('mget_w' and 'add_new_cluster' procs are modified)
  2583                              <1> 
  2584                              <1> syswrite_0:
  2585 0000D60A E8033C0000          <1> 	call	writei	; 24/08/2024 ('mget_w' modification)
  2586                              <1> rw0: ; 1:
  2587 0000D60F A1[D8940100]        <1>         mov	eax, [u.nread]
  2588 0000D614 A3[AC940100]        <1> 	mov	[u.r0], eax
  2589 0000D619 E982F8FFFF          <1> 	jmp	sysret
  2590                              <1> 
  2591                              <1> 	; 17/04/2021 (temporary)
  2592                              <1> device_write:
  2593                              <1> device_read:
  2594                              <1> 	; 26/09/2024
  2595                              <1> 	; 18/09/2024 - TRDOS 386 v2.0.9
  2596                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
  2597                              <1> 	;	(temporary modifications)
  2598                              <1> 	;
  2599                              <1> 	; 11/10/2016 (TRDOS 386 = TRDOS v2.0)
  2600                              <1> 	; cl = DEV_OPENMODE ; open mode
  2601                              <1> 	; ch = DEV_ACCESS   ; access flags
  2602                              <1> 	; al = DEV_DRIVER   ; device number (eax)
  2603                              <1> 
  2604                              <1> 	; 24/04/2025 - TRDOS 386 v2.0.10
  2605                              <1> 	;; 18/09/2024 (temporary)
  2606                              <1> 	;call	rw2 ; file not open ; cf = 1
  2607                              <1> 	;;jmp	error
  2608                              <1> 	;; 26/09/2024
  2609                              <1> 	;jmp	short sysrw_err
  2610                              <1> 	; 24/04/2025
  2611 0000D61E EBA9                <1> 	jmp	short device_rw_err
  2612                              <1> 
  2613                              <1> 
  2614                              <1> ;	test	cl, 1 ; 1 = read, 2 = write, 3 = read&write
  2615                              <1> ;	jz	short rw3
  2616                              <1> ;
  2617                              <1> ;	mov	ebx, eax
  2618                              <1> ;	shl	bx, 2 ; *4
  2619                              <1> ;
  2620                              <1> ;	test	ch, 80h ; bit 7, installable device driver flag
  2621                              <1> ;	jz	short d_read_2 ; Kernel device
  2622                              <1> ;	; installable device
  2623                              <1> ;d_read_1:
  2624                              <1> ;       jmp	dword [ebx+IDEV_RADDR-4]
  2625                              <1> ;d_read_2:
  2626                              <1> ;	jmp	dword [ebx+KDEV_RADDR-4]
  2627                              <1> 
  2628                              <1> ;device_write:
  2629                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
  2630                              <1> 	;	(temporary modifications)
  2631                              <1> 	;
  2632                              <1> 	; 11/10/2016 (TRDOS 386 = TRDOS v2.0)
  2633                              <1> 	; cl = DEV_OPENMODE ; open mode
  2634                              <1> 	; ch = DEV_ACCESS   ; access flags
  2635                              <1> 	; al = DEV_DRIVER   ; device number (eax)
  2636                              <1> 
  2637                              <1> 	; 17/04/2021 (temporary)
  2638                              <1> 	;jmp	short rw2 ; file not open
  2639                              <1> 
  2640                              <1> ;	test	cl, 2 ; 1 = read, 2 = write, 3 = read&write
  2641                              <1> ;	jz	short rw3
  2642                              <1> ;
  2643                              <1> ;	mov	ebx, eax
  2644                              <1> ;	shl	bx, 2 ; *4
  2645                              <1> ;
  2646                              <1> ;	test	ch, 80h ; bit 7, installable device driver flag
  2647                              <1> ;	jz	short d_write_2 ; Kernel device
  2648                              <1> ;	; installable device
  2649                              <1> ;d_write_1:
  2650                              <1> ;       jmp	dword [ebx+IDEV_WADDR-4]
  2651                              <1> ;d_write_2:
  2652                              <1> ;	jmp	dword [ebx+KDEV_WADDR-4]
  2653                              <1> 
  2654                              <1> rw1:
  2655                              <1> 	; 27/09/2024	
  2656                              <1> 	; 03/09/2024 (TRDOS 386 v2.0.9)
  2657                              <1> 	; 17/04/2021 (TRDOS 386 v2.0.4)
  2658                              <1> 	; 11/10/2016 (TRDOS 386 = TRDOS v2.0)
  2659                              <1> 	; 14/05/2015 (Retro UNIX 386 v1)
  2660                              <1> 	; 11/05/2015 (Retro UNIX 386 v1 - Beginning)
  2661                              <1> 	; 23/05/2013 - 24/05/2013 (Retro UNIX 8086 v1)
  2662                              <1> 	; System call registers: ebx, ecx, edx (through 'sysenter')
  2663                              <1> 	;
  2664                              <1> 	; EBX = File descriptor
  2665                              <1> 	;call	getf1 ; calling point in 'getf' from 'rw1'
  2666                              <1> 	;jc	short device_rw ; read/write data from/to device
  2667                              <1> 	; EAX = First cluster of the file
  2668                              <1> 
  2669                              <1> 	; 03/09/2024
  2670 0000D620 09C0                <1> 	or	eax, eax
  2671 0000D622 7421                <1> 	jz	short rw7 ; eax = 0 -> empty file (OK for now)
  2672                              <1> 
  2673 0000D624 83F802              <1> 	cmp 	eax, 2	  ; is it valid cluster number ?
  2674                              <1> 	;jb	short rw2
  2675                              <1> 	; 03/09/2024
  2676 0000D627 7307                <1> 	jnb	short rw6 ; yes, check upper limit
  2677                              <1> 
  2678                              <1> 	;;;
  2679                              <1> 	; eax = 1 -> invalid cluster number
  2680                              <1> rw5:
  2681 0000D629 B823000000          <1> 	mov	eax, ERR_CLUSTER ; 35 ; 'cluster not available !'
  2682 0000D62E EB2C                <1> 	jmp	short rw4 ; cf = 1
  2683                              <1> 
  2684                              <1> rw6:	; 03/09/2024 (check cluster number is valid or not)
  2685 0000D630 53                  <1> 	push	ebx
  2686                              <1> 	; ebx <= OPENFILES-1 ; 0-31
  2687 0000D631 8ABB[3C8A0100]      <1> 	mov	bh, [ebx+OF_DRIVE] ; drive number * 256
  2688 0000D637 28DB                <1> 	sub	bl, bl ; 27/09/2024
  2689 0000D639 8B9B78010900        <1> 	mov	ebx, [ebx+Logical_DOSDisks+LD_Clusters]
  2690 0000D63F 43                  <1> 	inc	ebx ; cluster count + 1 = last cluster number
  2691 0000D640 39C3                <1> 	cmp	ebx, eax
  2692 0000D642 5B                  <1> 	pop	ebx
  2693 0000D643 72E4                <1> 	jb	short rw5
  2694                              <1> rw7:
  2695                              <1> 	;;;
  2696                              <1> 
  2697 0000D645 890D[D0940100]      <1> 	mov	[u.base], ecx 	; buffer address/offset 
  2698                              <1> 				;(in the user's virtual memory space)
  2699 0000D64B 8915[D4940100]      <1> 	mov	[u.count], edx 
  2700 0000D651 C705[18950100]0000- <1>         mov	dword [u.error], 0 ; reset the last error code
  2700 0000D659 0000                <1>
  2701 0000D65B C3                  <1> 	retn
  2702                              <1> 
  2703                              <1> ; 24/04/2025 - TRDOS 386 v2.0.10
  2704                              <1> %if 0
  2705                              <1> 
  2706                              <1> rw2:
  2707                              <1> 	mov	eax, ERR_FILE_NOT_OPEN ; file not open !
  2708                              <1> 	;mov	dword [u.error], eax
  2709                              <1> 	;retn
  2710                              <1> 
  2711                              <1> %endif
  2712                              <1> 	; 03/09/2024
  2713                              <1> 	; 17/04/2021
  2714                              <1> 	;jmp	short rw4
  2715                              <1> 
  2716                              <1> 	; 03/09/2024
  2717                              <1> rw3: 
  2718                              <1> ;	mov	eax, ERR_FILE_ACCESS ; permission denied !
  2719                              <1> ;	stc
  2720                              <1> 
  2721                              <1> rw4:	; 17/04/2021
  2722 0000D65C A3[18950100]        <1> 	mov	dword [u.error], eax
  2723 0000D661 C3                  <1> 	retn
  2724                              <1> 
  2725                              <1> systimer:
  2726                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
  2727                              <1> 	; 02/01/2017
  2728                              <1> 	; 21/12/2016
  2729                              <1> 	; 19/12/2016
  2730                              <1> 	; 10/12/2016 (callback)
  2731                              <1> 	; 10/06/2016
  2732                              <1> 	; 07/06/2016
  2733                              <1> 	; 06/06/2016
  2734                              <1> 	; 21/05/2016
  2735                              <1> 	; 19/05/2016
  2736                              <1> 	; 18/05/2016 - TRDOS 386 (TRDOS v2.0)
  2737                              <1> 	; (TRDOS 386 feature only!)
  2738                              <1> 	;
  2739                              <1> 	; (start or stop timer event(s))
  2740                              <1> 	;
  2741                              <1> 	; INPUT ->
  2742                              <1> 	;	BL = Signal return byte (response byte)
  2743                              <1> 	;	     (Any requested value between 0 and 255)
  2744                              <1> 	;	     (Kernel will put it at the requested address)
  2745                              <1> 	;	BH = Time count unit
  2746                              <1> 	;	     0 = Stop timer event
  2747                              <1> 	;	     1 = 18.2 ticks per second
  2748                              <1> 	;	     2 = 10 milliseconds
  2749                              <1> 	;	     3 = 1 second (for real time clock interrupt)
  2750                              <1> 	;	     4 = time/tick count in current time count unit
  2751                              <1> 	;	    // 10/12/2016
  2752                              <1> 	;	    80h = Stop timer event (callback method)
  2753                              <1> 	;	    81h = 18.2 ticks per second, callback method
  2754                              <1> 	;	    82h = 10 milliseconds, callback method
  2755                              <1> 	;	    83h = 1 second (for RTC int), callback method
  2756                              <1> 	;	    84h = current time count unit, callback method
  2757                              <1> 	;
  2758                              <1> 	;	    Note: Only 03h or 83h will set real time clock
  2759                              <1> 	;		  (RTC) events (Others are for PIT events)!
  2760                              <1> 	;	
  2761                              <1> 	;	NOTE: If callback (user service) method is used,
  2762                              <1> 	;	    EDX will point to the return address (of service
  2763                              <1> 	;	    procedure) in user's space instead of signal 
  2764                              <1> 	;	    response byte address. (TRDOS 386 kernel will
  2765                              <1> 	;	    direct the cpu to that address -in user's space-
  2766                              <1> 	;	    at the return of system call or interrupt 
  2767                              <1> 	;	    just after the adjusted count/time is elapsed.)
  2768                              <1> 	;	    User's sevice routine must be ended with a
  2769                              <1> 	;	    'iret'. Normal return addresses from system 
  2770                              <1> 	;	    calls or and interrupts will be kept same except
  2771                              <1> 	;	    the timer returns.
  2772                              <1>      	;
  2773                              <1> 	;	BH = 0 -> Stop timer event
  2774                              <1> 	;	BL = Timer event number (1 to 255) if BH = 0
  2775                              <1> 	;	     If BL = 0, all timer events (which are belongs
  2776                              <1> 	;	      to running process) will be stopped
  2777                              <1> 	;	ECX = Time/Tick count (depending on time count unit)
  2778                              <1> 	;	EDX = Signal return (Response) byte address
  2779                              <1> 	;	      (virtual address in user's memory space)
  2780                              <1> 	; OUTPUT ->
  2781                              <1> 	;	AL = Timer event number	(1 to 255) (max. value = 16)
  2782                              <1> 	;	IF BH Input = 0 & CF = 0 & AL = 0 -> 
  2783                              <1> 	;	     timer event(s) has/have been stopped/finished
  2784                              <1> 	;	CF = 1 & AL = 0 -> no timer setting space to set
  2785                              <1> 	;	CF = 1 & AL > 0 -> timer count unit is not usable
  2786                              <1> 	;
  2787                              <1> 	;	NOTE: To modify a time count for a user function,
  2788                              <1> 	;	      at first, current timer event must be stopped
  2789                              <1> 	;	      then a new timer event (which is related with
  2790                              <1> 	;	      same user function) must be started.
  2791                              <1> 	;		
  2792                              <1> 	;	      Signal return (response) byte may be used for
  2793                              <1> 	;	      several purposes. Kernel will put this value
  2794                              <1> 	;	      to requested address during timer interrupt,
  2795                              <1> 	;	      program/user can check this value to understand
  2796                              <1> 	;	      which event has been occurred and what is changed.
  2797                              <1> 	;	      (Multi timer events can share same signal address)
  2798                              <1> 	;	
  2799                              <1> 	;	NOTE: If the process is running while the time count
  2800                              <1> 	;	      is reached, kernel will put signal return (response)
  2801                              <1> 	;	      byte value at requested address during timer
  2802                              <1> 	;	      interrupt and the process will continue to run.
  2803                              <1> 	;	      Program/process must call (jump to) it's timer event
  2804                              <1> 	;	      function as required, for checking the timer event
  2805                              <1> 	;	      status via signal return (response) byte address.
  2806                              <1> 	;
  2807                              <1> 	;	      If the process is not running (waiting or sleeping
  2808                              <1> 	;	      or released) while the time count is reached,
  2809                              <1> 	;	      it is restarted from where it left, to ensure
  2810                              <1> 	;	      proper multi media (video, audio, clock, timer)
  2811                              <1> 	;	      functionality.
  2812                              <1> 	;
  2813                              <1> 	;	      (It is better to use 'syswait' or 'syssleep',
  2814                              <1> 	;	      or 'sysrele' system call just after the timer
  2815                              <1> 	;	      function. Otherwise, timer events may block other
  2816                              <1> 	;	      processes which are not using timer events.)
  2817                              <1> 	;
  2818                              <1> 	; Timer Event Structure: (max. 16 timer events, 16*16 bytes)
  2819                              <1> 	;       Owner:	        resb 1 ; 0 = free
  2820                              <1> 	;		  	       ;>0 = process number (u.uno)
  2821                              <1> 	;	Calback:	resb 1 ; 1 = callback, 0 = response byte
  2822                              <1> 	;	Interrupt:      resb 1 ; 0 = Timer interrupt (or none)
  2823                              <1> 	;		   	       ; 1 = Real Time Clock interrupt
  2824                              <1> 	;	Response:       resb 1 ; 0 to 255, signal return value
  2825                              <1> 	;	Count Limit:	resd 1 ; count of ticks (total/set)
  2826                              <1> 	;	Current Count: 	resd 1 ; count of ticks (current)
  2827                              <1> 	;	Response Addr:  resd 1 ; response byte (pointer) address
  2828                              <1> 	;
  2829                              <1> 
  2830                              <1> 	; 19/12/2016 (timer callback)
  2831 0000D662 C605[948E0100]00    <1> 	mov	byte [tcallback], 0
  2832 0000D669 C605[958E0100]00    <1> 	mov	byte [trtc], 0
  2833 0000D670 C705[20950100]0000- <1> 	mov	dword [u.tcb], 0 ; this is not necessary...
  2833 0000D678 0000                <1>
  2834                              <1> 
  2835 0000D67A 80FF80              <1> 	cmp	bh, 80h
  2836 0000D67D 7224                <1> 	jb	short systimer_cb2
  2837 0000D67F 7704                <1> 	ja	short systimer_cb0
  2838                              <1> 
  2839 0000D681 31D2                <1> 	xor	edx, edx ; 0, reset callback address
  2840 0000D683 EB0B                <1> 	jmp	short systimer_cb1
  2841                              <1> 
  2842                              <1> systimer_cb0:
  2843 0000D685 80FF84              <1> 	cmp	bh, 84h	
  2844 0000D688 7764                <1> 	ja	short systimer_5 ;  undefined, error
  2845                              <1> 
  2846                              <1> 	;mov	byte [tcallback], 1 ; 19/12/2016
  2847 0000D68A FE05[948E0100]      <1> 	inc	byte [tcallback]
  2848                              <1> 
  2849                              <1> systimer_cb1:
  2850 0000D690 0FB635[FD940100]    <1> 	movzx	esi, byte [u.uno] ; process number
  2851                              <1> 	;shl	si, 2	
  2852                              <1> 	; 23/07/2022
  2853 0000D697 C1E602              <1> 	shl	esi, 2
  2854 0000D69A 8996[3C940100]      <1> 	mov	[esi+p.tcb-4], edx ; set process timer callback address
  2855                              <1> 				   ; (overwrite prev value if it is set!)
  2856 0000D6A0 80E77F              <1> 	and	bh, 7Fh
  2857                              <1> 
  2858                              <1> systimer_cb2:
  2859 0000D6A3 80FF02              <1> 	cmp	bh, 2
  2860 0000D6A6 7446                <1>         je      short systimer_5  ; only 18.2 ticks per second is usable
  2861                              <1> 				  ; 10 milliseconds (100 Hertz) timer 
  2862                              <1> 				  ; will be set later (18/05/2016)
  2863 0000D6A8 774C                <1>         ja      short systimer_6 
  2864                              <1> 
  2865 0000D6AA 20FF                <1> 	and	bh, bh
  2866                              <1> 	;jz	systimer_9        ; stop timer event(s)
  2867                              <1> 	; 23/07/2022
  2868 0000D6AC 7505                <1> 	jnz	short systimer_19
  2869 0000D6AE E9BA000000          <1> 	jmp	systimer_9
  2870                              <1> 
  2871                              <1> 	; bh = 1 (timer interrupt, 18.2 Hz, IBM PC/AT ROMBIOS default)
  2872                              <1> 
  2873                              <1> systimer_19:
  2874 0000D6B3 B00A                <1> 	mov	al, 10 ; (*)
  2875                              <1> 
  2876                              <1> systimer_0:
  2877 0000D6B5 B710                <1> 	mov	bh, 16
  2878                              <1> 	;
  2879 0000D6B7 383D[8B890100]      <1> 	cmp	[timer_events], bh ; 16 ; 07/06/2016
  2880 0000D6BD 7319                <1> 	jnb 	short systimer_3  ; max. 16 timer events
  2881                              <1> 	;
  2882 0000D6BF 50                  <1> 	push	eax ; (*)
  2883                              <1> 
  2884 0000D6C0 BF[C0950100]        <1> 	mov	edi, timer_set  ; beginning address of timer events
  2885                              <1> 				; setting space
  2886 0000D6C5 30C0                <1> 	xor	al, al ; 0
  2887                              <1> systimer_1:
  2888 0000D6C7 FEC0                <1> 	inc	al
  2889 0000D6C9 803F00              <1> 	cmp	byte [edi], 0 	; is it free space ?
  2890 0000D6CC 7639                <1> 	jna	short systimer_7 ; yes
  2891 0000D6CE FECF                <1> 	dec	bh
  2892 0000D6D0 7405                <1> 	jz	short systimer_2
  2893 0000D6D2 83C710              <1> 	add	edi, 16
  2894 0000D6D5 EBF0                <1> 	jmp	short  systimer_1 ; next event space
  2895                              <1> 
  2896                              <1> systimer_2:
  2897 0000D6D7 58                  <1> 	pop	eax ; (*) discard
  2898                              <1> systimer_3:
  2899 0000D6D8 C605[AC940100]00    <1> 	mov	byte [u.r0], 0
  2900                              <1> systimer_4:
  2901 0000D6DF C705[18950100]1B00- <1>         mov     dword [u.error], ERR_MISC
  2901 0000D6E7 0000                <1>
  2902                              <1>                                 ; one of miscellaneous/other errors
  2903 0000D6E9 E992F7FFFF          <1> 	jmp	error ; cf -> 1
  2904                              <1> 
  2905                              <1> systimer_5:
  2906 0000D6EE 883D[AC940100]      <1> 	mov	[u.r0], bh ; Time count unit (=2 or >3)
  2907 0000D6F4 EBE9                <1> 	jmp	short systimer_4 ; 07/06/2016
  2908                              <1> 
  2909                              <1> systimer_6:
  2910 0000D6F6 80FF04              <1> 	cmp	bh, 4
  2911 0000D6F9 77F3                <1>         ja      short systimer_5  ; undefined time count unit
  2912                              <1> 	;jb	short systimer_16
  2913                              <1> 
  2914                              <1> 	;mov	al, 1	; default (use current timer unit)
  2915                              <1> 			; countdown value is in ECX !
  2916                              <1> 			; max. value of ecx = 4294967296/10
  2917                              <1>         ;jmp    short systimer_0
  2918                              <1> 	;jmp	short systimer_19
  2919 0000D6FB 74B6                <1> 	je	short systimer_19
  2920                              <1> 
  2921                              <1> systimer_16:
  2922                              <1> 	; bh = 3
  2923                              <1> 	; timer event via real time clock interrupt
  2924                              <1> 	; interrupt/update frequency: 1 Hz (1 tick per second)
  2925                              <1> 	
  2926 0000D6FD B0B6                <1> 	mov	al, 182 ; (*) ; 18.2 * 10
  2927 0000D6FF FE05[958E0100]      <1> 	inc	byte [trtc] ; timer event via real time clock
  2928 0000D705 EBAE                <1>         jmp     short systimer_0
  2929                              <1> 
  2930                              <1> systimer_7:
  2931 0000D707 A2[AC940100]        <1> 	mov	[u.r0], al ; timer event number
  2932                              <1> 	;
  2933                              <1> 	; edi = address of empty timer event area
  2934 0000D70C A0[FD940100]        <1> 	mov	al, [u.uno]
  2935 0000D711 FA                  <1> 	cli 	; disable interrupts 
  2936 0000D712 AA                  <1> 	stosb	; process number
  2937 0000D713 A0[948E0100]        <1> 	mov	al, [tcallback] ; timer callback flag
  2938 0000D718 AA                  <1> 	stosb 	; 1= callback method, 0= signal response byte method
  2939 0000D719 A0[958E0100]        <1> 	mov	al, [trtc] ; timer interrupt type
  2940 0000D71E AA                  <1> 	stosb	; 1= real time clock, 0= programmable interval timer
  2941 0000D71F 88D8                <1> 	mov	al, bl ; Signal return (Response) value
  2942 0000D721 AA                  <1> 	stosb   ; response byte
  2943 0000D722 58                  <1> 	pop	eax ; (*) ; 10 or 182
  2944 0000D723 89D3                <1> 	mov	ebx, edx ; virtual address for response/signal byte
  2945 0000D725 F7E1                <1> 	mul	ecx
  2946                              <1> 	; (eax = 10 * count of 18.2 Hz timer ticks)
  2947                              <1> 	; (count down step = 10)
  2948 0000D727 AB                  <1> 	stosd  ; count limit (reset value)
  2949 0000D728 AB                  <1> 	stosd  ; current count value
  2950                              <1> 
  2951                              <1> 	; 19/12/2016
  2952 0000D729 803D[948E0100]00    <1> 	cmp	byte [tcallback], 0 ; timer callback method ?
  2953 0000D730 7604                <1> 	jna	short systimer_17 ; no
  2954 0000D732 89D8                <1> 	mov	eax, ebx ; virtual address for callback routine
  2955 0000D734 EB0D                <1> 	jmp	short systimer_18
  2956                              <1> 
  2957                              <1> systimer_17: ; signal response byte method
  2958                              <1> 	; ebx = virtual address
  2959                              <1> 	; [u.pgdir] = page directory's physical address
  2960                              <1> 	; 20/02/2017
  2961 0000D736 FE05[968E0100]      <1> 	inc	 byte [no_page_swap] ; 1 
  2962                              <1> 			; Do not add this page to swap queue
  2963                              <1> 			; and remove it from swap queue if it is
  2964                              <1> 			; on the queue.
  2965 0000D73C E87D84FFFF          <1> 	call	get_physical_addr
  2966 0000D741 721A                <1> 	jc	short systimer_8 ; 07/06/2016
  2967                              <1> 	; eax = physical address of the virtual address in user's space
  2968                              <1> systimer_18:
  2969 0000D743 AB                  <1> 	stosd	; response addr (physical) or callback addr (virtual)
  2970 0000D744 FE05[8B890100]      <1> 	inc	byte [timer_events] ; 07/06/201
  2971                              <1> 	; 02/01/2017
  2972 0000D74A 0FB605[FD940100]    <1> 	movzx	eax, byte [u.uno]
  2973 0000D751 FE80[2F940100]      <1> 	inc	byte [eax+p.timer-1]
  2974                              <1> 	;
  2975 0000D757 FB                  <1> 	sti 	; enable interrupts
  2976 0000D758 E943F7FFFF          <1> 	jmp	sysret
  2977                              <1> 
  2978                              <1> systimer_8:
  2979                              <1> 	; 10/06/2016
  2980                              <1> 	; 07/06/2016
  2981 0000D75D 28C0                <1> 	sub	al, al ; 0
  2982 0000D75F 8847F4              <1> 	mov	[edi-12], al ; clear process number (free timer event)
  2983                              <1> 	;mov	dword [edi], eax ; 0
  2984 0000D762 FB                  <1> 	sti
  2985 0000D763 A2[AC940100]        <1> 	mov	[u.r0], al ; 0
  2986 0000D768 E913F7FFFF          <1> 	jmp	error
  2987                              <1> 
  2988                              <1> systimer_9:
  2989                              <1> 	; 10/06/2016
  2990                              <1> 	; 07/06/2016
  2991 0000D76D 28C0                <1> 	sub	al, al
  2992 0000D76F A2[AC940100]        <1> 	mov	byte [u.r0], al ; 0
  2993 0000D774 3805[8B890100]      <1> 	cmp     byte [timer_events], al ;  0
  2994 0000D77A 7631                <1> 	jna	short systimer_12
  2995                              <1> 
  2996                              <1> 	; Note: ecx and edx are undefined here
  2997                              <1> 	;	(for stop timer function)
  2998                              <1> 
  2999 0000D77C BE[C0950100]        <1> 	mov	esi, timer_set  ; beginning address of timer events
  3000                              <1> 				; setting space
  3001 0000D781 A0[FD940100]        <1> 	mov	al, [u.uno]
  3002                              <1> 
  3003 0000D786 B710                <1> 	mov	bh, 16
  3004                              <1> 
  3005 0000D788 08DB                <1> 	or	bl, bl
  3006 0000D78A 7544                <1> 	jnz	short systimer_15
  3007                              <1> 
  3008                              <1> 	; clear timer event areas belong to current process
  3009                              <1> 	; (for stopping all timer events belong to current process) 
  3010 0000D78C FA                  <1> 	cli 	; disable interrupts
  3011                              <1> systimer_10:
  3012                              <1> 	; 10/06/2016
  3013                              <1> 	; 07/06/2016 	
  3014 0000D78D 8A26                <1> 	mov	ah, [esi]
  3015 0000D78F 08E4                <1> 	or	ah, ah ; 0 ?
  3016 0000D791 7411                <1> 	jz	short systimer_11
  3017 0000D793 38C4                <1> 	cmp	ah, al ; is the process number (owner) same ?
  3018 0000D795 750D                <1>         jne     short systimer_11 ; no
  3019                              <1> 
  3020                              <1> 	;mov	byte [esi], 0
  3021 0000D797 66C7060000          <1> 	mov	word [esi], 0 ; clear
  3022                              <1> 	;mov	dword [esi+12], 0 ; clear
  3023                              <1> 
  3024 0000D79C FE0D[8B890100]      <1> 	dec	byte [timer_events]
  3025 0000D7A2 7409                <1> 	jz	short systimer_12
  3026                              <1> 
  3027                              <1> systimer_11:
  3028 0000D7A4 FECF                <1> 	dec	bh
  3029 0000D7A6 7405                <1> 	jz	short systimer_12
  3030 0000D7A8 83C610              <1> 	add	esi, 16
  3031 0000D7AB EBE0                <1> 	jmp	short systimer_10
  3032                              <1> 
  3033                              <1> systimer_12:
  3034 0000D7AD 0FB635[FD940100]    <1> 	movzx	esi, byte [u.uno]
  3035 0000D7B4 08DB                <1> 	or	bl, bl ; all timer events or one timer event ?
  3036 0000D7B6 740C                <1> 	jz	short systimer_13
  3037 0000D7B8 8A9E[2F940100]      <1> 	mov	bl, [esi+p.timer-1]
  3038 0000D7BE 20DB                <1> 	and	bl, bl	; previous number of timer events for the process
  3039 0000D7C0 7408                <1> 	jz	short systimer_14
  3040 0000D7C2 FECB                <1> 	dec	bl  ; previous number of timer events for the process - 1
  3041                              <1> systimer_13:
  3042 0000D7C4 889E[2F940100]      <1> 	mov	[esi+p.timer-1], bl ; 0 ; no timer events for process
  3043                              <1> systimer_14:
  3044 0000D7CA FB                  <1> 	sti	; enable interrupts
  3045 0000D7CB E9D0F6FFFF          <1> 	jmp	sysret
  3046                              <1> 
  3047                              <1> systimer_15:
  3048 0000D7D0 38FB                <1> 	cmp	bl, bh ; 16
  3049                              <1>         ;ja	systimer_4      ; max. 16 timer events !
  3050                              <1> 	; 23/07/2022
  3051 0000D7D2 7605                <1> 	jna	short systimer_21
  3052                              <1> systimer_20:
  3053 0000D7D4 E906FFFFFF          <1> 	jmp	systimer_4
  3054                              <1> systimer_21:	; 23/07/2022
  3055 0000D7D9 88DA                <1> 	mov	dl, bl
  3056 0000D7DB FECA                <1> 	dec	dl  ; 16 -> 15 ... 1 -> 0
  3057 0000D7DD C0E204              <1> 	shl	dl, 4 ; * 16
  3058 0000D7E0 0FB6FA              <1> 	movzx	edi, dl
  3059 0000D7E3 01F7                <1> 	add	edi, esi ; timer_set 
  3060                              <1> 	
  3061 0000D7E5 3A07                <1> 	cmp	al, [edi] ; process number
  3062                              <1>         ;jne	systimer_4
  3063                              <1> 	; 23/07/2022
  3064 0000D7E7 75EB                <1> 	jne	short systimer_20 ; jmp systimer_4
  3065                              <1> 	
  3066                              <1> 	; same process ID
  3067 0000D7E9 FA                  <1> 	cli	; disable interrupts
  3068                              <1>  	; 10/06/2016 ; 02/01/2017
  3069                              <1> 	;mov	byte [edi], 0 
  3070 0000D7EA 66C7070000          <1> 	mov	word [edi], 0 ; clear
  3071                              <1> 	;mov	dword [edi+12], 0 ; clear
  3072 0000D7EF FE0D[8B890100]      <1> 	dec	byte [timer_events]
  3073 0000D7F5 EBB6                <1> 	jmp	short systimer_12
  3074                              <1> 
  3075                              <1> sysvideo: ; VIDEO DATA TRANSFER FUNCTIONS
  3076                              <1> 	; 11/08/2022
  3077                              <1> 	; 08/08/2022
  3078                              <1> 	; 23/07/2022 (TRDOS 386 v2.0.5)
  3079                              <1> 	; 06/03/2021
  3080                              <1> 	; 02/03/2021
  3081                              <1> 	; 28/02/2021
  3082                              <1> 	; 27/02/2021
  3083                              <1> 	; 26/02/2021
  3084                              <1> 	; 25/02/2021
  3085                              <1> 	; 21/02/2021, 22/02/2021, 23/02/2021
  3086                              <1> 	; 15/02/2021, 16/02/2021, 18/02/2021
  3087                              <1> 	; 10/02/2021, 11/02/2021, 12/02/2021
  3088                              <1> 	; 07/02/2021, 08/02/2021
  3089                              <1> 	; 01/02/2021, 02/02/2021, 05/02/2021
  3090                              <1> 	; 29/01/2021, 30/01/2021, 31/01/2021
  3091                              <1> 	; 23/01/2021, 24/01/2021, 28/01/2021
  3092                              <1> 	; 18/01/2021, 19/01/2021, 22/01/2021
  3093                              <1> 	; 04/01/2021, 10/01/2021, 11/01/2021
  3094                              <1> 	; 01/01/2021, 02/01/2021, 03/01/2021
  3095                              <1> 	; 28/12/2020, 29/12/2020, 30/12/2020
  3096                              <1> 	; 25/12/2020, 26/12/2020
  3097                              <1> 	; 21/12/2020, 23/12/2020
  3098                              <1> 	; 12/12/2020, 14/12/2020
  3099                              <1> 	; 10/12/2020, 11/12/2020
  3100                              <1> 	; 03/12/2020, 04/12/2020
  3101                              <1> 	; 22/11/2020, 23/11/2020
  3102                              <1> 	; 21/11/2020 (TRDOS 386 v2.0.3)
  3103                              <1> 	; 12/05/2017
  3104                              <1> 	; 11/07/2016
  3105                              <1> 	; 13/06/2016
  3106                              <1> 	; 16/05/2016 - TRDOS 386 (TRDOS v2.0)
  3107                              <1> 	;
  3108                              <1> 	; VIDEO DATA TRANSFER FUNCTIONS:
  3109                              <1> 	;
  3110                              <1> 	; Inputs:
  3111                              <1> 	;		; 07/02/2021
  3112                              <1> 	;	BH = 0 = VIDEO BIOS Mode 3, tty/text mode data transfers
  3113                              <1> 	;	     BL = 
  3114                              <1> 	;		Bits 0&1, Transfer direction
  3115                              <1> 	;	     	 	0 - System to system
  3116                              <1> 	;			1 - User to system
  3117                              <1> 	;			2 - System to user
  3118                              <1> 	;			3 - Exhange (Swap) - 28/01/2021
  3119                              <1> 	;		Bits 2, Transfer Type
  3120                              <1> 	;			0 - Display page (complete) transfer
  3121                              <1> 	;	     		1 - Display page window (col,row) transfer
  3122                              <1> 	;		; 28/01/2021
  3123                              <1> 	;		Bits 3..7 - Reserved, undefined (must be 0)
  3124                              <1> 	;	        ; 28/01/2021	
  3125                              <1> 	;	     /// BL = 0 -> System to system (display page) transfer
  3126                              <1> 	;		 CL = Source page (0FFh = current video page)
  3127                              <1> 	;		 DL = Destination page (0FFh = current video page)
  3128                              <1> 	;		 (Note: Nothing to do if src & dest are same page)
  3129                              <1> 	;	     /// BL = 1&2 -> user to system & system to user transfer
  3130                              <1> 	;		 ECX = User's buffer address
  3131                              <1> 	;		 DL = Video page (0FFh = current video page)
  3132                              <1> 	;	     /// BL = 3 -> exchange (swap) display page ; 28/01/2021
  3133                              <1> 	;		 ECX = User's buffer address
  3134                              <1> 	;		 DL = Video page (0FFh = current video page)
  3135                              <1> 	;		 EDI = Swap address in user's memory (must be > 0)
  3136                              <1> 	;	     /// BL = 5&6&7 -> user to system, system to user transfer 
  3137                              <1> 	;		(system window is in current/active display page)
  3138                              <1> 	;		 ESI = User's buffer address
  3139                              <1> 	;		 ECX Low 16 bits = Top left column (X1 position)
  3140                              <1> 	;		 ECX High 16 bits = Top row (Y1 position)
  3141                              <1> 	;		 EDX Low 16 bits = Bottom right column (X2 position)
  3142                              <1> 	;		 EDX High 16 bits = Bottom row (Y2 position)
  3143                              <1>         ;                If BL = 5 or BL bit 0 & bit 1 are 1 ; 28/01/2021
  3144                              <1> 	;		 EDI = Swap address (in user's memory space)
  3145                              <1> 	;		 (If swap address > 0, previous content of the window
  3146                              <1> 	;		 will be saved into swap area in user's memory space)
  3147                              <1> 	;	     /// BL = 4 -> system to system transfer
  3148                              <1> 	;		 ESI = System's source buffer (video page) address
  3149                              <1> 	;		 ECX Low 16 bits = Top left column (X1 position)
  3150                              <1> 	;		 ECX High 16 bits = Top row (Y1 position)
  3151                              <1> 	;		 EDX Low 16 bits = Bottom right column (X2 position)
  3152                              <1> 	;		 EDX High 16 bits = Bottom row (Y2 position)
  3153                              <1> 	;		 EDI = System's destination buffer (video page) addr
  3154                              <1> 	;
  3155                              <1> 	;		; 06/02/2021
  3156                              <1> 	;		; 05/02/2021
  3157                              <1> 	;		; 01/02/2021, 02/02/2021
  3158                              <1> 	;		; 30/01/2021, 31/02/2021
  3159                              <1> 	;		; 29/01/2021 (major modification)
  3160                              <1> 	;		; 23/11/2020 (major modification)
  3161                              <1> 	;		; 22/11/2020 (bugfixes and extensions)
  3162                              <1> 	;	BH = 1 = VGA Graphics (0A0000h) data transfers
  3163                              <1> 	;		BL bit 7
  3164                              <1> 	;		   resolution (screen width) option
  3165                              <1> 	;		   0 = 320 pixels
  3166                              <1> 	;		   1 = 640 pixels
  3167                              <1> 	;		.. followings are same with SVGA transfer function
  3168                              <1> 	;		BL bit 6
  3169                              <1> 	;		   direction option
  3170                              <1> 	;		   0 = user to system (video memory)
  3171                              <1> 	;		   1 = system to user
  3172                              <1> 	;		BL bit 5
  3173                              <1> 	;		   masked/direct (non-masked) operations
  3174                              <1> 	;		   1 = masked, 0 = non-masked (direct)
  3175                              <1> 	;		BL bit 4
  3176                              <1> 	;		   page/window option
  3177                              <1> 	;		   1 = window, 0 = display page (screen)
  3178                              <1> 	;		BL bit 0 to 3 (pixel operation types)
  3179                              <1> 	;		   0 = Copy pixels (colors) ((mask color))
  3180                              <1> 	;		   1 = Change (New, Fill) color
  3181                              <1> 	;		   2 = Add color
  3182                              <1> 	;		   3 = Sub color
  3183                              <1> 	;		   4 = OR color
  3184                              <1> 	;		   5 = AND color
  3185                              <1> 	;		   6 = XOR color
  3186                              <1> 	;		   7 = NOT color
  3187                              <1> 	;		   8 = NEG color
  3188                              <1> 	;		   9 = INC color
  3189                              <1> 	;		  10 = DEC color
  3190                              <1> 	;		  11 = Mix (Average) colors
  3191                              <1> 	;		  12 = Replace pixel colors
  3192                              <1> 	;		  13 = Copy pixel block(s)
  3193                              <1> 	;		  14 = Write line(s)
  3194                              <1> 	;		  15 = Write character (font)
  3195                              <1> 	;
  3196                              <1> 	;	   Input Registers for pixel operations:
  3197                              <1> 	;		 Same with LFB data transfer function below
  3198                              <1> 	;
  3199                              <1> 	;		; 25/02/2021
  3200                              <1> 	;		; 05/02/2021, 06/02/2021
  3201                              <1> 	;		; 01/02/2021, 02/02/2021
  3202                              <1> 	;		; 30/01/2021, 31/02/2021
  3203                              <1> 	; 		; 29/01/2021 (major modification)
  3204                              <1> 	;		; 23/11/2020 (major modification)
  3205                              <1> 	;		; 22/11/2020 (bugfixes and extensions)
  3206                              <1> 	;	BH = 2 = Super VGA, LINEAR FRAME BUFFER data transfers
  3207                              <1> 	;		BL bit 7
  3208                              <1> 	;		   unused (invalid), must be 0
  3209                              <1> 	;		BL bit 6
  3210                              <1> 	;		   direction option
  3211                              <1> 	;		   0 = user to system (video memory)
  3212                              <1> 	;		   1 = system to user
  3213                              <1> 	;		BL bit 5
  3214                              <1> 	;		   masked/direct (non-masked) operations
  3215                              <1> 	;		   1 = masked, 0 = non-masked (direct)
  3216                              <1> 	;		BL bit 4
  3217                              <1> 	;		   page/window option
  3218                              <1> 	;		   1 = window, 0 = display page (screen)
  3219                              <1> 	;		BL bit 0 to 3 (pixel operation types)
  3220                              <1> 	;		   0 = Copy pixels (colors) ((mask color))
  3221                              <1> 	;		   1 = Change (New, Fill) color
  3222                              <1> 	;		   2 = Add color
  3223                              <1> 	;		   3 = Sub color
  3224                              <1> 	;		   4 = OR color
  3225                              <1> 	;		   5 = AND color
  3226                              <1> 	;		   6 = XOR color
  3227                              <1> 	;		   7 = NOT color
  3228                              <1> 	;		   8 = NEG color
  3229                              <1> 	;		   9 = INC color
  3230                              <1> 	;		  10 = DEC color
  3231                              <1> 	;		  11 = Mix (Average) colors
  3232                              <1> 	;		  12 = Replace pixel colors
  3233                              <1> 	;		  13 = Copy pixel block(s)
  3234                              <1> 	;		  14 = Write line(s)
  3235                              <1> 	;		  15 = Write character (font)
  3236                              <1> 	;
  3237                              <1> 	;	   Note: If HW of EBX > 0, it is VESA VBE mode number
  3238                              <1> 	;		 otherwise, function will be applied
  3239                              <1> 	;		 to current (VESA VBE) video mode.
  3240                              <1> 	;
  3241                              <1> 	;	   Input Registers for pixel operations:
  3242                              <1> 	;		-- user to system & system to system --
  3243                              <1> 	;		-- (BL = 0 to 0Fh) -- non-masked, screen --
  3244                              <1> 	;		-- (BL = 10h to 1Fh) -- non-masked, window --
  3245                              <1> 	;		-- (BL = 20h to 2Fh) -- masked, screen --
  3246                              <1> 	;		-- (BL = 30h to 3Fh) -- masked, window --
  3247                              <1> 	;		(*) window, (**) masked (***) sys to sys
  3248                              <1> 	;		for BL bit 0 to 3
  3249                              <1> 	;		00h: COPY PIXELS
  3250                              <1> 	;		  If BL bit 4 = 0 ; 21/02/2021
  3251                              <1> 	;		     full screen copy	
  3252                              <1>    	;		     ECX & EDX will not be used
  3253                              <1> 	;		    (user buffer must fit to display page)
  3254                              <1> 	;		  If BL bit 4 = 1 ; 21/02/2021
  3255                              <1> 	;		    ECX = start position (row, column) (*)
  3256                              <1> 	;			  (HW = row, CX = column)
  3257                              <1> 	;		    EDX = size (rows, colums) (*)
  3258                              <1> 	;			  (HW = rows, DX = columns)
  3259                              <1> 	;		          (0 -> invalid)
  3260                              <1> 	;		          (1 -> horizontal or vertical line)
  3261                              <1> 	;		    ESI = user's buffer address
  3262                              <1> 	;		    EDI = mask color (**) ; 25/02/2021
  3263                              <1> 	;			  (this color will be excluded)
  3264                              <1> 	;		01h: CHANGE PIXEL COLORS
  3265                              <1> 	;		02h: ADD PIXEL COLORS
  3266                              <1> 	;		03h: SUB PIXEL COLORS
  3267                              <1> 	;		04h: OR PIXEL COLORS
  3268                              <1> 	;		05h: AND PIXEL COLORS
  3269                              <1> 	;		06h: XOR PIXEL COLORS
  3270                              <1> 	;		0Bh: MIX PIXEL COLORS
  3271                              <1> 	;		     CL = color (8 bit, 256 colors)
  3272                              <1> 	;		    ECX = color (16 bit and true colors)
  3273                              <1> 	;		    EDX = start position (row, column) (*)
  3274                              <1> 	;			 (HW = row, DX = column)
  3275                              <1> 	;		    ESI = size (rows, colums) (*)
  3276                              <1> 	;			  (HW = rows, SI = columns)
  3277                              <1> 	;		    EDI = mask color (**) ; 25/02/2021
  3278                              <1> 	;			  (this color will be excluded)
  3279                              <1> 	;		07h: NOT PIXEL COLORS
  3280                              <1> 	;		08h: NEG PIXEL COLORS
  3281                              <1> 	;		09h: INC PIXEL COLORS
  3282                              <1> 	;		0Ah: DEC PIXEL COLORS
  3283                              <1> 	;		    ECX = start position (row, column) (*)
  3284                              <1> 	;			  (HW = row, CX = column)
  3285                              <1> 	;		    EDX = size (rows, colums) (*)
  3286                              <1> 	;			  (HW = rows, DX = columns)
  3287                              <1> 	;		          (0 -> invalid)
  3288                              <1> 	;		          (1 -> horizontal or vertical line)
  3289                              <1> 	;		    EDI = mask color (**) ; 25/02/2021
  3290                              <1> 	;			  (this color will be excluded)
  3291                              <1> 	;		0Ch: REPLACE PIXEL COLORS
  3292                              <1> 	;		     CL = current color (8 bit, 256 colors)
  3293                              <1> 	;		    ECX = current color (16 bit and true colors)
  3294                              <1> 	;		     DL = new color (8 bit, 256 colors)
  3295                              <1> 	;		    EDX = new color (16 bit and true colors)
  3296                              <1> 	;		    ESI = start position (row, column) (*)
  3297                              <1> 	;			  (HW = row, SI = column)
  3298                              <1> 	;		    EDI = size (rows, colums) (*)
  3299                              <1> 	;			  (HW = rows, DI = columns)
  3300                              <1> 	;		0Dh: COPY PIXEL BLOCK(S) -full screen-
  3301                              <1> 	;		   -If BL bit 5 is 0-
  3302                              <1> 	;		    ECX = start position (row, column) (*)
  3303                              <1> 	;			  (HW = row, CX = column)
  3304                              <1> 	;		    EDX = size (rows, colums) (*)
  3305                              <1> 	;			  (HW = rows, DX = columns)
  3306                              <1> 	;		          (0 -> invalid)
  3307                              <1> 	;		          (1 -> horizontal or vertical line)
  3308                              <1> 	;		    ESI = destination (row, column) (***)
  3309                              <1> 	;		   -If BL bit 5 is 1-
  3310                              <1> 	;	               CL = color (8 bit, 256 colors)
  3311                              <1> 	;		      ECX = color (16 bit and true colors)
  3312                              <1> 	;	   	      EDX = count of blocks (not bytes)
  3313                              <1> 	;			    (limit: 2048 blocks)
  3314                              <1> 	;		      ESI = user's buffer address 
  3315                              <1> 	;			  contains 64 bits block data
  3316                              <1> 	;			  BLOCK ADDRESS - (row, col), dword
  3317                              <1> 	;			  (first 32 bits)
  3318                              <1> 	;			  BLOCK SIZE - (rows, cols), dword
  3319                              <1> 	;			  (second 32 bits)
  3320                              <1> 	;		; 10/02/2021
  3321                              <1> 	;		0Eh: WRITE LINE(s) -full screen- 
  3322                              <1> 	;		   -If BL bit 5 is 0-	
  3323                              <1> 	; 		    CL = color (8 bit, 256 colors)
  3324                              <1> 	; 		   ECX = color (16 bit and true colors)
  3325                              <1> 	; 		    DX = low 12 bits - size (length)
  3326                              <1> 	;			 high 4 bits - direction or type
  3327                              <1> 	;			     0 - Horizontal line
  3328                              <1> 	;			     1 - Vertical line
  3329                              <1> 	;			   > 1 - undefined, invalid
  3330                              <1> 	; 		   ESI = start position (row, column)
  3331                              <1> 	;			 (HW = row, SI = column)
  3332                              <1> 	;		   -If BL bit 5 is 1-
  3333                              <1> 	;		     CL = color (8 bit, 256 colors)
  3334                              <1> 	;		    ECX = color (16 bit and true colors)
  3335                              <1> 	;		     DX = number of lines (in user buffer)
  3336                              <1> 	;			   (limit: 2048 lines)	
  3337                              <1> 	;		    ESI = user's buffer
  3338                              <1> 	;		          contains 64 bit data for lines
  3339                              <1> 	;			   START POINT: 32 bit (row, col)
  3340                              <1> 	;			   LENGTH: 32 bit
  3341                              <1> 	;			   high 16 bits - 0
  3342                              <1> 	;			   bit 0-11 - length
  3343                              <1> 	;			   bit 12-15 - type (length)
  3344                              <1> 	;		0Fh: WRITE CHARACTER (FONT)
  3345                              <1> 	;		     CL = char's color (8 bit, 256 colors)
  3346                              <1> 	;		    ECX = char's color (16 bit and true colors)
  3347                              <1> 	;		     DL = Character's ASCII code
  3348                              <1> 	;		     DH bit 0 -> font height
  3349                              <1> 	;			  0 -> 8x16 character font
  3350                              <1> 	;			  1 -> 8x8 character font
  3351                              <1> 	;		     DH bit 1 & 2 -> scale
  3352                              <1> 	;			  0 = 1/1 (8 pixels per char row)
  3353                              <1> 	;			  1 = 2/1 (16 pixels per char row)
  3354                              <1> 	;			  2 = 3/1 (24 pixels per char row)
  3355                              <1> 	;			  3 = 4/1 (32 pixels per char row) 
  3356                              <1> 	;		     DH bit 6 -> [ufont] option (1 = use [ufont])
  3357                              <1> 	;		     If DH bit 7 = 1
  3358                              <1> 	;			 USER FONT (from user buffer)
  3359                              <1> 	;			    DL = 0 -> 8x8 (width: 1 byte per row)
  3360                              <1> 	;			    DL = 1 -> 8x16
  3361                              <1> 	;			    DL = 2 -> 16x16 (width: 2 bytes)
  3362                              <1> 	;			    DL = 3 -> 16x32
  3363                              <1> 	;			    DL = 4 -> 24x24 (width: 3 bytes)
  3364                              <1> 	;			    DL = 5 -> 24x48
  3365                              <1> 	;			    DL = 6 -> 32x32 (width: 4 bytes)
  3366                              <1> 	;			    DL = 7 -> 32x64
  3367                              <1> 	;			    DL > 7 -> invalid (unused)
  3368                              <1> 	;			 EDI = user's font buffer address
  3369                              <1> 	;			    (NOTE: byte order is as row0,row1,row2..)
  3370                              <1> 	; 		    ESI = start position (row, column) (*)
  3371                              <1> 	;			     (HW = row, SI = column)
  3372                              <1> 	;
  3373                              <1> 	;		-- system to user --
  3374                              <1> 	;		   BL (bit 0 to 7)
  3375                              <1> 	;	 	40h: COPY PIXELS (full screen, display page)
  3376                              <1> 	;		    EDI = user's buffer address
  3377                              <1> 	;		41h: COPY PIXELS (window)
  3378                              <1> 	;		    ECX = start position (row, column) (*)
  3379                              <1> 	;			  (HW = row, CX = column)
  3380                              <1> 	;		    EDX = size (rows, colums) (*)
  3381                              <1> 	;			  (HW = rows, DX = columns)
  3382                              <1> 	;		          (<=1 -> horizontal or vertical line)
  3383                              <1> 	;		    EDI = user's buffer address
  3384                              <1> 	;
  3385                              <1> 	;		Example: (29/01/2021)
  3386                              <1> 	;		    ecx = 00400064h (start at row 64, column 100)
  3387                              <1> 	;		    edx = 00320048h (size: 50 rows, 72 columns)
  3388                              <1> 	;				    (end at row 114, column 172)
  3389                              <1> 	;		    If video memory starts at 0A0000h
  3390                              <1> 	;		    and if resolution is 320x200 (256 colors) ..
  3391                              <1> 	;		    window start offset: (64*320)+100 = 20580
  3392                              <1> 	;		    window size: 16072 bytes (pixels) 
  3393                              <1> 	;		    window end offset: 20580+16072 = 36652
  3394                              <1> 	;		    window start address: 0A0000h+564h = 0A5064h
  3395                              <1> 	; Outputs:
  3396                              <1> 	;	EAX = transfer/byte count
  3397                              <1> 	;
  3398                              <1> 	;	NOTE: If the source or destination address passes out of
  3399                              <1> 	;	video pages (display memory limits), data will not be transferred
  3400                              <1> 	;	and EAX will return as 0.
  3401                              <1> 	;
  3402                              <1> 	; 08/02/2021
  3403                              <1> 	; 07/02/2021
  3404                              <1> 	; 04/01/2021
  3405                              <1> 	; PIXEL READ/WRITE (in current/active video mode)
  3406                              <1> 	;
  3407                              <1> 	;	BH = 3 = Read/Write pixel(s) -for all graphics modes-
  3408                              <1> 	;	     BL = 
  3409                              <1> 	;		0 = Read pixel
  3410                              <1> 	;		1 = Write pixel
  3411                              <1> 	;	     	2 = swap pixel colors
  3412                              <1> 	;		3 = mix pixel colors
  3413                              <1> 	;	     29/01/2021	
  3414                              <1> 	;		4 = read pixels from user defined positions 
  3415                              <1> 	;		5 = write single color pixels to user defined positions
  3416                              <1> 	;		6 = write multi color pixels to user defined positions 
  3417                              <1> 	;
  3418                              <1> 	;	      > 6 = invalid/unimplemented
  3419                              <1> 	;
  3420                              <1> 	;	     .. for BL = 0 to 5
  3421                              <1> 	;	     CL = color for writing pixel(s) or
  3422                              <1>  	;	     ECX = color for writing pixel(s) in true color modes
  3423                              <1> 	;
  3424                              <1> 	;	     EDX = Offset from start of video memory (0A0000h)
  3425                              <1> 	;		   or start of linear frame buffer
  3426                              <1> 	;
  3427                              <1> 	;	     07/02/2021	
  3428                              <1> 	;	     .. for BL = 4
  3429                              <1> 	;	     EDI = user's destination buffer address for pixel colors
  3430                              <1> 	;	     29/01/2021
  3431                              <1> 	;	     .. for BL = 4 & 5
  3432                              <1> 	;	     ESI = user's source buffer address for BL = 4 & 5
  3433                              <1> 	;	     (buffer contains dword offset positions for pixels)
  3434                              <1> 	;	     EDX = number of pixels
  3435                              <1> 	;	     .. for BL = 6
  3436                              <1> 	;	     ESI = user's buffer address for BL = 6
  3437                              <1> 	;	     (buffer contains dword offset position and dword color
  3438                              <1> 	;	      value for each pixel)
  3439                              <1> 	;	     EDX = number of pixels
  3440                              <1> 	;
  3441                              <1> 	; Note:
  3442                              <1> 	;	Pixel read/write will be performed in current video mode.
  3443                              <1> 	;	If [CRT_MODE] < 0FFh, 0A0000h will be used 
  3444                              <1> 	;	   as video memory and limit will be 65536
  3445                              <1> 	;	   (new/mix pixel color will be in CL)
  3446                              <1> 	;	if [CRT_MODE] = 0FFh (VESA VBE video mode)
  3447                              <1> 	;	   LFB base address will be used as video memory
  3448                              <1> 	;	   and limit will be video page size
  3449                              <1> 	;	   (new/mix pixel color will be in CL)
  3450                              <1> 	;
  3451                              <1> 	; Outputs:
  3452                              <1> 	;	EAX = pixel color (according to BL and ECX input)
  3453                              <1> 	;	EAX = 0 (pixel color is 0 or there is an error)
  3454                              <1> 	;	     (BL will return as 0FFh if there is an error)
  3455                              <1> 	;	; 29/01/2021
  3456                              <1> 	;	EAX = number of pixels (for BL input = 4&5&6)
  3457                              <1> 	;
  3458                              <1> 	; DIRECT (STANDARD VGA/CGA) DISPLAY MEMORY ACCESS FUNCTIONS:
  3459                              <1> 	;
  3460                              <1> 	;	BH = 4 = CGA direct video memory (0B8000h, 32K) access
  3461                              <1> 	;		Page directory & page tables of the user's
  3462                              <1> 	;		program will be updated to direct access to
  3463                              <1> 	;		0B8000h (32K) video (CGA, color) memory; if
  3464                              <1> 	;		there is not a permission conflict or lock!
  3465                              <1> 	;	        (User's program/process will have permission to
  3466                              <1> 	;		access locked display memory if the owner is
  3467                              <1> 	;		it's parent.)
  3468                              <1>         ;
  3469                              <1> 	;	    Screen width = 320
  3470                              <1> 	;
  3471                              <1> 	;	BH = 5 = VGA direct video memory (0A0000h, 64K) access
  3472                              <1> 	;		Page directory & page tables of the user's
  3473                              <1> 	;		program will be updated to direct access to
  3474                              <1> 	;		0A0000h (64K) video (VGA) memory; if there is not
  3475                              <1> 	;		a permission conflict or lock!  
  3476                              <1> 	;	        (User's program/process will have permission to
  3477                              <1> 	;		access locked display memory if the owner is
  3478                              <1> 	;		it's parent.)
  3479                              <1> 	;
  3480                              <1> 	;	    ; 23/11/2020
  3481                              <1> 	;	    Screen width options = 320, 640, 800
  3482                              <1> 	;
  3483                              <1> 	; Outputs:
  3484                              <1> 	;	EAX = Display memory address for direct access
  3485                              <1> 	;	      0A0000h for VGA, 0B8000h for CGA
  3486                              <1> 	;	(Display memory size: 32K for CGA, 64K for VGA)
  3487                              <1> 	; 	EAX = 0 if display page access permission has been denied.
  3488                              <1> 	;	      (Locked!)
  3489                              <1> 	;
  3490                              <1> 	; LINEAR FRAME BUFFER ACCESS FUNCTIONS:
  3491                              <1> 	;
  3492                              <1> 	;	BH = 6 = Linear Frame Buffer direct video memory access
  3493                              <1> 	;
  3494                              <1> 	;		Page directory & page tables of the user's
  3495                              <1> 	;		program will be updated to direct access to
  3496                              <1> 	;		the configured LFB (Linear Frame Buffer) address,
  3497                              <1> 	;		if there is not a permission conflict or lock!
  3498                              <1> 	;	        (User's program/process will have permission to
  3499                              <1> 	;		access locked display memory if the owner is
  3500                              <1> 	;		it's parent.)
  3501                              <1> 	;
  3502                              <1> 	;	   ; 10/12/2020
  3503                              <1> 	;	   BL = 0FFh -> Direct LFB access for current video mode
  3504                              <1> 	;	   BL = XXh < 0FFh -> Direct LFB access
  3505                              <1> 	; 			      for VESA video mode 1XXh
  3506                              <1> 	;
  3507                              <1> 	;		Return: EAX = Linear Frame Buffer address
  3508                              <1> 	;			(EAX = 0 -> error)
  3509                              <1> 	;		     If EAX > 0
  3510                              <1> 	;			EDX = Frame Buffer Size in bytes
  3511                              <1> 	;		         BH = Requested Video Mode - 100h
  3512                              <1> 	;		              (VESA VBE video modes)	
  3513                              <1> 	;		         BL = bits per pixel
  3514                              <1> 	;			      8 = 256 colors, 8
  3515                              <1> 	;		             16 = 65536 colors, 5-6(G)-5 
  3516                              <1> 	;		             24 = RGB, 16M colors, 8-8-8
  3517                              <1> 	;		             32 = RGB + alpha bytes, 8-8-8-8
  3518                              <1> 	;		     If BH = 0FFh
  3519                              <1> 	;		        BL = VGA/CGA video mode (also EAX = 0)
  3520                              <1> 	;
  3521                              <1> 	;		** Function will return with EAX = 0 if the mode
  3522                              <1> 	;		is not a valid VESA VBE video mode as 1??h **
  3523                              <1> 	;
  3524                              <1> 	;		ECX = Pixel resolution
  3525                              <1> 	;		      CX = Width (320, 640, 800, 1024, 1366, 1920)
  3526                              <1> 	;		      High 16 bits of ECX = Height
  3527                              <1> 	;
  3528                              <1> 	; 	23/11/2020
  3529                              <1> 	; ***	GET VIDEO MODE & LINEAR FRAME BUFFER INFO
  3530                              <1> 	;	(This function -7- also is used for VGA and CGA modes)
  3531                              <1> 	;
  3532                              <1> 	;	BH = 7 = Get Linear Frame Buffer info
  3533                              <1> 	;
  3534                              <1> 	;	   ; 22/01/2021
  3535                              <1> 	;	   ; 10/12/2020
  3536                              <1> 	;	   BL = any -not used- (22/01/2021)
  3537                              <1> 	;
  3538                              <1> 	;		Return:
  3539                              <1> 	;		EAX = Frame Buffer Address (0 = is not in use)
  3540                              <1> 	;		EDX = Frame Buffer Size in bytes
  3541                              <1> 	;		 BH = Current Video Mode - 100h  ; 22/01/2021
  3542                              <1> 	;		     (VESA VBE video modes)
  3543                              <1> 	;		 BL = bits per pixel
  3544                              <1> 	;			8 = 256 colors, 8
  3545                              <1> 	;		       16 = 65536 colors, 5-6(G)-5
  3546                              <1> 	;		       24 = RGB, 16M colors, 8-8-8
  3547                              <1> 	;		       32 = RGB + alpha bytes, 8-8-8-8
  3548                              <1> 	;		If BH = 0FFh
  3549                              <1> 	;		   BL = VGA/CGA video mode (also EAX = 0)
  3550                              <1> 	;
  3551                              <1> 	;		Note:
  3552                              <1> 	;		Alpha byte will be used as virtual color index.
  3553                              <1> 	;		(32 bit pixel colors.. byte 0,1,2 rgb and 3 alpha)
  3554                              <1> 	;
  3555                              <1> 	;		** Function will return with EAX = 0 if the mode
  3556                              <1> 	;		is not a valid VESA VBE video mode as 1??h **
  3557                              <1> 	;
  3558                              <1> 	;		ECX = Pixel resolution
  3559                              <1> 	;		      CX = Width (320, 640, 800, 1024, 1366, 1920)
  3560                              <1> 	;		      High 16 bits of ECX = Height  
  3561                              <1> 	;
  3562                              <1> 	;	NOTE: Each process will have it's own frame buffer
  3563                              <1> 	;	      address and resolution parameters in 'u' area.
  3564                              <1> 	;	      Then, if the current frame buffer & resolution
  3565                              <1> 	;	      is different, frame buffer r/w functions
  3566                              <1> 	;	      will use scale factor to convert process's
  3567                              <1>         ;             pixel coordinates to actual screen coordinates.
  3568                              <1> 	;	      resolution -> dimensional scale
  3569                              <1> 	;	      color size -> color scale
  3570                              <1> 	;	     * RGB (TRUE) colors to 256 colors conversion:
  3571                              <1>         ;             TRUE Colors -> 8,8,8 (R,G,B; byte 0 is R)
  3572                              <1> 	;	      256 colors -> 2,2,2,2 (R,G,B,L; bit 0&1 is R)
  3573                              <1> 	; 		  bit 6&7 -> luminosity base level (0,1,2,3)
  3574                              <1> 	;		  bit 4&5 -> blue level (0,1,2,3)
  3575                              <1> 	;		  bit 2%3 -> green level (0,1,2,3)
  3576                              <1> 	;		  bit 0&1 -> red level (0,1,2,3)
  3577                              <1> 	;	      Example: total red level : luminosity + red level
  3578                              <1> 	;	      Luminosity base level: 0 -> 16
  3579                              <1> 	;		 		     1 -> 32
  3580                              <1> 	;				     2 -> 64
  3581                              <1> 	;				     3 -> 128
  3582                              <1> 	;	      Color level:
  3583                              <1> 	;				    0 -> 0
  3584                              <1> 	;				    1 -> luminosity level
  3585                              <1> 	;				    2 -> luminosity level + 64
  3586                              <1> 	;				    3 -> 255
  3587                              <1> 	;	     Luminosity base level = min (R,G,B)
  3588                              <1> 	;			if it is <16, it will be set to 16
  3589                              <1> 	;	     Color levels: Color values are fixed to (nearest)
  3590                              <1> 	;		   one of all possible set level (step) values
  3591                              <1> 	;		   (according to luminosity base level); then
  3592                              <1> 	;		   color levels are set to R-L, G-L, B-L.
  3593                              <1> 	;	 For example: If luminosity base level is 32
  3594                              <1> 	;		  all possible set values are 0, 32, 96, 255.
  3595                              <1> 	;
  3596                              <1> 	;	    * RGB (TRUE) colors to 16 colors conversion:
  3597                              <1> 	;	    16 colors: R,B,G,L bits (4 bits)
  3598                              <1> 	;	    	   If any one of R,G,B >= 128 L = 1
  3599                              <1>  	;		   If max. value of (R,G,B) >= 32, it is 1
  3600                              <1> 	;		      else all color bits (R&G&B&L) are 0
  3601                              <1> 	;		   If the second value >= max. value / 2
  3602                              <1> 	;		      it is 1
  3603                              <1> 	;		   If the third value >= max. value / 2
  3604                              <1> 	;		      it is 1
  3605                              <1> 	;	    Example: R = 132, G = 64, B = 78
  3606                              <1> 	;		     L = 1, R = 1
  3607                              <1> 	;		     G < 66 --> G = 0
  3608                              <1> 	;		     B >= 66 --> B = 1
  3609                              <1> 	;
  3610                              <1> 	; 10/12/2020
  3611                              <1> 	; SET VIDEO MODE (& RETURN LFB INFO for VESA VBE VIDEO MODES)
  3612                              <1> 	;	
  3613                              <1> 	;	BH = 8 = Set Video Mode
  3614                              <1> 	;		
  3615                              <1> 	;		BL = Requested Video Mode (method)
  3616                              <1> 	;		If BL = 0FFh
  3617                              <1> 	;		   CX = VESA VBE Video Mode
  3618                              <1> 	;		   ; 11/12/2020
  3619                              <1> 	;		   If EDX > 0 -> LFB INFO (user) buffer addr
  3620                              <1> 	;		If BL < 0FFh, it is VGA/CGA video mode and
  3621                              <1> 	;			CX & EDX will not be used
  3622                              <1> 	;
  3623                              <1> 	;	    NOTE: The last VESA VBE video mode is 11Bh but
  3624                              <1> 	;	    TRDOS 386 will permit to set video mode upto 11Fh.
  3625                              <1> 	;	    Above 11Fh, from 140h to 1FEh, it will be accepted
  3626                              <1> 	;	    as Bochs/Plex86 emulator video mode and it will be
  3627                              <1> 	;	    used only if [vbe3] = 2 and detected
  3628                              <1> 	;	    video bios is BOCHS/PLEX86/QEMU/VIRTUALBOX vbios.
  3629                              <1> 	;
  3630                              <1> 	; Outputs:
  3631                              <1> 	;	EAX = Requested (Proper) video mode number + 1
  3632                              <1> 	;	      ("dec eax" by user will give requested video mode),
  3633                              <1> 	;
  3634                              <1> 	;	If BL input is 0FFh
  3635                              <1> 	;	   EDX = LFBINFO table/structure (in user's buffer addr)
  3636                              <1> 	;	   EDX = 0 -> Invalid LFBINFO (do not use it)
  3637                              <1> 	;
  3638                              <1> 	;	EAX = 0 -> Error (but EDX will not be changed)
  3639                              <1> 	;
  3640                              <1> 	; 03/12/2020
  3641                              <1> 	; VESA VBE3 VIDEO BIOS (32 bit) PROTECTED MODE INTERFACE SETTINGS
  3642                              <1> 	;
  3643                              <1> 	;	BH = 9 = set/get VBE3 Protected Mode Interface parameters
  3644                              <1> 	;
  3645                              <1> 	;		BL = 0 - Disable protected mode interface
  3646                              <1> 	;			([pmi32] = 0)
  3647                              <1> 	;		 	Return: AL = 1
  3648                              <1> 	;		BL = 1 - Enable protected mode Interface
  3649                              <1> 	;			([pmi32] = 1)
  3650                              <1> 	;			Return: AL = 2
  3651                              <1> 	;		BL = 2 - Get protected mode interface status
  3652                              <1> 	;			Return: AL = [pmi32] + 1 (AL = 1 or 2)
  3653                              <1> 	;
  3654                              <1> 	;		If [vbe3] <> 3 --> AL = 0
  3655                              <1> 	;
  3656                              <1> 	;		; 17/01/2021
  3657                              <1> 	;		BL = 3 - Disable/Cancel restore permission to user
  3658                              <1> 	;			Return: AL = 1 (if disabled) or 0
  3659                              <1> 	;		BL = 4 - Enable/Give restore permission to user
  3660                              <1> 	;			Return: AL = 2 (if enabled) or 0
  3661                              <1> 	;		BL = 5 - Get video state save/restore status
  3662                              <1> 	;			 (permission status)
  3663                              <1> 	;		        Return: AL = Status (enabled = 1)
  3664                              <1> 	;				; 22/01/2021
  3665                              <1> 	;				AH = state options ([srvso])
  3666                              <1> 	;		BL = 6 - Return VESA VBE number/status
  3667                              <1> 	;		        Return: AX = status
  3668                              <1> 	;			      if AH =  2, AL > 0 : Emulator
  3669                              <1> 	;				 AH =  3, VESA VBE3 video bios
  3670                              <1> 	;		; 28/02/2021
  3671                              <1> 	;		BL = 7 - Set true color mode as 32bpp (default)
  3672                              <1> 	;			Return: AX = 32 (if VBE3) 
  3673                              <1> 	;		NOTE: Initial/default value is 32bpp for vbe3.
  3674                              <1> 	;			Return: AX = 0 -> error
  3675                              <1> 	;		BL = 8 - Set true color mode as 24bpp (default)
  3676                              <1> 	;			Return: AX = 24
  3677                              <1> 	;			;Return: AX = 0 -> error
  3678                              <1> 	;		BL = 9 - Return default/current true color mode
  3679                              <1> 	;			Return: AX = 32 (32 bpp)
  3680                              <1> 	;			Return: AX = 24 (24 bpp)
  3681                              <1> 	;			Return: AX = 0 -> error (not VESA bios)
  3682                              <1> 	;
  3683                              <1> 	;		BL > 9 : not implemented (28/02/2021)
  3684                              <1> 	;
  3685                              <1> 	;	; 19/01/2021 ([u.uid] check)
  3686                              <1> 	;	Note: Enabling/Disabling are done by root ([u.uid] = 0)
  3687                              <1> 	;	      while [multi_tasking] = 0.
  3688                              <1> 	;
  3689                              <1>     	; 23/12/2020
  3690                              <1> 	; VIDEO MEMORY MAPPING:
  3691                              <1> 	;	BH = 10 = Map video memory to user's buffer
  3692                              <1> 	;
  3693                              <1> 	;	   BL = 0 : CGA memory (0B8000h) map (32K)
  3694                              <1> 	;	   BL = 1 : VGA memory (0A0000h) map (64K)
  3695                              <1> 	;	   BL = 2 : SVGA memory (LFB) map to user's buffer
  3696                              <1> 	;
  3697                              <1> 	;	ECX = User's buffer addr (low 12 bits will be cleared)
  3698                              <1> 	;	EDX = Buffer size in bytes (if BL = 2)
  3699                              <1> 	;		(will be trimmed if LFB size < EDX)
  3700                              <1> 	; Return:
  3701                              <1>         ;	EAX = physical address of video memory (buffer)
  3702                              <1> 	;	EBX = mapped (actual) size of video memory (bytes)
  3703                              <1> 	;	ECX = virtual start address of user's video buffer 
  3704                              <1> 	;	EDX is same with EDX input
  3705                              <1> 	;
  3706                              <1> 	;	(Note: Memory page boundaries will be applied 
  3707                              <1> 	;	 to buffer size and buff start addr by rounding down.
  3708                              <1> 	;	 Rounded size & address values must not be zero.) 
  3709                              <1> 	;	-Normally, it is expected to request mapping by using
  3710                              <1> 	;	 correct buffer size of current or desired video mode-
  3711                              <1> 	;
  3712                              <1> 	;	EAX = 0 -> error ! memory can not mapped to user
  3713                              <1> 	;
  3714                              <1> 	; 04/01/2021
  3715                              <1> 	; SET/READ COLOR PALETTE (set/read DAC color registers)
  3716                              <1> 	;	((256 colors (8bpp) VGA/CGA video hardware feature))
  3717                              <1> 	;
  3718                              <1> 	;	BH = 11 = Set/Read DAC color registers
  3719                              <1> 	;
  3720                              <1> 	;	   (BL<4 Original method for std VGA video hardware)
  3721                              <1> 	;	   BL = 0 : Read all DAC color registers (256 colors)
  3722                              <1> 	;	       (6 bit colors, in RGB order)
  3723                              <1> 	;	   BL = 1 : Set all DAC color registers (256 colors)
  3724                              <1> 	;	       (6 bit colors, in RGB order)
  3725                              <1> 	;	   BL = 2 : Read single DAC color register
  3726                              <1> 	;	       (6 bit color, in RGB order)
  3727                              <1> 	;		((EAX will return with color value))
  3728                              <1> 	;		CL = DAC color register (index)
  3729                              <1> 	;	   BL = 3 : Set/Write single DAC color register
  3730                              <1> 	;	       (6 bit color, in RGB order, bit 6&7 are 0)
  3731                              <1> 	;		ECX byte 0 - DAC color register
  3732                              <1> 	;		ECX byte 1 - Red (6 bit)
  3733                              <1> 	;		ECX byte 2 - Green (6 bit)
  3734                              <1> 	;		ECX byte 3 - Blue (6 bit)
  3735                              <1> 	;	   (BL>3 Alternative method for BMP files etc.)	
  3736                              <1> 	;	   BL = 4 : Read all DAC color registers (256 colors)
  3737                              <1> 	;	       (8 bit colors, in BGR order, bit 0&1 is 0)
  3738                              <1> 	;	   BL = 5 : Set all DAC color registers (256 colors)
  3739                              <1> 	;	       (8 bit colors, in BGR order, bit 0&1 is 0)
  3740                              <1> 	;	   BL = 6 : Read single DAC color register
  3741                              <1> 	;	       (8 bit color, in BGR order, bit 0&1 is 0)
  3742                              <1> 	;		((EAX will return with color value))
  3743                              <1> 	;		CL = DAC color register (index)
  3744                              <1> 	;	   BL = 7 : Set/Write single DAC color register
  3745                              <1> 	;	       (8 bit color, bit 0&1 are 0)
  3746                              <1> 	;		ECX byte 0 - DAC color register
  3747                              <1> 	;		ECX byte 1 - Blue (8 bit)
  3748                              <1> 	;		ECX byte 2 - Green (8 bit)
  3749                              <1> 	;		ECX byte 3 - Red (8 bit)
  3750                              <1> 	;
  3751                              <1> 	;	  BL > 7 : invalid (not implemented)
  3752                              <1> 	;
  3753                              <1> 	;   if BL bit 2 is 1, 6 bit colors converted to 8 bit colors
  3754                              <1> 	;	(low two bits of color bytes will be 0)
  3755                              <1> 	;     ((color byte 00111111b will be converted to 11111100b))
  3756                              <1> 	;	and RGB byte order will be 
  3757                              <1> 	;		byte 0 - Blue (low 2 bits are 0)
  3758                              <1> 	;		byte 1 - Green (low 2 bits are 0)
  3759                              <1> 	;		byte 2 - Red (low 2 bits are 0)
  3760                              <1> 	;		byte 3 - pad (or zero byte)
  3761                              <1> 	;	and 256 colors buffer size must be 256*4 = 1024 bytes
  3762                              <1> 	;   if BL bit 2 is 0, 6 bit colors will be used directly
  3763                              <1> 	;	  (high two bits of 8 bit color bytes will be 0)
  3764                              <1> 	;     ((dac color 111111b will be converted to 00111111b))
  3765                              <1> 	;		byte 0 - Red (high 2 bits are 0)
  3766                              <1> 	;		byte 1 - Green (high 2 bits are 0)
  3767                              <1> 	;		byte 2 - Blue (high 2 bits are 0)
  3768                              <1> 	;	and 256 colors buffer size must be 256*3 = 768 bytes
  3769                              <1> 	;
  3770                              <1> 	;	ECX = User's buffer addr (256*3 = 768 bytes) or
  3771                              <1> 	;	      Color
  3772                              <1> 	;
  3773                              <1> 	; Return:
  3774                              <1>         ;	EAX = buffer size (for BL input = 0,1,4,5)
  3775                              <1> 	;	      or color value (for BL input = 2,3,6,7)
  3776                              <1> 	;
  3777                              <1> 	; 10/01/2021
  3778                              <1> 	; SET/READ FONT DATA
  3779                              <1> 	;
  3780                              <1> 	;	BH = 12 = Set/Read Character Font Data
  3781                              <1> 	;
  3782                              <1> 	;	   BL = 0 : Disable system font overwrite
  3783                              <1> 	;	   BL = 1 : Enable system font overwrite
  3784                              <1> 	;	   BL = 2 : Read system font 8x8
  3785                              <1> 	;	   BL = 3 : Read system font 8x14
  3786                              <1> 	;	   BL = 4 : Read system font 8x16
  3787                              <1> 	;	   BL = 5 : Read user defined font 8x8
  3788                              <1> 	;	   BL = 6 : Read user defined font 8x16
  3789                              <1> 	;	   BL = 7 : Write system font 8x8
  3790                              <1> 	;	   BL = 8 : Write system font 8x14
  3791                              <1> 	;	   BL = 9 : Write system font 8x16
  3792                              <1> 	;	   BL = 10 : Write user defined font 8x8
  3793                              <1> 	;	   BL = 11 : Write user defined font 8x16
  3794                              <1> 	;
  3795                              <1> 	;	  BL > 11 : invalid (not implemented)
  3796                              <1> 	;
  3797                              <1> 	;	For BL = 1 to 11
  3798                              <1> 	;	   ECX = number of characters (<= 256)
  3799                              <1> 	;	   EDX = first character (ascii code in DL)
  3800                              <1> 	;	   ESI = user's buffer address
  3801                              <1> 	;
  3802                              <1> 	; Return:
  3803                              <1>         ;	EAX = number of characters (ecx input)
  3804                              <1> 	;	EAX = 0 -> error
  3805                              <1> 	;	(EAX = 256 for BL = 0 and 1 if successful)
  3806                              <1> 	;
  3807                              <1> 	; Note: system font overwrite permission will be
  3808                              <1> 	;       given if [multi_tasking] = 0
  3809                              <1> 	;	and [u.uid] = 0 (BL = 1) ; 19/01/2021
  3810                              <1> 	;       and if [ufont] bit 7 is 1 (BL = 7,8,9)
  3811                              <1> 	;
  3812                              <1> 	; 18/01/2021
  3813                              <1> 	; SAVE/RESTORE STANDARD VGA VIDEO STATE
  3814                              <1> 	;
  3815                              <1> 	;	BH = 13 = Save/Restore std VGA video state
  3816                              <1> 	;
  3817                              <1> 	;	   BL = 0 : Save VGA state (without DAC regs)
  3818                              <1> 	;		Return: EAX = VideoStateID (>0)
  3819                              <1> 	;			EAX = 0 (failed!)
  3820                              <1> 	;	       (size: 110 bytes for TRDOS 386 v2.0.3)
  3821                              <1> 	;	   BL = 1 : Restore VGA state (without DAC regs)
  3822                              <1> 	;		ECX = VideoStateID (to be verified)
  3823                              <1> 	;	        Return: EAX = Restore size (>0)
  3824                              <1> 	;	   BL = 2 : Save VGA state (complete)
  3825                              <1> 	;		Return: EAX = VideoStateID (>0)
  3826                              <1> 	;			EAX = 0 (failed!)
  3827                              <1> 	;	       (size: 882 bytes for TRDOS 386 v2.0.3)
  3828                              <1> 	;	   BL = 3 : Restore VGA state (complete)
  3829                              <1> 	;		ECX = VideoStateID (to be verified)
  3830                              <1> 	;	        Return: EAX = Restore size (>0)
  3831                              <1> 	;
  3832                              <1> 	;	* Above options are for saving
  3833                              <1> 	;	*       video state to system memory
  3834                              <1> 	;	*	(location: VBE3VIDEOSTATE, 2048 bytes)
  3835                              <1> 	;
  3836                              <1> 	;	   BL = 4 : Save VGA state (without DAC regs)
  3837                              <1> 	;		ECX = buffer address
  3838                              <1> 	;		Return: EAX = transfer count
  3839                              <1> 	;	       (size: 110 bytes for TRDOS 386 v2.0.3)
  3840                              <1> 	;		ECX = buffer address
  3841                              <1> 	;	   BL = 5 : Restore VGA state (without DAC regs)
  3842                              <1> 	;		ECX = buffer address
  3843                              <1> 	;	        Return: EAX = transfer count
  3844                              <1> 	;	   BL = 6 : Save VGA state (complete)
  3845                              <1> 	;		ECX = buffer address
  3846                              <1> 	;		Return: EAX = transfer count
  3847                              <1> 	;	       (size: 882 bytes for TRDOS 386 v2.0.3)
  3848                              <1> 	;	   BL = 7 : Restore VGA state (complete)
  3849                              <1> 	;		ECX = buffer address
  3850                              <1> 	;	        Return: EAX = transfer count
  3851                              <1> 	;
  3852                              <1> 	;	* Above options are for saving
  3853                              <1> 	;	*       video state to user's buffer
  3854                              <1> 	;	*	(buffer size: 110 bytes or 882 bytes)
  3855                              <1> 	;
  3856                              <1> 	;	  BL > 7 : invalid (not implemented)
  3857                              <1> 	;
  3858                              <1> 	; 18/01/2021
  3859                              <1> 	; SAVE/RESTORE SUPER VGA (VESA VBE 2/3) VIDEO STATE
  3860                              <1> 	;
  3861                              <1> 	;	BH = 14 = Save/Restore SVGA video state
  3862                              <1> 	;
  3863                              <1> 	;	   BL = options
  3864                              <1> 	;		bit 0 - Save (0) or Restore (1)
  3865                              <1> 	;		bit 1 - controller hardware state
  3866                              <1> 	;		bit 2 - BIOS data state
  3867                              <1> 	;		bit 3 - DAC state
  3868                              <1> 	;		bit 4 - (extended) Register state
  3869                              <1> 	;		bit 5 - system (0) or user (1) memory
  3870                              <1> 	;		bit 6 - verify without transfer
  3871                              <1> 	;		bit 7 - not used (must be 0)
  3872                              <1> 	;
  3873                              <1> 	;	     if bit 0 = 0 and bit 5 = 0
  3874                              <1> 	;		Return:	EAX = VideoStateID (>0)
  3875                              <1> 	;	     if bit 0 = 1
  3876                              <1> 	;		ECX = VideoStateID (bit 5 = 0)
  3877                              <1> 	;		Return: EAX = restore (transfer) size
  3878                              <1> 	;	     if bit 5 = 1
  3879                              <1> 	;		ECX = Buffer address
  3880                              <1> 	;		Return: EAX = transfer count (size)
  3881                              <1> 	;
  3882                              <1> 	;	     ECX = Buffer address or VideoStateID
  3883                              <1> 	;
  3884                              <1> 	;	  BL > 127 : invalid (not implemented)
  3885                              <1> 	;
  3886                              <1> 	;  Note: Required buffer size may be > 2048 bytes
  3887                              <1> 	;	 (function fails when buff size > 2048 bytes)
  3888                              <1> 	;	 proper option must be used
  3889                              <1> 	;
  3890                              <1> 	; 18/01/2021
  3891                              <1> 	; READ VESA EDID (EXTENDED DISPLAY IDENTIFICATION DATA)
  3892                              <1> 	;
  3893                              <1> 	;	BH = 15 = Read VESA EDID for connected monitor
  3894                              <1> 	;		  (copy EDID to user)
  3895                              <1> 	;
  3896                              <1> 	;	   BL = any
  3897                              <1> 	;
  3898                              <1> 	;	Input:
  3899                              <1> 	;	    ECX = user's (EDID) buffer address 
  3900                              <1> 	;		 (buffer size: 128 bytes)
  3901                              <1> 	;	Output:
  3902                              <1> 	;	    EAX = 128 (EDID size)
  3903                              <1> 	;	    or EAX = 0 -> Error!
  3904                              <1> 	;	       (EDID not ready or buffer addr error)
  3905                              <1> 	;
  3906                              <1> 
  3907                              <1> 	; 16/05/2016
  3908 0000D7F7 31C0                <1> 	xor	eax, eax
  3909 0000D7F9 A3[AC940100]        <1> 	mov	[u.r0], eax
  3910 0000D7FE 20FF                <1> 	and	bh, bh
  3911                              <1> 	;jnz	sysvideo_13 ; 11/07/2016
  3912                              <1> 	; 23/07/2022
  3913 0000D800 7405                <1> 	jz	short sysvideo_40
  3914 0000D802 E974020000          <1> 	jmp	sysvideo_13
  3915                              <1> 
  3916                              <1> sysvideo_40:	; 23/07/2022
  3917                              <1> 	;; 21/11/2020 (TRDOS 386 v2.0.3)
  3918                              <1> 	;; tty/text mode transfers are only for video mode 3
  3919                              <1> 
  3920                              <1> 	; 22/11/2020
  3921                              <1> 	;cmp	byte [CRT_MODE], 3 ; 80x25 text, 16 colors
  3922                              <1> 	;jne	sysret ; invalid (nothing to do), [u.r0] = 0
  3923                              <1> 	
  3924                              <1> 	; 23/11/2020
  3925                              <1> 	; bit 7,6,5,4 of BL are reserved and it must be 0
  3926                              <1> 	;	 	 for current 'sysvideo' version
  3927                              <1> 	;test	bl, 0F0h
  3928                              <1> 	;;jnz	sysret ; invalid (undefined) !
  3929                              <1> 	;; 28/01/2021
  3930                              <1> 	;jnz	short sysvideo_1_2 ; invalid (undefined) !
  3931                              <1> 	; 28/01/2021
  3932 0000D807 80FB07              <1> 	cmp	bl, 7
  3933 0000D80A 776E                <1> 	ja	short sysvideo_1_2 ; invalid (undefined) !
  3934                              <1> 
  3935                              <1> 	; Video mode 0, 80*25 text mode, CGA 16 colors  
  3936                              <1> 	; [CRT_MODE] = 3
  3937                              <1> 	;mov	bh, bl
  3938                              <1> 	;shr	bh, 2 ; 4..7 -> 1, 8..11 -> 2, 12..15 -> 3
  3939                              <1> 	;; 21/11/2020
  3940                              <1> 	;;and	bh, bh
  3941                              <1>         ;jnz	sysvideo_4  ; Display page window transfer etc.
  3942                              <1> 
  3943                              <1> 	; 28/01/2021
  3944 0000D80C F6C304              <1> 	test	bl, 4 ; bit 2
  3945                              <1> 	;jnz	sysvideo_4 ; Display page window transfer
  3946                              <1> 	; 23/07/2022
  3947 0000D80F 7405                <1> 	jz	short sysvideo_41
  3948 0000D811 E9A1000000          <1> 	jmp	sysvideo_4
  3949                              <1> sysvideo_41:	; 23/07/2022
  3950                              <1> 	; Display page (complete) transfer
  3951 0000D816 80FA07              <1> 	cmp	dl, 7
  3952                              <1> 	;jnz	sysret ; invalid (nothing to do), [u.r0] = 0
  3953 0000D819 760A                <1> 	jna	short sysvideo_0 ; 28/01/2021
  3954 0000D81B FEC2                <1> 	inc	dl ; 0FFh -> 0 ("use current video page")
  3955 0000D81D 755B                <1> 	jnz	short sysvideo_1_2  ; invalid
  3956                              <1> 	; dl = 0 -> use current current page
  3957 0000D81F 8A15[1E7D0100]      <1> 	mov	dl, [ACTIVE_PAGE]
  3958                              <1> sysvideo_0:
  3959                              <1> 	; 28/01/2021
  3960 0000D825 80FB03              <1> 	cmp	bl, 3
  3961 0000D828 7206                <1> 	jb	short sysvideo_0_0
  3962 0000D82A 09FF                <1> 	or	edi, edi
  3963 0000D82C 744C                <1> 	jz	short sysvideo_1_2  ; invalid
  3964 0000D82E 89FE                <1> 	mov	esi, edi ; save swap/exchange buffer addr
  3965                              <1> 	; ecx = user buffer for new video page content
  3966                              <1> 	; esi = user (swap) buffer for saving current video page
  3967                              <1> sysvideo_0_0:
  3968 0000D830 BF00800B00          <1> 	mov	edi, 0B8000h
  3969                              <1> 	; dl = display page number, destination
  3970 0000D835 66B80010            <1> 	mov	ax, 4096 ; 21/11/2020
  3971 0000D839 20D2                <1> 	and	dl, dl
  3972 0000D83B 7408                <1> 	jz	short sysvideo_1
  3973                              <1> 	; 07/02/2021
  3974 0000D83D 88D6                <1> 	mov	dh, dl
  3975                              <1> sysvideo_0_1:
  3976                              <1> 	; page length = 4096 bytes (but page content is 80*25*2 bytes)
  3977 0000D83F 01C7                <1> 	add	edi, eax ; 21//11/2020 ([CRT_LEN] = 1000h for mode 3)
  3978 0000D841 FECE                <1> 	dec	dh
  3979 0000D843 75FA                <1> 	jnz	short sysvideo_0_1
  3980                              <1> sysvideo_1:
  3981 0000D845 80E303              <1> 	and	bl, 3
  3982 0000D848 7535                <1> 	jnz	short sysvideo_2 ; user to system display page transfer
  3983                              <1> 	; system to system video page (content) transfer
  3984                              <1> 	; cl = display page number, source
  3985 0000D84A 80F907              <1> 	cmp	cl, 7
  3986                              <1> 	;ja	sysret ; invalid (nothing to do), [u.r0] = 0
  3987 0000D84D 760A                <1> 	jna	short sysvideo_1_0
  3988 0000D84F FEC1                <1> 	inc	cl ; 0FFh -> 0 ("use current video page")
  3989 0000D851 7527                <1> 	jnz	short sysvideo_1_2  ; invalid
  3990 0000D853 8A0D[1E7D0100]      <1> 	mov	cl, [ACTIVE_PAGE]
  3991                              <1> sysvideo_1_0:
  3992                              <1> 	; 28/01/2021
  3993 0000D859 38D1                <1> 	cmp	cl, dl
  3994 0000D85B 741D                <1> 	je	short sysvideo_1_2  ; same video page !
  3995                              <1> 
  3996                              <1> 	; system to system video/display page transfer (mode 0)
  3997                              <1> 	; 21/11/2020
  3998                              <1> 	;mov	esi, 0B8000h
  3999                              <1> 	;movzx	eax, cl
  4000                              <1> 	;mov	edx, 4096 ; [CRT_LEN] = 1000h for video mode 3
  4001                              <1> 	;mov	ecx, edx
  4002                              <1> 	;mul	edx
  4003                              <1> 	;add	esi, eax
  4004                              <1> 	; 28/01/2021
  4005                              <1> 	;movzx	esi, cl
  4006                              <1> 	;shl	si, 12 ; * 4096
  4007                              <1> 	;add	esi, 0B8000h
  4008                              <1> 	
  4009                              <1> 	; 28/01/2021
  4010 0000D85D A3[AC940100]        <1> 	mov	[u.r0], eax ; 4096
  4011 0000D862 BE00800B00          <1> 	mov	esi, 0B8000h
  4012 0000D867 08C9                <1> 	or	cl, cl
  4013 0000D869 7409                <1> 	jz	short sysvideo_1_1
  4014                              <1> 	; 07/02/2021
  4015                              <1> 	;mov	al, cl ; display/video page
  4016                              <1> 	;xor	ah, ah
  4017                              <1> 	;shl	ax, 12 ; * 4096
  4018                              <1> 	; 23/07/2022
  4019 0000D86B 30C0                <1>  	xor	al, al
  4020                              <1> 	;xor	eax, eax
  4021 0000D86D 88CC                <1> 	mov	ah, cl ; CL * 256
  4022 0000D86F C1E004              <1> 	shl	eax, 4 ; * 16 = CL * 4096
  4023 0000D872 01C6                <1> 	add	esi, eax
  4024                              <1> sysvideo_1_1:
  4025                              <1> 	; 21/11/2020
  4026                              <1> 	;;mov	ecx, 4096
  4027                              <1> 	;mov	ecx, eax ; 4096
  4028                              <1> 	;;mov	[u.r0], ecx ; 4096 bytes
  4029                              <1> 	; 28/01/2021
  4030                              <1> 	;mov	[u.r0], cx
  4031 0000D874 31C9                <1> 	xor	ecx, ecx
  4032 0000D876 B504                <1> 	mov	ch, 4 ; mov ecx, 1024
  4033                              <1> 	;shr	cx, 2 ; / 4
  4034 0000D878 F3A5                <1> 	rep	movsd
  4035                              <1> sysvideo_1_2:
  4036 0000D87A E921F6FFFF          <1> 	jmp	sysret
  4037                              <1> sysvideo_2:
  4038 0000D87F 80FB02              <1> 	cmp	bl, 2
  4039                              <1>         ;ja	sysret; invalid (user to user), [u.r0] = 0
  4040                              <1> 	; 28/01/2021
  4041 0000D882 7226                <1> 	jb	short sysvideo_3 ; user to system
  4042 0000D884 7404                <1> 	je	short sysvideo_2_0 ; system to user
  4043                              <1> 	; bl = 3
  4044 0000D886 89CA                <1> 	mov	edx, ecx ; save user's buffer addr
  4045 0000D888 89F1                <1> 	mov	ecx, esi ; save swap address
  4046                              <1> sysvideo_2_0:
  4047                              <1> 	; bl = 2 (or bl = 3, stage 1)
  4048                              <1> 	; system to user video/display page transfer (mode 0)
  4049 0000D88A 89FE                <1> 	mov	esi, edi
  4050 0000D88C 89CF                <1> 	mov	edi, ecx ; user buffer ; 28/01/2021
  4051                              <1> 	; 21/11/2020
  4052 0000D88E 89C1                <1> 	mov	ecx, eax ; 4096
  4053 0000D890 E81B370000          <1> 	call	transfer_to_user_buffer ; fast transfer
  4054                              <1> 	;jc	sysret ; [u.r0] = 0
  4055 0000D895 72E3                <1> 	jc	short sysvideo_1_2 ; 28/01/2021
  4056                              <1> 	; 28/01/2021
  4057 0000D897 80FB03              <1> 	cmp	bl, 3
  4058 0000D89A 7408                <1> 	je	short sysvideo_2_2
  4059                              <1> sysvideo_2_1:
  4060                              <1> 	; 21/11/2020
  4061 0000D89C 890D[AC940100]      <1> 	mov	[u.r0], ecx
  4062                              <1> 	;;mov	[u.r0], cx
  4063                              <1> 	;jmp	sysret
  4064 0000D8A2 EBD6                <1> 	jmp	short sysvideo_1_2
  4065                              <1> 
  4066                              <1> sysvideo_2_2:
  4067                              <1> 	; bl = 3 (exchange/swap) complete display page
  4068                              <1> 	; esi = video page start address
  4069                              <1> 	; edx = user's buffer address
  4070                              <1> 	
  4071                              <1> 	;mov	ecx, 4096
  4072 0000D8A4 89F7                <1> 	mov	edi, esi ; video page start address
  4073 0000D8A6 89D6                <1> 	mov	esi, edx ; user's (new page) buffer address
  4074 0000D8A8 EB04                <1> 	jmp	short sysvideo_2_3
  4075                              <1> sysvideo_3: 
  4076                              <1> 	; bl = 1 (or bl = 3, stage 2)
  4077                              <1> 	; user to system video/display page transfer (mode 0)
  4078 0000D8AA 89CE                <1> 	mov	esi, ecx ; user buffer
  4079                              <1> 	; edi = video page address
  4080                              <1> 	; 21/11/2020
  4081 0000D8AC 89C1                <1> 	mov	ecx, eax ; 4096
  4082                              <1> sysvideo_2_3:
  4083 0000D8AE E847370000          <1> 	call	transfer_from_user_buffer ; fast transfer
  4084                              <1> 	;jc	sysret ; [u.r0] = 0
  4085 0000D8B3 72C5                <1> 	jc	short sysvideo_1_2 ; 28/01/2021
  4086 0000D8B5 EBE5                <1> 	jmp	short sysvideo_2_1
  4087                              <1> 
  4088                              <1> 	; 21/11/2020
  4089                              <1> 	;mov	[u.r0], ecx
  4090                              <1> 	;;mov	[u.r0], cx
  4091                              <1> 	;;jmp	sysret
  4092                              <1> 	;jmp	short sysvideo_1_2 ; 28/01/2021
  4093                              <1> 
  4094                              <1> sysvideo_4:
  4095                              <1> 	; 23/07/2022
  4096                              <1> 	; 23/11/2020 (TRDOS 386 v2.0.3)
  4097                              <1> 
  4098                              <1> 	; Display page window transfer etc.
  4099 0000D8B7 80E303              <1> 	and	bl, 3
  4100                              <1>         ;jnz	sysvideo_9 ; user to system or system to user
  4101                              <1> 	; 23/07/2022
  4102 0000D8BA 7405                <1> 	jz	short sysvideo_4_0
  4103 0000D8BC E9E3000000          <1> 	jmp	sysvideo_9
  4104                              <1> sysvideo_4_0:
  4105                              <1> 	; 21/11/2020
  4106                              <1> 	; system to system video/display page window transfer (mode 0)
  4107 0000D8C1 81FE00800B00        <1> 	cmp	esi, 0B8000h	; source buffer address (system)
  4108                              <1> 	;jb	sysret
  4109                              <1> 	; 23/07/2022
  4110 0000D8C7 7245                <1> 	jb	short sysvideo_4_3  ; jmp sysret
  4111 0000D8C9 81FE00000C00        <1> 	cmp	esi, 0B8000h+(4096*8)
  4112                              <1> 	; 23/07/2022
  4113                              <1> 	;jnb	sysret
  4114 0000D8CF 733D                <1> 	jnb	short sysvideo_4_3  ; jmp sysret
  4115 0000D8D1 81FF00800B00        <1> 	cmp	edi, 0B8000h	; destination buffer address (system)
  4116                              <1> 	;jb	sysret
  4117                              <1> 	; 23/07/2022
  4118 0000D8D7 7235                <1> 	jb	short sysvideo_4_3  ; jmp sysret
  4119 0000D8D9 81FF00000C00        <1>         cmp     edi, 0B8000h+(4096*8)
  4120                              <1> 	; 23/07/2022
  4121                              <1> 	;jnb	sysret
  4122 0000D8DF 732D                <1> 	jnb	short sysvideo_4_3  ; jmp sysret
  4123                              <1> 	;
  4124 0000D8E1 51                  <1> 	push	ecx ; X1 and Y1 position - top left column, row
  4125 0000D8E2 0FB7C1              <1> 	movzx	eax, cx ; top left column
  4126                              <1> 	; 21/11/2020
  4127 0000D8E5 C1E910              <1> 	shr	ecx, 16 ; top row
  4128 0000D8E8 740E                <1> 	jz	short sysvideo_4_1 ; bypass following code
  4129 0000D8EA 52                  <1> 	push	edx ; X2 and Y2 position - bottom right column, row
  4130 0000D8EB 50                  <1> 	push	eax
  4131 0000D8EC 66B8A000            <1> 	mov	ax, 80*2 ; 80 colums, 160 bytes per row
  4132 0000D8F0 F7E1                <1> 	mul	ecx
  4133                              <1> 		; eax = offset for start row number 
  4134 0000D8F2 01C6                <1> 	add	esi, eax
  4135 0000D8F4 01C7                <1> 	add	edi, eax
  4136 0000D8F6 58                  <1> 	pop	eax
  4137 0000D8F7 5A                  <1> 	pop	edx
  4138                              <1> sysvideo_4_1:
  4139                              <1> 	;shl	ax, 1 ; * 2 ; convert start column number to offset
  4140                              <1> 	; 23/07/2022
  4141 0000D8F8 D1E0                <1> 	shl	eax, 1
  4142 0000D8FA 7404                <1> 	jz	short sysvideo_4_2
  4143 0000D8FC 01C6                <1> 	add	esi, eax
  4144 0000D8FE 01C7                <1> 	add	edi, eax
  4145                              <1> 		; esi = source page window start offset
  4146                              <1> 		; edi = destination page window start offset
  4147                              <1> sysvideo_4_2:
  4148 0000D900 59                  <1> 	pop	ecx
  4149                              <1> 	;mov	eax, 0B8000h+(80*25*2*8)
  4150                              <1> 	; 21/11/2020
  4151 0000D901 B800000C00          <1> 	mov	eax, 0B8000h+(4096*8)
  4152 0000D906 39C6                <1> 	cmp	esi, eax
  4153                              <1> 	;jnb	sysret ; out of video page
  4154                              <1> 	; 23/07/2022
  4155 0000D908 7304                <1> 	jnb	short sysvideo_4_3  ; jmp sysret
  4156 0000D90A 39C6                <1> 	cmp	esi, eax
  4157                              <1> 	;jnb	sysret  ;out of video page
  4158                              <1> 	; 23/07/2022
  4159 0000D90C 7205                <1> 	jb	short sysvideo_4_4
  4160                              <1> sysvideo_4_3:
  4161 0000D90E E98DF5FFFF          <1> 	jmp	sysret
  4162                              <1> sysvideo_4_4:
  4163 0000D913 56                  <1> 	push	esi ; ****
  4164 0000D914 57                  <1> 	push	edi ; ***
  4165 0000D915 52                  <1> 	push	edx ; **
  4166 0000D916 51                  <1> 	push	ecx ; *
  4167 0000D917 C1E910              <1> 	shr	ecx, 16 ; top row
  4168 0000D91A C1EA10              <1> 	shr	edx, 16 ; bottom row
  4169                              <1> 	; 21/11/2020
  4170                              <1> 	;cmp	ecx, 24 ; max. 25 rows
  4171 0000D91D 6683F918            <1> 	cmp	cx, 24
  4172 0000D921 7778                <1> 	ja	short sysvideo_6 ; invalid, [u.r0] = 0
  4173                              <1> 	;cmp	edx, 24 ; max. 25 rows
  4174 0000D923 6683FA18            <1> 	cmp	dx, 24
  4175 0000D927 7772                <1> 	ja	short sysvideo_6 ; invalid, [u.r0] = 0
  4176 0000D929 28CA                <1> 	sub	dl, cl ; end >= start
  4177 0000D92B 726E                <1> 	jc	short sysvideo_6 ; invalid, [u.r0] = 0
  4178                              <1> 	; 21/11/2020
  4179 0000D92D 89D3                <1> 	mov	ebx, edx ; row count - 1
  4180 0000D92F 7415                <1> 	jz	short sysvideo_4_5
  4181 0000D931 50                  <1> 	push	eax ; *****
  4182 0000D932 B8A0000000          <1> 	mov	eax, 80*2 ; bytes per row
  4183 0000D937 F7E3                <1> 	mul	ebx ; 21/11/2020
  4184                              <1> 		; eax = window end offset 
  4185                              <1> 		; (for the last row, before adding column bytes)
  4186 0000D939 01C6                <1> 	add	esi, eax
  4187 0000D93B 01C7                <1> 	add	edi, eax
  4188 0000D93D 58                  <1> 	pop	eax ; ***** ; mode 3 video memory end (0C000h)
  4189 0000D93E 39C6                <1> 	cmp	esi, eax
  4190                              <1> 	;ja	short sysvideo_6 ; invalid, [u.r0] = 0
  4191 0000D940 7359                <1> 	jnb	short sysvideo_6 ; 21/11/2020
  4192 0000D942 39C7                <1> 	cmp	edi, eax
  4193                              <1> 	;ja	short sysvideo_6 ; invalid, [u.r0] = 0
  4194 0000D944 7355                <1> 	jnb	short sysvideo_6 ; 21/11/2020
  4195                              <1> sysvideo_4_5:
  4196 0000D946 59                  <1> 	pop	ecx ; *
  4197 0000D947 5A                  <1> 	pop	edx ; **
  4198 0000D948 81E1FFFF0000        <1> 	and	ecx, 0FFFFh
  4199 0000D94E 81E2FFFF0000        <1> 	and	edx, 0FFFFh
  4200                              <1> 	; 21/11/2020
  4201                              <1> 	;cmp	ecx, 79 ; max. 80 columns
  4202 0000D954 6683F94F            <1> 	cmp	cx, 79
  4203 0000D958 7743                <1> 	ja	short sysvideo_7 ; invalid, [u.r0] = 0
  4204                              <1> 	;cmp	edx, 79 ; max. 80 columns
  4205 0000D95A 6683FA4F            <1> 	cmp	dx, 79 
  4206 0000D95E 773D                <1> 	ja	short sysvideo_7 ; invalid, [u.r0] = 0
  4207 0000D960 28CA                <1> 	sub	dl, cl
  4208 0000D962 7639                <1> 	jna	short sysvideo_7 ; invalid, [u.r0] = 0
  4209                              <1> 	; 21/11/2020
  4210 0000D964 740E                <1> 	jz	short sysvideo_4_6 
  4211                              <1> 	; edx = column count (width) - 1
  4212 0000D966 D0E2                <1> 	shl	dl, 1 ; * 2 ; byte offset (in end row)
  4213 0000D968 01D6                <1> 	add	esi, edx
  4214 0000D96A 01D7                <1> 	add	edi, edx
  4215                              <1> 		; esi = source page window end offset
  4216                              <1> 		; edi = destination page window end offset
  4217 0000D96C 39C6                <1> 	cmp	esi, eax ; video memory end
  4218                              <1> 	;ja	short sysvideo_7
  4219 0000D96E 732D                <1> 	jnb	short sysvideo_7 ; 21/11/2020
  4220 0000D970 39C7                <1> 	cmp	edi, eax ; video memory end
  4221                              <1> 	;ja	short sysvideo_7
  4222 0000D972 7329                <1> 	jnb	short sysvideo_7 ; 21/11/2020
  4223                              <1> sysvideo_4_6:
  4224 0000D974 5F                  <1> 	pop	edi ; ***
  4225 0000D975 5E                  <1> 	pop	esi ; ****
  4226 0000D976 FEC3                <1> 	inc	bl ; row count - 1 -> row count
  4227 0000D978 FEC2                <1> 	inc	dl ; column count
  4228 0000D97A 88D7                <1> 	mov	bh, dl
  4229 0000D97C D0E2                <1> 	shl	dl, 1 ; convert column count to byte offset
  4230                              <1> 	; 21/11/2020
  4231                              <1> 	; esi = source page window start offset
  4232                              <1> 	; edi = destination page window start offset
  4233 0000D97E B8A0000000          <1> 	mov	eax, 80*2 ; bytes per row
  4234                              <1> 	; Note: 160 bytes per row (even if move count < 160)
  4235                              <1> sysvideo_5:
  4236 0000D983 88F9                <1> 	mov	cl, bh ; move/transfer -word- count per row
  4237 0000D985 0115[AC940100]      <1> 	add	[u.r0], edx ; transfer count in bytes
  4238 0000D98B F366A5              <1> 	rep	movsw
  4239 0000D98E 01C6                <1> 	add	esi, eax ; + 160 bytes to next row
  4240 0000D990 01C7                <1> 	add	edi, eax ; + 160 bytes to next row
  4241 0000D992 FECB                <1> 	dec	bl ; remain count of rows
  4242 0000D994 75ED                <1> 	jnz	short sysvideo_5
  4243 0000D996 E905F5FFFF          <1> 	jmp	sysret
  4244                              <1> 
  4245                              <1> sysvideo_6:
  4246 0000D99B 59                  <1> 	pop	ecx ; *
  4247 0000D99C 5A                  <1> 	pop	edx ; **
  4248                              <1> sysvideo_7:
  4249 0000D99D 5F                  <1> 	pop	edi ; ***
  4250 0000D99E 5E                  <1> 	pop	esi ; ****
  4251                              <1> sysvideo_8:
  4252 0000D99F E9FCF4FFFF          <1> 	jmp	sysret
  4253                              <1> 
  4254                              <1> sysvideo_9:
  4255                              <1> 	; user to system or system to user window transfer
  4256                              <1> 	; 28/01/2021 (bl = 3 -> swap/exchange)
  4257                              <1> 	;cmp	bl, 2
  4258                              <1> 	;;ja	sysret	; user to user transfer is invalid
  4259                              <1> 	;		; [u.r0] = 0
  4260                              <1> 	;ja	short sysvideo_8 ; 26/12/2020
  4261                              <1> 
  4262                              <1> 	; 28/01/2021
  4263 0000D9A4 80FB02              <1> 	cmp	bl, 2
  4264 0000D9A7 7604                <1> 	jna	short sysvideo_9_8 
  4265                              <1> 
  4266                              <1> 	; swap/ exchange video memory and user mem windows
  4267                              <1> 	; edi = swap address in user's memory space
  4268 0000D9A9 21FF                <1> 	and	edi, edi
  4269 0000D9AB 74F2                <1> 	jz	short sysvideo_8 ; invalid ; 28/01/2021
  4270                              <1> 
  4271                              <1> sysvideo_9_8:
  4272 0000D9AD 56                  <1> 	push	esi ; ****
  4273 0000D9AE 57                  <1> 	push	edi ; ***
  4274 0000D9AF 52                  <1> 	push	edx ; **
  4275 0000D9B0 51                  <1> 	push	ecx ; *
  4276                              <1> 
  4277 0000D9B1 C1E910              <1> 	shr	ecx, 16 ; top row
  4278 0000D9B4 C1EA10              <1> 	shr	edx, 16 ; bottom row
  4279                              <1> 
  4280                              <1> 	; 21/11/2020
  4281                              <1> 	;cmp	ecx, 24 ; max. 25 rows
  4282 0000D9B7 6683F918            <1> 	cmp	cx, 24
  4283 0000D9BB 77DE                <1> 	ja	short sysvideo_6 ; invalid, [u.r0] = 0
  4284                              <1> 	;cmp	edx, 24 ; max. 25 rows
  4285 0000D9BD 6683FA18            <1> 	cmp	dx, 24
  4286 0000D9C1 77D8                <1> 	ja	short sysvideo_6 ; invalid, [u.r0] = 0
  4287 0000D9C3 28CA                <1> 	sub	dl, cl
  4288 0000D9C5 72D4                <1> 	jc	short sysvideo_6 ; invalid, [u.r0] = 0
  4289                              <1> 
  4290                              <1> 	;mov	ch, cl ; top row
  4291                              <1> 	;mov	cl, [ACTIVE_PAGE]
  4292                              <1> 
  4293                              <1> 	;mov	edi, 80*25*2 ; 4000
  4294                              <1> 	; 21/11/2020
  4295                              <1> 	;mov	edi, 4096 ; [CRT_LEN = 4096 for video mode 3
  4296                              <1> 	;shl	edi, cl  ; ! wrong for page 2 to page 7 !
  4297                              <1> 	;;add	edi, 0B8000h - 80*25*2
  4298                              <1> 	;add	edi, 0B8000h - 1000h ; - 4096
  4299                              <1> 
  4300                              <1> 	; 21/11/2020
  4301                              <1> 	;xor	eax, eax
  4302                              <1> 	;mov	edi, 0B8000h
  4303                              <1> 	;and	cl, cl ; is video page = 0 ?
  4304                              <1> 	;jz	short sysvideo_9_1 ; yes
  4305                              <1> 	; eax = 0
  4306                              <1> 
  4307                              <1> ;sysvideo_9_0:
  4308                              <1> 	;add	ax, 4096
  4309                              <1> 	;dec	cl
  4310                              <1> 	;jnz	short sysvideo_9_0
  4311                              <1> 	;add	edi, eax
  4312                              <1> 	;	; edi = video page start address
  4313                              <1> 
  4314                              <1> 	; 21/11/2020
  4315 0000D9C7 BF00800B00          <1> 	mov	edi, 0B8000h
  4316 0000D9CC 803D[1E7D0100]00    <1> 	cmp	byte [ACTIVE_PAGE], 0
  4317 0000D9D3 760C                <1> 	jna	short sysvideo_9_1
  4318                              <1> stsvideo_9_0:
  4319 0000D9D5 B010                <1> 	mov	al, 16 ; 4096/256
  4320 0000D9D7 F625[1E7D0100]      <1> 	mul	byte [ACTIVE_PAGE]
  4321 0000D9DD 86E0                <1> 	xchg	ah, al ; * 256
  4322 0000D9DF 01C7                <1> 	add	edi, eax
  4323                              <1> 		; edi = video page start address
  4324                              <1> sysvideo_9_1:
  4325                              <1> 	; bl = transfer direction 
  4326                              <1> 	;     (1 = from user, 2 = to user)
  4327                              <1> 	;     (3 = swap) ; 28/01/2021
  4328 0000D9E1 88D7                <1> 	mov	bh, dl ; row count - 1
  4329                              <1> 	;mov	dl, ch ; top row
  4330                              <1> 	; 21/11/2020
  4331 0000D9E3 08C9                <1> 	or	cl, cl ; top row number
  4332 0000D9E5 7408                <1> 	jz	short sysvideo_9_2
  4333                              <1> 
  4334                              <1> 	;mov	eax, 80*2
  4335 0000D9E7 66B8A000            <1> 	mov	ax, 80*2 ; 160, bytes per row
  4336 0000D9EB F7E1                <1> 	mul	ecx ; 22/11/2020
  4337 0000D9ED 01C7                <1> 	add	edi, eax
  4338                              <1> 		; edi = window start address for top row
  4339                              <1> sysvideo_9_2:
  4340 0000D9EF 59                  <1> 	pop	ecx ; *
  4341 0000D9F0 5A                  <1> 	pop	edx ; **
  4342 0000D9F1 81E1FFFF0000        <1> 	and	ecx, 0FFFFh
  4343 0000D9F7 81E2FFFF0000        <1> 	and	edx, 0FFFFh
  4344                              <1> 	; 21/11/2020
  4345                              <1> 	;cmp	ecx, 79 ; max. 80 columns
  4346 0000D9FD 6683F94F            <1> 	cmp	cx, 79
  4347 0000DA01 779A                <1> 	ja	short sysvideo_7 ; invalid, [u.r0] = 0
  4348                              <1> 	;cmp	edx, 79 ; max. 80 columns
  4349 0000DA03 6683FA4F            <1> 	cmp	dx, 79
  4350 0000DA07 7794                <1> 	ja	short sysvideo_7 ; invalid, [u.r0] = 0
  4351                              <1> 
  4352 0000DA09 28CA                <1> 	sub	dl, cl
  4353 0000DA0B 7290                <1> 	jc	short sysvideo_7 ; invalid, [u.r0] = 0
  4354                              <1> 
  4355 0000DA0D 08C9                <1> 	or	cl, cl ; left column 
  4356 0000DA0F 7404                <1> 	jz	short sysvideo_9_3 ; 0
  4357                              <1> 
  4358                              <1> 	; 21/11/2020
  4359 0000DA11 D0E1                <1> 	shl	cl, 1  ; column * 2
  4360 0000DA13 01CF                <1> 	add	edi, ecx
  4361                              <1> 		; edi = window start addr for top left column
  4362                              <1> sysvideo_9_3:
  4363 0000DA15 88D1                <1> 	mov	cl, dl
  4364 0000DA17 FEC1                <1> 	inc	cl ; column count
  4365 0000DA19 D0E1                <1> 	shl	cl, 1 ; column count * 2
  4366                              <1> 		; ecx = transfer count per row
  4367                              <1> 
  4368 0000DA1B 58                  <1> 	pop	eax ; *** (swap address)
  4369 0000DA1C 5E                  <1> 	pop	esi ; ****
  4370                              <1> 
  4371 0000DA1D FEC7                <1> 	inc	bh  ; row count
  4372                              <1> 	
  4373                              <1> 	;mov	edx, 80*2
  4374 0000DA1F B2A0                <1> 	mov	dl, 80*2  ; bytes per row
  4375                              <1> 	;
  4376                              <1> 	;cmp	bl, 1 ; transfer direction
  4377                              <1> 	;ja	short sysvideo_11 ; system to user transfer
  4378                              <1> 	; 28/01/2021
  4379 0000DA21 F6C301              <1> 	test	bl, 1
  4380 0000DA24 7439                <1> 	jz	short sysvideo_11 ; system to user transfer
  4381                              <1> 
  4382                              <1> 	; user to system video/display page window transfer (mode 0)	
  4383 0000DA26 21C0                <1> 	and	eax, eax ; swap address
  4384 0000DA28 741B                <1> 	jz	short sysvideo_10 ; no window swap
  4385                              <1> sysvideo_9_7: ; 28/01/2021
  4386                              <1> 	; save previous window content in user's buffer (swap address)
  4387 0000DA2A 56                  <1> 	push	esi ; user buffer
  4388 0000DA2B 57                  <1> 	push	edi ; beginning address of the window
  4389                              <1> 	; 21/11/2020
  4390 0000DA2C 53                  <1> 	push	ebx ; save bh
  4391 0000DA2D 89FE                <1> 	mov	esi, edi
  4392 0000DA2F 89C7                <1> 	mov	edi, eax
  4393                              <1> sysvideo_9_4:
  4394 0000DA31 E87A350000          <1> 	call	transfer_to_user_buffer ; fast transfer
  4395 0000DA36 7208                <1> 	jc	short sysvideo_9_5
  4396                              <1> 	; ecx = actual transfer count (must be same with input)
  4397 0000DA38 01D6                <1> 	add	esi, edx ; next row address of (video page) window 
  4398 0000DA3A 01CF                <1> 	add	edi, ecx ; next row address of user's window
  4399                              <1> 		; Note: ecx may be less than row length of video page
  4400                              <1> 		; user's window uses offset according to window width
  4401 0000DA3C FECF                <1> 	dec	bh
  4402 0000DA3E 75F1                <1> 	jnz	short sysvideo_9_4 ; repeat for next row
  4403                              <1> sysvideo_9_5:
  4404 0000DA40 5B                  <1> 	pop	ebx ; restore bh
  4405 0000DA41 5F                  <1> 	pop	edi
  4406 0000DA42 5E                  <1> 	pop	esi
  4407                              <1> 	;jnc	short sysvideo_10
  4408 0000DA43 7215                <1> 	jc	short sysvideo_9_6 ; 28/01/2021
  4409                              <1> ;sysvideo_9_6:
  4410                              <1> ;	jmp	sysret ; [u.r0] = 0
  4411                              <1> 
  4412                              <1> sysvideo_10:
  4413                              <1> 	; user to system video/display page window transfer (mode 0)
  4414                              <1> 	; esi =	user buffer
  4415 0000DA45 E8B0350000          <1> 	call	transfer_from_user_buffer ; fast transfer
  4416                              <1> 	;jc	sysret
  4417 0000DA4A 720E                <1> 	jc	short sysvideo_9_6 ; 28/01/2021
  4418                              <1> 	; ecx = actual transfer count (must be same with input)
  4419 0000DA4C 010D[AC940100]      <1> 	add	[u.r0], ecx ; actual transfer count
  4420 0000DA52 01D7                <1> 	add	edi, edx ; next row address of (video page) window 
  4421 0000DA54 01CE                <1> 	add	esi, ecx ; next row address of user's window
  4422                              <1> 		; Note: ecx may be less than row length of video page
  4423                              <1> 		; user's window uses offset according to window width
  4424 0000DA56 FECF                <1> 	dec	bh
  4425 0000DA58 75EB                <1> 	jnz	short sysvideo_10 ; repeat for next row
  4426                              <1> 	;jmp	sysret
  4427                              <1> sysvideo_9_6:
  4428 0000DA5A E941F4FFFF          <1> 	jmp	sysret
  4429                              <1> 	
  4430                              <1> sysvideo_11:
  4431                              <1> 	; system to user video/display page window transfer (mode 0)
  4432 0000DA5F 87FE                <1> 	xchg	edi, esi
  4433                              <1> sysvideo_12:
  4434                              <1> 	; esi = beginning addr of the (screen, video page) window
  4435                              <1> 	; edi =	user's buffer	
  4436 0000DA61 E84A350000          <1> 	call	transfer_to_user_buffer ; fast transfer
  4437                              <1> 	;jc	sysret
  4438                              <1> 	; 23/07/2022
  4439 0000DA66 72F2                <1> 	jc	short sysvideo_9_6 ; jmp sysret	
  4440                              <1> 
  4441                              <1> 	; ecx = actual transfer count (must be same with input)
  4442 0000DA68 010D[AC940100]      <1> 	add	[u.r0], ecx
  4443 0000DA6E 01D6                <1> 	add	esi, edx ; next row (edx = 160)
  4444 0000DA70 01CF                <1> 	add	edi, ecx ; next row of the user's window
  4445                              <1> 			 ; (ecx <= 160)
  4446 0000DA72 FECF                <1> 	dec	bh
  4447 0000DA74 75EB                <1> 	jnz	short sysvideo_12
  4448                              <1> sysvideo_12_0:
  4449 0000DA76 E925F4FFFF          <1> 	jmp	sysret
  4450                              <1> 
  4451                              <1> sysvideo_13:
  4452                              <1> 	; 28/12/2020
  4453 0000DA7B 80FF01              <1> 	cmp	bh, 1
  4454 0000DA7E 7752                <1>         ja      short sysvideo_15 ; 23/11/2020
  4455                              <1> 
  4456                              <1> 	; 25/02/2021
  4457                              <1> 	; 12/02/2021
  4458                              <1> 	; 29/01/2021, 31/01/2021
  4459                              <1> 	; 23/11/2020 (TRDOS 386 v2.0.3)
  4460                              <1> 	; (major modification, from mode 13h to all VGA modes,
  4461                              <1> 	;  except super VGA modes and liner frame buffer method)
  4462                              <1> 
  4463                              <1> 	; BH = 1 = VGA Graphics mode (0A0000h) data transfers
  4464                              <1> 
  4465                              <1> 	; 29/01/2021
  4466 0000DA80 66B84001            <1> 	mov	ax, 320	; 320 pixels
  4467 0000DA84 F6C380              <1> 	test	bl, 80h	; bit 7 (screen width, 640 pixels)
  4468 0000DA87 7407                <1> 	jz	short sysvideo_13_0
  4469                              <1> 	;shl	ax, 1	; 640 pixels
  4470                              <1> 	; 23/07/2022
  4471 0000DA89 D1E0                <1> 	shl	eax, 1
  4472                              <1> 	;
  4473 0000DA8B 80E37F              <1> 	and	bl, 7Fh
  4474 0000DA8E 7405                <1> 	jz	short sysvideo_14
  4475                              <1> sysvideo_13_0:
  4476                              <1> 	; 29/01/2021
  4477 0000DA90 80FB41              <1> 	cmp	bl, 41h
  4478 0000DA93 77E1                <1> 	ja	short sysvideo_12_0 ; invalid (unknown) sub function
  4479                              <1> sysvideo_14:
  4480 0000DA95 66A3[CEA30100]      <1> 	mov	[v_width], ax	; save screen width
  4481 0000DA9B C705[D2A30100]0000- <1> 	mov	dword [v_mem], 0A0000h  ; save video memory address
  4481 0000DAA3 0A00                <1>
  4482 0000DAA5 C705[D6A30100]0000- <1> 	mov	dword [v_siz], 65536	; save video memory size
  4482 0000DAAD 0100                <1>
  4483 0000DAAF C705[DEA30100]0000- <1> 	mov	dword [v_end], 0B0000h	; save end of video page
  4483 0000DAB7 0B00                <1>
  4484 0000DAB9 B708                <1> 	mov	bh, 8
  4485 0000DABB 883D[D1A30100]      <1> 	mov	[v_bpp], bh ; 8	; bits per pixel (256 colors)
  4486 0000DAC1 881D[D0A30100]      <1> 	mov	[v_ops], bl	; VGA data transfer options
  4487                              <1> 	;mov	[maskbuff], edi ; 25/02/2021 
  4488 0000DAC7 893D[E2A30100]      <1> 	mov	[maskcolor], edi ; 25/02/2021
  4489                              <1> 			; save mask color or bitmask buffer address
  4490 0000DACD E9BE000000          <1> 	jmp	sysvideo_15_7
  4491                              <1> 
  4492                              <1> sysvideo_15:
  4493                              <1> 	; 23/07/2022
  4494                              <1> 	; 28/12/2020
  4495 0000DAD2 80FF02              <1> 	cmp	bh, 2
  4496                              <1>         ;ja	sysvideo_16
  4497                              <1> 	; 23/07/2022
  4498 0000DAD5 7605                <1> 	jna	short sysvideo_15_17
  4499 0000DAD7 E9ED1E0000          <1> 	jmp	sysvideo_16
  4500                              <1> sysvideo_15_17:	; 23/07/2022
  4501                              <1> 	; 25/02/2021
  4502                              <1> 	; 12/02/2021
  4503                              <1> 	; 30/01/2021 - 31/01/2021
  4504                              <1> 	; 01/01/2021 - 29/01/2021
  4505                              <1> 	; 26/12/2020 - 27/12/2020
  4506                              <1> 	; 25/12/2020 (TRDOS 386 v2.0.3)
  4507                              <1> 	;
  4508                              <1> 	; BH = 2 = SVGA (VESA VBE) Graphics mode (LFB) data transfers
  4509                              <1> 
  4510                              <1> 	; 25/12/2020
  4511                              <1> 	; resolution table entry will be saved into EBP register
  4512                              <1> 
  4513 0000DADC 803D[86090000]02    <1> 	cmp	byte [vbe3], 2 ; VESA VBE 3 video bios 
  4514                              <1> 			  ; or BOCHS/QEMU/VIRTUALBOX emu video bios
  4515 0000DAE3 724E                <1> 	jb	short sysvideo_15_4 ; no, nothing to do !
  4516 0000DAE5 770B                <1> 	ja	short sysvideo_15_0 ; yes
  4517                              <1> 
  4518                              <1> 	; Only Bochs/Plex86 (emu) vbe2 video bios is usable in pmid
  4519                              <1> 	; (if [vbe3] = 2) 
  4520 0000DAE7 A0[87090000]        <1> 	mov	al, [vbe2bios] ; Bochs vbios sign is from C0h to C5h
  4521 0000DAEC 24F0                <1> 	and	al, 0F0h
  4522 0000DAEE 3CC0                <1> 	cmp	al, 0C0h
  4523 0000DAF0 7541                <1> 	jne	short sysvideo_15_4 ; unknown (vbe2) video bios
  4524                              <1> sysvideo_15_0:
  4525                              <1> 	; 29/01/2021
  4526 0000DAF2 80FB41              <1> 	cmp	bl, 41h
  4527 0000DAF5 773C                <1> 	ja	short sysvideo_15_4 ; invalid (unknown) sub function
  4528                              <1> 	; 29/01/2021
  4529 0000DAF7 881D[D0A30100]      <1> 	mov	[v_ops], bl	; SVGA data transfer options
  4530                              <1> 
  4531 0000DAFD 89D8                <1> 	mov	eax, ebx ; hw of ebx is vesa vbe video mode
  4532 0000DAFF C1E810              <1> 	shr	eax, 16 ; ax = vesa vbe video mode
  4533 0000DB02 7513                <1> 	jnz	short sysvideo_15_2 
  4534                              <1> 	; ax = 0
  4535                              <1> 
  4536                              <1> 	; check & use current video mode
  4537 0000DB04 803D[DE670000]FF    <1> 	cmp	byte [CRT_MODE], 0FFh ; extended (SVGA) mode ?
  4538 0000DB0B 7526                <1> 	jne	short sysvideo_15_4 ; no
  4539                              <1> sysvideo_15_1:
  4540                              <1> 	; use current vbe (svga) video mode
  4541 0000DB0D 66A1[66A30100]      <1> 	mov	ax, [video_mode] ; extended (SVGA, VESA VBE) mode
  4542 0000DB13 6625FF01            <1> 	and	ax, 1FFh ; vesa vbe video mode: 1XXh
  4543                              <1> sysvideo_15_2:
  4544                              <1> 	; 29/01/2021
  4545                              <1> 	;mov	[maskbuff], edi ; 25/02/2021
  4546 0000DB17 893D[E2A30100]      <1> 	mov	[maskcolor], edi ; 25/02/2021
  4547                              <1> 			; save mask color or bitmask buffer address
  4548 0000DB1D BD[6A6B0000]        <1> 	mov	ebp, b_vbe_modes ; vbe mode table (in 'vidata.s')
  4549                              <1> sysvideo_15_3:
  4550 0000DB22 663B4500            <1> 	cmp	ax, [ebp]
  4551 0000DB26 7410                <1> 	je	short sysvideo_15_5
  4552 0000DB28 83C508              <1> 	add	ebp, 8 ; vbe mode table entry size
  4553 0000DB2B 81FD[2A6C0000]      <1> 	cmp	ebp, end_of_b_vbe_modes
  4554 0000DB31 72EF                <1>  	jb	short sysvideo_15_3
  4555                              <1> sysvideo_15_4:
  4556                              <1> 	; desired video mode is not a valid (implemented)
  4557                              <1> 	;	  extended (VESA VBE, SVGA) video mode
  4558                              <1> 	;
  4559                              <1> 	; nothing to do !
  4560                              <1> 
  4561                              <1>  	; [u.r0] = 0  ; return value of EAX
  4562 0000DB33 E968F3FFFF          <1>  	jmp	sysret
  4563                              <1> 
  4564                              <1> sysvideo_15_5:
  4565                              <1> 	; get LFB address
  4566 0000DB38 A1[74A30100]        <1> 	mov	eax, [LFB_ADDR] ; [LFB_Info+LFBINFO.LFB_addr]
  4567 0000DB3D 09C0                <1> 	or	eax, eax
  4568 0000DB3F 7509                <1> 	jnz	short sysvideo_15_6
  4569 0000DB41 66A1[1A0F0000]      <1> 	mov	ax, [def_LFB_addr] ; default LFB addr 
  4570                              <1> 				   ; (for vbe mode 118h)
  4571 0000DB47 C1E010              <1> 	shl	eax, 16
  4572                              <1> 	; 27/12/2020
  4573                              <1> 	;jz	short sysvideo_15_4
  4574                              <1> sysvideo_15_6:
  4575                              <1> 	; 29/01/2021
  4576 0000DB4A A3[D2A30100]        <1> 	mov	[v_mem], eax ; save video memory address
  4577                              <1> 	
  4578                              <1> 	; 27/12/2020
  4579                              <1> 	; 26/12/2020
  4580 0000DB4F 8B4502              <1> 	mov	eax, [ebp+2] ; width, height
  4581                              <1> 	; 29/01/2021
  4582 0000DB52 66A3[CEA30100]      <1> 	mov	[v_width], ax ; save screen width
  4583                              <1> 	; 28/12/2020
  4584 0000DB58 8A7D06              <1> 	mov	bh, [ebp+6] ; bpp
  4585                              <1> 	; 28/02/2021
  4586                              <1> 	; check default truecolor bpp value and use
  4587                              <1> 	; 32bpp instead of 24bpp if the default value
  4588                              <1> 	; has been set to 32bpp.
  4589 0000DB5B 80FF18              <1> 	cmp	bh, 24
  4590 0000DB5E 750B                <1> 	jne	short sysvideo_15_16
  4591 0000DB60 803D[B7790100]20    <1> 	cmp	byte [truecolor], 32
  4592                              <1> 		; Default truecolor bpp value,
  4593                              <1> 		; it is 32 for VBE3 video bios
  4594                              <1> 		; (it can be set to 32 or 24)
  4595 0000DB67 7502                <1> 	jne	short sysvideo_15_16 ; not VBE3 !
  4596                              <1> 				; or it is set to 24
  4597 0000DB69 B720                <1> 	mov	bh, 32
  4598                              <1> 	; 28/02/2021
  4599                              <1> sysvideo_15_16:
  4600                              <1> 	; 29/01/2021
  4601 0000DB6B 883D[D1A30100]      <1> 	mov	[v_bpp], bh ; bits per pixel
  4602                              <1> 
  4603 0000DB71 52                  <1> 	push	edx ; *
  4604 0000DB72 0FB7D0              <1> 	movzx	edx, ax  ; width
  4605 0000DB75 C1E810              <1> 	shr	eax, 16  ; height
  4606 0000DB78 F7E2                <1> 	mul	edx
  4607                              <1> 	; eax = linear frame buffer size (pixels)
  4608                              <1> 	; 29/01/2021
  4609 0000DB7A A3[D6A30100]        <1> 	mov	[v_siz], eax ; save video page size
  4610 0000DB7F E8FD000000          <1> 	call	pixels_to_byte_count
  4611 0000DB84 0305[D2A30100]      <1> 	add	eax, [v_mem]
  4612 0000DB8A A3[DEA30100]        <1> 	mov	[v_end], eax ; save end of video page 
  4613 0000DB8F 5A                  <1> 	pop	edx ; *
  4614                              <1> 
  4615                              <1> 	; bh = bits per pixel
  4616                              <1> 	; (bh will not be used after here, 29/01/2021)
  4617                              <1> 
  4618                              <1> 	; bl = pixel operations & options
  4619                              <1> 	; ecx, edx, esi, edi input parameters
  4620                              <1> 	; [maskcolor] = edi input ; 25/02/2021
  4621                              <1> 
  4622                              <1> sysvideo_15_7:
  4623                              <1> 	; 29/01/2021
  4624                              <1> 	;test	byte [v_ops], 40h  ; system to user ?
  4625 0000DB90 F6C340              <1> 	test	bl, 40h
  4626 0000DB93 7517                <1> 	jnz	short sysvideo_15_9
  4627                              <1> 
  4628 0000DB95 31C0                <1> 	xor	eax, eax
  4629 0000DB97 88D8                <1> 	mov	al, bl
  4630 0000DB99 BB[BFDC0000]        <1> 	mov	ebx, pixel_ops
  4631 0000DB9E 240F                <1> 	and	al, 0Fh ; isolate 16 pixel operations
  4632 0000DBA0 C0E002              <1> 	shl	al, 2 ; * 4 for dword table pointers 
  4633 0000DBA3 01C3                <1> 	add	ebx, eax
  4634                              <1> 
  4635                              <1> 	; ebx = subroutine address
  4636                              <1> 
  4637                              <1> 	; ecx, edx, esi, edi input parameters
  4638                              <1> 	; [maskbuff] = edi input
  4639                              <1> 	; [maskcolor] = edi input ; 25/02/2021
  4640                              <1> 
  4641 0000DBA5 FF13                <1> 	call	[ebx]
  4642                              <1> sysvideo_15_8:
  4643 0000DBA7 E9F4F2FFFF          <1> 	jmp	sysret
  4644                              <1> 
  4645                              <1> sysvideo_15_9:
  4646                              <1> 	; system to user display page or window copy
  4647                              <1> 	;test	byte [v_ops], 1 ; window copy ?
  4648 0000DBAC F6C301              <1> 	test	bl, 1	
  4649 0000DBAF 7521                <1> 	jnz	short sysvideo_15_10
  4650                              <1> 
  4651                              <1> 	; display page (full screen copy)
  4652 0000DBB1 8B35[D2A30100]      <1> 	mov	esi, [v_mem] ; LFB start address
  4653 0000DBB7 A1[D6A30100]        <1> 	mov	eax, [v_siz]
  4654 0000DBBC E8C0000000          <1> 	call	pixels_to_byte_count
  4655 0000DBC1 89C1                <1> 	mov	ecx, eax ; transfer count in bytes
  4656                              <1> 	;edi = user's buffer address
  4657 0000DBC3 E8E8330000          <1> 	call	transfer_to_user_buffer
  4658 0000DBC8 72DD                <1> 	jc	short sysvideo_15_8
  4659 0000DBCA 890D[AC940100]      <1> 	mov	[u.r0], ecx
  4660 0000DBD0 EBD5                <1> 	jmp	short sysvideo_15_8
  4661                              <1> 
  4662                              <1> sysvideo_15_10:
  4663 0000DBD2 E820000000          <1> 	call	sysvideo_15_12 ; window preparations
  4664 0000DBD7 72CE                <1> 	jc	short sysvideo_15_8
  4665                              <1> 
  4666 0000DBD9 8B35[DAA30100]      <1> 	mov	esi, [v_str]
  4667                              <1> sysvideo_15_11:
  4668                              <1> 	; esi = window's current row address (video mem)
  4669                              <1> 	; edi = current row (virtual) addr in user's buff
  4670                              <1> 	; ecx = transfer count per row
  4671 0000DBDF E8CC330000          <1> 	call	transfer_to_user_buffer
  4672 0000DBE4 72C1                <1> 	jc	short sysvideo_15_8
  4673 0000DBE6 010D[AC940100]      <1>  	add	[u.r0], ecx
  4674 0000DBEC 4B                  <1> 	dec	ebx
  4675 0000DBED 74B8                <1> 	jz	short sysvideo_15_8 ; ok.
  4676                              <1> 	; next row
  4677 0000DBEF 01CF                <1> 	add	edi, ecx ; next row in user's buffer
  4678 0000DBF1 01D6                <1> 	add	esi, edx ; next row of window (system)
  4679 0000DBF3 EBEA                <1> 	jmp	short sysvideo_15_11
  4680                              <1> 
  4681                              <1> sysvideo_15_14:
  4682 0000DBF5 F9                  <1> 	stc	 ; error !
  4683                              <1> sysvideo_15_15:
  4684 0000DBF6 C3                  <1> 	retn
  4685                              <1> 
  4686                              <1> sysvideo_15_12:
  4687                              <1> 	; 30/01/2021
  4688                              <1> 	; 29/01/2021
  4689                              <1> 	; Window address preparations for window copy
  4690 0000DBF7 6621D2              <1> 	and	dx, dx
  4691 0000DBFA 74F9                <1> 	jz	short sysvideo_15_14 ; invalid (zero columns)
  4692                              <1> 	;test	edx, 0FFFF0000h
  4693                              <1> 	;jz	short sysvideo_15_14 ; invalid (zero rows)
  4694 0000DBFC 81FA00000100        <1> 	cmp	edx, 65536
  4695 0000DC02 72F2                <1> 	jb	short sysvideo_15_15 ; invalid (zero rows)
  4696 0000DC04 89C8                <1> 	mov	eax, ecx ; start position (row, column)
  4697 0000DC06 E899000000          <1> 	call	calc_pixel_offset
  4698 0000DC0B 3B05[D6A30100]      <1> 	cmp	eax, [v_siz]
  4699 0000DC11 73E2                <1> 	jnb	short sysvideo_15_14 ; out of display page
  4700                              <1> 				; nothing to do
  4701 0000DC13 E869000000          <1> 	call	pixels_to_byte_count
  4702 0000DC18 0305[D2A30100]      <1> 	add	eax, [v_mem]
  4703 0000DC1E A3[DAA30100]        <1> 	mov	[v_str], eax ; window start address
  4704                              <1> 			     ; (addr of top left corner)
  4705                              <1> 	; check column limit
  4706 0000DC23 89C8                <1> 	mov	eax, ecx
  4707 0000DC25 6601D0              <1> 	add	ax, dx  ; add columns to start column
  4708 0000DC28 72CC                <1> 	jc	short sysvideo_15_15 ; cf = 1
  4709 0000DC2A 663B05[CEA30100]    <1> 	cmp	ax, [v_width]
  4710 0000DC31 77C2                <1> 	ja	short sysvideo_15_14
  4711                              <1> 
  4712 0000DC33 89D0                <1> 	mov	eax, edx ; size
  4713 0000DC35 2D00000100          <1> 	sub	eax, 65536 ; row count -> 0 based row #
  4714 0000DC3A E865000000          <1> 	call	calc_pixel_offset
  4715 0000DC3F 3B05[D6A30100]      <1> 	cmp	eax, [v_siz] ; video (display) page size
  4716 0000DC45 77AE                <1> 	ja	short sysvideo_15_14 ; out of display page
  4717                              <1> 				; nothing to do
  4718 0000DC47 E835000000          <1> 	call	pixels_to_byte_count
  4719 0000DC4C 0305[DAA30100]      <1> 	add	eax, [v_str] ; window start address
  4720 0000DC52 3B05[DEA30100]      <1> 	cmp	eax, [v_end] ; window end address (+1)
  4721                              <1> 			 ; (addr of bottom right corner +1)
  4722 0000DC58 779B                <1> 	ja	short sysvideo_15_14 ; out of display page
  4723                              <1> 				; nothing to do
  4724 0000DC5A 89D3                <1> 	mov	ebx, edx
  4725 0000DC5C C1EB10              <1> 	shr	ebx, 16
  4726                              <1> 	; ebx = row count
  4727 0000DC5F 81E2FFFF0000        <1> 	and	edx, 0FFFFh
  4728                              <1> 	; edx = transfer count per row (from user's buffer)
  4729                              <1> 	;	(in pixels, window width)
  4730 0000DC65 89D0                <1> 	mov	eax, edx
  4731 0000DC67 A3[E6A30100]        <1> 	mov	[pixcount], eax ; 27/02/2021
  4732 0000DC6C E810000000          <1> 	call	pixels_to_byte_count
  4733 0000DC71 89C1                <1> 	mov	ecx, eax
  4734                              <1> 	; ecx = transfer count per row (from user's buffer)
  4735                              <1> 	;	(in bytes, window width)
  4736 0000DC73 66A1[CEA30100]      <1> 	mov	ax, [v_width]
  4737 0000DC79 E803000000          <1> 	call	pixels_to_byte_count
  4738 0000DC7E 89C2                <1> 	mov	edx, eax
  4739                              <1> 	; edx = byte count per row
  4740 0000DC80 C3                  <1> 	retn ; cf = 0
  4741                              <1> 
  4742                              <1> pixels_to_byte_count:
  4743                              <1> 	; 29/01/2021
  4744                              <1> 	; INPUT:
  4745                              <1> 	;   eax = pixel count
  4746                              <1> 	; OUTPUT:
  4747                              <1> 	;   eax = byte count
  4748                              <1> 	;
  4749 0000DC81 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8
  4750 0000DC88 7619                <1> 	jna	short pixtobc_3 ; 8 bit colors
  4751 0000DC8A 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24
  4752 0000DC91 720A                <1> 	jb	short pixtobc_1 ; 16 bit colors
  4753 0000DC93 770B                <1> 	ja	short pixtobc_2 ; 32 bit colors
  4754                              <1> 	; 24 bit pixels
  4755                              <1> 	; eax = eax * 3
  4756                              <1> 	;push	edx
  4757                              <1> 	;mov	edx, eax
  4758                              <1> 	;shl	eax, 1
  4759                              <1> 	;add	eax, edx
  4760                              <1> 	;pop	edx
  4761 0000DC95 50                  <1> 	push	eax
  4762 0000DC96 D1E0                <1> 	shl	eax, 1
  4763 0000DC98 010424              <1> 	add	[esp], eax
  4764 0000DC9B 58                  <1> 	pop	eax
  4765 0000DC9C C3                  <1> 	retn
  4766                              <1> pixtobc_1:
  4767                              <1> 	; 32 bit pixels
  4768                              <1> 	; eax = eax * 2
  4769 0000DC9D D1E0                <1> 	shl	eax, 1
  4770 0000DC9F C3                  <1> 	retn
  4771                              <1> pixtobc_2:
  4772                              <1> 	; 16 bit pixels
  4773                              <1> 	; eax = eax * 4
  4774 0000DCA0 C1E002              <1> 	shl	eax, 2
  4775                              <1> pixtobc_3:
  4776 0000DCA3 C3                  <1> 	retn
  4777                              <1> 
  4778                              <1> calc_pixel_offset:
  4779                              <1> 	; 29/01/2021
  4780                              <1> 	; INPUT:
  4781                              <1> 	;   eax = pixel position (row, column)
  4782                              <1> 	; OUTPUT:
  4783                              <1> 	;   eax = pixel offset (linear address)
  4784                              <1> 	;
  4785 0000DCA4 52                  <1> 	push	edx
  4786 0000DCA5 50                  <1> 	push	eax
  4787 0000DCA6 C1E810              <1> 	shr	eax, 16
  4788 0000DCA9 7409                <1> 	jz	short cpixo_0
  4789                              <1> 	; eax = row 
  4790 0000DCAB 0FB715[CEA30100]    <1> 	movzx	edx, word [v_width]
  4791 0000DCB2 F7E2                <1> 	mul	edx
  4792                              <1> cpixo_0:
  4793                              <1> 	; eax = row * screen width
  4794 0000DCB4 5A                  <1> 	pop	edx
  4795 0000DCB5 81E2FFFF0000        <1> 	and	edx, 0FFFFh
  4796                              <1> 	; edx = column
  4797 0000DCBB 01D0                <1> 	add	eax, edx
  4798                              <1> 	; eax = (row * screen width) + column
  4799 0000DCBD 5A                  <1> 	pop	edx
  4800 0000DCBE C3                  <1> 	retn
  4801                              <1> 
  4802                              <1> 	; 02/02/2021
  4803                              <1> 	; 29/01/2021
  4804                              <1> pixel_ops:
  4805 0000DCBF [FFDC0000]          <1> 	dd	pix_op_cpy ; copy pixels (user to system)
  4806 0000DCC3 [4AE20000]          <1> 	dd	pix_op_new ; change (new, fill) color
  4807 0000DCC7 [67DD0000]          <1> 	dd	pix_op_add ; add color (up to 0FFh)
  4808 0000DCCB [19DE0000]          <1> 	dd	pix_op_sub ; sub color (down to 0)
  4809 0000DCCF [34E00000]          <1> 	dd	pix_op_orc ; or color
  4810 0000DCD3 [E6E00000]          <1> 	dd	pix_op_and ; and color
  4811 0000DCD7 [98E10000]          <1> 	dd	pix_op_xor ; xor color
  4812 0000DCDB [0EE30000]          <1> 	dd	pix_op_not ; not color
  4813 0000DCDF [B8E30000]          <1> 	dd	pix_op_neg ; neg color
  4814 0000DCE3 [62E40000]          <1> 	dd	pix_op_inc ; inc color
  4815 0000DCE7 [0CE50000]          <1> 	dd	pix_op_dec ; dec color
  4816 0000DCEB [CBDE0000]          <1> 	dd	pix_op_mix ; mix color
  4817 0000DCEF [92DF0000]          <1> 	dd	pix_op_rpl ; replace color
  4818 0000DCF3 [B6E50000]          <1> 	dd	pix_op_blk ; copy pixel block(s) (sys)
  4819 0000DCF7 [64E60000]          <1> 	dd	pix_op_lin ; write line(s)
  4820 0000DCFB [47EA0000]          <1> 	dd	pix_op_chr ; write character (font)
  4821                              <1> 
  4822                              <1> pix_op_cpy:
  4823                              <1> 	; 21/02/2021
  4824                              <1> 	; 06/02/2021
  4825                              <1> 	; 30/01/2021
  4826                              <1> 	; COPY PIXELS
  4827                              <1> 	;
  4828                              <1> 	; INPUT:
  4829                              <1> 	;  If bit 4 of BL or [v_ops] = 1 -window copy-
  4830                              <1> 	;  ECX = start position (row, column)
  4831                              <1> 	;        (HW = row, CX = column)
  4832                              <1> 	;  EDX = size (rows, colums)
  4833                              <1> 	;        (HW = rows, DX = columns)
  4834                              <1> 	;	 (0 -> invalid 	
  4835                              <1> 	;        (1 -> horizontal or vertical line)
  4836                              <1> 	;  If bit 4 of BL or [v_ops] = 0 -full screen-
  4837                              <1> 	;     ECX and EDX will not be used
  4838                              <1>   	;  ESI = user's buffer address
  4839                              <1> 	;  [maskcolor] = mask color (to be excluded)
  4840                              <1> 	;
  4841                              <1> 	; OUTPUT:
  4842                              <1> 	; 	[u.r0] will be > 0 if succesful
  4843                              <1> 
  4844 0000DCFF F605[D0A30100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  4845 0000DD06 752E                <1> 	jnz	short pix_op_cpy_w ; window
  4846                              <1> 
  4847 0000DD08 8B3D[D2A30100]      <1> 	mov	edi, [v_mem] ; 21/02/2021
  4848                              <1> 	
  4849                              <1> 	; Copy user's buffer content do display page
  4850                              <1> 	; (full screen copy)
  4851 0000DD0E A1[D6A30100]        <1> 	mov	eax, [v_siz] ; video page size
  4852 0000DD13 E869FFFFFF          <1> 	call	pixels_to_byte_count
  4853 0000DD18 89C1                <1> 	mov	ecx, eax ; transfer count
  4854                              <1> 	; esi = user's buffer address (virtual)
  4855 0000DD1A F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked copy ?
  4856 0000DD21 7405                <1> 	jz	short pix_op_cpy_0 ; no	
  4857 0000DD23 E96F0F0000          <1> 	jmp	m_pix_op_cpy ; copy pixels except mask color
  4858                              <1> pix_op_cpy_0:
  4859                              <1> 	; esi = user buffer for full screen copy
  4860                              <1> 	; edi = start of video memory 
  4861                              <1> 	;	(start of display page)
  4862                              <1> 	; ecx = byte count (display page size in bytes)
  4863 0000DD28 E8CD320000          <1> 	call	transfer_from_user_buffer
  4864 0000DD2D 7206                <1> 	jc	short pix_op_cpy_1
  4865 0000DD2F 890D[AC940100]      <1> 	mov	[u.r0], ecx
  4866                              <1> pix_op_cpy_1:
  4867 0000DD35 C3                  <1> 	retn	; 06/02/2021
  4868                              <1> 
  4869                              <1> pix_op_cpy_w:
  4870 0000DD36 E8BCFEFFFF          <1> 	call	sysvideo_15_12 ; window preparations
  4871 0000DD3B 72F8                <1> 	jc	short pix_op_cpy_1
  4872                              <1> 	; ecx = bytes per row (to be applied)
  4873                              <1> 	; edx = screen width in bytes
  4874                              <1> 	; ebx = row count
  4875 0000DD3D 8B3D[DAA30100]      <1> 	mov	edi, [v_str]
  4876 0000DD43 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked copy ?
  4877 0000DD4A 7405                <1> 	jz	short pix_op_cpy_w_0 ; no
  4878 0000DD4C E909100000          <1> 	jmp	m_pix_op_cpy_w ; window copy except mask color
  4879                              <1> pix_op_cpy_w_0:
  4880                              <1> 	; esi = current row (virtual) addr in user's buff
  4881                              <1> 	; edi = window's current row address (video mem)
  4882                              <1> 	; ecx = transfer count per row
  4883 0000DD51 E8A4320000          <1> 	call	transfer_from_user_buffer
  4884 0000DD56 72DD                <1> 	jc	short pix_op_cpy_1
  4885 0000DD58 010D[AC940100]      <1>  	add	[u.r0], ecx
  4886 0000DD5E 4B                  <1> 	dec	ebx
  4887 0000DD5F 74D4                <1> 	jz	short pix_op_cpy_1 ; ok.
  4888                              <1> 	; next row
  4889 0000DD61 01CE                <1> 	add	esi, ecx ; next row in user's buffer
  4890 0000DD63 01D7                <1> 	add	edi, edx ; next row of window (system)
  4891 0000DD65 EBEA                <1> 	jmp	short pix_op_cpy_w_0
  4892                              <1> 
  4893                              <1> pix_op_add:
  4894                              <1> 	; 31/01/2021
  4895                              <1> 	; 30/01/2021
  4896                              <1> 	; ADD COLOR
  4897                              <1> 	;
  4898                              <1> 	; INPUT:
  4899                              <1> 	;   CL = color (8 bit, 256 colors)
  4900                              <1> 	;  ECX = color (16 bit and true colors)
  4901                              <1> 	;  EDX = start position (row, column)
  4902                              <1> 	;        (HW = row, DX = column)
  4903                              <1> 	;  ESI = size (rows, colums)
  4904                              <1> 	;        (HW = rows, SI = columns)
  4905                              <1> 	;
  4906                              <1> 	;  [maskcolor] = mask color (to be excluded)
  4907                              <1> 	;
  4908                              <1> 	; OUTPUT:
  4909                              <1> 	; 	[u.r0] will be > 0 if succesful
  4910                              <1> 
  4911 0000DD67 F605[D0A30100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  4912 0000DD6E 7555                <1> 	jnz	short pix_op_add_w ; window
  4913                              <1> 
  4914 0000DD70 8B3D[D2A30100]      <1> 	mov	edi, [v_mem]
  4915 0000DD76 89FE                <1> 	mov	esi, edi
  4916                              <1> 	; ecx = color (CL, CX, ECX)
  4917 0000DD78 89C8                <1> 	mov	eax, ecx
  4918 0000DD7A 8B0D[D6A30100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  4919                              <1> 
  4920 0000DD80 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color adding ?
  4921 0000DD87 7405                <1> 	jz	short pix_op_add_0 ; no
  4922 0000DD89 E9CB100000          <1> 	jmp	m_pix_op_add ; add color except mask color
  4923                              <1> pix_op_add_0:
  4924 0000DD8E 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  4925 0000DD95 7707                <1> 	ja	short pix_op_add_1
  4926                              <1> 
  4927                              <1> 	; 256 colors (8bpp)
  4928 0000DD97 E84C0A0000          <1> 	call	pix_op_add_8
  4929 0000DD9C EB1E                <1> 	jmp	short pix_op_add_4
  4930                              <1> 
  4931                              <1> pix_op_add_1:
  4932 0000DD9E 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  4933 0000DDA5 7710                <1> 	ja	short pix_op_add_3 ; 32bpp
  4934 0000DDA7 7207                <1> 	jb	short pix_op_add_2 ; 16bpp
  4935                              <1> 
  4936                              <1> 	; 24 bit true colors
  4937 0000DDA9 E85A0A0000          <1> 	call	pix_op_add_24
  4938 0000DDAE EB0C                <1> 	jmp	short pix_op_add_4
  4939                              <1> 
  4940                              <1> 	; 65536 colors (16bpp)
  4941                              <1> pix_op_add_2:
  4942 0000DDB0 E8410A0000          <1> 	call	pix_op_add_16
  4943 0000DDB5 EB05                <1> 	jmp	short pix_op_add_4
  4944                              <1> 
  4945                              <1> 	; 32 bit true colors
  4946                              <1> pix_op_add_3:
  4947 0000DDB7 E86C0A0000          <1> 	call	pix_op_add_32
  4948                              <1> pix_op_add_4:
  4949 0000DDBC 29F7                <1> 	sub	edi, esi
  4950 0000DDBE 893D[AC940100]      <1> 	mov	[u.r0], edi
  4951                              <1> pix_op_add_5:
  4952 0000DDC4 C3                  <1> 	retn
  4953                              <1> 
  4954                              <1> pix_op_add_w:
  4955                              <1> 	; 31/01/2021
  4956 0000DDC5 51                  <1> 	push	ecx ; * ; color
  4957 0000DDC6 89D1                <1> 	mov	ecx, edx ; win start pos
  4958 0000DDC8 89F2                <1> 	mov	edx, esi ; size (rows, cols)
  4959 0000DDCA E828FEFFFF          <1> 	call	sysvideo_15_12 ; window preparations
  4960 0000DDCF 58                  <1> 	pop	eax ; * ; color
  4961 0000DDD0 72F2                <1> 	jc	short pix_op_add_5
  4962                              <1> 
  4963 0000DDD2 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color adding ?
  4964 0000DDD9 7405                <1> 	jz	short pix_op_add_w_0 ; no
  4965 0000DDDB E927110000          <1> 	jmp	m_pix_op_add_w
  4966                              <1> 			; window add color except mask color
  4967                              <1> pix_op_add_w_0:
  4968                              <1> 	; ecx = bytes per row (to be applied)
  4969                              <1> 	; edx = screen width in bytes
  4970                              <1> 	; ebx = row count
  4971                              <1> 	; eax = color
  4972                              <1> 
  4973 0000DDE0 8B3D[DAA30100]      <1> 	mov	edi, [v_str]
  4974 0000DDE6 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  4975 0000DDED 7707                <1> 	ja	short pix_op_add_w_1
  4976                              <1> 
  4977                              <1> 	; 256 colors (8bpp)
  4978 0000DDEF BD[E8E70000]        <1> 	mov	ebp, pix_op_add_8
  4979 0000DDF4 EB1E                <1> 	jmp	short pix_op_add_w_4
  4980                              <1> 
  4981                              <1> pix_op_add_w_1:
  4982 0000DDF6 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  4983 0000DDFD 7710                <1> 	ja	short pix_op_add_w_3 ; 32bpp
  4984 0000DDFF 7207                <1> 	jb	short pix_op_add_w_2 ; 16bpp
  4985                              <1> 
  4986                              <1> 	; 24 bit true colors
  4987 0000DE01 BD[08E80000]        <1> 	mov	ebp, pix_op_add_24
  4988 0000DE06 EB0C                <1> 	jmp	short pix_op_add_w_4
  4989                              <1> 
  4990                              <1> 	; 65536 colors (16bpp)
  4991                              <1> pix_op_add_w_2:
  4992 0000DE08 BD[F6E70000]        <1> 	mov	ebp, pix_op_add_16
  4993 0000DE0D EB05                <1> 	jmp	short pix_op_add_w_4
  4994                              <1> 
  4995                              <1> 	; 32 bit true colors
  4996                              <1> pix_op_add_w_3:
  4997 0000DE0F BD[28E80000]        <1> 	mov	ebp, pix_op_add_32
  4998                              <1> pix_op_add_w_4:
  4999 0000DE14 E95F010000          <1> 	jmp	pix_op_add_w_x
  5000                              <1> 
  5001                              <1> pix_op_sub:
  5002                              <1> 	; 31/01/2021
  5003                              <1> 	; SUB COLOR
  5004                              <1> 	;
  5005                              <1> 	; INPUT:
  5006                              <1> 	;   CL = color (8 bit, 256 colors)
  5007                              <1> 	;  ECX = color (16 bit and true colors)
  5008                              <1> 	;  EDX = start position (row, column)
  5009                              <1> 	;        (HW = row, DX = column)
  5010                              <1> 	;  ESI = size (rows, colums)
  5011                              <1> 	;        (HW = rows, SI = columns)
  5012                              <1> 	;
  5013                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5014                              <1> 	;
  5015                              <1> 	; OUTPUT:
  5016                              <1> 	; 	[u.r0] will be > 0 if succesful
  5017                              <1> 
  5018 0000DE19 F605[D0A30100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5019 0000DE20 7555                <1> 	jnz	short pix_op_sub_w ; window
  5020                              <1> 
  5021 0000DE22 8B3D[D2A30100]      <1> 	mov	edi, [v_mem]
  5022 0000DE28 89FE                <1> 	mov	esi, edi
  5023                              <1> 	; ecx = color (CL, CX, ECX)
  5024 0000DE2A 89C8                <1> 	mov	eax, ecx
  5025 0000DE2C 8B0D[D6A30100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5026                              <1> 
  5027 0000DE32 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color subtract ?
  5028 0000DE39 7405                <1> 	jz	short pix_op_sub_0 ; no
  5029 0000DE3B E9FA100000          <1> 	jmp	m_pix_op_sub ; sub color except mask color
  5030                              <1> pix_op_sub_0:
  5031 0000DE40 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5032 0000DE47 7707                <1> 	ja	short pix_op_sub_1
  5033                              <1> 
  5034                              <1> 	; 256 colors (8bpp)
  5035 0000DE49 E8E9090000          <1> 	call	pix_op_sub_8
  5036 0000DE4E EB1E                <1> 	jmp	short pix_op_sub_4
  5037                              <1> 
  5038                              <1> pix_op_sub_1:
  5039 0000DE50 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5040 0000DE57 7710                <1> 	ja	short pix_op_sub_3 ; 32bpp
  5041 0000DE59 7207                <1> 	jb	short pix_op_sub_2 ; 16bpp
  5042                              <1> 
  5043                              <1> 	; 24 bit true colors
  5044 0000DE5B E8FA090000          <1> 	call	pix_op_sub_24
  5045 0000DE60 EB0C                <1> 	jmp	short pix_op_sub_4
  5046                              <1> 
  5047                              <1> 	; 65536 colors (16bpp)
  5048                              <1> pix_op_sub_2:
  5049 0000DE62 E8E0090000          <1> 	call	pix_op_sub_16
  5050 0000DE67 EB05                <1> 	jmp	short pix_op_sub_4
  5051                              <1> 
  5052                              <1> 	; 32 bit true colors
  5053                              <1> pix_op_sub_3:
  5054 0000DE69 E8060A0000          <1> 	call	pix_op_sub_32
  5055                              <1> pix_op_sub_4:
  5056 0000DE6E 29F7                <1> 	sub	edi, esi
  5057 0000DE70 893D[AC940100]      <1> 	mov	[u.r0], edi
  5058                              <1> pix_op_sub_5:
  5059 0000DE76 C3                  <1> 	retn
  5060                              <1> 
  5061                              <1> pix_op_sub_w:
  5062                              <1> 	; 31/01/2021
  5063 0000DE77 51                  <1> 	push	ecx ; * ; color
  5064 0000DE78 89D1                <1> 	mov	ecx, edx ; win start pos
  5065 0000DE7A 89F2                <1> 	mov	edx, esi ; size (rows, cols)
  5066 0000DE7C E876FDFFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5067 0000DE81 58                  <1> 	pop	eax ; * ; color
  5068 0000DE82 72F2                <1> 	jc	short pix_op_sub_5
  5069                              <1> 
  5070 0000DE84 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color subtract ?
  5071 0000DE8B 7405                <1> 	jz	short pix_op_sub_w_0 ; no
  5072 0000DE8D E94B110000          <1> 	jmp	m_pix_op_sub_w 
  5073                              <1> 			; window sub color except mask color
  5074                              <1> pix_op_sub_w_0:
  5075                              <1> 	; ecx = bytes per row (to be applied)
  5076                              <1> 	; edx = screen width in bytes
  5077                              <1> 	; ebx = row count
  5078                              <1> 	; eax = color
  5079                              <1> 
  5080 0000DE92 8B3D[DAA30100]      <1> 	mov	edi, [v_str]
  5081 0000DE98 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5082 0000DE9F 7707                <1> 	ja	short pix_op_sub_w_1
  5083                              <1> 
  5084                              <1> 	; 256 colors (8bpp)
  5085 0000DEA1 BD[37E80000]        <1> 	mov	ebp, pix_op_sub_8
  5086 0000DEA6 EB1E                <1> 	jmp	short pix_op_sub_w_4
  5087                              <1> 
  5088                              <1> pix_op_sub_w_1:
  5089 0000DEA8 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5090 0000DEAF 7710                <1> 	ja	short pix_op_sub_w_3 ; 32bpp
  5091 0000DEB1 7207                <1> 	jb	short pix_op_sub_w_2 ; 16bpp
  5092                              <1> 
  5093                              <1> 	; 24 bit true colors
  5094 0000DEB3 BD[5AE80000]        <1> 	mov	ebp, pix_op_sub_24
  5095 0000DEB8 EB0C                <1> 	jmp	short pix_op_sub_w_4
  5096                              <1> 
  5097                              <1> 	; 65536 colors (16bpp)
  5098                              <1> pix_op_sub_w_2:
  5099 0000DEBA BD[47E80000]        <1> 	mov	ebp, pix_op_sub_16
  5100 0000DEBF EB05                <1> 	jmp	short pix_op_sub_w_4
  5101                              <1> 
  5102                              <1> 	; 32 bit true colors
  5103                              <1> pix_op_sub_w_3:
  5104 0000DEC1 BD[74E80000]        <1> 	mov	ebp, pix_op_sub_32
  5105                              <1> pix_op_sub_w_4:
  5106 0000DEC6 E9AD000000          <1> 	jmp	pix_op_sub_w_x
  5107                              <1> 
  5108                              <1> pix_op_mix:
  5109                              <1> 	; 31/01/2021
  5110                              <1> 	; MIX COLOR
  5111                              <1> 	;
  5112                              <1> 	; INPUT:
  5113                              <1> 	;   CL = color (8 bit, 256 colors)
  5114                              <1> 	;  ECX = color (16 bit and true colors)
  5115                              <1> 	;  EDX = start position (row, column)
  5116                              <1> 	;        (HW = row, DX = column)
  5117                              <1> 	;  ESI = size (rows, colums)
  5118                              <1> 	;        (HW = rows, SI = columns)
  5119                              <1> 	;
  5120                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5121                              <1> 	;
  5122                              <1> 	; OUTPUT:
  5123                              <1> 	; 	[u.r0] will be > 0 if succesful
  5124                              <1> 
  5125 0000DECB F605[D0A30100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5126 0000DED2 7555                <1> 	jnz	short pix_op_mix_w ; window
  5127                              <1> 
  5128 0000DED4 8B3D[D2A30100]      <1> 	mov	edi, [v_mem]
  5129 0000DEDA 89FE                <1> 	mov	esi, edi
  5130                              <1> 	; ecx = color (CL, CX, ECX)
  5131 0000DEDC 89C8                <1> 	mov	eax, ecx
  5132 0000DEDE 8B0D[D6A30100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5133                              <1> 
  5134 0000DEE4 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color mix ?
  5135 0000DEEB 7405                <1> 	jz	short pix_op_mix_0 ; no
  5136 0000DEED E91E110000          <1> 	jmp	m_pix_op_mix ; mix colors except mask color
  5137                              <1> pix_op_mix_0:
  5138 0000DEF2 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5139 0000DEF9 7707                <1> 	ja	short pix_op_mix_1
  5140                              <1> 
  5141                              <1> 	; 256 colors (8bpp)
  5142 0000DEFB E8F3090000          <1> 	call	pix_op_mix_8
  5143 0000DF00 EB1E                <1> 	jmp	short pix_op_mix_4
  5144                              <1> 
  5145                              <1> pix_op_mix_1:
  5146 0000DF02 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5147 0000DF09 7710                <1> 	ja	short pix_op_mix_3 ; 32bpp
  5148 0000DF0B 7207                <1> 	jb	short pix_op_mix_2 ; 16bpp
  5149                              <1> 
  5150                              <1> 	; 24 bit true colors
  5151 0000DF0D E8FC090000          <1> 	call	pix_op_mix_24
  5152 0000DF12 EB0C                <1> 	jmp	short pix_op_mix_4
  5153                              <1> 
  5154                              <1> 	; 65536 colors (16bpp)
  5155                              <1> pix_op_mix_2:
  5156 0000DF14 E8E6090000          <1> 	call	pix_op_mix_16
  5157 0000DF19 EB05                <1> 	jmp	short pix_op_mix_4
  5158                              <1> 
  5159                              <1> 	; 32 bit true colors
  5160                              <1> pix_op_mix_3:
  5161 0000DF1B E80A0A0000          <1> 	call	pix_op_mix_32
  5162                              <1> pix_op_mix_4:
  5163 0000DF20 29F7                <1> 	sub	edi, esi
  5164 0000DF22 893D[AC940100]      <1> 	mov	[u.r0], edi
  5165                              <1> pix_op_mix_5:
  5166 0000DF28 C3                  <1> 	retn
  5167                              <1> 
  5168                              <1> pix_op_mix_w:
  5169                              <1> 	; 31/01/2021
  5170 0000DF29 51                  <1> 	push	ecx ; * ; color
  5171 0000DF2A 89D1                <1> 	mov	ecx, edx ; win start pos
  5172 0000DF2C 89F2                <1> 	mov	edx, esi ; size (rows, cols)
  5173 0000DF2E E8C4FCFFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5174 0000DF33 58                  <1> 	pop	eax ; * ; color
  5175 0000DF34 72F2                <1> 	jc	short pix_op_mix_5
  5176                              <1> 
  5177 0000DF36 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color mix ?
  5178 0000DF3D 7405                <1> 	jz	short pix_op_mix_w_0 ; no
  5179 0000DF3F E969110000          <1> 	jmp	m_pix_op_mix_w 
  5180                              <1> 			; window mix colors except mask color
  5181                              <1> pix_op_mix_w_0:
  5182                              <1> 	; ecx = bytes per row (to be applied)
  5183                              <1> 	; edx = screen width in bytes
  5184                              <1> 	; ebx = row count
  5185                              <1> 	; eax = color
  5186                              <1> 
  5187 0000DF44 8B3D[DAA30100]      <1> 	mov	edi, [v_str]
  5188 0000DF4A 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5189 0000DF51 7707                <1> 	ja	short pix_op_mix_w_1
  5190                              <1> 
  5191                              <1> 	; 256 colors (8bpp)
  5192 0000DF53 BD[F3E80000]        <1> 	mov	ebp, pix_op_mix_8
  5193 0000DF58 EB1E                <1> 	jmp	short pix_op_mix_w_x
  5194                              <1> 
  5195                              <1> pix_op_mix_w_1:
  5196 0000DF5A 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5197 0000DF61 7710                <1> 	ja	short pix_op_mix_w_3 ; 32bpp
  5198 0000DF63 7207                <1> 	jb	short pix_op_mix_w_2 ; 16bpp
  5199                              <1> 
  5200                              <1> 	; 24 bit true colors
  5201 0000DF65 BD[0EE90000]        <1> 	mov	ebp, pix_op_mix_24
  5202 0000DF6A EB0C                <1> 	jmp	short pix_op_mix_w_x
  5203                              <1> 
  5204                              <1> 	; 65536 colors (16bpp)
  5205                              <1> pix_op_mix_w_2:
  5206 0000DF6C BD[FFE80000]        <1> 	mov	ebp, pix_op_mix_16
  5207 0000DF71 EB05                <1> 	jmp	short pix_op_mix_w_x
  5208                              <1> 
  5209                              <1> 	; 32 bit true colors
  5210                              <1> pix_op_mix_w_3:
  5211 0000DF73 BD[2AE90000]        <1> 	mov	ebp, pix_op_mix_32
  5212                              <1> 	;jmp	short pix_op_mix_w_x
  5213                              <1> 
  5214                              <1> pix_op_mix_w_x:
  5215                              <1> pix_op_add_w_x:
  5216                              <1> pix_op_sub_w_x:
  5217                              <1> pix_op_rpl_w_x:
  5218                              <1> pix_op_orc_w_x:
  5219                              <1> pix_op_and_w_x:
  5220                              <1> pix_op_xor_w_x:
  5221                              <1> 	; 27/02/2021
  5222                              <1> 	; 31/01/2021
  5223                              <1> 	; ecx = bytes per row (to be applied)
  5224                              <1> 	; edx = windows (screen) width in bytes
  5225                              <1> 	; ebx = row count
  5226                              <1> 	; eax = color
  5227                              <1> 	; ebp = pixel operation subroutine address
  5228 0000DF78 52                  <1> 	push	edx
  5229 0000DF79 51                  <1> 	push	ecx
  5230 0000DF7A 57                  <1> 	push	edi
  5231 0000DF7B 8B0D[E6A30100]      <1> 	mov	ecx, [pixcount] ; 27/02/2021
  5232 0000DF81 FFD5                <1> 	call	ebp ; call pixel-row operation
  5233 0000DF83 5F                  <1> 	pop	edi
  5234 0000DF84 59                  <1> 	pop	ecx ; bytes per row
  5235 0000DF85 010D[AC940100]      <1> 	add	[u.r0], ecx
  5236 0000DF8B 5A                  <1> 	pop	edx
  5237 0000DF8C 01D7                <1> 	add	edi, edx ; next row
  5238 0000DF8E 4B                  <1> 	dec	ebx
  5239 0000DF8F 75E7                <1> 	jnz	short pix_op_mix_w_x
  5240 0000DF91 C3                  <1> 	retn
  5241                              <1> 
  5242                              <1> pix_op_rpl:
  5243                              <1> 	; 01/02/2021
  5244                              <1> 	; REPLACE COLOR
  5245                              <1> 	;
  5246                              <1> 	; INPUT:
  5247                              <1> 	;   CL = old/current color (8 bit, 256 colors)
  5248                              <1> 	;  ECX = old/current color (16 bit and true colors)
  5249                              <1> 	;   DL = new color (8 bit, 256 colors)
  5250                              <1> 	;  EDX = new color (16 bit and true colors)
  5251                              <1> 	;  ESI = start position (row, column)
  5252                              <1> 	;        (HW = row, DX = column)
  5253                              <1> 	;  EDI = size (rows, colums)
  5254                              <1> 	;        (HW = rows, SI = columns)
  5255                              <1> 	; OUTPUT:
  5256                              <1> 	; 	[u.r0] will be > 0 if succesful
  5257                              <1> 	
  5258 0000DF92 F605[D0A30100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5259 0000DF99 754D                <1> 	jnz	short pix_op_rpl_w ; window
  5260                              <1> 	
  5261 0000DF9B 8B3D[D2A30100]      <1> 	mov	edi, [v_mem]
  5262 0000DFA1 89FE                <1> 	mov	esi, edi
  5263                              <1> 	; ecx = old color (CL, CX, ECX) -to be replaced with-
  5264                              <1> 	; edx = new color (CL, CX, ECX) -new one-
  5265 0000DFA3 89D0                <1> 	mov	eax, edx ; new color
  5266 0000DFA5 890D[E2A30100]      <1> 	mov	[maskcolor], ecx ; old color
  5267 0000DFAB 8B0D[D6A30100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5268                              <1> pix_op_rpl_0:
  5269 0000DFB1 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5270 0000DFB8 7707                <1> 	ja	short pix_op_rpl_1
  5271                              <1> 
  5272                              <1> 	; 256 colors (8bpp)
  5273 0000DFBA E82F0A0000          <1> 	call	pix_op_rpl_8
  5274 0000DFBF EB1E                <1> 	jmp	short pix_op_rpl_4
  5275                              <1> 
  5276                              <1> pix_op_rpl_1:
  5277 0000DFC1 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5278 0000DFC8 7710                <1> 	ja	short pix_op_rpl_3 ; 32bpp
  5279 0000DFCA 7207                <1> 	jb	short pix_op_rpl_2 ; 16bpp
  5280                              <1> 
  5281                              <1> 	; 24 bit true colors
  5282 0000DFCC E8400A0000          <1> 	call	pix_op_rpl_24
  5283 0000DFD1 EB0C                <1> 	jmp	short pix_op_rpl_4
  5284                              <1> 
  5285                              <1> 	; 65536 colors (16bpp)
  5286                              <1> pix_op_rpl_2:
  5287 0000DFD3 E8260A0000          <1> 	call	pix_op_rpl_16
  5288 0000DFD8 EB05                <1> 	jmp	short pix_op_rpl_4
  5289                              <1> 
  5290                              <1> 	; 32 bit true colors
  5291                              <1> pix_op_rpl_3:
  5292 0000DFDA E8540A0000          <1> 	call	pix_op_rpl_32
  5293                              <1> pix_op_rpl_4:
  5294 0000DFDF 29F7                <1> 	sub	edi, esi
  5295 0000DFE1 893D[AC940100]      <1> 	mov	[u.r0], edi
  5296                              <1> pix_op_rpl_5:
  5297 0000DFE7 C3                  <1> 	retn
  5298                              <1> 
  5299                              <1> pix_op_rpl_w:
  5300                              <1> 	; 01/02/2021
  5301 0000DFE8 890D[E2A30100]      <1> 	mov	[maskcolor], ecx ; old color
  5302 0000DFEE 52                  <1> 	push	edx ; * ; new color
  5303 0000DFEF 89F1                <1> 	mov	ecx, esi ; win start pos
  5304 0000DFF1 89FA                <1> 	mov	edx, edi ; size (rows, cols)
  5305 0000DFF3 E8FFFBFFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5306 0000DFF8 58                  <1> 	pop	eax ; * ; new color
  5307 0000DFF9 72EC                <1> 	jc	short pix_op_rpl_5
  5308                              <1> 
  5309                              <1> 	; replace window color
  5310                              <1> pix_op_rpl_w_0:
  5311                              <1> 	; ecx = bytes per row (to be applied)
  5312                              <1> 	; edx = screen width in bytes
  5313                              <1> 	; ebx = row count
  5314                              <1> 	; eax = new color
  5315                              <1> 	; [maskcolor] = old color
  5316                              <1> 
  5317 0000DFFB 8B3D[DAA30100]      <1> 	mov	edi, [v_str]
  5318                              <1> 
  5319 0000E001 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5320 0000E008 7707                <1> 	ja	short pix_op_rpl_w_1
  5321                              <1> 
  5322                              <1> 	; 256 colors (8bpp)
  5323 0000E00A BD[EEE90000]        <1> 	mov	ebp, pix_op_rpl_8
  5324 0000E00F EB1E                <1> 	jmp	short pix_op_rpl_w_4
  5325                              <1> 
  5326                              <1> pix_op_rpl_w_1:
  5327 0000E011 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5328 0000E018 7710                <1> 	ja	short pix_op_rpl_w_3 ; 32bpp
  5329 0000E01A 7207                <1> 	jb	short pix_op_rpl_w_2 ; 16bpp
  5330                              <1> 
  5331                              <1> 	; 24 bit true colors
  5332 0000E01C BD[11EA0000]        <1> 	mov	ebp, pix_op_rpl_24
  5333 0000E021 EB0C                <1> 	jmp	short pix_op_rpl_w_4
  5334                              <1> 
  5335                              <1> 	; 65536 colors (16bpp)
  5336                              <1> pix_op_rpl_w_2:
  5337 0000E023 BD[FEE90000]        <1> 	mov	ebp, pix_op_rpl_16
  5338 0000E028 EB05                <1> 	jmp	short pix_op_rpl_w_4
  5339                              <1> 
  5340                              <1> 	; 32 bit true colors
  5341                              <1> pix_op_rpl_w_3:
  5342 0000E02A BD[33EA0000]        <1> 	mov	ebp, pix_op_rpl_32
  5343                              <1> pix_op_rpl_w_4:
  5344 0000E02F E944FFFFFF          <1> 	jmp	pix_op_rpl_w_x
  5345                              <1> 
  5346                              <1> pix_op_orc:
  5347                              <1> 	; 31/01/2021
  5348                              <1> 	; OR COLOR
  5349                              <1> 	;
  5350                              <1> 	; INPUT:
  5351                              <1> 	;   CL = color (8 bit, 256 colors)
  5352                              <1> 	;  ECX = color (16 bit and true colors)
  5353                              <1> 	;  EDX = start position (row, column)
  5354                              <1> 	;        (HW = row, DX = column)
  5355                              <1> 	;  ESI = size (rows, colums)
  5356                              <1> 	;        (HW = rows, SI = columns)
  5357                              <1> 	;
  5358                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5359                              <1> 	;
  5360                              <1> 	; OUTPUT:
  5361                              <1> 	; 	[u.r0] will be > 0 if succesful
  5362                              <1> 	
  5363 0000E034 F605[D0A30100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5364 0000E03B 7555                <1> 	jnz	short pix_op_or_w ; window
  5365                              <1> 	
  5366 0000E03D 8B3D[D2A30100]      <1> 	mov	edi, [v_mem]
  5367 0000E043 89FE                <1> 	mov	esi, edi
  5368                              <1> 	; ecx = color (CL, CX, ECX)
  5369 0000E045 89C8                <1> 	mov	eax, ecx
  5370 0000E047 8B0D[D6A30100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5371                              <1> 
  5372 0000E04D F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color 'or' ?
  5373 0000E054 7405                <1> 	jz	short pix_op_or_0 ; no
  5374 0000E056 E945110000          <1> 	jmp	m_pix_op_or ; 'or' color except mask color
  5375                              <1> pix_op_or_0:
  5376 0000E05B 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5377 0000E062 7707                <1> 	ja	short pix_op_or_1
  5378                              <1> 
  5379                              <1> 	; 256 colors (8bpp)
  5380 0000E064 E81B080000          <1> 	call	pix_op_or_8
  5381 0000E069 EB1E                <1> 	jmp	short pix_op_or_4
  5382                              <1> 
  5383                              <1> pix_op_or_1:
  5384 0000E06B 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5385 0000E072 7710                <1> 	ja	short pix_op_or_3 ; 32bpp
  5386 0000E074 7207                <1> 	jb	short pix_op_or_2 ; 16bpp
  5387                              <1> 
  5388                              <1> 	; 24 bit true colors
  5389 0000E076 E817080000          <1> 	call	pix_op_or_24
  5390 0000E07B EB0C                <1> 	jmp	short pix_op_or_4
  5391                              <1> 
  5392                              <1> 	; 65536 colors (16bpp)
  5393                              <1> pix_op_or_2:
  5394 0000E07D E808080000          <1> 	call	pix_op_or_16
  5395 0000E082 EB05                <1> 	jmp	short pix_op_or_4
  5396                              <1> 
  5397                              <1> 	; 32 bit true colors
  5398                              <1> pix_op_or_3:
  5399 0000E084 E818080000          <1> 	call	pix_op_or_32
  5400                              <1> pix_op_or_4:
  5401 0000E089 29F7                <1> 	sub	edi, esi
  5402 0000E08B 893D[AC940100]      <1> 	mov	[u.r0], edi
  5403                              <1> pix_op_or_5:
  5404 0000E091 C3                  <1> 	retn
  5405                              <1> 
  5406                              <1> pix_op_or_w:
  5407                              <1> 	; 31/01/2021
  5408 0000E092 51                  <1> 	push	ecx ; * ; color
  5409 0000E093 89D1                <1> 	mov	ecx, edx ; win start pos
  5410 0000E095 89F2                <1> 	mov	edx, esi ; size (rows, cols)
  5411 0000E097 E85BFBFFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5412 0000E09C 58                  <1> 	pop	eax ; * ; color
  5413 0000E09D 72F2                <1> 	jc	short pix_op_or_5
  5414                              <1> 
  5415 0000E09F F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color 'or' ?
  5416 0000E0A6 7405                <1> 	jz	short pix_op_or_w_0 ; no
  5417 0000E0A8 E980110000          <1> 	jmp	m_pix_op_or_w 
  5418                              <1> 			; window 'or' color except mask color
  5419                              <1> pix_op_or_w_0:
  5420                              <1> 	; ecx = bytes per row (to be applied)
  5421                              <1> 	; edx = screen width in bytes
  5422                              <1> 	; ebx = row count
  5423                              <1> 	; eax = color
  5424                              <1> 
  5425 0000E0AD 8B3D[DAA30100]      <1> 	mov	edi, [v_str]
  5426 0000E0B3 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5427 0000E0BA 7707                <1> 	ja	short pix_op_or_w_1
  5428                              <1> 
  5429                              <1> 	; 256 colors (8bpp)
  5430 0000E0BC BD[84E80000]        <1> 	mov	ebp, pix_op_or_8
  5431 0000E0C1 EB1E                <1> 	jmp	short pix_op_or_w_4
  5432                              <1> 
  5433                              <1> pix_op_or_w_1:
  5434 0000E0C3 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5435 0000E0CA 7710                <1> 	ja	short pix_op_or_w_3 ; 32bpp
  5436 0000E0CC 7207                <1> 	jb	short pix_op_or_w_2 ; 16bpp
  5437                              <1> 
  5438                              <1> 	; 24 bit true colors
  5439 0000E0CE BD[92E80000]        <1> 	mov	ebp, pix_op_or_24
  5440 0000E0D3 EB0C                <1> 	jmp	short pix_op_or_w_4
  5441                              <1> 
  5442                              <1> 	; 65536 colors (16bpp)
  5443                              <1> pix_op_or_w_2:
  5444 0000E0D5 BD[8AE80000]        <1> 	mov	ebp, pix_op_or_16
  5445 0000E0DA EB05                <1> 	jmp	short pix_op_or_w_4
  5446                              <1> 
  5447                              <1> 	; 32 bit true colors
  5448                              <1> pix_op_or_w_3:
  5449 0000E0DC BD[A1E80000]        <1> 	mov	ebp, pix_op_or_32
  5450                              <1> pix_op_or_w_4:
  5451 0000E0E1 E992FEFFFF          <1> 	jmp	pix_op_orc_w_x
  5452                              <1> 
  5453                              <1> pix_op_and:
  5454                              <1> 	; 31/01/2021
  5455                              <1> 	; AND COLOR
  5456                              <1> 	;
  5457                              <1> 	; INPUT:
  5458                              <1> 	;   CL = color (8 bit, 256 colors)
  5459                              <1> 	;  ECX = color (16 bit and true colors)
  5460                              <1> 	;  EDX = start position (row, column)
  5461                              <1> 	;        (HW = row, DX = column)
  5462                              <1> 	;  ESI = size (rows, colums)
  5463                              <1> 	;        (HW = rows, SI = columns)
  5464                              <1> 	;
  5465                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5466                              <1> 	;
  5467                              <1> 	; OUTPUT:
  5468                              <1> 	; 	[u.r0] will be > 0 if succesful
  5469                              <1> 	
  5470 0000E0E6 F605[D0A30100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5471 0000E0ED 7555                <1> 	jnz	short pix_op_and_w ; window
  5472                              <1> 	
  5473 0000E0EF 8B3D[D2A30100]      <1> 	mov	edi, [v_mem]
  5474 0000E0F5 89FE                <1> 	mov	esi, edi
  5475                              <1> 	; ecx = color (CL, CX, ECX)
  5476 0000E0F7 89C8                <1> 	mov	eax, ecx
  5477 0000E0F9 8B0D[D6A30100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5478                              <1> 
  5479 0000E0FF F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color 'and' ?
  5480 0000E106 7405                <1> 	jz	short pix_op_and_0 ; no
  5481 0000E108 E9D30F0000          <1> 	jmp	m_pix_op_and ; 'and' color except mask color
  5482                              <1> pix_op_and_0:
  5483 0000E10D 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5484 0000E114 7707                <1> 	ja	short pix_op_and_1
  5485                              <1> 
  5486                              <1> 	; 256 colors (8bpp)
  5487 0000E116 E88E070000          <1> 	call	pix_op_and_8
  5488 0000E11B EB1E                <1> 	jmp	short pix_op_and_4
  5489                              <1> 
  5490                              <1> pix_op_and_1:
  5491 0000E11D 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5492 0000E124 7710                <1> 	ja	short pix_op_and_3 ; 32bpp
  5493 0000E126 7207                <1> 	jb	short pix_op_and_2 ; 16bpp
  5494                              <1> 
  5495                              <1> 	; 24 bit true colors
  5496 0000E128 E88A070000          <1> 	call	pix_op_and_24
  5497 0000E12D EB0C                <1> 	jmp	short pix_op_and_4
  5498                              <1> 
  5499                              <1> 	; 65536 colors (16bpp)
  5500                              <1> pix_op_and_2:
  5501 0000E12F E87B070000          <1> 	call	pix_op_and_16
  5502 0000E134 EB05                <1> 	jmp	short pix_op_and_4
  5503                              <1> 
  5504                              <1> 	; 32 bit true colors
  5505                              <1> pix_op_and_3:
  5506 0000E136 E88B070000          <1> 	call	pix_op_and_32
  5507                              <1> pix_op_and_4:
  5508 0000E13B 29F7                <1> 	sub	edi, esi
  5509 0000E13D 893D[AC940100]      <1> 	mov	[u.r0], edi
  5510                              <1> pix_op_and_5:
  5511 0000E143 C3                  <1> 	retn
  5512                              <1> 
  5513                              <1> pix_op_and_w:
  5514                              <1> 	; 31/01/2021
  5515 0000E144 51                  <1> 	push	ecx ; * ; color
  5516 0000E145 89D1                <1> 	mov	ecx, edx ; win start pos
  5517 0000E147 89F2                <1> 	mov	edx, esi ; size (rows, cols)
  5518 0000E149 E8A9FAFFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5519 0000E14E 58                  <1> 	pop	eax ; * ; color
  5520 0000E14F 72F2                <1> 	jc	short pix_op_and_5
  5521                              <1> 
  5522 0000E151 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color 'and' ?
  5523 0000E158 7405                <1> 	jz	short pix_op_and_w_0 ; no
  5524 0000E15A E90E100000          <1> 	jmp	m_pix_op_and_w 
  5525                              <1> 			; window 'and' color except mask color
  5526                              <1> pix_op_and_w_0:
  5527                              <1> 	; ecx = bytes per row (to be applied)
  5528                              <1> 	; edx = screen width in bytes
  5529                              <1> 	; ebx = row count
  5530                              <1> 	; eax = color
  5531                              <1> 
  5532 0000E15F 8B3D[DAA30100]      <1> 	mov	edi, [v_str]
  5533 0000E165 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5534 0000E16C 7707                <1> 	ja	short pix_op_and_w_1
  5535                              <1> 
  5536                              <1> 	; 256 colors (8bpp)
  5537 0000E16E BD[A9E80000]        <1> 	mov	ebp, pix_op_and_8
  5538 0000E173 EB1E                <1> 	jmp	short pix_op_and_w_4
  5539                              <1> 
  5540                              <1> pix_op_and_w_1:
  5541 0000E175 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5542 0000E17C 7710                <1> 	ja	short pix_op_and_w_3 ; 32bpp
  5543 0000E17E 7207                <1> 	jb	short pix_op_and_w_2 ; 16bpp
  5544                              <1> 
  5545                              <1> 	; 24 bit true colors
  5546 0000E180 BD[B7E80000]        <1> 	mov	ebp, pix_op_and_24
  5547 0000E185 EB0C                <1> 	jmp	short pix_op_and_w_4
  5548                              <1> 
  5549                              <1> 	; 65536 colors (16bpp)
  5550                              <1> pix_op_and_w_2:
  5551 0000E187 BD[AFE80000]        <1> 	mov	ebp, pix_op_and_16
  5552 0000E18C EB05                <1> 	jmp	short pix_op_and_w_4
  5553                              <1> 
  5554                              <1> 	; 32 bit true colors
  5555                              <1> pix_op_and_w_3:
  5556 0000E18E BD[C6E80000]        <1> 	mov	ebp, pix_op_and_32
  5557                              <1> pix_op_and_w_4:
  5558 0000E193 E9E0FDFFFF          <1> 	jmp	pix_op_and_w_x
  5559                              <1> 
  5560                              <1> pix_op_xor:
  5561                              <1> 	; 31/01/2021
  5562                              <1> 	; XOR COLOR
  5563                              <1> 	;
  5564                              <1> 	; INPUT:
  5565                              <1> 	;   CL = color (8 bit, 256 colors)
  5566                              <1> 	;  ECX = color (16 bit and true colors)
  5567                              <1> 	;  EDX = start position (row, column)
  5568                              <1> 	;        (HW = row, DX = column)
  5569                              <1> 	;  ESI = size (rows, colums)
  5570                              <1> 	;        (HW = rows, SI = columns)
  5571                              <1> 	;
  5572                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5573                              <1> 	;
  5574                              <1> 	; OUTPUT:
  5575                              <1> 	; 	[u.r0] will be > 0 if succesful
  5576                              <1> 	
  5577 0000E198 F605[D0A30100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5578 0000E19F 7555                <1> 	jnz	short pix_op_xor_w ; window
  5579                              <1> 
  5580 0000E1A1 8B3D[D2A30100]      <1> 	mov	edi, [v_mem]
  5581 0000E1A7 89FE                <1> 	mov	esi, edi
  5582                              <1> 	; ecx = color (CL, CX, ECX)
  5583 0000E1A9 89C8                <1> 	mov	eax, ecx
  5584 0000E1AB 8B0D[D6A30100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5585                              <1> 
  5586 0000E1B1 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color 'xor' ?
  5587 0000E1B8 7405                <1> 	jz	short pix_op_xor_0 ; no
  5588 0000E1BA E9A1100000          <1> 	jmp	m_pix_op_xor ; 'xor' color except mask color
  5589                              <1> pix_op_xor_0:
  5590 0000E1BF 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5591 0000E1C6 7707                <1> 	ja	short pix_op_xor_1
  5592                              <1> 
  5593                              <1> 	; 256 colors (8bpp)
  5594 0000E1C8 E801070000          <1> 	call	pix_op_xor_8
  5595 0000E1CD EB1E                <1> 	jmp	short pix_op_xor_4
  5596                              <1> 
  5597                              <1> pix_op_xor_1:
  5598 0000E1CF 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5599 0000E1D6 7710                <1> 	ja	short pix_op_xor_3 ; 32bpp
  5600 0000E1D8 7207                <1> 	jb	short pix_op_xor_2 ; 16bpp
  5601                              <1> 
  5602                              <1> 	; 24 bit true colors
  5603 0000E1DA E8FD060000          <1> 	call	pix_op_xor_24
  5604 0000E1DF EB0C                <1> 	jmp	short pix_op_xor_4
  5605                              <1> 
  5606                              <1> 	; 65536 colors (16bpp)
  5607                              <1> pix_op_xor_2:
  5608 0000E1E1 E8EE060000          <1> 	call	pix_op_xor_16
  5609 0000E1E6 EB05                <1> 	jmp	short pix_op_xor_4
  5610                              <1> 
  5611                              <1> 	; 32 bit true colors
  5612                              <1> pix_op_xor_3:
  5613 0000E1E8 E8FE060000          <1> 	call	pix_op_xor_32
  5614                              <1> pix_op_xor_4:
  5615 0000E1ED 29F7                <1> 	sub	edi, esi
  5616 0000E1EF 893D[AC940100]      <1> 	mov	[u.r0], edi
  5617                              <1> pix_op_xor_5:
  5618 0000E1F5 C3                  <1> 	retn
  5619                              <1> 
  5620                              <1> pix_op_xor_w:
  5621                              <1> 	; 31/01/2021
  5622 0000E1F6 51                  <1> 	push	ecx ; * ; color
  5623 0000E1F7 89D1                <1> 	mov	ecx, edx ; win start pos
  5624 0000E1F9 89F2                <1> 	mov	edx, esi ; size (rows, cols)
  5625 0000E1FB E8F7F9FFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5626 0000E200 58                  <1> 	pop	eax ; * ; color
  5627 0000E201 72F2                <1> 	jc	short pix_op_xor_5
  5628                              <1> 
  5629 0000E203 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color 'xor' ?
  5630 0000E20A 7405                <1> 	jz	short pix_op_xor_w_0 ; no
  5631 0000E20C E9DC100000          <1> 	jmp	m_pix_op_xor_w 
  5632                              <1> 			; window 'xor' color except mask color
  5633                              <1> pix_op_xor_w_0:
  5634                              <1> 	; ecx = bytes per row (to be applied)
  5635                              <1> 	; edx = screen width in bytes
  5636                              <1> 	; ebx = row count
  5637                              <1> 	; eax = color
  5638                              <1> 
  5639 0000E211 8B3D[DAA30100]      <1> 	mov	edi, [v_str]
  5640 0000E217 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5641 0000E21E 7707                <1> 	ja	short pix_op_xor_w_1
  5642                              <1> 
  5643                              <1> 	; 256 colors (8bpp)
  5644 0000E220 BD[CEE80000]        <1> 	mov	ebp, pix_op_xor_8
  5645 0000E225 EB1E                <1> 	jmp	short pix_op_xor_w_4
  5646                              <1> 
  5647                              <1> pix_op_xor_w_1:
  5648 0000E227 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5649 0000E22E 7710                <1> 	ja	short pix_op_xor_w_3 ; 32bpp
  5650 0000E230 7207                <1> 	jb	short pix_op_xor_w_2 ; 16bpp
  5651                              <1> 
  5652                              <1> 	; 24 bit true colors
  5653 0000E232 BD[DCE80000]        <1> 	mov	ebp, pix_op_xor_24
  5654 0000E237 EB0C                <1> 	jmp	short pix_op_xor_w_4
  5655                              <1> 
  5656                              <1> 	; 65536 colors (16bpp)
  5657                              <1> pix_op_xor_w_2:
  5658 0000E239 BD[D4E80000]        <1> 	mov	ebp, pix_op_xor_16
  5659 0000E23E EB05                <1> 	jmp	short pix_op_xor_w_4
  5660                              <1> 
  5661                              <1> 	; 32 bit true colors
  5662                              <1> pix_op_xor_w_3:
  5663 0000E240 BD[EBE80000]        <1> 	mov	ebp, pix_op_xor_32
  5664                              <1> pix_op_xor_w_4:
  5665 0000E245 E92EFDFFFF          <1> 	jmp	pix_op_xor_w_x
  5666                              <1> 
  5667                              <1> pix_op_new:
  5668                              <1> 	; 31/01/2021
  5669                              <1> 	; 30/01/2021
  5670                              <1> 	; CHANGE COLOR
  5671                              <1> 	;
  5672                              <1> 	; INPUT:
  5673                              <1> 	;   CL = color (8 bit, 256 colors)
  5674                              <1> 	;  ECX = color (16 bit and true colors)
  5675                              <1> 	;  EDX = start position (row, column)
  5676                              <1> 	;        (HW = row, DX = column)
  5677                              <1> 	;  ESI = size (rows, colums)
  5678                              <1> 	;        (HW = rows, SI = columns)
  5679                              <1> 	;
  5680                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5681                              <1> 	;
  5682                              <1> 	; OUTPUT:
  5683                              <1> 	; 	[u.r0] will be > 0 if succesful
  5684                              <1> 	
  5685 0000E24A F605[D0A30100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5686 0000E251 7554                <1> 	jnz	short pix_op_new_w ; window
  5687                              <1> 	
  5688 0000E253 8B3D[D2A30100]      <1> 	mov	edi, [v_mem]
  5689 0000E259 89FE                <1> 	mov	esi, edi
  5690                              <1> 	; ecx = color (CL, CX, ECX)
  5691 0000E25B 89C8                <1> 	mov	eax, ecx
  5692 0000E25D 8B0D[D6A30100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5693                              <1> 
  5694 0000E263 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color change ?
  5695 0000E26A 7405                <1> 	jz	short pix_op_new_0 ; no
  5696 0000E26C E90A0B0000          <1> 	jmp	m_pix_op_new ; change color except mask color
  5697                              <1> pix_op_new_0:
  5698 0000E271 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5699 0000E278 7706                <1> 	ja	short pix_op_new_2
  5700                              <1> 
  5701                              <1> 	; 256 colors (8bpp)
  5702                              <1> pix_op_new_1:
  5703 0000E27A 88C4                <1> 	mov	ah, al
  5704 0000E27C D1E9                <1> 	shr	ecx, 1
  5705 0000E27E EB12                <1> 	jmp	short pix_op_new_3
  5706                              <1> 
  5707                              <1> pix_op_new_2:
  5708 0000E280 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5709 0000E287 7713                <1> 	ja	short pix_op_new_4 ; 32bpp
  5710 0000E289 7207                <1> 	jb	short pix_op_new_3 ; 16bpp
  5711                              <1> 
  5712                              <1> 	; 31/01/2021
  5713                              <1> 	
  5714                              <1> 	; 24 bit true colors
  5715 0000E28B E849050000          <1> 	call	pix_op_new_24
  5716                              <1> 
  5717 0000E290 EB0C                <1> 	jmp	short pix_op_new_5
  5718                              <1> 
  5719                              <1> 	; 65536 colors (16bpp)
  5720                              <1> pix_op_new_3:
  5721 0000E292 89C2                <1> 	mov	edx, eax
  5722 0000E294 C1E010              <1> 	shl	eax, 16
  5723 0000E297 6689D0              <1> 	mov	ax, dx
  5724 0000E29A D1E9                <1> 	shr	ecx, 1 ; dword counts
  5725                              <1> 	; 32 bit true colors
  5726                              <1> pix_op_new_4:
  5727 0000E29C F3AB                <1> 	rep	stosd
  5728                              <1> pix_op_new_5:
  5729 0000E29E 29F7                <1> 	sub	edi, esi
  5730 0000E2A0 893D[AC940100]      <1> 	mov	[u.r0], edi
  5731                              <1> pix_op_new_6:
  5732 0000E2A6 C3                  <1> 	retn
  5733                              <1> 
  5734                              <1> pix_op_new_w:
  5735                              <1> 	; 31/01/2021
  5736                              <1> 	; 30/01/2021
  5737 0000E2A7 51                  <1> 	push	ecx ; * ; color
  5738 0000E2A8 89D1                <1> 	mov	ecx, edx ; win start pos
  5739 0000E2AA 89F2                <1> 	mov	edx, esi ; size (rows, cols)
  5740 0000E2AC E846F9FFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5741 0000E2B1 58                  <1> 	pop	eax ; * ; color
  5742 0000E2B2 72F2                <1> 	jc	short pix_op_new_6
  5743                              <1> 
  5744 0000E2B4 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color change ?
  5745 0000E2BB 7405                <1> 	jz	short pix_op_new_w_0 ; no
  5746 0000E2BD E9470B0000          <1> 	jmp	m_pix_op_new_w 
  5747                              <1> 			; window chg color except mask color
  5748                              <1> pix_op_new_w_0:
  5749                              <1> 	; ecx = bytes per row (to be applied)
  5750                              <1> 	; edx = screen width in bytes
  5751                              <1> 	; ebx = row count
  5752                              <1> 	; eax = color
  5753                              <1> 
  5754 0000E2C2 8B3D[DAA30100]      <1> 	mov	edi, [v_str]
  5755                              <1> 
  5756 0000E2C8 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5757 0000E2CF 7707                <1> 	ja	short pix_op_new_w_1
  5758                              <1> 
  5759                              <1> 	; 256 colors (8bpp)
  5760 0000E2D1 BD[D2E70000]        <1> 	mov	ebp, pix_op_new_8
  5761 0000E2D6 EB1E                <1> 	jmp	short pix_op_new_w_x
  5762                              <1> 
  5763                              <1> pix_op_new_w_1:
  5764 0000E2D8 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5765 0000E2DF 7710                <1> 	ja	short pix_op_new_w_3 ; 32bpp
  5766 0000E2E1 7207                <1> 	jb	short pix_op_new_w_2 ; 16bpp
  5767                              <1> 
  5768                              <1> 	; 24 bit true colors
  5769 0000E2E3 BD[D9E70000]        <1> 	mov	ebp, pix_op_new_24
  5770 0000E2E8 EB0C                <1> 	jmp	short pix_op_new_w_x
  5771                              <1> 
  5772                              <1> 	; 65536 colors (16bpp)
  5773                              <1> pix_op_new_w_2:
  5774 0000E2EA BD[D5E70000]        <1> 	mov	ebp, pix_op_new_16
  5775 0000E2EF EB05                <1> 	jmp	short pix_op_new_w_x
  5776                              <1> 
  5777                              <1> 	; 32 bit true colors
  5778                              <1> pix_op_new_w_3:
  5779 0000E2F1 BD[E5E70000]        <1> 	mov	ebp, pix_op_new_32
  5780                              <1> 	;jmp	short pix_op_new_w_x
  5781                              <1> 
  5782                              <1> pix_op_new_w_x:
  5783                              <1> pix_op_not_w_x:
  5784                              <1> pix_op_neg_w_x:
  5785                              <1> pix_op_inc_w_x:
  5786                              <1> pix_op_dec_w_x:
  5787                              <1> 	; 27/02/2021
  5788                              <1> 	; 01/02/2021
  5789                              <1> 	; 31/01/2021
  5790                              <1> 	; ecx = bytes per row (to be applied)
  5791                              <1> 	; edx = windows (screen) width in bytes
  5792                              <1> 	; ebx = row count
  5793                              <1> 	; eax = color
  5794                              <1> 	; ebp = pixel operation subroutine address
  5795                              <1> 	;push	edx ; 01/02/2021
  5796 0000E2F6 51                  <1> 	push	ecx
  5797 0000E2F7 57                  <1> 	push	edi
  5798 0000E2F8 8B0D[E6A30100]      <1> 	mov	ecx, [pixcount] ; 27/02/2021
  5799 0000E2FE FFD5                <1> 	call	ebp ; call pixel-row operation
  5800 0000E300 5F                  <1> 	pop	edi
  5801 0000E301 59                  <1> 	pop	ecx ; bytes per row
  5802 0000E302 010D[AC940100]      <1> 	add	[u.r0], ecx
  5803                              <1> 	;pop	edx ; 01/02/2021
  5804 0000E308 01D7                <1> 	add	edi, edx ; next row
  5805 0000E30A 4B                  <1> 	dec	ebx
  5806 0000E30B 75E9                <1> 	jnz	short pix_op_new_w_x
  5807 0000E30D C3                  <1> 	retn
  5808                              <1> 
  5809                              <1> pix_op_not:
  5810                              <1> 	; 31/01/2021
  5811                              <1> 	; NOT COLOR
  5812                              <1> 	;
  5813                              <1> 	; INPUT:
  5814                              <1> 	;  ECX = start position (row, column)
  5815                              <1> 	;        (HW = row, CX = column)
  5816                              <1> 	;  EDX = size (rows, colums)
  5817                              <1> 	;        (HW = rows, DX = columns)
  5818                              <1> 	;	 (0 -> invalid 	
  5819                              <1> 	;        (1 -> horizontal or vertical line)
  5820                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5821                              <1> 	;
  5822                              <1> 	; OUTPUT:
  5823                              <1> 	; 	[u.r0] will be > 0 if succesful
  5824                              <1> 	
  5825 0000E30E F605[D0A30100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5826 0000E315 7553                <1> 	jnz	short pix_op_not_w ; window
  5827                              <1> 	
  5828 0000E317 8B3D[D2A30100]      <1> 	mov	edi, [v_mem]
  5829 0000E31D 89FE                <1> 	mov	esi, edi
  5830 0000E31F 8B0D[D6A30100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5831                              <1> 
  5832 0000E325 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color 'not' ?
  5833 0000E32C 7405                <1> 	jz	short pix_op_not_0 ; no
  5834 0000E32E E9ED0F0000          <1> 	jmp	m_pix_op_not ; 'not' color except mask color
  5835                              <1> pix_op_not_0:
  5836 0000E333 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5837 0000E33A 7707                <1> 	ja	short pix_op_not_1
  5838                              <1> 
  5839                              <1> 	; 256 colors (8bpp)
  5840 0000E33C E8F5050000          <1> 	call	pix_op_not_8
  5841 0000E341 EB1E                <1> 	jmp	short pix_op_not_4
  5842                              <1> 
  5843                              <1> pix_op_not_1:
  5844 0000E343 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5845 0000E34A 7710                <1> 	ja	short pix_op_not_3 ; 32bpp
  5846 0000E34C 7207                <1> 	jb	short pix_op_not_2 ; 16bpp
  5847                              <1> 
  5848                              <1> 	; 24 bit true colors
  5849 0000E34E E8F1050000          <1> 	call	pix_op_not_24
  5850 0000E353 EB0C                <1> 	jmp	short pix_op_not_4
  5851                              <1> 
  5852                              <1> 	; 65536 colors (16bpp)
  5853                              <1> pix_op_not_2:
  5854 0000E355 E8E2050000          <1> 	call	pix_op_not_16
  5855 0000E35A EB05                <1> 	jmp	short pix_op_not_4
  5856                              <1> 
  5857                              <1> 	; 32 bit true colors
  5858                              <1> pix_op_not_3:
  5859 0000E35C E8EE050000          <1> 	call	pix_op_not_32
  5860                              <1> pix_op_not_4:
  5861 0000E361 29F7                <1> 	sub	edi, esi
  5862 0000E363 893D[AC940100]      <1> 	mov	[u.r0], edi
  5863                              <1> pix_op_not_5:
  5864 0000E369 C3                  <1> 	retn
  5865                              <1> 
  5866                              <1> pix_op_not_w:
  5867                              <1> 	; 31/01/2021
  5868                              <1> 	; ecx = win start pos (row, column)
  5869                              <1> 	; edx = size (rows, columns)
  5870 0000E36A E888F8FFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5871 0000E36F 72F8                <1> 	jc	short pix_op_not_5
  5872                              <1> 
  5873 0000E371 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked color 'not' ?
  5874 0000E378 7405                <1> 	jz	short pix_op_not_w_0 ; no
  5875 0000E37A E926100000          <1> 	jmp	m_pix_op_not_w 
  5876                              <1> 			; window 'not' color except mask color
  5877                              <1> pix_op_not_w_0:
  5878                              <1> 	; ecx = bytes per row (to be applied)
  5879                              <1> 	; edx = screen width in bytes
  5880                              <1> 	; ebx = row count
  5881                              <1> 
  5882 0000E37F 8B3D[DAA30100]      <1> 	mov	edi, [v_str]
  5883                              <1> 
  5884 0000E385 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5885 0000E38C 7707                <1> 	ja	short pix_op_not_w_1
  5886                              <1> 
  5887                              <1> 	; 256 colors (8bpp)
  5888 0000E38E BD[36E90000]        <1> 	mov	ebp, pix_op_not_8
  5889 0000E393 EB1E                <1> 	jmp	short pix_op_not_w_4
  5890                              <1> 
  5891                              <1> pix_op_not_w_1:
  5892 0000E395 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5893 0000E39C 7710                <1> 	ja	short pix_op_not_w_3 ; 32bpp
  5894 0000E39E 7207                <1> 	jb	short pix_op_not_w_2 ; 16bpp
  5895                              <1> 
  5896                              <1> 	; 24 bit true colors
  5897 0000E3A0 BD[44E90000]        <1> 	mov	ebp, pix_op_not_24
  5898 0000E3A5 EB0C                <1> 	jmp	short pix_op_not_w_4
  5899                              <1> 
  5900                              <1> 	; 65536 colors (16bpp)
  5901                              <1> pix_op_not_w_2:
  5902 0000E3A7 BD[3CE90000]        <1> 	mov	ebp, pix_op_not_16
  5903 0000E3AC EB05                <1> 	jmp	short pix_op_not_w_4
  5904                              <1> 
  5905                              <1> 	; 32 bit true colors
  5906                              <1> pix_op_not_w_3:
  5907 0000E3AE BD[4FE90000]        <1> 	mov	ebp, pix_op_not_32
  5908                              <1> pix_op_not_w_4:
  5909 0000E3B3 E93EFFFFFF          <1> 	jmp	pix_op_not_w_x
  5910                              <1> 
  5911                              <1> pix_op_neg:
  5912                              <1> 	; 31/01/2021
  5913                              <1> 	; NEGATE COLOR
  5914                              <1> 	;
  5915                              <1> 	; INPUT:
  5916                              <1> 	;  ECX = start position (row, column)
  5917                              <1> 	;        (HW = row, CX = column)
  5918                              <1> 	;  EDX = size (rows, colums)
  5919                              <1> 	;        (HW = rows, DX = columns)
  5920                              <1> 	;	 (0 -> invalid 	
  5921                              <1> 	;        (1 -> horizontal or vertical line)
  5922                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5923                              <1> 	;
  5924                              <1> 	; OUTPUT:
  5925                              <1> 	; 	[u.r0] will be > 0 if succesful
  5926                              <1> 
  5927 0000E3B8 F605[D0A30100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5928 0000E3BF 7553                <1> 	jnz	short pix_op_neg_w ; window
  5929                              <1> 
  5930 0000E3C1 8B3D[D2A30100]      <1> 	mov	edi, [v_mem]
  5931 0000E3C7 89FE                <1> 	mov	esi, edi
  5932 0000E3C9 8B0D[D6A30100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5933                              <1> 
  5934 0000E3CF F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked negate color ?
  5935 0000E3D6 7405                <1> 	jz	short pix_op_neg_0 ; no
  5936 0000E3D8 E9FB0F0000          <1> 	jmp	m_pix_op_neg ; 'neg' color except mask color
  5937                              <1> pix_op_neg_0:
  5938 0000E3DD 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5939 0000E3E4 7707                <1> 	ja	short pix_op_neg_1
  5940                              <1> 
  5941                              <1> 	; 256 colors (8bpp)
  5942 0000E3E6 E86C050000          <1> 	call	pix_op_neg_8
  5943 0000E3EB EB1E                <1> 	jmp	short pix_op_neg_4
  5944                              <1> 
  5945                              <1> pix_op_neg_1:
  5946 0000E3ED 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5947 0000E3F4 7710                <1> 	ja	short pix_op_neg_3 ; 32bpp
  5948 0000E3F6 7207                <1> 	jb	short pix_op_neg_2 ; 16bpp
  5949                              <1> 
  5950                              <1> 	; 24 bit true colors
  5951 0000E3F8 E868050000          <1> 	call	pix_op_neg_24
  5952 0000E3FD EB0C                <1> 	jmp	short pix_op_neg_4
  5953                              <1> 
  5954                              <1> 	; 65536 colors (16bpp)
  5955                              <1> pix_op_neg_2:
  5956 0000E3FF E859050000          <1> 	call	pix_op_neg_16
  5957 0000E404 EB05                <1> 	jmp	short pix_op_neg_4
  5958                              <1> 
  5959                              <1> 	; 32 bit true colors
  5960                              <1> pix_op_neg_3:
  5961 0000E406 E86C050000          <1> 	call	pix_op_neg_32
  5962                              <1> pix_op_neg_4:
  5963 0000E40B 29F7                <1> 	sub	edi, esi
  5964 0000E40D 893D[AC940100]      <1> 	mov	[u.r0], edi
  5965                              <1> pix_op_neg_5:
  5966 0000E413 C3                  <1> 	retn
  5967                              <1> 
  5968                              <1> pix_op_neg_w:
  5969                              <1> 	; 31/01/2021
  5970                              <1> 	; ecx = win start pos (row, column)
  5971                              <1> 	; edx = size (rows, columns)
  5972 0000E414 E8DEF7FFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5973 0000E419 72F8                <1> 	jc	short pix_op_neg_5
  5974                              <1> 
  5975 0000E41B F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked negate color ?
  5976 0000E422 7405                <1> 	jz	short pix_op_neg_w_0 ; no
  5977 0000E424 E934100000          <1> 	jmp	m_pix_op_neg_w 
  5978                              <1> 			; window 'neg' color except mask color
  5979                              <1> pix_op_neg_w_0:
  5980                              <1> 	; ecx = bytes per row (to be applied)
  5981                              <1> 	; edx = screen width in bytes
  5982                              <1> 	; ebx = row count
  5983                              <1> 
  5984 0000E429 8B3D[DAA30100]      <1> 	mov	edi, [v_str]
  5985                              <1> 
  5986 0000E42F 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5987 0000E436 7707                <1> 	ja	short pix_op_neg_w_1
  5988                              <1> 
  5989                              <1> 	; 256 colors (8bpp)
  5990 0000E438 BD[57E90000]        <1> 	mov	ebp, pix_op_neg_8
  5991 0000E43D EB1E                <1> 	jmp	short pix_op_neg_w_4
  5992                              <1> 
  5993                              <1> pix_op_neg_w_1:
  5994 0000E43F 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5995 0000E446 7710                <1> 	ja	short pix_op_neg_w_3 ; 32bpp
  5996 0000E448 7207                <1> 	jb	short pix_op_neg_w_2 ; 16bpp
  5997                              <1> 
  5998                              <1> 	; 24 bit true colors
  5999 0000E44A BD[65E90000]        <1> 	mov	ebp, pix_op_neg_24
  6000 0000E44F EB0C                <1> 	jmp	short pix_op_neg_w_4
  6001                              <1> 
  6002                              <1> 	; 65536 colors (16bpp)
  6003                              <1> pix_op_neg_w_2:
  6004 0000E451 BD[5DE90000]        <1> 	mov	ebp, pix_op_neg_16
  6005 0000E456 EB05                <1> 	jmp	short pix_op_neg_w_4
  6006                              <1> 
  6007                              <1> 	; 32 bit true colors
  6008                              <1> pix_op_neg_w_3:
  6009 0000E458 BD[77E90000]        <1> 	mov	ebp, pix_op_neg_32
  6010                              <1> pix_op_neg_w_4:
  6011 0000E45D E994FEFFFF          <1> 	jmp	pix_op_neg_w_x
  6012                              <1> 
  6013                              <1> pix_op_inc:
  6014                              <1> 	; 31/01/2021
  6015                              <1> 	; INCREASE COLOR
  6016                              <1> 	;
  6017                              <1> 	; INPUT:
  6018                              <1> 	;  ECX = start position (row, column)
  6019                              <1> 	;        (HW = row, CX = column)
  6020                              <1> 	;  EDX = size (rows, colums)
  6021                              <1> 	;        (HW = rows, DX = columns)
  6022                              <1> 	;	 (0 -> invalid 	
  6023                              <1> 	;        (1 -> horizontal or vertical line)
  6024                              <1> 	;  [maskcolor] = mask color (to be excluded)
  6025                              <1> 	;
  6026                              <1> 	; OUTPUT:
  6027                              <1> 	; 	[u.r0] will be > 0 if succesful
  6028                              <1> 	
  6029 0000E462 F605[D0A30100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  6030 0000E469 7553                <1> 	jnz	short pix_op_inc_w ; window
  6031                              <1> 	
  6032 0000E46B 8B3D[D2A30100]      <1> 	mov	edi, [v_mem]
  6033 0000E471 89FE                <1> 	mov	esi, edi
  6034 0000E473 8B0D[D6A30100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  6035                              <1> 
  6036 0000E479 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked increase color ?
  6037 0000E480 7405                <1> 	jz	short pix_op_inc_0 ; no
  6038 0000E482 E909100000          <1> 	jmp	m_pix_op_inc ; 'inc' color except mask color
  6039                              <1> pix_op_inc_0:
  6040 0000E487 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  6041 0000E48E 7707                <1> 	ja	short pix_op_inc_1
  6042                              <1> 
  6043                              <1> 	; 256 colors (8bpp)
  6044 0000E490 E8EA040000          <1> 	call	pix_op_inc_8
  6045 0000E495 EB1E                <1> 	jmp	short pix_op_inc_4
  6046                              <1> 
  6047                              <1> pix_op_inc_1:
  6048 0000E497 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  6049 0000E49E 7710                <1> 	ja	short pix_op_inc_3 ; 32bpp
  6050 0000E4A0 7207                <1> 	jb	short pix_op_inc_2 ; 16bpp
  6051                              <1> 
  6052                              <1> 	; 24 bit true colors
  6053 0000E4A2 E8EF040000          <1> 	call	pix_op_inc_24
  6054 0000E4A7 EB0C                <1> 	jmp	short pix_op_inc_4
  6055                              <1> 
  6056                              <1> 	; 65536 colors (16bpp)
  6057                              <1> pix_op_inc_2:
  6058 0000E4A9 E8DB040000          <1> 	call	pix_op_inc_16
  6059 0000E4AE EB05                <1> 	jmp	short pix_op_inc_4
  6060                              <1> 
  6061                              <1> 	; 32 bit true colors
  6062                              <1> pix_op_inc_3:
  6063 0000E4B0 E8F5040000          <1> 	call	pix_op_inc_32
  6064                              <1> pix_op_inc_4:
  6065 0000E4B5 29F7                <1> 	sub	edi, esi
  6066 0000E4B7 893D[AC940100]      <1> 	mov	[u.r0], edi
  6067                              <1> pix_op_inc_5:
  6068 0000E4BD C3                  <1> 	retn
  6069                              <1> 
  6070                              <1> pix_op_inc_w:
  6071                              <1> 	; 31/01/2021
  6072                              <1> 	; ecx = win start pos (row, column)
  6073                              <1> 	; edx = size (rows, columns)
  6074 0000E4BE E834F7FFFF          <1> 	call	sysvideo_15_12 ; window preparations
  6075 0000E4C3 72F8                <1> 	jc	short pix_op_inc_5
  6076                              <1> 
  6077 0000E4C5 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked increase color ?
  6078 0000E4CC 7405                <1> 	jz	short pix_op_inc_w_0 ; no
  6079 0000E4CE E956100000          <1> 	jmp	m_pix_op_inc_w 
  6080                              <1> 			; window 'inc' color except mask color
  6081                              <1> pix_op_inc_w_0:
  6082                              <1> 	; ecx = bytes per row (to be applied)
  6083                              <1> 	; edx = screen width in bytes
  6084                              <1> 	; ebx = row count
  6085                              <1> 
  6086 0000E4D3 8B3D[DAA30100]      <1> 	mov	edi, [v_str]
  6087                              <1> 
  6088 0000E4D9 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  6089 0000E4E0 7707                <1> 	ja	short pix_op_inc_w_1
  6090                              <1> 
  6091                              <1> 	; 256 colors (8bpp)
  6092 0000E4E2 BD[7FE90000]        <1> 	mov	ebp, pix_op_inc_8
  6093 0000E4E7 EB1E                <1> 	jmp	short pix_op_inc_w_4
  6094                              <1> 
  6095                              <1> pix_op_inc_w_1:
  6096 0000E4E9 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  6097 0000E4F0 7710                <1> 	ja	short pix_op_inc_w_3 ; 32bpp
  6098 0000E4F2 7207                <1> 	jb	short pix_op_inc_w_2 ; 16bpp
  6099                              <1> 
  6100                              <1> 	; 24 bit true colors
  6101 0000E4F4 BD[96E90000]        <1> 	mov	ebp, pix_op_inc_24
  6102 0000E4F9 EB0C                <1> 	jmp	short pix_op_inc_w_4
  6103                              <1> 
  6104                              <1> 	; 65536 colors (16bpp)
  6105                              <1> pix_op_inc_w_2:
  6106 0000E4FB BD[89E90000]        <1> 	mov	ebp, pix_op_inc_16
  6107 0000E500 EB05                <1> 	jmp	short pix_op_inc_w_4
  6108                              <1> 
  6109                              <1> 	; 32 bit true colors
  6110                              <1> pix_op_inc_w_3:
  6111 0000E502 BD[AAE90000]        <1> 	mov	ebp, pix_op_inc_32
  6112                              <1> pix_op_inc_w_4:
  6113 0000E507 E9EAFDFFFF          <1> 	jmp	pix_op_inc_w_x
  6114                              <1> 
  6115                              <1> pix_op_dec:
  6116                              <1> 	; 31/01/2021
  6117                              <1> 	; DECREASE COLOR
  6118                              <1> 	;
  6119                              <1> 	; INPUT:
  6120                              <1> 	;  ECX = start position (row, column)
  6121                              <1> 	;        (HW = row, CX = column)
  6122                              <1> 	;  EDX = size (rows, colums)
  6123                              <1> 	;        (HW = rows, DX = columns)
  6124                              <1> 	;	 (0 -> invalid 	
  6125                              <1> 	;        (1 -> horizontal or vertical line)
  6126                              <1> 	;  [maskcolor] = mask color (to be excluded)
  6127                              <1> 	;
  6128                              <1> 	; OUTPUT:
  6129                              <1> 	; 	[u.r0] will be > 0 if succesful
  6130                              <1> 	
  6131 0000E50C F605[D0A30100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  6132 0000E513 7553                <1> 	jnz	short pix_op_dec_w ; window
  6133                              <1> 	
  6134 0000E515 8B3D[D2A30100]      <1> 	mov	edi, [v_mem]
  6135 0000E51B 89FE                <1> 	mov	esi, edi
  6136 0000E51D 8B0D[D6A30100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  6137                              <1> 
  6138 0000E523 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked decrease color ?
  6139 0000E52A 7405                <1> 	jz	short pix_op_dec_0 ; no
  6140 0000E52C E92B100000          <1> 	jmp	m_pix_op_dec ; 'dec' color except mask color
  6141                              <1> pix_op_dec_0:
  6142 0000E531 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  6143 0000E538 7707                <1> 	ja	short pix_op_dec_1
  6144                              <1> 
  6145                              <1> 	; 256 colors (8bpp)
  6146 0000E53A E877040000          <1> 	call	pix_op_dec_8
  6147 0000E53F EB1E                <1> 	jmp	short pix_op_dec_4
  6148                              <1> 
  6149                              <1> pix_op_dec_1:
  6150 0000E541 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  6151 0000E548 7710                <1> 	ja	short pix_op_dec_3 ; 32bpp
  6152 0000E54A 7207                <1> 	jb	short pix_op_dec_2 ; 16bpp
  6153                              <1> 
  6154                              <1> 	; 24 bit true colors
  6155 0000E54C E87C040000          <1> 	call	pix_op_dec_24
  6156 0000E551 EB0C                <1> 	jmp	short pix_op_dec_4
  6157                              <1> 
  6158                              <1> 	; 65536 colors (16bpp)
  6159                              <1> pix_op_dec_2:
  6160 0000E553 E868040000          <1> 	call	pix_op_dec_16
  6161 0000E558 EB05                <1> 	jmp	short pix_op_dec_4
  6162                              <1> 
  6163                              <1> 	; 32 bit true colors
  6164                              <1> pix_op_dec_3:
  6165 0000E55A E881040000          <1> 	call	pix_op_dec_32
  6166                              <1> pix_op_dec_4:
  6167 0000E55F 29F7                <1> 	sub	edi, esi
  6168 0000E561 893D[AC940100]      <1> 	mov	[u.r0], edi
  6169                              <1> pix_op_dec_5:
  6170 0000E567 C3                  <1> 	retn
  6171                              <1> 
  6172                              <1> pix_op_dec_w:
  6173                              <1> 	; 31/01/2021
  6174                              <1> 	; ecx = win start pos (row, column)
  6175                              <1> 	; edx = size (rows, columns)
  6176 0000E568 E88AF6FFFF          <1> 	call	sysvideo_15_12 ; window preparations
  6177 0000E56D 72F8                <1> 	jc	short pix_op_dec_5
  6178                              <1> 
  6179 0000E56F F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked decrease color ?
  6180 0000E576 7405                <1> 	jz	short pix_op_dec_w_0 ; no
  6181 0000E578 E973100000          <1> 	jmp	m_pix_op_dec_w 
  6182                              <1> 			; window 'dec' color except mask color
  6183                              <1> pix_op_dec_w_0:
  6184                              <1> 	; ecx = bytes per row (to be applied)
  6185                              <1> 	; edx = screen width in bytes
  6186                              <1> 	; ebx = row count
  6187                              <1> 
  6188 0000E57D 8B3D[DAA30100]      <1> 	mov	edi, [v_str]
  6189                              <1> 
  6190 0000E583 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  6191 0000E58A 7707                <1> 	ja	short pix_op_dec_w_1
  6192                              <1> 
  6193                              <1> 	; 256 colors (8bpp)
  6194 0000E58C BD[B6E90000]        <1> 	mov	ebp, pix_op_dec_8
  6195 0000E591 EB1E                <1> 	jmp	short pix_op_dec_w_4
  6196                              <1> 
  6197                              <1> pix_op_dec_w_1:
  6198 0000E593 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  6199 0000E59A 7710                <1> 	ja	short pix_op_dec_w_3 ; 32bpp
  6200 0000E59C 7207                <1> 	jb	short pix_op_dec_w_2 ; 16bpp
  6201                              <1> 
  6202                              <1> 	; 24 bit true colors
  6203 0000E59E BD[CDE90000]        <1> 	mov	ebp, pix_op_dec_24
  6204 0000E5A3 EB0C                <1> 	jmp	short pix_op_dec_w_4
  6205                              <1> 
  6206                              <1> 	; 65536 colors (16bpp)
  6207                              <1> pix_op_dec_w_2:
  6208 0000E5A5 BD[C0E90000]        <1> 	mov	ebp, pix_op_dec_16
  6209 0000E5AA EB05                <1> 	jmp	short pix_op_dec_w_4
  6210                              <1> 
  6211                              <1> 	; 32 bit true colors
  6212                              <1> pix_op_dec_w_3:
  6213 0000E5AC BD[E0E90000]        <1> 	mov	ebp, pix_op_dec_32
  6214                              <1> pix_op_dec_w_4:
  6215 0000E5B1 E940FDFFFF          <1> 	jmp	pix_op_dec_w_x
  6216                              <1> 
  6217                              <1> pix_op_blk:
  6218                              <1> 	; 11/08/2022 (TRDOS 386 Kernel v2.0.5)
  6219                              <1> 	; 23/01/2021
  6220                              <1> 	; 22/02/2021
  6221                              <1> 	; 02/02/2021
  6222                              <1> 	; COPY PIXEL BLOCK -system to system-
  6223                              <1> 	; WRITE PIXEL BLOCKS -user to system-
  6224                              <1> 	;
  6225                              <1> 	; INPUT:
  6226                              <1> 	;   -If BL bit 5 is 0-
  6227                              <1> 	;    ECX = start position (row, column) (*)
  6228                              <1> 	;    (HW = row, CX = column)
  6229                              <1> 	;    EDX = size (rows, colums) (*)
  6230                              <1> 	;    (HW = rows, DX = columns)
  6231                              <1> 	;         (0 -> invalid)
  6232                              <1> 	;         (1 -> horizontal or vertical line)
  6233                              <1> 	;    ESI = destination (row, column) (***)
  6234                              <1> 	;   -If BL bit 5 is 1-	
  6235                              <1> 	;     CL = color (8 bit, 256 colors)
  6236                              <1> 	;    ECX = color (16 bit and true colors)
  6237                              <1> 	;    EDX = count of blocks (not bytes)
  6238                              <1> 	;	 (limit: 2048 blocks/windows)
  6239                              <1> 	;    ESI = user's buffer address 
  6240                              <1> 	;	  contains 64 bit block data
  6241                              <1> 	;	  BLOCK ADDRESS - (row, col), dword
  6242                              <1> 	;	  (first 32 bits)
  6243                              <1> 	;	  BLOCK SIZE - (rows, cols), dword
  6244                              <1> 	;	  (second 32 bits)
  6245                              <1> 	; OUTPUT:
  6246                              <1> 	; 	[u.r0] will be > 0 if succesful
  6247                              <1> 
  6248                              <1> 	; Window option ([v_ops] bit 4) will be ignored
  6249                              <1> 	; (Function is used for display page coordinates)
  6250                              <1> 
  6251 0000E5B6 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked or direct ?
  6252 0000E5BD 755A                <1> 	jnz	short pix_op_blk_u ; blocks from user's buffer
  6253                              <1> 
  6254 0000E5BF 89F0                <1> 	mov	eax, esi ; destination position (row, col)
  6255 0000E5C1 E8DEF6FFFF          <1> 	call	calc_pixel_offset
  6256 0000E5C6 3B05[D6A30100]      <1> 	cmp	eax, [v_siz]
  6257 0000E5CC 734A                <1> 	jnb	short pix_op_blk_retn ; out of display page
  6258 0000E5CE 89C6                <1> 	mov	esi, eax
  6259 0000E5D0 E8ACF6FFFF          <1> 	call	pixels_to_byte_count
  6260 0000E5D5 89C7                <1> 	mov	edi, eax
  6261 0000E5D7 89D0                <1> 	mov	eax, edx  ; size
  6262 0000E5D9 E8C6F6FFFF          <1> 	call	calc_pixel_offset
  6263                              <1> 	; 22/02/2021
  6264 0000E5DE 3B05[D6A30100]      <1> 	cmp	eax, [v_siz]
  6265 0000E5E4 7732                <1> 	ja	short pix_op_blk_retn ; out of display page
  6266 0000E5E6 01C6                <1> 	add	esi, eax
  6267 0000E5E8 3B35[D6A30100]      <1> 	cmp	esi, [v_siz]
  6268 0000E5EE 7728                <1> 	ja	short pix_op_blk_retn ; out of display page
  6269                              <1> 
  6270 0000E5F0 033D[D2A30100]      <1> 	add	edi, [v_mem] ; destination address
  6271                              <1> 
  6272                              <1> 	; 23/01/2021
  6273                              <1> 	;call	pixels_to_byte_count
  6274                              <1> 	;add	edi, eax
  6275                              <1> 	;jc	short pix_op_blk_retn ; out of display page
  6276                              <1> 	;cmp	edi, [v_end]
  6277                              <1> 	;ja	short pix_op_blk_retn ; out of display page
  6278                              <1> 	;sub	edi, eax
  6279                              <1> 
  6280 0000E5F6 E8FCF5FFFF          <1> 	call	sysvideo_15_12 ; window preparations
  6281 0000E5FB 721B                <1> 	jc	short pix_op_blk_retn ; something wrong !?
  6282                              <1> 	; ecx = bytes per row (to be applied)
  6283                              <1> 	; edx = screen width in bytes
  6284                              <1> 	; ebx = row count
  6285                              <1> 
  6286 0000E5FD 8B35[DAA30100]      <1> 	mov	esi, [v_str] ; source address
  6287                              <1> 
  6288                              <1> 	; Note:
  6289                              <1> 	; ecx & edx are already adjusted for pixel sizes
  6290                              <1> 	; so, following code is proper all pixel sizes
  6291                              <1> 
  6292 0000E603 29CA                <1> 	sub	edx, ecx ; screen width - window width
  6293                              <1> pix_op_blk_0:
  6294 0000E605 89C8                <1> 	mov	eax, ecx
  6295 0000E607 0105[AC940100]      <1> 	add	[u.r0], eax
  6296 0000E60D F3A4                <1> 	rep	movsb
  6297 0000E60F 89C1                <1> 	mov	ecx, eax
  6298 0000E611 01D6                <1> 	add	esi, edx ; next row
  6299 0000E613 01D7                <1> 	add	edi, edx ; next row
  6300 0000E615 4B                  <1> 	dec	ebx
  6301 0000E616 75ED                <1> 	jnz	short pix_op_blk_0
  6302                              <1> pix_op_blk_retn:
  6303 0000E618 C3                  <1> 	retn
  6304                              <1> 
  6305                              <1> pix_op_blk_u:
  6306                              <1> 	; fill blocks (windows) with desired color
  6307                              <1> 	; according to block definitions in user's buffer
  6308 0000E619 81FA00080000        <1> 	cmp	edx, 2048
  6309 0000E61F 7605                <1> 	jna	short pix_op_blk_u_0
  6310                              <1> 	; Maximum 2048 blocks
  6311 0000E621 BA00080000          <1> 	mov	edx, 2048
  6312                              <1> pix_op_blk_u_0:
  6313 0000E626 8025[D0A30100]DF    <1> 	and	byte [v_ops], ~20h ; clear masked bit
  6314 0000E62D 890D[E2A30100]      <1> 	mov	[maskcolor], ecx ; save pixel color
  6315                              <1> 	; 22/02/2021
  6316                              <1> 	;mov	ebp, edx ; save blocks count
  6317                              <1> 	;push	ebp
  6318                              <1> pix_op_blk_u_next:
  6319 0000E633 52                  <1> 	push	edx
  6320                              <1> 	;mov	ecx, 8
  6321                              <1> 	; 11/08/2022
  6322 0000E634 29C9                <1> 	sub	ecx, ecx
  6323 0000E636 B108                <1> 	mov	cl, 8
  6324 0000E638 BF[EAA30100]        <1> 	mov	edi, buffer8 ; 8 bytes small buffer
  6325                              <1> 	; esi = user's buffer address
  6326 0000E63D E8B8290000          <1> 	call	transfer_from_user_buffer
  6327 0000E642 72D4                <1> 	jc	short pix_op_blk_retn
  6328 0000E644 01CE                <1> 	add	esi, ecx ; 22/02/2021
  6329 0000E646 56                  <1> 	push	esi
  6330 0000E647 8B15[EAA30100]      <1> 	mov	edx, [buffer8] ; block start pos (row,col)
  6331 0000E64D 8B35[EEA30100]      <1> 	mov	esi, [buffer8+4] ; block size (rows,cols)
  6332 0000E653 8B0D[E2A30100]      <1> 	mov	ecx, [maskcolor]
  6333 0000E659 E849FCFFFF          <1> 	call	pix_op_new_w ; new (change) color (window)
  6334 0000E65E 5E                  <1> 	pop	esi
  6335                              <1> 	;pop	ebp
  6336                              <1> 	;dec	ebp
  6337 0000E65F 5A                  <1> 	pop	edx
  6338 0000E660 4A                  <1> 	dec	edx
  6339 0000E661 75D0                <1> 	jnz	short pix_op_blk_u_next
  6340 0000E663 C3                  <1> 	retn
  6341                              <1> 
  6342                              <1> pix_op_lin:
  6343                              <1> 	; 11/08/2022
  6344                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
  6345                              <1> 	; 12/02/2021
  6346                              <1> 	; 11/02/2021
  6347                              <1> 	; 10/02/2021
  6348                              <1> 	; 05/02/2021
  6349                              <1> 	; 02/02/2021
  6350                              <1> 	; WRITE LINE -direct-
  6351                              <1> 	; WRITE LINE(S) -via user's buffer-
  6352                              <1> 	;
  6353                              <1> 	; INPUT:
  6354                              <1> 	;   -If BL bit 5 is 0-	
  6355                              <1> 	;     CL = color (8 bit, 256 colors)
  6356                              <1> 	;    ECX = color (16 bit and true colors)
  6357                              <1> 	;     DX = low 12 bits - size (length)
  6358                              <1> 	;	   high 4 bits - direction or type
  6359                              <1> 	;	     0 - Horizontal line
  6360                              <1> 	;	     1 - Vertical line
  6361                              <1> 	;	   > 1 - undefined, invalid
  6362                              <1> 	;    ESI = start position (row, column)
  6363                              <1> 	;	  (HW = row, SI = column)
  6364                              <1> 	;   -If BL bit 5 is 1-
  6365                              <1> 	;     CL = color (8 bit, 256 colors)
  6366                              <1> 	;    ECX = color (16 bit and true colors)
  6367                              <1> 	;     DX = number of lines (in user buffer)
  6368                              <1> 	;	   (limit: 2048 lines)	
  6369                              <1> 	;    ESI = user's buffer
  6370                              <1> 	;          contains 64 bit data for lines
  6371                              <1> 	;	   START POINT: 32 bit (row, col)
  6372                              <1> 	;	   LENGTH: 32 bit
  6373                              <1> 	;		   high 16 bits - 0
  6374                              <1> 	;		   bit 0-11 - length
  6375                              <1> 	;	   	   bit 12-15 - type (length)
  6376                              <1> 	; OUTPUT:
  6377                              <1> 	; 	[u.r0] will be > 0 if succesful
  6378                              <1> 
  6379                              <1> 	; Window option ([v_ops] bit 4) will be ignored
  6380                              <1> 	; (Function is used for display page coordinates)
  6381                              <1> 
  6382                              <1> 	; 10/02/2021
  6383 0000E664 F605[D0A30100]20    <1> 	test	byte [v_ops], 20h ; masked or direct ?
  6384 0000E66B 7444                <1> 	jz	short pix_op_lin_vh ; direct (v/h lines)
  6385                              <1> 
  6386                              <1> 	; lines from user's buffer
  6387                              <1> pix_op_lin_u:
  6388                              <1> 	; draw lines with desired color
  6389                              <1> 	; according to line definitions in user's buffer
  6390 0000E66D 81FA00080000        <1> 	cmp	edx, 2048
  6391 0000E673 7605                <1> 	jna	short pix_op_lin_u_0
  6392                              <1> 	; Maximum 2048 lines
  6393 0000E675 BA00080000          <1> 	mov	edx, 2048
  6394                              <1> pix_op_lin_u_0:
  6395 0000E67A 890D[E2A30100]      <1> 	mov	[maskcolor], ecx ; save pixel color
  6396 0000E680 89D5                <1> 	mov	ebp, edx ; save line count
  6397                              <1> pix_op_lin_u_next:
  6398                              <1> 	;mov	ecx, 8
  6399                              <1> 	; 11/08/2022
  6400 0000E682 29C9                <1> 	sub	ecx, ecx
  6401 0000E684 B108                <1> 	mov	cl, 8
  6402 0000E686 BF[EAA30100]        <1> 	mov	edi, buffer8 ; 8 bytes small buffer
  6403                              <1> 	; esi = user's buffer address
  6404 0000E68B E86A290000          <1> 	call	transfer_from_user_buffer
  6405 0000E690 721E                <1> 	jc	short pix_op_lin_retn
  6406 0000E692 01CE                <1> 	add	esi, ecx ; 11/02/2021
  6407 0000E694 56                  <1> 	push	esi
  6408 0000E695 8B35[EAA30100]      <1> 	mov	esi, [buffer8] ; line start pos (row,col)
  6409 0000E69B 8B15[EEA30100]      <1> 	mov	edx, [buffer8+4] ; line length
  6410 0000E6A1 8B0D[E2A30100]      <1> 	mov	ecx, [maskcolor]
  6411 0000E6A7 E805000000          <1> 	call	pix_op_lin_vh ; new (change) color (window)
  6412 0000E6AC 5E                  <1> 	pop	esi
  6413 0000E6AD 4D                  <1> 	dec	ebp
  6414 0000E6AE 75D2                <1> 	jnz	short pix_op_lin_u_next
  6415                              <1> pix_op_lin_retn:
  6416 0000E6B0 C3                  <1> 	retn
  6417                              <1> 
  6418                              <1> pix_op_lin_vh:
  6419 0000E6B1 81FA38140000        <1> 	cmp	edx, 1438h ; 1920*1080 (780hx438h) limit
  6420 0000E6B7 7762                <1> 	ja	short pix_op_lin_err1 ; invalid type 
  6421                              <1> 			    	; (for current version)
  6422 0000E6B9 66F7C2FF0F          <1> 	test	dx, 0FFFh
  6423 0000E6BE 745B                <1> 	jz	short pix_op_lin_err1 ; zero length!
  6424                              <1> 
  6425 0000E6C0 89F0                <1> 	mov	eax, esi ; start point (row, col)
  6426 0000E6C2 E8DDF5FFFF          <1> 	call	calc_pixel_offset
  6427 0000E6C7 3B05[D6A30100]      <1> 	cmp	eax, [v_siz]
  6428 0000E6CD 734C                <1> 	jnb	short pix_op_lin_err1 ; out of display page!
  6429 0000E6CF E8ADF5FFFF          <1> 	call	pixels_to_byte_count
  6430 0000E6D4 89C7                <1> 	mov	edi, eax ; start point offset
  6431 0000E6D6 033D[D2A30100]      <1> 	add	edi, [v_mem] ; LFB start address
  6432 0000E6DC 89C8                <1> 	mov	eax, ecx ; color
  6433                              <1> 
  6434 0000E6DE F6C610              <1> 	test	dh, 10h
  6435                              <1> 	;jz	pix_op_lin_h ; Horizontal line
  6436                              <1> 	; 23/07/2022
  6437 0000E6E1 7505                <1> 	jnz	short pix_op_lin_v
  6438 0000E6E3 E98A000000          <1> 	jmp	pix_op_lin_h
  6439                              <1> 
  6440                              <1> pix_op_lin_v:
  6441                              <1> 	; Vertical line
  6442 0000E6E8 80E60F              <1> 	and 	dh, 0Fh ; low 12 bits
  6443 0000E6EB 51                  <1> 	push	ecx ; color
  6444 0000E6EC 89D1                <1> 	mov	ecx, edx
  6445 0000E6EE 0FB705[CEA30100]    <1> 	movzx	eax, word [v_width]
  6446 0000E6F5 89C3                <1> 	mov	ebx, eax
  6447                              <1> 	; 12/02/2021
  6448 0000E6F7 F7E2                <1> 	mul	edx ; rows * [v_width]
  6449 0000E6F9 01F8                <1> 	add	eax, edi
  6450 0000E6FB 3B05[DEA30100]      <1> 	cmp	eax, [v_end]
  6451 0000E701 58                  <1> 	pop	eax ; color
  6452 0000E702 7717                <1> 	ja	short pix_op_lin_err1 ; out of display page
  6453                              <1> 	; ecx = rows	
  6454 0000E704 89CA                <1> 	mov	edx, ecx
  6455                              <1> 
  6456 0000E706 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  6457 0000E70D 770D                <1> 	ja	short pix_op_lin_v_2
  6458                              <1> 	; 256 colors (1 byte per pixel)
  6459 0000E70F 010D[AC940100]      <1> 	add	[u.r0], ecx ; byte count
  6460                              <1> pix_op_lin_v_1:
  6461 0000E715 8807                <1> 	mov	[edi], al
  6462 0000E717 01DF                <1> 	add	edi, ebx  ; next row
  6463 0000E719 E2FA                <1> 	loop	pix_op_lin_v_1
  6464                              <1> pix_op_lin_err1:
  6465 0000E71B C3                  <1> 	retn
  6466                              <1> 
  6467                              <1> pix_op_lin_v_2:
  6468 0000E71C 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  6469 0000E723 773A                <1> 	ja	short pix_op_lin_v_6 ; 32bpp
  6470 0000E725 7226                <1> 	jb	short pix_op_lin_v_4 ; 16bpp
  6471                              <1> 
  6472                              <1> 	; 24 bit true colors
  6473                              <1> 	; * 3
  6474 0000E727 53                  <1> 	push	ebx ; screen width in pixels
  6475 0000E728 D1E3                <1> 	shl	ebx, 1
  6476 0000E72A 011C24              <1> 	add	[esp], ebx
  6477 0000E72D 5B                  <1> 	pop	ebx ; screen width in bytes
  6478 0000E72E 010D[AC940100]      <1> 	add	[u.r0], ecx
  6479 0000E734 D1E2                <1> 	shl	edx, 1
  6480 0000E736 0115[AC940100]      <1> 	add	[u.r0], edx ; byte count
  6481                              <1> pix_op_lin_v_3:
  6482 0000E73C 668907              <1> 	mov	[edi], ax
  6483 0000E73F C1C810              <1> 	ror	eax, 16
  6484 0000E742 884702              <1> 	mov	[edi+2], al
  6485 0000E745 C1C010              <1> 	rol	eax, 16
  6486 0000E748 01DF                <1> 	add	edi, ebx  ; next row
  6487 0000E74A E2F0                <1> 	loop	pix_op_lin_v_3
  6488 0000E74C C3                  <1> 	retn
  6489                              <1> 
  6490                              <1> pix_op_lin_v_4:
  6491                              <1> 	; 16 bit (65536) colors
  6492 0000E74D D1E3                <1> 	shl	ebx, 1
  6493 0000E74F D1E2                <1> 	shl	edx, 1
  6494 0000E751 0115[AC940100]      <1> 	add	[u.r0], edx
  6495                              <1> pix_op_lin_v_5:
  6496 0000E757 668907              <1> 	mov	[edi], ax
  6497 0000E75A 01DF                <1> 	add	edi, ebx  ; next row
  6498 0000E75C E2F9                <1> 	loop	pix_op_lin_v_5
  6499 0000E75E C3                  <1> 	retn
  6500                              <1> 
  6501                              <1> pix_op_lin_v_6:
  6502                              <1> 	; 32 bit true colors
  6503 0000E75F C1E302              <1> 	shl	ebx, 2
  6504 0000E762 C1E202              <1> 	shl	edx, 2
  6505 0000E765 0115[AC940100]      <1> 	add	[u.r0], edx ; byte count
  6506                              <1> pix_op_lin_v_7:
  6507 0000E76B 8907                <1> 	mov	[edi], eax
  6508 0000E76D 01DF                <1> 	add	edi, ebx  ; next row
  6509 0000E76F E2FA                <1> 	loop	pix_op_lin_v_7
  6510 0000E771 C3                  <1> 	retn
  6511                              <1> 
  6512                              <1> pix_op_lin_h:
  6513                              <1> 	; Horizontal line
  6514 0000E772 80E60F              <1> 	and 	dh, 0Fh ; low 12 bits
  6515 0000E775 89D1                <1>   	mov	ecx, edx
  6516 0000E777 6601D6              <1> 	add	si, dx ; start column + columns
  6517 0000E77A 663B35[CEA30100]    <1> 	cmp	si, [v_width] ; screen width
  6518 0000E781 7711                <1> 	ja	short pix_op_lin_err2 ; out of columns limit
  6519                              <1> 
  6520 0000E783 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  6521 0000E78A 7709                <1> 	ja	short pix_op_lin_h_1
  6522                              <1> 	; 256 colors (1 byte per pixel)
  6523 0000E78C 010D[AC940100]      <1> 	add	[u.r0], ecx
  6524 0000E792 F3AA                <1> 	rep	stosb
  6525                              <1> pix_op_lin_err2:
  6526 0000E794 C3                  <1> 	retn
  6527                              <1> 
  6528                              <1> pix_op_lin_h_1:
  6529 0000E795 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  6530 0000E79C 7728                <1> 	ja	short pix_op_lin_h_4 ; 32bpp
  6531 0000E79E 721A                <1> 	jb	short pix_op_lin_h_3 ; 16bpp
  6532                              <1> 	
  6533                              <1> 	; 24 bit true colors
  6534                              <1> 	; * 3
  6535 0000E7A0 0115[AC940100]      <1> 	add	[u.r0], edx
  6536 0000E7A6 D1E2                <1> 	shl	edx, 1
  6537 0000E7A8 0115[AC940100]      <1> 	add	[u.r0], edx
  6538                              <1> pix_op_lin_h_2:
  6539 0000E7AE 66AB                <1> 	stosw
  6540 0000E7B0 C1C810              <1> 	ror	eax, 16
  6541 0000E7B3 AA                  <1> 	stosb	
  6542 0000E7B4 C1C010              <1> 	rol	eax, 16
  6543 0000E7B7 E2F5                <1> 	loop	pix_op_lin_h_2
  6544 0000E7B9 C3                  <1> 	retn
  6545                              <1> 
  6546                              <1> pix_op_lin_h_3:
  6547                              <1> 	; 16 bit (65536) colors
  6548 0000E7BA D1E2                <1> 	shl	edx, 1
  6549 0000E7BC 0115[AC940100]      <1> 	add	[u.r0], edx
  6550 0000E7C2 F366AB              <1> 	rep	stosw
  6551 0000E7C5 C3                  <1> 	retn
  6552                              <1> 
  6553                              <1> pix_op_lin_h_4:
  6554                              <1> 	; 32 bit true colors
  6555 0000E7C6 C1E202              <1> 	shl	edx, 2
  6556 0000E7C9 0115[AC940100]      <1> 	add	[u.r0], edx
  6557 0000E7CF F3AB                <1> 	rep	stosd
  6558 0000E7D1 C3                  <1> 	retn
  6559                              <1> 
  6560                              <1> pix_op_new_8:
  6561                              <1> 	; 8 bit colors (256 colors)
  6562                              <1> 	; CHANGE PIXEL COLOR
  6563                              <1> 	; ecx = pixel count per row
  6564                              <1> 	;  al = color
  6565                              <1> 	; edi = start pixel address
  6566                              <1> 
  6567 0000E7D2 F3AA                <1> 	rep	stosb
  6568 0000E7D4 C3                  <1> 	retn
  6569                              <1> 
  6570                              <1> pix_op_new_16:
  6571                              <1> 	; 16 bit colors (65536 colors)
  6572                              <1> 	; CHANGE PIXEL COLOR
  6573                              <1> 	; ecx = pixel count per row
  6574                              <1> 	;  ax = color
  6575                              <1> 	; edi = start pixel address
  6576                              <1> 
  6577 0000E7D5 F366AB              <1> 	rep	stosw
  6578 0000E7D8 C3                  <1> 	retn
  6579                              <1> 
  6580                              <1> pix_op_new_24:
  6581                              <1> 	; 24 bit true colors
  6582                              <1> 	; CHANGE PIXEL COLOR
  6583                              <1> 	; ecx = pixel count per row
  6584                              <1> 	; eax = color
  6585                              <1> 	; edi = start pixel address
  6586                              <1> 
  6587 0000E7D9 66AB                <1> 	stosw
  6588 0000E7DB C1C810              <1> 	ror	eax, 16	
  6589 0000E7DE AA                  <1> 	stosb
  6590 0000E7DF C1C010              <1> 	rol	eax, 16
  6591 0000E7E2 E2F5                <1> 	loop	pix_op_new_24
  6592 0000E7E4 C3                  <1> 	retn
  6593                              <1> 
  6594                              <1> pix_op_new_32:
  6595                              <1> 	; 32 bit true colors
  6596                              <1> 	; CHANGE PIXEL COLOR
  6597                              <1> 	; ecx = pixel count per row
  6598                              <1> 	; eax = color
  6599                              <1> 	; edi = start pixel address 
  6600                              <1> 
  6601 0000E7E5 F3AB                <1> 	rep	stosd
  6602 0000E7E7 C3                  <1> 	retn
  6603                              <1> 
  6604                              <1> pix_op_add_8:
  6605                              <1> 	; 8 bit colors (256 colors)
  6606                              <1> 	; ADD PIXEL COLOR
  6607                              <1> 	; ecx = pixel count per row
  6608                              <1> 	;  al = color
  6609                              <1> 	; edi = start pixel address
  6610                              <1> 
  6611 0000E7E8 88C4                <1> 	mov	ah, al
  6612                              <1> pix_op_add_8_0:
  6613 0000E7EA 0207                <1> 	add	al, [edi]
  6614 0000E7EC 7302                <1> 	jnc	short pix_op_add_8_1
  6615 0000E7EE B0FF                <1> 	mov	al, 0FFh ; Max. value
  6616                              <1> pix_op_add_8_1:
  6617 0000E7F0 AA                  <1> 	stosb
  6618 0000E7F1 88E0                <1> 	mov	al, ah
  6619 0000E7F3 E2F5                <1> 	loop	pix_op_add_8_0
  6620 0000E7F5 C3                  <1> 	retn
  6621                              <1> 
  6622                              <1> pix_op_add_16:
  6623                              <1> 	; 16 bit colors (65536 colors)
  6624                              <1> 	; ADD PIXEL COLOR
  6625                              <1> 	; ecx = pixel count per row
  6626                              <1> 	;  ax = color
  6627                              <1> 	; edi = start pixel address
  6628                              <1> 
  6629 0000E7F6 89C2                <1> 	mov	edx, eax
  6630                              <1> pix_op_add_16_0:
  6631 0000E7F8 660307              <1> 	add	ax, [edi]
  6632 0000E7FB 7304                <1> 	jnc	short pix_op_add_16_1
  6633 0000E7FD 66B8FFFF            <1> 	mov	ax, 0FFFFh ; Max. value
  6634                              <1> pix_op_add_16_1:
  6635 0000E801 66AB                <1> 	stosw
  6636 0000E803 89D0                <1> 	mov	eax, edx
  6637 0000E805 E2F1                <1> 	loop	pix_op_add_16_0
  6638 0000E807 C3                  <1> 	retn
  6639                              <1> 
  6640                              <1> pix_op_add_24:
  6641                              <1> 	; 24 bit true colors
  6642                              <1> 	; ADD PIXEL COLOR
  6643                              <1> 	; ecx = pixel count per row
  6644                              <1> 	; eax = color
  6645                              <1> 	; edi = start pixel address
  6646                              <1> 
  6647 0000E808 53                  <1> 	push	ebx
  6648 0000E809 BBFFFFFF00          <1> 	mov	ebx, 0FFFFFFh
  6649                              <1> 	;and	eax, ebx ; 0FFFFFFh
  6650 0000E80E 89C2                <1> 	mov	edx, eax
  6651                              <1> pix_op_add_24_0:
  6652 0000E810 8B07                <1> 	mov	eax, [edi]
  6653 0000E812 21D8                <1> 	and	eax, ebx ; 0FFFFFFh
  6654 0000E814 01D0                <1> 	add	eax, edx
  6655 0000E816 39D8                <1> 	cmp	eax, ebx
  6656 0000E818 7602                <1> 	jna	short pix_op_add_24_1
  6657 0000E81A 89D8                <1> 	mov	eax, ebx ; 0FFFFFFh  ; Max. value
  6658                              <1> pix_op_add_24_1:
  6659 0000E81C 66AB                <1> 	stosw
  6660 0000E81E C1E810              <1> 	shr	eax, 16
  6661 0000E821 AA                  <1> 	stosb
  6662 0000E822 E2EC                <1> 	loop	pix_op_add_24_0
  6663 0000E824 89D0                <1> 	mov	eax, edx
  6664 0000E826 5B                  <1> 	pop	ebx
  6665 0000E827 C3                  <1> 	retn
  6666                              <1> 
  6667                              <1> pix_op_add_32:
  6668                              <1> 	; 32 bit true colors
  6669                              <1> 	; ADD PIXEL COLOR
  6670                              <1> 	; ecx = pixel count per row
  6671                              <1> 	; eax = color
  6672                              <1> 	; edi = start pixel address
  6673                              <1> 
  6674 0000E828 89C2                <1> 	mov	edx, eax
  6675                              <1> pix_op_add_32_0:
  6676 0000E82A 0307                <1> 	add	eax, [edi]
  6677 0000E82C 7303                <1> 	jnc	short pix_op_add_32_1
  6678                              <1> 	;mov	eax, 0FFFFFFFFh ; Max. value
  6679 0000E82E 29C0                <1> 	sub	eax, eax
  6680 0000E830 48                  <1> 	dec	eax
  6681                              <1> pix_op_add_32_1:
  6682 0000E831 AB                  <1> 	stosd
  6683 0000E832 89D0                <1> 	mov	eax, edx
  6684 0000E834 E2F4                <1> 	loop	pix_op_add_32_0
  6685 0000E836 C3                  <1> 	retn
  6686                              <1> 
  6687                              <1> pix_op_sub_8:
  6688                              <1> 	; 8 bit colors (256 colors)
  6689                              <1> 	; SUBTRACT PIXEL COLOR
  6690                              <1> 	; ecx = pixel count per row
  6691                              <1> 	;  al = color
  6692                              <1> 	; edi = start pixel address 
  6693                              <1> 
  6694 0000E837 88C4                <1> 	mov	ah, al
  6695                              <1> pix_op_sub_8_0:
  6696 0000E839 8A07                <1> 	mov	al, [edi]
  6697 0000E83B 28E0                <1> 	sub	al, ah
  6698 0000E83D 7302                <1> 	jnb	short pix_op_sub_8_1
  6699 0000E83F 30C0                <1> 	xor	al, al ; 0 ; Min. value
  6700                              <1> pix_op_sub_8_1:
  6701 0000E841 AA                  <1> 	stosb
  6702 0000E842 E2F5                <1> 	loop	pix_op_sub_8_0
  6703 0000E844 88E0                <1> 	mov	al, ah
  6704 0000E846 C3                  <1> 	retn
  6705                              <1> 
  6706                              <1> pix_op_sub_16:
  6707                              <1> 	; 16 bit colors (65536 colors)
  6708                              <1> 	; SUBTRACT PIXEL COLOR
  6709                              <1> 	; ecx = pixel count per row
  6710                              <1> 	;  ax = color
  6711                              <1> 	; edi = start pixel address
  6712                              <1> 
  6713 0000E847 89C2                <1> 	mov	edx, eax
  6714                              <1> pix_op_sub_16_0:
  6715 0000E849 668B07              <1> 	mov	ax, [edi]
  6716 0000E84C 6629D0              <1> 	sub	ax, dx
  6717 0000E84F 7302                <1> 	jnb	short pix_op_sub_16_1
  6718 0000E851 31C0                <1> 	xor	eax, eax ; 0 ; Min. value
  6719                              <1> pix_op_sub_16_1:
  6720 0000E853 66AB                <1> 	stosw
  6721 0000E855 E2F2                <1> 	loop	pix_op_sub_16_0
  6722 0000E857 89D0                <1> 	mov	eax, edx
  6723 0000E859 C3                  <1> 	retn
  6724                              <1> 
  6725                              <1> pix_op_sub_24:
  6726                              <1> 	; 24 bit true colors
  6727                              <1> 	; SUBTRACT PIXEL COLOR
  6728                              <1> 	; ecx = pixel count per row
  6729                              <1> 	; eax = color
  6730                              <1> 	; edi = start pixel address
  6731                              <1> 
  6732                              <1> 	;and	eax, 0FFFFFFh
  6733 0000E85A 89C2                <1> 	mov	edx, eax
  6734                              <1> pix_op_sub_24_0:
  6735 0000E85C 8B07                <1> 	mov	eax, [edi]
  6736                              <1> 	; 27/02/2021
  6737 0000E85E 25FFFFFF00          <1> 	and	eax, 0FFFFFFh
  6738 0000E863 29D0                <1> 	sub	eax, edx
  6739 0000E865 7302                <1> 	jnb	short pix_op_sub_24_1
  6740 0000E867 31C0                <1> 	xor	eax, eax ; 0 ; Min. value
  6741                              <1> pix_op_sub_24_1: 
  6742 0000E869 66AB                <1> 	stosw
  6743 0000E86B C1E810              <1> 	shr	eax, 16
  6744 0000E86E AA                  <1> 	stosb
  6745 0000E86F E2EB                <1> 	loop	pix_op_sub_24_0
  6746 0000E871 89D0                <1> 	mov	eax, edx
  6747 0000E873 C3                  <1> 	retn
  6748                              <1> 
  6749                              <1> pix_op_sub_32:
  6750                              <1> 	; 32 bit true colors
  6751                              <1> 	; SUBTRACT PIXEL COLOR
  6752                              <1> 	; ecx = pixel count per row
  6753                              <1> 	; eax = color
  6754                              <1> 	; edi = start pixel address
  6755                              <1> 
  6756 0000E874 89C2                <1> 	mov	edx, eax
  6757                              <1> pix_op_sub_32_0:
  6758 0000E876 8B07                <1> 	mov	eax, [edi]
  6759 0000E878 29D0                <1> 	sub	eax, edx
  6760 0000E87A 7302                <1> 	jnb	short pix_op_sub_32_1
  6761 0000E87C 31C0                <1> 	xor	eax, eax ; 0 ; Min. value
  6762                              <1> pix_op_sub_32_1:
  6763 0000E87E AB                  <1> 	stosd
  6764 0000E87F E2F5                <1> 	loop	pix_op_sub_32_0
  6765 0000E881 89D0                <1> 	mov	eax, edx
  6766 0000E883 C3                  <1> 	retn
  6767                              <1> 
  6768                              <1> pix_op_or_8:
  6769                              <1> 	; 8 bit colors (256 colors)
  6770                              <1> 	; OR PIXEL COLOR
  6771                              <1> 	; ecx = pixel count per row
  6772                              <1> 	;  al = color
  6773                              <1> 	; edi = start pixel address
  6774                              <1> 
  6775                              <1> pix_op_or_8_0:
  6776 0000E884 0807                <1> 	or	[edi], al
  6777 0000E886 47                  <1> 	inc	edi
  6778 0000E887 E2FB                <1> 	loop	pix_op_or_8_0
  6779 0000E889 C3                  <1> 	retn
  6780                              <1> 
  6781                              <1> pix_op_or_16:
  6782                              <1> 	; 16 bit colors (65536 colors)
  6783                              <1> 	; OR PIXEL COLOR
  6784                              <1> 	; ecx = pixel count per row
  6785                              <1> 	;  ax = color
  6786                              <1> 	; edi = start pixel address 
  6787                              <1> 
  6788                              <1> pix_op_or_16_0:
  6789 0000E88A 660907              <1> 	or	[edi], ax
  6790 0000E88D 47                  <1> 	inc	edi
  6791 0000E88E 47                  <1> 	inc	edi
  6792 0000E88F E2F9                <1> 	loop	pix_op_or_16_0
  6793 0000E891 C3                  <1> 	retn
  6794                              <1> 
  6795                              <1> pix_op_or_24:
  6796                              <1> 	; 24 bit true colors
  6797                              <1> 	; OR PIXEL COLOR
  6798                              <1> 	; ecx = pixel count per row
  6799                              <1> 	; eax = color
  6800                              <1> 	; edi = start pixel address
  6801                              <1> 
  6802 0000E892 89C2                <1> 	mov	edx, eax
  6803                              <1> pix_op_or_24_0:
  6804 0000E894 0B07                <1> 	or	eax, [edi]
  6805 0000E896 66AB                <1> 	stosw
  6806 0000E898 C1E810              <1> 	shr	eax, 16
  6807 0000E89B AA                  <1> 	stosb	
  6808 0000E89C 89D0                <1> 	mov	eax, edx
  6809 0000E89E E2F4                <1> 	loop	pix_op_or_24_0
  6810 0000E8A0 C3                  <1> 	retn
  6811                              <1> 
  6812                              <1> pix_op_or_32:
  6813                              <1> 	; 32 bit true colors
  6814                              <1> 	; OR PIXEL COLOR
  6815                              <1> 	; ecx = pixel count per row
  6816                              <1> 	; eax = color
  6817                              <1> 	; edi = start pixel address
  6818                              <1> 
  6819                              <1> 	;mov	edx, eax
  6820                              <1> pix_op_or_32_0:
  6821                              <1> 	;or	eax, [edi]
  6822                              <1> 	;stosd
  6823                              <1> 	;mov	eax, edx
  6824 0000E8A1 0907                <1> 	or	[edi], eax
  6825 0000E8A3 83C704              <1> 	add	edi, 4
  6826 0000E8A6 E2F9                <1> 	loop	pix_op_or_32_0
  6827 0000E8A8 C3                  <1> 	retn
  6828                              <1> 
  6829                              <1> pix_op_and_8:
  6830                              <1> 	; 8 bit colors (256 colors)
  6831                              <1> 	; AND PIXEL COLOR
  6832                              <1> 	; ecx = pixel count per row
  6833                              <1> 	;  al = color
  6834                              <1> 	; edi = start pixel address
  6835                              <1> 
  6836                              <1> pix_op_and_8_0:
  6837 0000E8A9 2007                <1> 	and	[edi], al
  6838 0000E8AB 47                  <1> 	inc	edi
  6839 0000E8AC E2FB                <1> 	loop	pix_op_and_8_0
  6840 0000E8AE C3                  <1> 	retn
  6841                              <1> 
  6842                              <1> pix_op_and_16:
  6843                              <1> 	; 16 bit colors (65536 colors)
  6844                              <1> 	; AND PIXEL COLOR
  6845                              <1> 	; ecx = pixel count per row
  6846                              <1> 	;  ax = color
  6847                              <1> 	; edi = start pixel address
  6848                              <1> 
  6849                              <1> pix_op_and_16_0:
  6850 0000E8AF 662107              <1> 	and	[edi], ax
  6851 0000E8B2 47                  <1> 	inc	edi
  6852 0000E8B3 47                  <1> 	inc	edi
  6853 0000E8B4 E2F9                <1> 	loop	pix_op_and_16_0
  6854 0000E8B6 C3                  <1> 	retn
  6855                              <1> 
  6856                              <1> pix_op_and_24:
  6857                              <1> 	; 24 bit true colors
  6858                              <1> 	; AND PIXEL COLOR
  6859                              <1> 	; ecx = pixel count per row
  6860                              <1> 	; eax = color
  6861                              <1> 	; edi = start pixel address
  6862                              <1> 
  6863 0000E8B7 89C2                <1> 	mov	edx, eax
  6864                              <1> pix_op_and_24_0:
  6865 0000E8B9 2307                <1> 	and	eax, [edi]
  6866 0000E8BB 66AB                <1> 	stosw
  6867 0000E8BD C1E810              <1> 	shr	eax, 16
  6868 0000E8C0 AA                  <1> 	stosb	
  6869 0000E8C1 89D0                <1> 	mov	eax, edx
  6870 0000E8C3 E2F4                <1> 	loop	pix_op_and_24_0
  6871 0000E8C5 C3                  <1> 	retn
  6872                              <1> 
  6873                              <1> pix_op_and_32:
  6874                              <1> 	; 32 bit true colors
  6875                              <1> 	; AND PIXEL COLOR
  6876                              <1> 	; ecx = pixel count per row
  6877                              <1> 	; eax = color
  6878                              <1> 	; edi = start pixel address
  6879                              <1> 
  6880                              <1> 	;mov	edx, eax
  6881                              <1> pix_op_and_32_0:
  6882                              <1> 	;and	eax, [edi]
  6883                              <1> 	;stosd
  6884                              <1> 	;mov	eax, edx
  6885 0000E8C6 2107                <1> 	and	[edi], eax
  6886 0000E8C8 83C704              <1> 	add	edi, 4
  6887 0000E8CB E2F9                <1> 	loop	pix_op_and_32_0
  6888 0000E8CD C3                  <1> 	retn
  6889                              <1> 
  6890                              <1> pix_op_xor_8:
  6891                              <1> 	; 8 bit colors (256 colors)
  6892                              <1> 	; XOR PIXEL COLOR
  6893                              <1> 	; ecx = pixel count per row
  6894                              <1> 	;  al = color
  6895                              <1> 	; edi = start pixel address
  6896                              <1> 
  6897                              <1> pix_op_xor_8_0:
  6898 0000E8CE 3007                <1> 	xor	[edi], al
  6899 0000E8D0 47                  <1> 	inc	edi
  6900 0000E8D1 E2FB                <1> 	loop	pix_op_xor_8_0
  6901 0000E8D3 C3                  <1> 	retn
  6902                              <1> 
  6903                              <1> pix_op_xor_16:
  6904                              <1> 	; 16 bit colors (65536 colors)
  6905                              <1> 	; XOR PIXEL COLOR
  6906                              <1> 	; ecx = pixel count per row
  6907                              <1> 	;  ax = color
  6908                              <1> 	; edi = start pixel address
  6909                              <1> 
  6910                              <1> pix_op_xor_16_0:
  6911 0000E8D4 663107              <1> 	xor	[edi], ax
  6912 0000E8D7 47                  <1> 	inc	edi
  6913 0000E8D8 47                  <1> 	inc	edi
  6914 0000E8D9 E2F9                <1> 	loop	pix_op_xor_16_0
  6915 0000E8DB C3                  <1> 	retn
  6916                              <1> 
  6917                              <1> pix_op_xor_24:
  6918                              <1> 	; 24 bit true colors
  6919                              <1> 	; XOR PIXEL COLOR
  6920                              <1> 	; ecx = pixel count per row
  6921                              <1> 	; eax = color
  6922                              <1> 	; edi = start pixel address
  6923                              <1> 
  6924 0000E8DC 89C2                <1> 	mov	edx, eax
  6925                              <1> pix_op_xor_24_0:
  6926 0000E8DE 3307                <1> 	xor	eax, [edi]
  6927 0000E8E0 66AB                <1> 	stosw
  6928 0000E8E2 C1E810              <1> 	shr	eax, 16
  6929 0000E8E5 AA                  <1> 	stosb	
  6930 0000E8E6 89D0                <1> 	mov	eax, edx
  6931 0000E8E8 E2F4                <1> 	loop	pix_op_xor_24_0
  6932 0000E8EA C3                  <1> 	retn
  6933                              <1> 
  6934                              <1> pix_op_xor_32:
  6935                              <1> 	; 32 bit true colors
  6936                              <1> 	; XOR PIXEL COLOR
  6937                              <1> 	; ecx = pixel count per row
  6938                              <1> 	; eax = color
  6939                              <1> 	; edi = start pixel address
  6940                              <1> 
  6941                              <1> 	;mov	edx, eax
  6942                              <1> pix_op_xor_32_0:
  6943                              <1> 	;xor	eax, [edi]
  6944                              <1> 	;stosd
  6945                              <1> 	;mov	eax, edx
  6946 0000E8EB 3107                <1> 	xor	[edi], eax
  6947 0000E8ED 83C704              <1> 	add	edi, 4
  6948 0000E8F0 E2F9                <1> 	loop	pix_op_xor_32_0
  6949 0000E8F2 C3                  <1> 	retn
  6950                              <1> 
  6951                              <1> pix_op_mix_8:
  6952                              <1> 	; 8 bit colors (256 colors)
  6953                              <1> 	; MIX (AVERAGE) PIXEL COLORS
  6954                              <1> 	; ecx = pixel count per row
  6955                              <1> 	;  al = color
  6956                              <1> 	; edi = start pixel address
  6957                              <1> 
  6958 0000E8F3 88C4                <1> 	mov	ah, al
  6959                              <1> pix_op_mix_8_0:
  6960 0000E8F5 0207                <1> 	add	al, [edi]
  6961 0000E8F7 D0D8                <1> 	rcr	al, 1
  6962 0000E8F9 AA                  <1> 	stosb
  6963 0000E8FA 88E0                <1> 	mov	al, ah
  6964 0000E8FC E2F7                <1> 	loop	pix_op_mix_8_0
  6965 0000E8FE C3                  <1> 	retn
  6966                              <1> 
  6967                              <1> pix_op_mix_16:
  6968                              <1> 	; 16 bit colors (65536 colors)
  6969                              <1> 	; MIX (AVERAGE) PIXEL COLORS
  6970                              <1> 	; ecx = pixel count per row
  6971                              <1> 	;  ax = color
  6972                              <1> 	; edi = start pixel address
  6973                              <1> 
  6974 0000E8FF 89C2                <1> 	mov	edx, eax
  6975                              <1> pix_op_mix_16_0:
  6976 0000E901 660307              <1> 	add	ax, [edi]
  6977 0000E904 66D1D8              <1> 	rcr	ax, 1
  6978 0000E907 66AB                <1> 	stosw
  6979 0000E909 89D0                <1> 	mov	eax, edx
  6980 0000E90B E2F4                <1> 	loop	pix_op_mix_16_0
  6981 0000E90D C3                  <1> 	retn
  6982                              <1> 
  6983                              <1> pix_op_mix_24:
  6984                              <1> 	; 24 bit true colors
  6985                              <1> 	; MIX (AVERAGE) PIXEL COLORS
  6986                              <1> 	; ecx = pixel count per row
  6987                              <1> 	; eax = color
  6988                              <1> 	; edi = start pixel address
  6989                              <1> 
  6990 0000E90E 53                  <1> 	push	ebx
  6991 0000E90F BBFFFFFF00          <1> 	mov	ebx, 0FFFFFFh
  6992                              <1> 	;and	eax, ebx ; 0FFFFFFh
  6993 0000E914 89C2                <1> 	mov	edx, eax
  6994                              <1> pix_op_mix_24_0:
  6995 0000E916 8B07                <1> 	mov	eax, [edi]
  6996 0000E918 21D8                <1> 	and	eax, ebx ; 0FFFFFFh
  6997 0000E91A 01D0                <1> 	add	eax, edx
  6998 0000E91C D1E8                <1> 	shr	eax, 1
  6999                              <1> 	;rcr	eax, 1
  7000 0000E91E 66AB                <1> 	stosw
  7001 0000E920 C1E810              <1> 	shr	eax, 16
  7002 0000E923 AA                  <1> 	stosb
  7003 0000E924 E2F0                <1> 	loop	pix_op_mix_24_0
  7004 0000E926 89D0                <1> 	mov	eax, edx
  7005 0000E928 5B                  <1> 	pop	ebx
  7006 0000E929 C3                  <1> 	retn
  7007                              <1> 
  7008                              <1> pix_op_mix_32:
  7009                              <1> 	; 32 bit true colors
  7010                              <1> 	; MIX (AVERAGE) PIXEL COLORS
  7011                              <1> 	; ecx = pixel count per row
  7012                              <1> 	; eax = color
  7013                              <1> 	; edi = start pixel address
  7014                              <1> 
  7015 0000E92A 89C2                <1> 	mov	edx, eax
  7016                              <1> pix_op_mix_32_0:
  7017 0000E92C 0307                <1> 	add	eax, [edi]
  7018 0000E92E D1D8                <1> 	rcr	eax, 1	
  7019 0000E930 AB                  <1> 	stosd
  7020 0000E931 89D0                <1> 	mov	eax, edx
  7021 0000E933 E2F7                <1> 	loop	pix_op_mix_32_0
  7022 0000E935 C3                  <1> 	retn
  7023                              <1> 
  7024                              <1> pix_op_not_8:
  7025                              <1> 	; 8 bit colors (256 colors)
  7026                              <1> 	; NOT PIXEL COLOR
  7027                              <1> 	; ecx = pixel count per row
  7028                              <1> 	; edi = start pixel address
  7029                              <1> 
  7030                              <1> pix_op_not_8_0:
  7031 0000E936 F617                <1> 	not	byte [edi]
  7032 0000E938 47                  <1> 	inc	edi
  7033 0000E939 E2FB                <1> 	loop	pix_op_not_8_0
  7034 0000E93B C3                  <1> 	retn
  7035                              <1> 
  7036                              <1> pix_op_not_16:
  7037                              <1> 	; 16 bit colors (65536 colors)
  7038                              <1> 	; NOT PIXEL COLOR
  7039                              <1> 	; ecx = pixel count per row
  7040                              <1> 	; edi = start pixel address
  7041                              <1> 
  7042                              <1> pix_op_not_16_0:
  7043 0000E93C 66F717              <1> 	not	word [edi]
  7044 0000E93F 47                  <1> 	inc	edi
  7045 0000E940 47                  <1> 	inc	edi
  7046 0000E941 E2F9                <1> 	loop	pix_op_not_16_0
  7047 0000E943 C3                  <1> 	retn
  7048                              <1> 
  7049                              <1> pix_op_not_24:
  7050                              <1> 	; 24 bit true colors
  7051                              <1> 	; NOT PIXEL COLOR
  7052                              <1> 	; ecx = pixel count per row
  7053                              <1> 	; edi = start pixel address
  7054                              <1> 
  7055                              <1> pix_op_not_24_0:
  7056 0000E944 66F717              <1> 	not	word [edi]
  7057 0000E947 47                  <1> 	inc	edi
  7058 0000E948 47                  <1> 	inc	edi
  7059 0000E949 F617                <1> 	not	byte [edi]
  7060 0000E94B 47                  <1> 	inc	edi
  7061 0000E94C E2F6                <1> 	loop	pix_op_not_24_0
  7062 0000E94E C3                  <1> 	retn
  7063                              <1> 
  7064                              <1> pix_op_not_32:
  7065                              <1> 	; 32 bit true colors
  7066                              <1> 	; NOT PIXEL COLOR
  7067                              <1> 	; ecx = pixel count per row
  7068                              <1> 	; eax = color
  7069                              <1> 	; edi = start pixel address
  7070                              <1> pix_op_not_32_0:
  7071 0000E94F F717                <1> 	not	dword [edi]
  7072 0000E951 83C704              <1> 	add	edi, 4
  7073 0000E954 E2F9                <1> 	loop	pix_op_not_32_0
  7074 0000E956 C3                  <1> 	retn
  7075                              <1> 
  7076                              <1> pix_op_neg_8:
  7077                              <1> 	; 8 bit colors (256 colors)
  7078                              <1> 	; NEG PIXEL COLOR
  7079                              <1> 	; ecx = pixel count per row
  7080                              <1> 	; edi = start pixel address
  7081                              <1> 
  7082                              <1> pix_op_neg_8_0:
  7083 0000E957 F61F                <1> 	neg	byte [edi]
  7084 0000E959 47                  <1> 	inc	edi
  7085 0000E95A E2FB                <1> 	loop	pix_op_neg_8_0
  7086 0000E95C C3                  <1> 	retn
  7087                              <1> 
  7088                              <1> pix_op_neg_16:
  7089                              <1> 	; 16 bit colors (65536 colors)
  7090                              <1> 	; NEG PIXEL COLOR
  7091                              <1> 	; ecx = pixel count per row
  7092                              <1> 	; edi = start pixel address
  7093                              <1> 
  7094                              <1> pix_op_neg_16_0:
  7095 0000E95D 66F71F              <1> 	neg	word [edi]
  7096 0000E960 47                  <1> 	inc	edi
  7097 0000E961 47                  <1> 	inc	edi
  7098 0000E962 E2F9                <1> 	loop	pix_op_neg_16_0
  7099 0000E964 C3                  <1> 	retn
  7100                              <1> 
  7101                              <1> pix_op_neg_24:
  7102                              <1> 	; 24 bit true colors
  7103                              <1> 	; NEG PIXEL COLOR
  7104                              <1> 	; ecx = pixel count per row
  7105                              <1> 	; edi = start pixel address
  7106                              <1> 
  7107                              <1> pix_op_neg_24_0:
  7108 0000E965 8B07                <1> 	mov	eax, [edi]
  7109 0000E967 25FFFFFF00          <1> 	and	eax, 0FFFFFFh
  7110 0000E96C F7D8                <1> 	neg	eax
  7111 0000E96E 66AB                <1> 	stosw
  7112 0000E970 C1E810              <1> 	shr	eax, 16
  7113 0000E973 AA                  <1> 	stosb
  7114 0000E974 E2EF                <1> 	loop	pix_op_neg_24_0
  7115 0000E976 C3                  <1> 	retn
  7116                              <1> 
  7117                              <1> pix_op_neg_32:
  7118                              <1> 	; 32 bit true colors
  7119                              <1> 	; NEG PIXEL COLOR
  7120                              <1> 	; ecx = pixel count per row
  7121                              <1> 	; eax = color
  7122                              <1> 	; edi = start pixel address
  7123                              <1> pix_op_neg_32_0:
  7124 0000E977 F71F                <1> 	neg	dword [edi]
  7125 0000E979 83C704              <1> 	add	edi, 4
  7126 0000E97C E2F9                <1> 	loop	pix_op_neg_32_0
  7127 0000E97E C3                  <1> 	retn
  7128                              <1> 
  7129                              <1> pix_op_inc_8:
  7130                              <1> 	; 8 bit colors (256 colors)
  7131                              <1> 	; INCREASE PIXEL COLOR
  7132                              <1> 	; ecx = pixel count per row
  7133                              <1> 	; edi = start pixel address
  7134                              <1> 
  7135                              <1> pix_op_inc_8_0:
  7136 0000E97F FE07                <1> 	inc	byte [edi]
  7137 0000E981 7502                <1> 	jnz	short pix_op_inc_8_1
  7138                              <1> 	;mov	[edi], 0FFh ; Max. value
  7139 0000E983 FE0F                <1> 	dec	byte [edi]
  7140                              <1> pix_op_inc_8_1:
  7141 0000E985 47                  <1> 	inc	edi
  7142 0000E986 E2F7                <1> 	loop	pix_op_inc_8_0
  7143 0000E988 C3                  <1> 	retn
  7144                              <1> 
  7145                              <1> pix_op_inc_16:
  7146                              <1> 	; 16 bit colors (65536 colors)
  7147                              <1> 	; INCREASE PIXEL COLOR
  7148                              <1> 	; ecx = pixel count per row
  7149                              <1> 	; edi = start pixel address
  7150                              <1> 
  7151                              <1> pix_op_inc_16_0:
  7152 0000E989 66FF07              <1> 	inc	word [edi]
  7153 0000E98C 7503                <1> 	jnz	short pix_op_inc_16_1
  7154                              <1> 	;mov	word [edi], 0FFFFh ; Max. value
  7155 0000E98E 66FF0F              <1> 	dec	word [edi]
  7156                              <1> pix_op_inc_16_1:
  7157 0000E991 47                  <1> 	inc	edi
  7158 0000E992 47                  <1> 	inc	edi
  7159 0000E993 E2F4                <1> 	loop	pix_op_inc_16_0
  7160 0000E995 C3                  <1> 	retn
  7161                              <1> 
  7162                              <1> pix_op_inc_24:
  7163                              <1> 	; 24 bit true colors
  7164                              <1> 	; INCREASE PIXEL COLOR
  7165                              <1> 	; ecx = pixel count per row
  7166                              <1> 	; edi = start pixel address
  7167                              <1> 
  7168                              <1> pix_op_inc_24_0:
  7169 0000E996 8B07                <1> 	mov	eax, [edi]
  7170 0000E998 40                  <1> 	inc	eax
  7171 0000E999 25FFFFFF00          <1> 	and	eax, 0FFFFFFh
  7172 0000E99E 7501                <1> 	jnz	short pix_op_inc_24_1
  7173                              <1> 	;mov	eax, 0FFFFFFh  ; Max. value
  7174 0000E9A0 48                  <1> 	dec	eax ; 0FFFFFFFFh
  7175                              <1> pix_op_inc_24_1: 
  7176 0000E9A1 66AB                <1> 	stosw
  7177 0000E9A3 C1E810              <1> 	shr	eax, 16
  7178 0000E9A6 AA                  <1> 	stosb
  7179 0000E9A7 E2ED                <1> 	loop	pix_op_inc_24_0
  7180 0000E9A9 C3                  <1> 	retn
  7181                              <1> 
  7182                              <1> pix_op_inc_32:
  7183                              <1> 	; 32 bit true colors
  7184                              <1> 	; INCREASE PIXEL COLOR
  7185                              <1> 	; ecx = pixel count per row
  7186                              <1> 	; edi = start pixel address
  7187                              <1> 
  7188                              <1> pix_op_inc_32_0:
  7189 0000E9AA FF07                <1> 	inc	dword [edi]
  7190 0000E9AC 7502                <1> 	jnz	short pix_op_inc_32_1
  7191                              <1> 	;mov	dword [edi], 0FFFFFFFFh ; Max. value
  7192 0000E9AE FF0F                <1> 	dec	dword [edi]
  7193                              <1> pix_op_inc_32_1:
  7194 0000E9B0 83C704              <1> 	add	edi, 4
  7195 0000E9B3 E2F5                <1> 	loop	pix_op_inc_32_0
  7196 0000E9B5 C3                  <1> 	retn
  7197                              <1> 
  7198                              <1> pix_op_dec_8:
  7199                              <1> 	; 8 bit colors (256 colors)
  7200                              <1> 	; DECREASE PIXEL COLOR
  7201                              <1> 	; ecx = pixel count per row
  7202                              <1> 	; edi = start pixel address
  7203                              <1> 
  7204                              <1> pix_op_dec_8_0:
  7205 0000E9B6 FE0F                <1> 	dec	byte [edi]
  7206 0000E9B8 7902                <1> 	jns	short pix_op_dec_8_1
  7207 0000E9BA FE07                <1> 	inc	byte [edi] ; 0 ; Min. value
  7208                              <1> pix_op_dec_8_1:
  7209 0000E9BC 47                  <1> 	inc	edi
  7210 0000E9BD E2F7                <1> 	loop	pix_op_dec_8_0
  7211 0000E9BF C3                  <1> 	retn
  7212                              <1> 
  7213                              <1> pix_op_dec_16:
  7214                              <1> 	; 16 bit colors (65536 colors)
  7215                              <1> 	; DECREASE PIXEL COLOR
  7216                              <1> 	; ecx = pixel count per row
  7217                              <1> 	; edi = start pixel address
  7218                              <1> 
  7219                              <1> pix_op_dec_16_0:
  7220 0000E9C0 66FF0F              <1> 	dec	word [edi]
  7221 0000E9C3 7903                <1> 	jns	short pix_op_dec_16_1
  7222 0000E9C5 66FF07              <1> 	inc	word [edi] ; 0 ; Min. value
  7223                              <1> pix_op_dec_16_1:
  7224 0000E9C8 47                  <1> 	inc edi
  7225 0000E9C9 47                  <1> 	inc edi
  7226 0000E9CA E2F4                <1> 	loop	pix_op_dec_16_0
  7227 0000E9CC C3                  <1> 	retn
  7228                              <1> 
  7229                              <1> pix_op_dec_24:
  7230                              <1> 	; 24 bit true colors
  7231                              <1> 	; DECREASE PIXEL COLOR
  7232                              <1> 	; ecx = pixel count per row
  7233                              <1> 	; edi = start pixel address
  7234                              <1> 
  7235                              <1> pix_op_dec_24_0:
  7236 0000E9CD 8B07                <1> 	mov	eax, [edi]
  7237 0000E9CF 25FFFFFF00          <1> 	and	eax, 0FFFFFFh
  7238 0000E9D4 7401                <1> 	jz	short pix_op_dec_24_1
  7239                              <1> 			; 0 ; Min. value
  7240 0000E9D6 48                  <1> 	dec	eax
  7241                              <1> pix_op_dec_24_1:
  7242 0000E9D7 66AB                <1> 	stosw
  7243 0000E9D9 C1E810              <1> 	shr	eax, 16
  7244 0000E9DC AA                  <1> 	stosb
  7245 0000E9DD E2B7                <1> 	loop	pix_op_inc_24_0
  7246 0000E9DF C3                  <1> 	retn
  7247                              <1> 
  7248                              <1> pix_op_dec_32:
  7249                              <1> 	; 32 bit true colors
  7250                              <1> 	; DECREASE PIXEL COLOR
  7251                              <1> 	; ecx = pixel count per row
  7252                              <1> 	; edi = start pixel address
  7253                              <1> 
  7254                              <1> pix_op_dec_32_0:
  7255 0000E9E0 FF0F                <1> 	dec	dword [edi]
  7256 0000E9E2 7902                <1> 	jns	short pix_op_dec_32_1
  7257 0000E9E4 FF07                <1> 	inc	dword [edi] ; 0 ; Min. value
  7258                              <1> pix_op_dec_32_1:
  7259 0000E9E6 83C704              <1> 	add	edi, 4
  7260 0000E9E9 E2F5                <1> 	loop	pix_op_dec_32_0
  7261 0000E9EB 89D0                <1> 	mov	eax, edx
  7262 0000E9ED C3                  <1> 	retn
  7263                              <1> 
  7264                              <1> pix_op_rpl_8:
  7265                              <1> 	; 8 bit colors (256 colors)
  7266                              <1> 	; REPLACE PIXEL COLORS
  7267                              <1> 	; ecx = pixel count per row
  7268                              <1> 	;  al = new color
  7269                              <1> 	; byte [maskcolor] = old color
  7270                              <1> 	; edi = start pixel address
  7271                              <1> 
  7272 0000E9EE 8A25[E2A30100]      <1> 	mov	ah, [maskcolor]
  7273                              <1> pix_op_rpl_8_0:
  7274 0000E9F4 3A27                <1> 	cmp	ah, [edi]
  7275 0000E9F6 7502                <1> 	jne	short pix_op_rpl_8_1
  7276 0000E9F8 8807                <1> 	mov	[edi], al
  7277                              <1> pix_op_rpl_8_1:
  7278 0000E9FA 47                  <1> 	inc	edi
  7279 0000E9FB E2F7                <1> 	loop	pix_op_rpl_8_0
  7280 0000E9FD C3                  <1> 	retn
  7281                              <1> 
  7282                              <1> pix_op_rpl_16:
  7283                              <1> 	; 16 bit colors (65536 colors)
  7284                              <1> 	; REPLACE PIXEL COLORS
  7285                              <1> 	; ecx = pixel count per row
  7286                              <1> 	;  ax = new color
  7287                              <1> 	; word [maskcolor] = old color
  7288                              <1> 	; edi = start pixel address
  7289                              <1> 
  7290 0000E9FE 8B15[E2A30100]      <1> 	mov	edx, [maskcolor]
  7291                              <1> pix_op_rpl_16_0:
  7292 0000EA04 663B17              <1> 	cmp	dx, [edi]
  7293 0000EA07 7503                <1> 	jne	short pix_op_rpl_16_1
  7294 0000EA09 668907              <1> 	mov	[edi], ax
  7295                              <1> pix_op_rpl_16_1:
  7296 0000EA0C 47                  <1> 	inc	edi
  7297 0000EA0D 47                  <1> 	inc	edi
  7298 0000EA0E E2F4                <1> 	loop	pix_op_rpl_16_0
  7299 0000EA10 C3                  <1> 	retn
  7300                              <1> 
  7301                              <1> pix_op_rpl_24:
  7302                              <1> 	; 24 bit true colors
  7303                              <1> 	; REPLACE PIXEL COLORS
  7304                              <1> 	; ecx = pixel count per row
  7305                              <1> 	; eax = new color
  7306                              <1> 	; [maskcolor] = old color
  7307                              <1> 	; edi = start pixel address
  7308                              <1> 
  7309                              <1> pix_op_rpl_24_0:
  7310 0000EA11 8B17                <1> 	mov	edx, [edi]
  7311 0000EA13 81E2FFFFFF00        <1> 	and	edx, 0FFFFFFh
  7312 0000EA19 3B15[E2A30100]      <1> 	cmp	edx, [maskcolor]
  7313 0000EA1F 7406                <1> 	je	short pix_op_rpl_24_1
  7314 0000EA21 83C703              <1> 	add	edi, 3
  7315 0000EA24 E2EB                <1> 	loop	pix_op_rpl_24_0
  7316 0000EA26 C3                  <1> 	retn
  7317                              <1> pix_op_rpl_24_1:
  7318 0000EA27 AA                  <1> 	stosb
  7319 0000EA28 C1C808              <1> 	ror	eax, 8
  7320 0000EA2B 66AB                <1> 	stosw
  7321 0000EA2D C1C008              <1> 	rol	eax, 8
  7322 0000EA30 E2DF                <1> 	loop	pix_op_rpl_24_0
  7323 0000EA32 C3                  <1> 	retn
  7324                              <1> 
  7325                              <1> pix_op_rpl_32:
  7326                              <1> 	; 32 bit true colors
  7327                              <1> 	; REPLACE PIXEL COLORS
  7328                              <1> 	; ecx = pixel count per row
  7329                              <1> 	; eax = new color
  7330                              <1> 	; [maskcolor] = old color
  7331                              <1> 	; edi = start pixel address
  7332                              <1> 
  7333 0000EA33 8B15[E2A30100]      <1> 	mov	edx, [maskcolor]
  7334                              <1> pix_op_rpl_32_0:
  7335 0000EA39 3B17                <1> 	cmp	edx, [edi]
  7336 0000EA3B 7504                <1> 	jne	short pix_op_rpl_32_2
  7337 0000EA3D AB                  <1> 	stosd
  7338 0000EA3E E2F9                <1> 	loop	pix_op_rpl_32_0
  7339 0000EA40 C3                  <1> 	retn
  7340                              <1> pix_op_rpl_32_2:
  7341 0000EA41 83C704              <1> 	add	edi, 4
  7342 0000EA44 E2F3                <1> 	loop	pix_op_rpl_32_0
  7343 0000EA46 C3                  <1> 	retn
  7344                              <1> 
  7345                              <1> pix_op_chr:
  7346                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
  7347                              <1> 	; 15/02/2021
  7348                              <1> 	; 05/02/2021
  7349                              <1> 	; WRITE CHARACTER (FONT)
  7350                              <1> 	; 05/01/2021 ([ufont])
  7351                              <1> 	; 01/01/2021
  7352                              <1> 	;     CL = char's color (8 bit, 256 colors)
  7353                              <1> 	;    ECX = char's color (16 bit and true colors)
  7354                              <1> 	;     DL = Character's ASCII code
  7355                              <1> 	;     DH bit 0 -> font height
  7356                              <1> 	;	  0 -> 8x16 character font
  7357                              <1> 	;	  1 -> 8x8 character font
  7358                              <1> 	;     DH bit 1 & 2 -> scale
  7359                              <1> 	;	  0 = 1/1 (8 pixels per char row)
  7360                              <1> 	;	  1 = 2/1 (16 pixels per char row)
  7361                              <1> 	;	  2 = 3/1 (24 pixels per char row)
  7362                              <1> 	;	  3 = 4/1 (32 pixels per char row)
  7363                              <1> 	;     DH bit 6 -> [ufont] option (1 = use [ufont])
  7364                              <1> 	;     If DH bit 7 = 1
  7365                              <1> 	;	 USER FONT (from user buffer)
  7366                              <1> 	;	    DL = 0 -> 8x8 (width: 1 byte per row)
  7367                              <1> 	;	    DL = 1 -> 8x16
  7368                              <1> 	;	    DL = 2 -> 16x16 (width: 2 bytes)
  7369                              <1> 	;	    DL = 3 -> 16x32
  7370                              <1> 	;	    DL = 4 -> 24x24 (width: 3 bytes)
  7371                              <1> 	;	    DL = 5 -> 24x48
  7372                              <1> 	;	    DL = 6 -> 32x32 (width: 4 bytes)
  7373                              <1> 	;	    DL = 7 -> 32x64
  7374                              <1> 	;	    DL > 7 -> invalid (unused)
  7375                              <1> 	;	 EDI = user's font buffer address
  7376                              <1> 	;	    (NOTE: byte order is as row0,row1,row2..)
  7377                              <1> 	;     ESI = start position (row, column) (*)
  7378                              <1> 	;	     (HW = row, SI = column)
  7379                              <1> 
  7380 0000EA47 89F0                <1> 	mov	eax, esi ; start position
  7381 0000EA49 E856F2FFFF          <1> 	call	calc_pixel_offset
  7382 0000EA4E 3B05[D6A30100]      <1> 	cmp	eax, [v_siz]
  7383 0000EA54 736D                <1> 	jnb	short pix_op_chr_err ; out of display page!
  7384 0000EA56 E826F2FFFF          <1> 	call	pixels_to_byte_count
  7385                              <1> 	; eax = font start offset
  7386 0000EA5B 0305[D2A30100]      <1> 	add	eax, [v_mem] ; LFB start address
  7387 0000EA61 A3[DAA30100]        <1> 	mov	[v_str], eax ; font start address
  7388                              <1> 
  7389 0000EA66 890D[E2A30100]      <1> 	mov	[maskcolor], ecx ; save char's color
  7390                              <1> 
  7391 0000EA6C 8835[D0A30100]      <1> 	mov	[v_ops], dh
  7392                              <1> 
  7393 0000EA72 81E6FFFF0000        <1> 	and	esi, 0FFFFh
  7394 0000EA78 8935[EAA30100]      <1> 	mov	[buffer8], esi ; start column
  7395                              <1> 
  7396 0000EA7E 31DB                <1> 	xor	ebx, ebx ; 0
  7397 0000EA80 31C0                <1> 	xor	eax, eax ; 15/02/2021
  7398                              <1> 
  7399 0000EA82 F6C680              <1> 	test	dh, 80h
  7400 0000EA85 7577                <1> 	jnz	short pix_op_chr_u ; user font
  7401                              <1> 
  7402 0000EA87 80E63F              <1> 	and	dh, 3Fh ; clear bit 6, [UFONT] option bit
  7403 0000EA8A 7409                <1> 	jz	short pix_op_chr_0
  7404                              <1> 
  7405 0000EA8C 80FE07              <1> 	cmp	dh, 7
  7406 0000EA8F 7732                <1> 	ja	short pix_op_chr_err
  7407                              <1> 			 ; invalid (undefined) option
  7408 0000EA91 88F4                <1> 	mov	ah, dh
  7409 0000EA93 D0EC                <1> 	shr	ah, 1
  7410                              <1> 	; ah = 0 to 3, scale
  7411                              <1> 	;jmp	short pix_op_chr_font_pixels
  7412                              <1> 
  7413                              <1> pix_op_chr_font_pixels:
  7414                              <1> 	; 05/02/2021
  7415                              <1> 	; write scaled font to buffer
  7416                              <1> 
  7417                              <1> 	; DL = ASCII code of character
  7418                              <1> 	; AH = scale
  7419                              <1> 	; EDI = buffer address (kernel)
  7420                              <1> 
  7421                              <1> pix_op_chr_0:
  7422 0000EA95 88D3                <1> 	mov	bl, dl ; 15/02/2021
  7423 0000EA97 31C9                <1> 	xor	ecx, ecx
  7424 0000EA99 B610                <1> 	mov	dh, 16
  7425 0000EA9B F605[D0A30100]01    <1> 	test	byte [v_ops], 1 ; 8x8 font ?
  7426 0000EAA2 7428                <1> 	jz	short pix_op_chr_2 ; 8x16 font
  7427 0000EAA4 B608                <1> 	mov	dh, 8
  7428 0000EAA6 C1E303              <1> 	shl	ebx, 3 ; * 8
  7429 0000EAA9 F605[D0A30100]40    <1> 	test	byte [v_ops], 40h ; [ufont] option
  7430 0000EAB0 7412                <1> 	jz	short pix_op_chr_1  ; no
  7431                              <1> 	; test 8x8 user font is ready flag
  7432 0000EAB2 F605[C6A30100]01    <1> 	test	byte [ufont], 1
  7433 0000EAB9 7409                <1> 	jz	short pix_op_chr_1 ; no
  7434 0000EABB 81C300500900        <1> 	add	ebx, VGAFONT8USER
  7435 0000EAC1 EB2C                <1> 	jmp	short pix_op_chr_fpos_0
  7436                              <1> pix_op_chr_err:
  7437 0000EAC3 C3                  <1> 	retn
  7438                              <1> pix_op_chr_1:
  7439 0000EAC4 81C3[84530100]      <1> 	add	ebx, vgafont8 ; system font (8x8)
  7440 0000EACA EB23                <1> 	jmp	short pix_op_chr_fpos_0
  7441                              <1> pix_op_chr_2:
  7442 0000EACC C1E304              <1> 	shl	ebx, 4 ; * 16
  7443 0000EACF F605[D0A30100]40    <1> 	test	byte [v_ops], 40h ; [ufont] option
  7444 0000EAD6 7411                <1> 	jz	short pix_op_chr_3  ; no
  7445                              <1> 	; test 8x16 user font is ready flag
  7446 0000EAD8 F605[C6A30100]02    <1> 	test	byte [ufont], 2
  7447 0000EADF 7408                <1> 	jz	short pix_op_chr_3 ; no
  7448 0000EAE1 81C300400900        <1> 	add	ebx, VGAFONT16USER
  7449 0000EAE7 EB06                <1> 	jmp	short pix_op_chr_fpos_0
  7450                              <1> pix_op_chr_3:
  7451 0000EAE9 81C3[84690100]      <1> 	add	ebx, vgafont16 ; system font (8x16)
  7452                              <1> pix_op_chr_fpos_0:
  7453 0000EAEF 20E4                <1> 	and	ah, ah
  7454 0000EAF1 754A                <1> 	jnz	short pix_op_chr_fpos_1 ; scale > 1
  7455                              <1> 	; no scale (scale = 1)
  7456 0000EAF3 89DE                <1> 	mov	esi, ebx ; 15/02/2021
  7457 0000EAF5 88F1                <1> 	mov	cl, dh ; rows/height (16 or 8)
  7458 0000EAF7 B608                <1> 	mov	dh, 8  ; columns/width
  7459 0000EAF9 E9CB000000          <1> 	jmp	pix_op_chr_f2p
  7460                              <1> pix_op_chr_u:
  7461                              <1> 	; write user defined font 
  7462 0000EAFE 80FE80              <1> 	cmp	dh, 80h
  7463 0000EB01 75C0                <1> 	jne	short pix_op_chr_err
  7464 0000EB03 80FA07              <1> 	cmp	dl, 7
  7465 0000EB06 77BB                <1> 	ja	short pix_op_chr_err
  7466                              <1> 
  7467                              <1> 	; 16/02/2021
  7468 0000EB08 89FE                <1> 	mov	esi, edi ; user's font buffer
  7469                              <1> 	
  7470                              <1> 	;xor	eax, eax
  7471                              <1> 	; eax = 0 ; 15/02/2021
  7472 0000EB0A 88D4                <1> 	mov	ah, dl
  7473 0000EB0C D0EC                <1> 	shr	ah, 1
  7474 0000EB0E FEC4                <1> 	inc	ah
  7475                              <1> 	; ah =  1 to 4
  7476 0000EB10 88E0                <1> 	mov	al, ah
  7477 0000EB12 C0E003              <1> 	shl	al, 3 ; * 8
  7478                              <1> 	; al = 8,16,24,32
  7479 0000EB15 88C3                <1> 	mov	bl, al
  7480 0000EB17 88C7                <1> 	mov	bh, al
  7481 0000EB19 F6E4                <1> 	mul	ah
  7482                              <1> 	; ax = 8,32,72,128 bytes
  7483 0000EB1B F6C201              <1> 	test	dl, 1
  7484 0000EB1E 7404                <1> 	jz	short pix_op_chr_u_0
  7485                              <1> 	;shl	ax, 1 ; *2
  7486                              <1> 	; 23/07/2022
  7487 0000EB20 D1E0                <1> 	shl	eax, 1
  7488                              <1> 	; ax = 16,32,144,256 bytes
  7489 0000EB22 D0E7                <1> 	shl	bh, 1
  7490                              <1> pix_op_chr_u_0:
  7491                              <1> 	; eax = byte count
  7492 0000EB24 89C1                <1> 	mov	ecx, eax
  7493 0000EB26 BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK
  7494                              <1> 	; esi = user buffer
  7495 0000EB2B E8CA240000          <1> 	call	transfer_from_user_buffer
  7496 0000EB30 7291                <1> 	jc	short pix_op_chr_err
  7497                              <1> 
  7498 0000EB32 88F9                <1> 	mov	cl, bh ; rows/height
  7499 0000EB34 88DE                <1> 	mov	dh, bl ; columns (width)
  7500 0000EB36 89FE                <1> 	mov	esi, edi ; VBE3SAVERESTOREBLOCK
  7501 0000EB38 E98C000000          <1> 	jmp	pix_op_chr_f2p
  7502                              <1> 
  7503                              <1> pix_op_chr_fpos_1:
  7504                              <1> 	; 18/02/2021
  7505                              <1> 	; scale > 1
  7506 0000EB3D 88F5                <1> 	mov	ch, dh ; 16 or 8
  7507 0000EB3F BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK
  7508 0000EB44 89FE                <1> 	mov	esi, edi
  7509 0000EB46 FECC                <1> 	dec	ah
  7510 0000EB48 7522                <1> 	jnz	short pix_op_chr_fpos_5 ; scale > 2
  7511                              <1> 	; scale = 2
  7512                              <1> pix_op_chr_fpos_2:
  7513 0000EB4A B108                <1> 	mov	cl, 8
  7514 0000EB4C 8A13                <1> 	mov	dl, [ebx]
  7515                              <1> pix_op_chr_fpos_3:
  7516                              <1> 	;shl 	ax, 2
  7517                              <1> 	; 23/07/2022
  7518 0000EB4E C1E002              <1> 	shl	eax, 2
  7519 0000EB51 D0E2                <1> 	shl	dl, 1
  7520 0000EB53 7302                <1> 	jnc	short pix_op_chr_fpos_4
  7521 0000EB55 0C03                <1> 	or	al, 3
  7522                              <1> pix_op_chr_fpos_4:
  7523 0000EB57 FEC9                <1> 	dec	cl
  7524 0000EB59 75F3                <1> 	jnz	short pix_op_chr_fpos_3
  7525 0000EB5B 66AB                <1> 	stosw
  7526                              <1> 	; 18/02/2021
  7527 0000EB5D 66AB                <1> 	stosw
  7528 0000EB5F 43                  <1> 	inc	ebx
  7529 0000EB60 FECD                <1> 	dec	ch
  7530 0000EB62 75E6                <1> 	jnz	short pix_op_chr_fpos_2
  7531                              <1> 	; scale = 2
  7532 0000EB64 88F1                <1> 	mov	cl, dh ; 16 or 8 (height/rows)
  7533 0000EB66 D0E1                <1> 	shl	cl, 1  ; 32 or 16 rows
  7534 0000EB68 B610                <1> 	mov	dh, 16 ; columns (width)
  7535 0000EB6A EB5D                <1> 	jmp	short pix_op_chr_f2p
  7536                              <1> pix_op_chr_fpos_5:
  7537 0000EB6C FECC                <1> 	dec	ah
  7538 0000EB6E 7538                <1> 	jnz	short pix_op_chr_fpos_9 ; scale = 4
  7539                              <1> 	; scale = 3
  7540                              <1> pix_op_chr_fpos_6:
  7541 0000EB70 B108                <1> 	mov	cl, 8
  7542 0000EB72 8A13                <1> 	mov	dl, [ebx]
  7543                              <1> pix_op_chr_fpos_7:
  7544 0000EB74 C1E003              <1> 	shl 	eax, 3
  7545 0000EB77 D0E2                <1> 	shl	dl, 1 ; 18/02/2021
  7546 0000EB79 7302                <1> 	jnc	short pix_op_chr_fpos_8
  7547 0000EB7B 0C07                <1> 	or	al, 7
  7548                              <1> pix_op_chr_fpos_8:
  7549 0000EB7D FEC9                <1> 	dec	cl
  7550 0000EB7F 75F3                <1> 	jnz	short pix_op_chr_fpos_7
  7551 0000EB81 66AB                <1> 	stosw
  7552                              <1> 	; 18/02/2021
  7553 0000EB83 C1C810              <1> 	ror	eax, 16
  7554 0000EB86 AA                  <1> 	stosb
  7555 0000EB87 C1C010              <1> 	rol	eax, 16
  7556 0000EB8A 66AB                <1> 	stosw
  7557 0000EB8C C1C810              <1> 	ror	eax, 16
  7558 0000EB8F AA                  <1> 	stosb
  7559 0000EB90 C1C010              <1> 	rol	eax, 16
  7560 0000EB93 66AB                <1> 	stosw
  7561 0000EB95 C1E810              <1> 	shr	eax, 16 ; 27/02/2021
  7562 0000EB98 AA                  <1> 	stosb
  7563 0000EB99 43                  <1> 	inc	ebx
  7564                              <1> 	; 18/02/2021
  7565 0000EB9A FECD                <1> 	dec	ch
  7566 0000EB9C 75D2                <1> 	jnz	short pix_op_chr_fpos_6
  7567                              <1> 	; scale = 3
  7568 0000EB9E 88F1                <1> 	mov	cl, dh ; 16 or 8 (height/rows)
  7569 0000EBA0 D0E1                <1> 	shl	cl, 1 
  7570 0000EBA2 00F1                <1> 	add	cl, dh ; 48 or 24 rows
  7571 0000EBA4 B618                <1> 	mov	dh, 24 ; columns (width)
  7572 0000EBA6 EB21                <1> 	jmp	short pix_op_chr_f2p
  7573                              <1> 
  7574                              <1> pix_op_chr_fpos_9:
  7575                              <1> 	; scale = 4
  7576 0000EBA8 B108                <1> 	mov	cl, 8
  7577 0000EBAA 8A13                <1> 	mov	dl, [ebx]
  7578                              <1> pix_op_chr_fpos_10:
  7579                              <1> 	; 18/02/2021
  7580 0000EBAC C1E004              <1> 	shl 	eax, 4
  7581 0000EBAF D0E2                <1> 	shl	dl, 1 ; 18/02/2021
  7582 0000EBB1 7302                <1> 	jnc	short pix_op_chr_fpos_11
  7583 0000EBB3 0C0F                <1> 	or	al, 0Fh ; or al, 15
  7584                              <1> pix_op_chr_fpos_11:
  7585 0000EBB5 FEC9                <1> 	dec	cl
  7586 0000EBB7 75F3                <1> 	jnz	short pix_op_chr_fpos_10
  7587 0000EBB9 AB                  <1> 	stosd
  7588                              <1> 	; 18/02/2021
  7589 0000EBBA AB                  <1> 	stosd
  7590 0000EBBB AB                  <1> 	stosd
  7591 0000EBBC AB                  <1> 	stosd
  7592 0000EBBD 43                  <1> 	inc	ebx
  7593 0000EBBE FECD                <1> 	dec	ch
  7594 0000EBC0 75E6                <1> 	jnz	short pix_op_chr_fpos_9
  7595                              <1> 	; scale = 4
  7596 0000EBC2 88F1                <1> 	mov	cl, dh ; 16 or 8 (height/rows)
  7597 0000EBC4 C0E102              <1> 	shl	cl, 2 ; 64 or 32 rows
  7598 0000EBC7 B620                <1> 	mov	dh, 32 ; columns (width)
  7599                              <1> 	;jmp	short pix_op_chr_f2p
  7600                              <1>  	
  7601                              <1> pix_op_chr_f2p:
  7602                              <1> 	; write font pixels
  7603 0000EBC9 8B3D[DAA30100]      <1> 	mov	edi, [v_str]
  7604                              <1> 	; 15/02/2021
  7605                              <1> pix_op_chr_f2p_next:
  7606 0000EBCF 80FE08              <1> 	cmp	dh, 8
  7607 0000EBD2 7706                <1> 	ja	short pix_op_chr_f2p_24
  7608                              <1> pix_op_chr_f2p_8:
  7609 0000EBD4 AC                  <1> 	lodsb
  7610 0000EBD5 C1E018              <1> 	shl	eax, 24 ; 15/02/2021
  7611 0000EBD8 EB16                <1> 	jmp	short pix_op_chr_f2p_0
  7612                              <1> pix_op_chr_f2p_24:
  7613 0000EBDA 80FE18              <1> 	cmp	dh, 24
  7614 0000EBDD 7710                <1> 	ja	short pix_op_chr_f2p_32
  7615 0000EBDF 7207                <1> 	jb	short pix_op_chr_f2p_16
  7616                              <1> 	; 27/02/2021
  7617                              <1> 	;mov	eax, [esi]
  7618 0000EBE1 AD                  <1> 	lodsd
  7619 0000EBE2 C1E008              <1> 	shl	eax, 8
  7620                              <1> 	;add	esi, 3
  7621 0000EBE5 4E                  <1> 	dec	esi
  7622 0000EBE6 EB08                <1> 	jmp	short pix_op_chr_f2p_0
  7623                              <1> pix_op_chr_f2p_16:
  7624 0000EBE8 66AD                <1> 	lodsw
  7625 0000EBEA C1E010              <1> 	shl	eax, 16 ; 15/02/2021
  7626 0000EBED EB01                <1> 	jmp	short pix_op_chr_f2p_0
  7627                              <1> pix_op_chr_f2p_32:
  7628 0000EBEF AD                  <1> 	lodsd
  7629                              <1> pix_op_chr_f2p_0:
  7630                              <1> 	; EAX = font row (8,16,24,32 pixels)
  7631                              <1> 	;	(bits are shifted to left)
  7632                              <1> 	; CL = rows
  7633                              <1> 	; DH = bits per row (8,16,24,32)
  7634 0000EBF0 8B1D[EAA30100]      <1> 	mov	ebx, [buffer8] ; start column
  7635 0000EBF6 57                  <1> 	push	edi ; *
  7636 0000EBF7 52                  <1> 	push	edx ; **
  7637                              <1> pix_op_chr_f2p_1:
  7638 0000EBF8 E82E000000          <1> 	call	pix_op_chr_w_pixel
  7639                              <1> pix_op_chr_f2p_2:
  7640 0000EBFD 663B1D[CEA30100]    <1> 	cmp	bx, [v_width] ; current column
  7641 0000EC04 7304                <1> 	jnb	short pix_op_chr_f2p_3
  7642 0000EC06 FECE                <1> 	dec	dh
  7643 0000EC08 75EE                <1> 	jnz	short pix_op_chr_f2p_1 ; next bit
  7644                              <1> pix_op_chr_f2p_3:
  7645                              <1> 	;mov	ebx, [buffer8]
  7646 0000EC0A 5A                  <1> 	pop	edx ; **
  7647 0000EC0B 58                  <1> 	pop	eax ; *
  7648 0000EC0C 3B3D[DEA30100]      <1> 	cmp	edi, [v_end]
  7649 0000EC12 7316                <1> 	jnb	short pix_op_chr_f2p_4
  7650 0000EC14 FEC9                <1> 	dec	cl
  7651 0000EC16 7412                <1> 	jz	short pix_op_chr_f2p_4
  7652                              <1> 	; 27/02/2021
  7653 0000EC18 89C7                <1> 	mov	edi, eax
  7654 0000EC1A 0FB705[CEA30100]    <1> 	movzx	eax, word [v_width]
  7655 0000EC21 E85BF0FFFF          <1> 	call	pixels_to_byte_count
  7656 0000EC26 01C7                <1> 	add	edi, eax ; next position
  7657 0000EC28 EBA5                <1> 	jmp	short pix_op_chr_f2p_next
  7658                              <1> pix_op_chr_f2p_4:
  7659 0000EC2A C3                  <1> 	retn
  7660                              <1> 
  7661                              <1> pix_op_chr_w_pixel:
  7662                              <1> 	; 15/02/2021
  7663 0000EC2B 89C5                <1> 	mov	ebp, eax
  7664 0000EC2D A1[E2A30100]        <1> 	mov	eax, [maskcolor]
  7665 0000EC32 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  7666 0000EC39 7711                <1> 	ja	short pix_op_chr_wp_2
  7667                              <1> 	; 256 colors (1 byte per pixel)
  7668 0000EC3B D1E5                <1> 	shl	ebp, 1
  7669 0000EC3D 7302                <1> 	jnc	short pix_op_chr_wp_0
  7670 0000EC3F 8807                <1> 	mov	[edi], al
  7671                              <1> pix_op_chr_wp_0:
  7672 0000EC41 47                  <1> 	inc	edi
  7673 0000EC42 FF05[AC940100]      <1> 	inc	dword [u.r0] ; +1
  7674                              <1> pix_op_chr_wp_1:
  7675 0000EC48 43                  <1> 	inc	ebx
  7676 0000EC49 89E8                <1> 	mov	eax, ebp
  7677 0000EC4B C3                  <1> 	retn
  7678                              <1> pix_op_chr_wp_2:
  7679 0000EC4C 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  7680 0000EC53 772E                <1> 	ja	short pix_op_chr_wp_6 ; 32bpp
  7681 0000EC55 721C                <1> 	jb	short pix_op_chr_wp_4 ; 16bpp
  7682                              <1> 	; 24 bit true colors
  7683                              <1> 	; * 3
  7684 0000EC57 D1E5                <1> 	shl	ebp, 1
  7685 0000EC59 7309                <1> 	jnc	short pix_op_chr_wp_3
  7686 0000EC5B 668907              <1> 	mov	[edi], ax
  7687 0000EC5E C1E810              <1> 	shr	eax, 16
  7688 0000EC61 884702              <1> 	mov	[edi+2], al
  7689                              <1> pix_op_chr_wp_3:
  7690 0000EC64 B803000000          <1> 	mov	eax, 3 ; 27/02/2021
  7691 0000EC69 01C7                <1> 	add	edi, eax  ; add edi, 3
  7692 0000EC6B 0105[AC940100]      <1> 	add	[u.r0], eax ; +3
  7693                              <1> 	
  7694 0000EC71 EBD5                <1> 	jmp	short pix_op_chr_wp_1
  7695                              <1> 
  7696                              <1> pix_op_chr_wp_4:
  7697                              <1> 	; 16 bit (65536) colors
  7698 0000EC73 D1E5                <1> 	shl	ebp, 1
  7699 0000EC75 7303                <1> 	jnc	short pix_op_chr_wp_5
  7700 0000EC77 668907              <1> 	mov	[edi], ax
  7701                              <1> pix_op_chr_wp_5:
  7702 0000EC7A 47                  <1> 	inc	edi
  7703 0000EC7B FF05[AC940100]      <1> 	inc	dword [u.r0] ; +1 
  7704 0000EC81 EBBE                <1> 	jmp	short pix_op_chr_wp_0
  7705                              <1> 
  7706                              <1> pix_op_chr_wp_6:
  7707                              <1> 	; 32 bit true colors
  7708 0000EC83 D1E5                <1> 	shl	ebp, 1
  7709 0000EC85 7302                <1> 	jnc	short pix_op_chr_wp_7
  7710 0000EC87 8907                <1> 	mov	[edi], eax
  7711                              <1> pix_op_chr_wp_7:
  7712 0000EC89 31C0                <1> 	xor	eax, eax
  7713 0000EC8B B004                <1> 	mov	al, 4
  7714 0000EC8D 01C7                <1> 	add	edi, eax ; add edi, 4
  7715 0000EC8F 0105[AC940100]      <1> 	add	[u.r0], eax ; +4
  7716 0000EC95 EBB1                <1> 	jmp	short pix_op_chr_wp_1
  7717                              <1> 
  7718                              <1> m_pix_op_cpy:
  7719                              <1> 	; 26/02/2021
  7720                              <1> 	; 06/02/2021
  7721                              <1> 	; MASKED COPY PIXELS (full screen)
  7722                              <1> 	;
  7723                              <1> 	; jump from pix_op_cpy
  7724                              <1> 	;
  7725                              <1> 	; INPUT:
  7726                              <1> 	;   ecx = transfer count (bytes)
  7727                              <1> 	;   edi = [v_mem] = start address of LFB 
  7728                              <1> 	;   esi = user's buffer address (virtual)
  7729                              <1> 	;
  7730                              <1> 	; OUTPUT:
  7731                              <1> 	;   [u.r0] will be > 0 if succesful
  7732                              <1> 
  7733                              <1> 	; Full screen masked copy
  7734                              <1> 
  7735                              <1> 	; Modified regs: eax, ebx, edx, esi, edi, ecx
  7736                              <1> 
  7737                              <1> m_pix_op_cpy_0:
  7738                              <1> 	;push	ebx ; *** ; 26/02/2021
  7739 0000EC97 57                  <1> 	push	edi ; **
  7740 0000EC98 51                  <1> 	push	ecx ; *
  7741 0000EC99 81F9F8070000        <1> 	cmp	ecx, 2040 ; (3*680) ; 26/02/2021
  7742 0000EC9F 7605                <1> 	jna	short m_pix_op_cpy_1
  7743 0000ECA1 B9F8070000          <1> 	mov	ecx, 2040
  7744                              <1> m_pix_op_cpy_1:
  7745 0000ECA6 BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK ; temporary buff
  7746 0000ECAB E84A230000          <1> 	call	transfer_from_user_buffer
  7747 0000ECB0 726C                <1> 	jc	short m_pix_op_cpy_3
  7748 0000ECB2 01CE                <1> 	add	esi, ecx
  7749 0000ECB4 89F5                <1> 	mov	ebp, esi  ; save user's buffer address
  7750 0000ECB6 89FE                <1> 	mov	esi, edi
  7751 0000ECB8 89CB                <1> 	mov	ebx, ecx
  7752 0000ECBA 59                  <1> 	pop	ecx ; *
  7753 0000ECBB 29D9                <1> 	sub	ecx, ebx
  7754 0000ECBD 5F                  <1> 	pop	edi ; **
  7755 0000ECBE 31D2                <1> 	xor	edx, edx ; 26/02/2021
  7756 0000ECC0 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8
  7757 0000ECC7 7435                <1> 	je	short m_pix_op_cpy_1_8
  7758 0000ECC9 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24
  7759 0000ECD0 776D                <1> 	ja	short m_pix_op_cpy_1_32
  7760 0000ECD2 724D                <1> 	jb	short m_pix_op_cpy_1_16
  7761                              <1> m_pix_op_cpy_1_24:
  7762                              <1> 	; 24 bit masked copy
  7763                              <1> 	;mov	edx, 3
  7764 0000ECD4 B203                <1> 	mov	dl, 3 ; 26/02/2021
  7765                              <1> m_pix_op_cpy_1_24_0:
  7766 0000ECD6 66AD                <1> 	lodsw
  7767 0000ECD8 C1E010              <1> 	shl	eax, 16
  7768 0000ECDB AC                  <1> 	lodsb
  7769 0000ECDC C1C010              <1> 	rol	eax, 16
  7770 0000ECDF 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  7771 0000ECE5 740F                <1> 	je	short m_pix_op_cpy_1_24_1 ; exclude
  7772 0000ECE7 668907              <1> 	mov	[edi], ax
  7773 0000ECEA C1E810              <1> 	shr	eax, 16
  7774 0000ECED 884702              <1> 	mov	[edi+2], al
  7775 0000ECF0 0115[AC940100]      <1> 	add	[u.r0], edx ; +3
  7776                              <1> m_pix_op_cpy_1_24_1:
  7777 0000ECF6 01D7                <1> 	add	edi, edx ; +3
  7778 0000ECF8 29D3                <1> 	sub	ebx, edx ; sub ebx, 3
  7779 0000ECFA 77DA                <1> 	ja	short m_pix_op_cpy_1_24_0
  7780 0000ECFC EB15                <1>  	jmp	short m_pix_op_cpy_2
  7781                              <1> 
  7782                              <1> m_pix_op_cpy_1_8:
  7783                              <1> 	; 8 bit masked copy
  7784 0000ECFE AC                  <1> 	lodsb
  7785 0000ECFF 3A05[E2A30100]      <1> 	cmp	al, [maskcolor]
  7786 0000ED05 7408                <1> 	je	short m_pix_op_cpy_1_8_1 ; exclude
  7787 0000ED07 8807                <1> 	mov	[edi], al
  7788 0000ED09 FF05[AC940100]      <1> 	inc	dword [u.r0] ; +1
  7789                              <1> m_pix_op_cpy_1_8_1:
  7790 0000ED0F 47                  <1> 	inc	edi ; +1
  7791 0000ED10 4B                  <1> 	dec	ebx
  7792 0000ED11 75EB                <1> 	jnz	short m_pix_op_cpy_1_8
  7793                              <1> m_pix_op_cpy_2:
  7794 0000ED13 89EE                <1> 	mov	esi, ebp ; restore user's buffer addr
  7795 0000ED15 09C9                <1> 	or	ecx, ecx
  7796                              <1> 	; 26/02/2021
  7797 0000ED17 7407                <1> 	jz	short m_pix_of_cpy_4
  7798 0000ED19 E979FFFFFF          <1> 	jmp	m_pix_op_cpy_0
  7799                              <1> m_pix_op_cpy_3:
  7800 0000ED1E 59                  <1> 	pop	ecx ; *
  7801 0000ED1F 5F                  <1> 	pop	edi ; **
  7802                              <1> m_pix_of_cpy_4:
  7803                              <1> 	;pop	ebx ; *** ; 26/02/2021
  7804 0000ED20 C3                  <1> 	retn
  7805                              <1> 
  7806                              <1> m_pix_op_cpy_1_16:
  7807                              <1> 	; 16 bit masked copy
  7808                              <1> 	;mov	edx, 2
  7809 0000ED21 B202                <1> 	mov	dl, 2 ; 26/02/2021
  7810                              <1> m_pix_op_cpy_1_16_0:
  7811 0000ED23 66AD                <1> 	lodsw
  7812 0000ED25 663B05[E2A30100]    <1> 	cmp	ax, [maskcolor]
  7813 0000ED2C 7409                <1> 	je	short m_pix_op_cpy_1_16_1 ; exclude
  7814 0000ED2E 668907              <1> 	mov	[edi], ax
  7815 0000ED31 0115[AC940100]      <1> 	add	[u.r0], edx ; +2
  7816                              <1> m_pix_op_cpy_1_16_1:
  7817 0000ED37 01D7                <1> 	add	edi, edx ; +2
  7818 0000ED39 29D3                <1> 	sub	ebx, edx ; sub ebx, 2
  7819 0000ED3B 77E6                <1> 	ja	short m_pix_op_cpy_1_16_0
  7820 0000ED3D EBD4                <1>  	jmp	short m_pix_op_cpy_2
  7821                              <1> 
  7822                              <1> m_pix_op_cpy_1_32:
  7823                              <1> 	; 32 bit masked copy
  7824                              <1> 	;mov	edx, 4
  7825 0000ED3F B204                <1> 	mov	dl, 4 ; 26/02/2021
  7826                              <1> m_pix_op_cpy_1_32_0:
  7827 0000ED41 AD                  <1> 	lodsd
  7828 0000ED42 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  7829 0000ED48 7408                <1> 	je	short m_pix_op_cpy_1_32_1 ; exclude
  7830 0000ED4A 8907                <1> 	mov	[edi], eax
  7831 0000ED4C 0115[AC940100]      <1> 	add	[u.r0], edx ; +4
  7832                              <1> m_pix_op_cpy_1_32_1:
  7833 0000ED52 01D7                <1> 	add	edi, edx ; +4
  7834 0000ED54 29D3                <1> 	sub	ebx, edx ; sub ebx, 4
  7835 0000ED56 77E9                <1> 	ja	short m_pix_op_cpy_1_32_0
  7836 0000ED58 EBB9                <1>  	jmp	short m_pix_op_cpy_2
  7837                              <1> 
  7838                              <1> m_pix_op_cpy_w:
  7839                              <1> 	; 26/02/2021
  7840                              <1> 	; 06/02/2021
  7841                              <1> 	; MASKED COPY PIXELS (window)
  7842                              <1> 	;
  7843                              <1> 	; jump from pix_op_cpy_w
  7844                              <1> 	;
  7845                              <1> 	; INPUT:
  7846                              <1> 	;   ecx = bytes per row (to be applied)
  7847                              <1> 	;   edx = screen width in bytes
  7848                              <1> 	;   ebx = row count
  7849                              <1> 	;   esi = user's buffer address
  7850                              <1> 	;   [v_str] = window start address
  7851                              <1> 	;
  7852                              <1> 	; OUTPUT:
  7853                              <1> 	;   [u.r0] will be > 0 if succesful
  7854                              <1> 
  7855                              <1> 	; Window masked copy
  7856                              <1> 
  7857                              <1> m_pix_op_cpy_w_0:
  7858 0000ED5A 8B3D[DAA30100]      <1> 	mov	edi, [v_str]
  7859                              <1> m_pix_op_cpy_w_1:
  7860 0000ED60 57                  <1> 	push	edi
  7861 0000ED61 56                  <1> 	push	esi
  7862 0000ED62 53                  <1> 	push	ebx
  7863 0000ED63 52                  <1> 	push	edx
  7864 0000ED64 51                  <1> 	push	ecx
  7865 0000ED65 E82DFFFFFF          <1> 	call	m_pix_op_cpy ; 26/02/2021
  7866 0000ED6A 59                  <1> 	pop	ecx
  7867 0000ED6B 5A                  <1> 	pop	edx
  7868 0000ED6C 5B                  <1> 	pop	ebx
  7869 0000ED6D 5E                  <1> 	pop	esi
  7870 0000ED6E 5F                  <1> 	pop	edi
  7871 0000ED6F 7209                <1> 	jc	short m_pix_op_cpy_w_2
  7872 0000ED71 4B                  <1> 	dec	ebx
  7873 0000ED72 7406                <1> 	jz	short m_pix_op_cpy_w_2 ; ok.
  7874                              <1> 	; next row
  7875 0000ED74 01CE                <1> 	add	esi, ecx ; next row in user's buffer
  7876 0000ED76 01D7                <1> 	add	edi, edx ; next row of window (system)
  7877 0000ED78 EBE6                <1> 	jmp	short m_pix_op_cpy_w_1
  7878                              <1> m_pix_op_cpy_w_2:
  7879 0000ED7A C3                  <1> 	retn
  7880                              <1> 
  7881                              <1> m_pix_op_new:
  7882                              <1> 	; 06/02/2021
  7883                              <1> 	; CHANGE COLOR (MASKED, full screen)
  7884                              <1> 	;
  7885                              <1> 	; jump from pix_op_new
  7886                              <1> 	;
  7887                              <1> 	; INPUT:
  7888                              <1> 	;   eax = color (AL, AX, EAX)
  7889                              <1> 	;   ecx = [v_siz] ; display page pixel count
  7890                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  7891                              <1> 	;
  7892                              <1> 	;   [maskcolor] = mask color (to be excluded)
  7893                              <1> 	;
  7894                              <1> 	; OUTPUT:
  7895                              <1> 	; 	[u.r0] will be > 0 if succesful
  7896                              <1> 
  7897                              <1> 	; Full screen
  7898                              <1> m_pix_op_new_0:
  7899 0000ED7B 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  7900 0000ED82 7717                <1> 	ja	short m_pix_op_new_1
  7901                              <1> 	; 256 colors (8bpp)
  7902                              <1> 	;jmp	short m_pix_op_new_8
  7903                              <1> m_pix_op_new_8:
  7904                              <1> 	; 8 bit colors (256 colors)
  7905 0000ED84 88C2                <1> 	mov	dl, al ; new color
  7906                              <1> m_pix_op_new_8_0:
  7907 0000ED86 AC                  <1> 	lodsb 
  7908 0000ED87 3A05[E2A30100]      <1> 	cmp	al, [maskcolor]
  7909 0000ED8D 7408                <1> 	je	short m_pix_op_new_8_1 ; exclude
  7910 0000ED8F 8817                <1> 	mov	[edi], dl
  7911 0000ED91 FF05[AC940100]      <1> 	inc	dword [u.r0]
  7912                              <1> m_pix_op_new_8_1:
  7913 0000ED97 47                  <1> 	inc	edi
  7914 0000ED98 E2EC                <1> 	loop	m_pix_op_new_8_0
  7915 0000ED9A C3                  <1> 	retn
  7916                              <1> m_pix_op_new_1:
  7917 0000ED9B 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  7918 0000EDA2 774B                <1> 	ja	short m_pix_op_new_3 ; 32bpp
  7919 0000EDA4 722C                <1> 	jb	short m_pix_op_new_2 ; 16bpp
  7920                              <1> 	; 24 bit true colors
  7921                              <1> 	;jmp	short m_pix_op_new_24
  7922                              <1> m_pix_op_new_24:
  7923                              <1> 	; 24 bit true colors
  7924 0000EDA6 89C2                <1> 	mov	edx, eax ; new color
  7925                              <1> m_pix_op_new_24_0:
  7926 0000EDA8 66AD                <1> 	lodsw
  7927 0000EDAA C1E010              <1> 	shl	eax, 16
  7928 0000EDAD AC                  <1> 	lodsb
  7929 0000EDAE C1C010              <1> 	rol	eax, 16	
  7930 0000EDB1 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  7931 0000EDB7 7413                <1> 	je	short m_pix_op_new_24_1 ; exclude
  7932 0000EDB9 668917              <1> 	mov	[edi], dx
  7933 0000EDBC C1CA10              <1> 	ror	edx, 16
  7934 0000EDBF 885702              <1> 	mov	[edi+2], dl
  7935 0000EDC2 C1C210              <1> 	rol	edx, 16
  7936 0000EDC5 8305[AC940100]03    <1> 	add	dword [u.r0], 3
  7937                              <1> m_pix_op_new_24_1:
  7938 0000EDCC 83C703              <1> 	add	edi, 3
  7939 0000EDCF E2D7                <1> 	loop	m_pix_op_new_24_0
  7940 0000EDD1 C3                  <1> 	retn
  7941                              <1> 	; 65536 colors (16bpp)
  7942                              <1> m_pix_op_new_2:
  7943                              <1> 	;jmp	short m_pix_op_new_16
  7944                              <1> m_pix_op_new_16:
  7945                              <1> 	; 16 bit colors (65536 colors)
  7946 0000EDD2 89C2                <1> 	mov	edx, eax ; new color
  7947                              <1> m_pix_op_new_16_0:
  7948 0000EDD4 66AD                <1> 	lodsw
  7949 0000EDD6 663B05[E2A30100]    <1> 	cmp	ax, [maskcolor]
  7950 0000EDDD 740A                <1> 	je	short m_pix_op_new_16_1 ; exclude
  7951 0000EDDF 668917              <1> 	mov	[edi], dx
  7952 0000EDE2 8305[AC940100]02    <1> 	add	dword [u.r0], 2
  7953                              <1> m_pix_op_new_16_1:
  7954 0000EDE9 83C702              <1> 	add	edi, 2
  7955 0000EDEC E2E6                <1> 	loop	m_pix_op_new_16_0
  7956 0000EDEE C3                  <1> 	retn
  7957                              <1> m_pix_op_new_3:
  7958                              <1> 	; 32 bit true colors
  7959                              <1> 	;jmp	short m_pix_op_new_32
  7960                              <1> m_pix_op_new_32:
  7961                              <1> 	; 32 bit true colors
  7962 0000EDEF 89C2                <1> 	mov	edx, eax ; new color
  7963                              <1> m_pix_op_new_32_0:
  7964 0000EDF1 AD                  <1> 	lodsd 
  7965 0000EDF2 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  7966 0000EDF8 7409                <1> 	je	short m_pix_op_new_32_1 ; exclude
  7967 0000EDFA 8917                <1> 	mov	[edi], edx
  7968 0000EDFC 8305[AC940100]04    <1> 	add	dword [u.r0], 4
  7969                              <1> m_pix_op_new_32_1:
  7970 0000EE03 83C704              <1> 	add	edi, 4
  7971 0000EE06 E2E9                <1> 	loop	m_pix_op_new_32_0
  7972 0000EE08 C3                  <1> 	retn
  7973                              <1> 
  7974                              <1> m_pix_op_new_w:
  7975                              <1> 	; 06/02/2021
  7976                              <1> 	; CHANGE COLOR (MASKED, window)
  7977                              <1> 	;
  7978                              <1> 	; jump from pix_op_new_w
  7979                              <1> 	;
  7980                              <1> 	; INPUT:
  7981                              <1> 	;   ecx = bytes per row (to be applied)
  7982                              <1> 	;   edx = screen width in bytes
  7983                              <1> 	;   ebx = row count
  7984                              <1> 	;   eax = color
  7985                              <1> 	;
  7986                              <1> 	;   [maskcolor] = mask color (to be excluded)
  7987                              <1> 	;
  7988                              <1> 	; OUTPUT:
  7989                              <1> 	; 	[u.r0] will be > 0 if succesful
  7990                              <1> 
  7991                              <1> 	; Window
  7992                              <1> 	;mov	edi, [v_str] ; LFB start address
  7993                              <1> 	;mov	esi, edi 
  7994                              <1> 
  7995 0000EE09 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  7996 0000EE10 7707                <1> 	ja	short m_pix_op_new_w_1
  7997                              <1> 
  7998                              <1> 	; 256 colors (8bpp)
  7999 0000EE12 BD[84ED0000]        <1> 	mov	ebp, m_pix_op_new_8
  8000 0000EE17 EB1E                <1> 	jmp	short m_pix_op_new_w_x
  8001                              <1> 
  8002                              <1> m_pix_op_new_w_1:
  8003 0000EE19 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8004 0000EE20 7710                <1> 	ja	short m_pix_op_new_w_3 ; 32bpp
  8005 0000EE22 7207                <1> 	jb	short m_pix_op_new_w_2 ; 16bpp
  8006                              <1> 
  8007                              <1> 	; 24 bit true colors
  8008 0000EE24 BD[A6ED0000]        <1> 	mov	ebp, m_pix_op_new_24
  8009 0000EE29 EB0C                <1> 	jmp	short m_pix_op_new_w_x
  8010                              <1> 
  8011                              <1> 	; 65536 colors (16bpp)
  8012                              <1> m_pix_op_new_w_2:
  8013 0000EE2B BD[D2ED0000]        <1> 	mov	ebp, m_pix_op_new_16
  8014 0000EE30 EB05                <1> 	jmp	short m_pix_op_new_w_x
  8015                              <1> 
  8016                              <1> 	; 32 bit true colors
  8017                              <1> m_pix_op_new_w_3:
  8018 0000EE32 BD[EFED0000]        <1> 	mov	ebp, m_pix_op_new_32
  8019                              <1> 	;jmp	short m_pix_op_new_w_x
  8020                              <1> 
  8021                              <1> m_pix_op_new_w_x:
  8022                              <1> m_pix_op_add_w_x:
  8023                              <1> m_pix_op_sub_w_x:
  8024                              <1> m_pix_op_mix_w_x:
  8025                              <1> m_pix_op_and_w_x:
  8026                              <1> m_pix_op_orc_w_x:
  8027                              <1> m_pix_op_xor_w_x:
  8028                              <1> m_pix_op_not_w_x:
  8029                              <1> m_pix_op_neg_w_x:
  8030                              <1> m_pix_op_inc_w_x:
  8031                              <1> m_pix_op_dec_w_x:
  8032                              <1> 	; 27/02/2021
  8033                              <1> 	; 26/02/2021
  8034                              <1> 	; 06/02/2021
  8035                              <1> 	; ecx = bytes per row (to be applied)
  8036                              <1> 	; edx = windows (screen) width in bytes
  8037                              <1> 	; ebx = row count
  8038                              <1> 	; eax = color
  8039                              <1> 	; ebp = pixel operation subroutine address
  8040                              <1> 	; edi = esi = window start address
  8041                              <1> 
  8042 0000EE37 8B3D[DAA30100]      <1> 	mov	edi, [v_str] ; LFB start address
  8043 0000EE3D 89FE                <1> 	mov	esi, edi
  8044                              <1> m_pix_op_w_x_next:
  8045 0000EE3F 52                  <1> 	push	edx
  8046 0000EE40 51                  <1> 	push	ecx
  8047 0000EE41 56                  <1> 	push	esi
  8048 0000EE42 57                  <1> 	push	edi
  8049 0000EE43 50                  <1> 	push	eax ; 26/02/2021
  8050 0000EE44 8B0D[E6A30100]      <1> 	mov	ecx, [pixcount] ; 27/02/2021
  8051 0000EE4A FFD5                <1> 	call	ebp ; call masked pixel-row operation
  8052 0000EE4C 58                  <1> 	pop	eax ; 26/02/2021
  8053 0000EE4D 5F                  <1> 	pop	edi
  8054 0000EE4E 5E                  <1> 	pop	esi
  8055 0000EE4F 59                  <1> 	pop	ecx
  8056 0000EE50 5A                  <1> 	pop	edx
  8057 0000EE51 01D6                <1> 	add	esi, edx ; next row
  8058 0000EE53 01D7                <1> 	add	edi, edx ; next row
  8059 0000EE55 4B                  <1> 	dec	ebx
  8060 0000EE56 75E7                <1> 	jnz	short m_pix_op_w_x_next
  8061 0000EE58 C3                  <1> 	retn
  8062                              <1> 
  8063                              <1> m_pix_op_add:
  8064                              <1> 	; 06/02/2021
  8065                              <1> 	; ADD COLOR (MASKED, full screen)
  8066                              <1> 	;
  8067                              <1> 	; jump from pix_op_add
  8068                              <1> 	;
  8069                              <1> 	; INPUT:
  8070                              <1> 	;   eax = color (AL, AX, EAX)
  8071                              <1> 	;   ecx = [v_siz] ; display page pixel count
  8072                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  8073                              <1> 	;
  8074                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8075                              <1> 	;
  8076                              <1> 	; OUTPUT:
  8077                              <1> 	; 	[u.r0] will be > 0 if succesful
  8078                              <1> 
  8079                              <1> 	; Full screen
  8080                              <1> m_pix_op_add_0:
  8081 0000EE59 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8082 0000EE60 771C                <1> 	ja	short m_pix_op_add_1
  8083                              <1> 	; 256 colors (8bpp)
  8084                              <1> 	;jmp	short m_pix_op_add_8
  8085                              <1> m_pix_op_add_8:
  8086                              <1> 	; 8 bit colors (256 colors)
  8087 0000EE62 88C2                <1> 	mov	dl, al ; new color
  8088                              <1> m_pix_op_add_8_0:
  8089 0000EE64 AC                  <1> 	lodsb 
  8090 0000EE65 3A05[E2A30100]      <1> 	cmp	al, [maskcolor]
  8091 0000EE6B 740D                <1> 	je	short m_pix_op_add_8_1 ; exclude
  8092 0000EE6D FF05[AC940100]      <1> 	inc	dword [u.r0] ; +1
  8093 0000EE73 0017                <1> 	add	[edi], dl
  8094 0000EE75 7303                <1> 	jnc	short m_pix_op_add_8_1
  8095 0000EE77 C607FF              <1> 	mov	byte [edi], 0FFh 
  8096                              <1> m_pix_op_add_8_1:
  8097 0000EE7A 47                  <1> 	inc	edi
  8098 0000EE7B E2E7                <1> 	loop	m_pix_op_add_8_0
  8099 0000EE7D C3                  <1> 	retn
  8100                              <1> m_pix_op_add_1:
  8101 0000EE7E 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8102 0000EE85 775E                <1> 	ja	short m_pix_op_add_3 ; 32bpp
  8103 0000EE87 7238                <1> 	jb	short m_pix_op_add_2 ; 16bpp
  8104                              <1> 	; 24 bit true colors
  8105                              <1> 	;jmp	short m_pix_op_add_24
  8106                              <1> m_pix_op_add_24:
  8107                              <1> 	; 24 bit true colors
  8108 0000EE89 89C2                <1> 	mov	edx, eax ; new color
  8109 0000EE8B 81CA000000FF        <1> 	or	edx, 0FF000000h
  8110                              <1> m_pix_op_add_24_0:
  8111 0000EE91 66AD                <1> 	lodsw
  8112 0000EE93 C1E010              <1> 	shl	eax, 16
  8113 0000EE96 AC                  <1> 	lodsb
  8114 0000EE97 C1C010              <1> 	rol	eax, 16	
  8115 0000EE9A 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  8116 0000EEA0 7419                <1> 	je	short m_pix_op_add_24_2 ; exclude
  8117 0000EEA2 8305[AC940100]03    <1> 	add	dword [u.r0], 3 ; +3
  8118 0000EEA9 01D0                <1> 	add	eax, edx
  8119 0000EEAB 7305                <1> 	jnc	short m_pix_op_add_24_1
  8120 0000EEAD B8FFFFFF00          <1> 	mov	eax, 0FFFFFFh
  8121                              <1> m_pix_op_add_24_1:	
  8122 0000EEB2 668907              <1> 	mov	[edi], ax
  8123 0000EEB5 C1E810              <1> 	shr	eax, 16
  8124 0000EEB8 884702              <1> 	mov	[edi+2], al
  8125                              <1> m_pix_op_add_24_2:
  8126 0000EEBB 83C703              <1> 	add	edi, 3 ; +3
  8127 0000EEBE E2D1                <1> 	loop	m_pix_op_add_24_0
  8128 0000EEC0 C3                  <1> 	retn
  8129                              <1> 	; 65536 colors (16bpp)
  8130                              <1> m_pix_op_add_2:
  8131                              <1> 	;jmp	short m_pix_op_add_16
  8132                              <1> m_pix_op_add_16:
  8133                              <1> 	; 16 bit colors (65536 colors)
  8134 0000EEC1 89C2                <1> 	mov	edx, eax ; new color
  8135                              <1> m_pix_op_add_16_0:
  8136 0000EEC3 66AD                <1> 	lodsw
  8137 0000EEC5 663B05[E2A30100]    <1> 	cmp	ax, [maskcolor]
  8138 0000EECC 7411                <1> 	je	short m_pix_op_add_16_1 ; exclude
  8139 0000EECE 8305[AC940100]02    <1> 	add	dword [u.r0], 2 ; +2
  8140 0000EED5 660117              <1> 	add	[edi], dx
  8141 0000EED8 7305                <1> 	jnc	short m_pix_op_add_16_1
  8142 0000EEDA 66C707FFFF          <1> 	mov	word [edi], 0FFFFh
  8143                              <1> m_pix_op_add_16_1:
  8144 0000EEDF 83C702              <1> 	add	edi, 2 ; +2
  8145 0000EEE2 E2DF                <1> 	loop	m_pix_op_add_16_0
  8146 0000EEE4 C3                  <1> 	retn
  8147                              <1> m_pix_op_add_3:
  8148                              <1> 	; 32 bit true colors
  8149                              <1> 	;jmp	short m_pix_op_add_32
  8150                              <1> m_pix_op_add_32:
  8151                              <1> 	; 32 bit true colors
  8152 0000EEE5 89C2                <1> 	mov	edx, eax ; new color
  8153                              <1> m_pix_op_add_32_0:
  8154 0000EEE7 AD                  <1> 	lodsd
  8155 0000EEE8 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  8156 0000EEEE 7411                <1> 	je	short m_pix_op_add_32_1 ; exclude
  8157 0000EEF0 8305[AC940100]04    <1> 	add	dword [u.r0], 4 ; +4
  8158 0000EEF7 0117                <1> 	add	[edi], edx
  8159 0000EEF9 7306                <1> 	jnc	short m_pix_op_add_32_1
  8160 0000EEFB C707FFFFFFFF        <1> 	mov	dword [edi], 0FFFFFFFFh
  8161                              <1> m_pix_op_add_32_1:
  8162 0000EF01 83C704              <1> 	add	edi, 4 ; +4
  8163 0000EF04 E2E1                <1> 	loop	m_pix_op_add_32_0
  8164 0000EF06 C3                  <1> 	retn
  8165                              <1> 
  8166                              <1> m_pix_op_add_w:
  8167                              <1> 	; 06/02/2021
  8168                              <1> 	; ADD COLOR (MASKED, window)
  8169                              <1> 	;
  8170                              <1> 	; jump from pix_op_add_w
  8171                              <1> 	;
  8172                              <1> 	; INPUT:
  8173                              <1> 	;   ecx = bytes per row (to be applied)
  8174                              <1> 	;   edx = screen width in bytes
  8175                              <1> 	;   ebx = row count
  8176                              <1> 	;   eax = color
  8177                              <1> 	;
  8178                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8179                              <1> 	;
  8180                              <1> 	; OUTPUT:
  8181                              <1> 	; 	[u.r0] will be > 0 if succesful
  8182                              <1> 
  8183                              <1> 	; window
  8184                              <1> 	;mov	edi, [v_str] ; LFB start address
  8185                              <1> 	;mov	esi, edi 
  8186                              <1> 
  8187 0000EF07 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8188 0000EF0E 7707                <1> 	ja	short m_pix_op_add_w_1
  8189                              <1> 
  8190                              <1> 	; 256 colors (8bpp)
  8191 0000EF10 BD[62EE0000]        <1> 	mov	ebp, m_pix_op_add_8
  8192 0000EF15 EB1E                <1> 	jmp	short m_pix_op_add_w_4
  8193                              <1> 
  8194                              <1> m_pix_op_add_w_1:
  8195 0000EF17 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8196 0000EF1E 7710                <1> 	ja	short m_pix_op_add_w_3 ; 32bpp
  8197 0000EF20 7207                <1> 	jb	short m_pix_op_add_w_2 ; 16bpp
  8198                              <1> 
  8199                              <1> 	; 24 bit true colors
  8200 0000EF22 BD[89EE0000]        <1> 	mov	ebp, m_pix_op_add_24
  8201 0000EF27 EB0C                <1> 	jmp	short m_pix_op_add_w_4
  8202                              <1> 
  8203                              <1> 	; 65536 colors (16bpp)
  8204                              <1> m_pix_op_add_w_2:
  8205 0000EF29 BD[C1EE0000]        <1> 	mov	ebp, m_pix_op_add_16
  8206 0000EF2E EB05                <1> 	jmp	short m_pix_op_add_w_4
  8207                              <1> 
  8208                              <1> 	; 32 bit true colors
  8209                              <1> m_pix_op_add_w_3:
  8210 0000EF30 BD[E5EE0000]        <1> 	mov	ebp, m_pix_op_add_32
  8211                              <1> m_pix_op_add_w_4:
  8212 0000EF35 E9FDFEFFFF          <1> 	jmp	m_pix_op_add_w_x
  8213                              <1> 
  8214                              <1> m_pix_op_sub:
  8215                              <1> 	; 02/03/2021
  8216                              <1> 	; 06/02/2021
  8217                              <1> 	; SUBTRACT COLOR (MASKED, full screen)
  8218                              <1> 	;
  8219                              <1> 	; jump from pix_op_sub
  8220                              <1> 	;
  8221                              <1> 	; INPUT:
  8222                              <1> 	;   eax = color (AL, AX, EAX)
  8223                              <1> 	;   ecx = [v_siz] ; display page pixel count
  8224                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  8225                              <1> 	;
  8226                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8227                              <1> 	;
  8228                              <1> 	; OUTPUT:
  8229                              <1> 	; 	[u.r0] will be > 0 if succesful
  8230                              <1> 
  8231                              <1> 	; Full screen
  8232                              <1> m_pix_op_sub_0:
  8233 0000EF3A 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8234 0000EF41 771C                <1> 	ja	short m_pix_op_sub_1
  8235                              <1> 	; 256 colors (8bpp)
  8236                              <1> 	;jmp	short m_pix_op_sub_8
  8237                              <1> m_pix_op_sub_8:
  8238                              <1> 	; 8 bit colors (256 colors)
  8239 0000EF43 88C2                <1> 	mov	dl, al ; new color
  8240                              <1> m_pix_op_sub_8_0:
  8241 0000EF45 AC                  <1> 	lodsb
  8242 0000EF46 3A05[E2A30100]      <1> 	cmp	al, [maskcolor]
  8243 0000EF4C 740D                <1> 	je	short m_pix_op_sub_8_1 ; exclude
  8244 0000EF4E FF05[AC940100]      <1> 	inc	dword [u.r0] ; +1
  8245 0000EF54 2817                <1> 	sub	[edi], dl
  8246 0000EF56 7303                <1> 	jnb	short m_pix_op_sub_8_1
  8247 0000EF58 C60700              <1> 	mov	byte [edi], 0 
  8248                              <1> m_pix_op_sub_8_1:
  8249 0000EF5B 47                  <1> 	inc	edi
  8250 0000EF5C E2E7                <1> 	loop	m_pix_op_sub_8_0
  8251 0000EF5E C3                  <1> 	retn
  8252                              <1> m_pix_op_sub_1:
  8253 0000EF5F 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8254 0000EF66 7755                <1> 	ja	short m_pix_op_sub_3 ; 32bpp
  8255 0000EF68 722F                <1> 	jb	short m_pix_op_sub_2 ; 16bpp
  8256                              <1> 	; 24 bit true colors
  8257                              <1> 	;jmp	short m_pix_op_sub_24
  8258                              <1> m_pix_op_sub_24:
  8259                              <1> 	; 24 bit true colors
  8260 0000EF6A 89C2                <1> 	mov	edx, eax ; new color
  8261                              <1> 	; 02/03/2021
  8262                              <1> m_pix_op_sub_24_0:
  8263 0000EF6C 66AD                <1> 	lodsw
  8264 0000EF6E C1E010              <1> 	shl	eax, 16
  8265 0000EF71 AC                  <1> 	lodsb
  8266 0000EF72 C1C010              <1> 	rol	eax, 16
  8267 0000EF75 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  8268 0000EF7B 7416                <1> 	je	short m_pix_op_sub_24_2 ; exclude
  8269 0000EF7D 8305[AC940100]03    <1> 	add	dword [u.r0], 3 ; +3
  8270 0000EF84 29D0                <1> 	sub	eax, edx
  8271 0000EF86 7302                <1> 	jnb	short m_pix_op_sub_24_1
  8272 0000EF88 31C0                <1> 	xor	eax, eax ; 0
  8273                              <1> m_pix_op_sub_24_1:
  8274 0000EF8A 668907              <1> 	mov	[edi], ax
  8275 0000EF8D C1E810              <1> 	shr	eax, 16
  8276 0000EF90 884702              <1> 	mov	[edi+2], al
  8277                              <1> m_pix_op_sub_24_2:
  8278 0000EF93 83C703              <1> 	add	edi, 3 ; +3
  8279 0000EF96 E2D4                <1> 	loop	m_pix_op_sub_24_0
  8280 0000EF98 C3                  <1> 	retn
  8281                              <1> 	; 65536 colors (16bpp)
  8282                              <1> m_pix_op_sub_2:
  8283                              <1> 	;jmp	short m_pix_op_sub_16
  8284                              <1> m_pix_op_sub_16:
  8285                              <1> 	; 16 bit colors (65536 colors)
  8286 0000EF99 89C2                <1> 	mov	edx, eax ; new color
  8287                              <1> m_pix_op_sub_16_0:
  8288 0000EF9B 66AD                <1> 	lodsw
  8289 0000EF9D 663B05[E2A30100]    <1> 	cmp	ax, [maskcolor]
  8290 0000EFA4 7411                <1> 	je	short m_pix_op_sub_16_1 ; exclude
  8291 0000EFA6 8305[AC940100]02    <1> 	add	dword [u.r0], 2 ; +2
  8292 0000EFAD 662917              <1> 	sub	[edi], dx
  8293 0000EFB0 7305                <1> 	jnb	short m_pix_op_sub_16_1
  8294 0000EFB2 31C0                <1> 	xor	eax, eax
  8295 0000EFB4 668907              <1> 	mov	[edi], ax ; 0
  8296                              <1> m_pix_op_sub_16_1:
  8297 0000EFB7 83C702              <1> 	add	edi, 2 ; +2
  8298 0000EFBA E2DF                <1> 	loop	m_pix_op_sub_16_0
  8299 0000EFBC C3                  <1> 	retn
  8300                              <1> m_pix_op_sub_3:
  8301                              <1> 	; 32 bit true colors
  8302                              <1> 	;jmp	short m_pix_op_sub_32
  8303                              <1> m_pix_op_sub_32:
  8304                              <1> 	; 32 bit true colors
  8305 0000EFBD 89C2                <1> 	mov	edx, eax ; new color
  8306                              <1> m_pix_op_sub_32_0:
  8307 0000EFBF AD                  <1> 	lodsd 
  8308 0000EFC0 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  8309 0000EFC6 740F                <1> 	je	short m_pix_op_sub_32_1 ; exclude
  8310 0000EFC8 8305[AC940100]04    <1> 	add	dword [u.r0], 4 ; +4
  8311 0000EFCF 2917                <1> 	sub	[edi], edx
  8312 0000EFD1 7304                <1> 	jnb	short m_pix_op_sub_32_1
  8313 0000EFD3 31C0                <1> 	xor	eax, eax
  8314 0000EFD5 8907                <1> 	mov	[edi], eax ; 0
  8315                              <1> m_pix_op_sub_32_1:
  8316 0000EFD7 83C704              <1> 	add	edi, 4 ; +4
  8317 0000EFDA E2E3                <1> 	loop	m_pix_op_sub_32_0
  8318 0000EFDC C3                  <1> 	retn
  8319                              <1> 
  8320                              <1> m_pix_op_sub_w:
  8321                              <1> 	; 06/02/2021
  8322                              <1> 	; SUBTRACT COLOR (MASKED, window)
  8323                              <1> 	;
  8324                              <1> 	; jump from pix_op_sub_w
  8325                              <1> 	;
  8326                              <1> 	; INPUT:
  8327                              <1> 	;   ecx = bytes per row (to be applied)
  8328                              <1> 	;   edx = screen width in bytes
  8329                              <1> 	;   ebx = row count
  8330                              <1> 	;   eax = color
  8331                              <1> 	;
  8332                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8333                              <1> 	;
  8334                              <1> 	; OUTPUT:
  8335                              <1> 	; 	[u.r0] will be > 0 if succesful
  8336                              <1> 
  8337                              <1> 	; window
  8338                              <1> 	;mov	edi, [v_str] ; LFB start address
  8339                              <1> 	;mov	esi, edi 
  8340                              <1> 
  8341 0000EFDD 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8342 0000EFE4 7707                <1> 	ja	short m_pix_op_sub_w_1
  8343                              <1> 
  8344                              <1> 	; 256 colors (8bpp)
  8345 0000EFE6 BD[43EF0000]        <1> 	mov	ebp, m_pix_op_sub_8
  8346 0000EFEB EB1E                <1> 	jmp	short m_pix_op_sub_w_4
  8347                              <1> 
  8348                              <1> m_pix_op_sub_w_1:
  8349 0000EFED 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8350 0000EFF4 7710                <1> 	ja	short m_pix_op_sub_w_3 ; 32bpp
  8351 0000EFF6 7207                <1> 	jb	short m_pix_op_sub_w_2 ; 16bpp
  8352                              <1> 
  8353                              <1> 	; 24 bit true colors
  8354 0000EFF8 BD[6AEF0000]        <1> 	mov	ebp, m_pix_op_sub_24
  8355 0000EFFD EB0C                <1> 	jmp	short m_pix_op_sub_w_4
  8356                              <1> 
  8357                              <1> 	; 65536 colors (16bpp)
  8358                              <1> m_pix_op_sub_w_2:
  8359 0000EFFF BD[99EF0000]        <1> 	mov	ebp, m_pix_op_sub_16
  8360 0000F004 EB05                <1> 	jmp	short m_pix_op_sub_w_4
  8361                              <1> 
  8362                              <1> 	; 32 bit true colors
  8363                              <1> m_pix_op_sub_w_3:
  8364 0000F006 BD[BDEF0000]        <1> 	mov	ebp, m_pix_op_sub_32
  8365                              <1> m_pix_op_sub_w_4:
  8366 0000F00B E927FEFFFF          <1> 	jmp	m_pix_op_sub_w_x
  8367                              <1> 
  8368                              <1> m_pix_op_mix:
  8369                              <1> 	; 25/02/2021
  8370                              <1> 	; 06/02/2021
  8371                              <1> 	; MIX COLOR (MASKED, full screen)
  8372                              <1> 	;
  8373                              <1> 	; jump from pix_op_mix
  8374                              <1> 	;
  8375                              <1> 	; INPUT:
  8376                              <1> 	;   eax = color (AL, AX, EAX)
  8377                              <1> 	;   ecx = [v_siz] ; display page pixel count
  8378                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  8379                              <1> 	;
  8380                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8381                              <1> 	;
  8382                              <1> 	; OUTPUT:
  8383                              <1> 	; 	[u.r0] will be > 0 if succesful
  8384                              <1> 
  8385                              <1> 	; Full screen
  8386                              <1> m_pix_op_mix_0:
  8387 0000F010 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8388 0000F017 771B                <1> 	ja	short m_pix_op_mix_1
  8389                              <1> 	; 256 colors (8bpp)
  8390                              <1> 	;jmp	short m_pix_op_mix_8
  8391                              <1> m_pix_op_mix_8:
  8392                              <1> 	; 8 bit colors (256 colors)
  8393 0000F019 88C2                <1> 	mov	dl, al ; new (mixing) color
  8394                              <1> m_pix_op_mix_8_0:
  8395 0000F01B AC                  <1> 	lodsb 
  8396 0000F01C 3A05[E2A30100]      <1> 	cmp	al, [maskcolor]
  8397 0000F022 740C                <1> 	je	short m_pix_op_mix_8_1 ; exclude
  8398 0000F024 00D0                <1> 	add	al, dl ; 25/02/2021
  8399 0000F026 D0D8                <1> 	rcr	al, 1	
  8400 0000F028 8807                <1> 	mov	[edi], al
  8401 0000F02A FF05[AC940100]      <1> 	inc	dword [u.r0] ; +1
  8402                              <1> m_pix_op_mix_8_1:
  8403 0000F030 47                  <1> 	inc	edi
  8404 0000F031 E2E8                <1> 	loop	m_pix_op_mix_8_0
  8405 0000F033 C3                  <1> 	retn
  8406                              <1> m_pix_op_mix_1:
  8407 0000F034 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8408 0000F03B 7752                <1> 	ja	short m_pix_op_mix_3 ; 32bpp
  8409 0000F03D 722D                <1> 	jb	short m_pix_op_mix_2 ; 16bpp
  8410                              <1> 	; 24 bit true colors
  8411                              <1> 	;jmp	short m_pix_op_mix_24
  8412                              <1> m_pix_op_mix_24:
  8413                              <1> 	; 24 bit true colors
  8414 0000F03F 89C2                <1> 	mov	edx, eax ; new color
  8415                              <1> 	;and	edx, 0FFFFFFh
  8416                              <1> m_pix_op_mix_24_0:
  8417 0000F041 66AD                <1> 	lodsw
  8418 0000F043 C1E010              <1> 	shl	eax, 16
  8419 0000F046 AC                  <1> 	lodsb
  8420 0000F047 C1C010              <1> 	rol	eax, 16	
  8421 0000F04A 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  8422 0000F050 7414                <1> 	je	short m_pix_op_mix_24_1 ; exclude
  8423 0000F052 01D0                <1> 	add	eax, edx
  8424 0000F054 D1E8                <1> 	shr	eax, 1
  8425 0000F056 668907              <1> 	mov	[edi], ax
  8426 0000F059 C1E810              <1> 	shr	eax, 16
  8427 0000F05C 884702              <1> 	mov	[edi+2], al
  8428 0000F05F 8305[AC940100]03    <1> 	add	dword [u.r0], 3 ; +3
  8429                              <1> m_pix_op_mix_24_1:
  8430 0000F066 83C703              <1> 	add	edi, 3 ; +3
  8431 0000F069 E2D6                <1> 	loop	m_pix_op_mix_24_0
  8432 0000F06B C3                  <1> 	retn
  8433                              <1> 	; 65536 colors (16bpp)
  8434                              <1> m_pix_op_mix_2:
  8435                              <1> 	;jmp	short m_pix_op_mix_16
  8436                              <1> m_pix_op_mix_16:
  8437                              <1> 	; 16 bit colors (65536 colors)
  8438 0000F06C 89C2                <1> 	mov	edx, eax ; new color
  8439                              <1> 	;and	edx, 0FFFFh
  8440                              <1> m_pix_op_mix_16_0:
  8441 0000F06E 66AD                <1> 	lodsw
  8442 0000F070 663B05[E2A30100]    <1> 	cmp	ax, [maskcolor]
  8443 0000F077 7410                <1> 	je	short m_pix_op_mix_16_1 ; exclude
  8444 0000F079 6601D0              <1> 	add	ax, dx
  8445 0000F07C 66D1D8              <1> 	rcr	ax, 1
  8446 0000F07F 668907              <1> 	mov	[edi], ax
  8447 0000F082 8305[AC940100]02    <1> 	add	dword [u.r0], 2 ; +2
  8448                              <1> m_pix_op_mix_16_1:
  8449 0000F089 83C702              <1> 	add	edi, 2 ; +2
  8450 0000F08C E2E0                <1> 	loop	m_pix_op_mix_16_0
  8451 0000F08E C3                  <1> 	retn
  8452                              <1> m_pix_op_mix_3:
  8453                              <1> 	; 32 bit true colors
  8454                              <1> 	;jmp	short m_pix_op_mix_32
  8455                              <1> m_pix_op_mix_32:
  8456                              <1> 	; 32 bit true colors
  8457 0000F08F 89C2                <1> 	mov	edx, eax ; new color
  8458                              <1> m_pix_op_mix_32_0:
  8459 0000F091 AD                  <1> 	lodsd 
  8460 0000F092 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  8461 0000F098 740D                <1> 	je	short m_pix_op_mix_32_1 ; exclude
  8462 0000F09A 01D0                <1> 	add	eax, edx
  8463                              <1> 	; 02/03/2021
  8464 0000F09C D1D8                <1> 	rcr	eax, 1
  8465 0000F09E 8907                <1> 	mov	[edi], eax
  8466 0000F0A0 8305[AC940100]04    <1> 	add	dword [u.r0], 4 ; +4
  8467                              <1> m_pix_op_mix_32_1:
  8468 0000F0A7 83C704              <1> 	add	edi, 4 ; +4
  8469 0000F0AA E2E5                <1> 	loop	m_pix_op_mix_32_0
  8470 0000F0AC C3                  <1> 	retn
  8471                              <1> 
  8472                              <1> m_pix_op_mix_w:
  8473                              <1> 	; 06/02/2021
  8474                              <1> 	; MIX COLOR (MASKED, window)
  8475                              <1> 	;
  8476                              <1> 	; jump from pix_op_mix_w
  8477                              <1> 	;
  8478                              <1> 	; INPUT:
  8479                              <1> 	;   ecx = bytes per row (to be applied)
  8480                              <1> 	;   edx = screen width in bytes
  8481                              <1> 	;   ebx = row count
  8482                              <1> 	;   eax = color
  8483                              <1> 	;
  8484                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8485                              <1> 	;
  8486                              <1> 	; OUTPUT:
  8487                              <1> 	; 	[u.r0] will be > 0 if succesful
  8488                              <1> 
  8489                              <1> 	; window
  8490                              <1> 	;mov	edi, [v_str] ; LFB start address
  8491                              <1> 	;mov	esi, edi
  8492                              <1> 
  8493 0000F0AD 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8494 0000F0B4 7707                <1> 	ja	short m_pix_op_mix_w_1
  8495                              <1> 
  8496                              <1> 	; 256 colors (8bpp)
  8497 0000F0B6 BD[19F00000]        <1> 	mov	ebp, m_pix_op_mix_8
  8498 0000F0BB EB1E                <1> 	jmp	short m_pix_op_mix_w_4
  8499                              <1> 
  8500                              <1> m_pix_op_mix_w_1:
  8501 0000F0BD 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8502 0000F0C4 7710                <1> 	ja	short m_pix_op_mix_w_3 ; 32bpp
  8503 0000F0C6 7207                <1> 	jb	short m_pix_op_mix_w_2 ; 16bpp
  8504                              <1> 
  8505                              <1> 	; 24 bit true colors
  8506 0000F0C8 BD[3FF00000]        <1> 	mov	ebp, m_pix_op_mix_24
  8507 0000F0CD EB0C                <1> 	jmp	short m_pix_op_mix_w_4
  8508                              <1> 
  8509                              <1> 	; 65536 colors (16bpp)
  8510                              <1> m_pix_op_mix_w_2:
  8511 0000F0CF BD[6CF00000]        <1> 	mov	ebp, m_pix_op_mix_16
  8512 0000F0D4 EB05                <1> 	jmp	short m_pix_op_mix_w_4
  8513                              <1> 
  8514                              <1> 	; 32 bit true colors
  8515                              <1> m_pix_op_mix_w_3:
  8516 0000F0D6 BD[8FF00000]        <1> 	mov	ebp, m_pix_op_mix_32
  8517                              <1> m_pix_op_mix_w_4:
  8518 0000F0DB E957FDFFFF          <1> 	jmp	m_pix_op_mix_w_x
  8519                              <1> 
  8520                              <1> m_pix_op_and:
  8521                              <1> 	; 06/02/2021
  8522                              <1> 	; AND COLOR (MASKED, full screen)
  8523                              <1> 	;
  8524                              <1> 	; jump from pix_op_and
  8525                              <1> 	;
  8526                              <1> 	; INPUT:
  8527                              <1> 	;   eax = color (AL, AX, EAX)
  8528                              <1> 	;   ecx = [v_siz] ; display page pixel count
  8529                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  8530                              <1> 	;
  8531                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8532                              <1> 	;
  8533                              <1> 	; OUTPUT:
  8534                              <1> 	; 	[u.r0] will be > 0 if succesful
  8535                              <1> 
  8536                              <1> 	; Full screen
  8537                              <1> m_pix_op_and_0:
  8538 0000F0E0 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8539 0000F0E7 7717                <1> 	ja	short m_pix_op_and_1
  8540                              <1> 	; 256 colors (8bpp)
  8541                              <1> 	;jmp	short m_pix_op_and_8
  8542                              <1> m_pix_op_and_8:
  8543                              <1> 	; 8 bit colors (256 colors)
  8544 0000F0E9 88C2                <1> 	mov	dl, al ; new color
  8545                              <1> m_pix_op_and_8_0:
  8546 0000F0EB AC                  <1> 	lodsb
  8547 0000F0EC 3A05[E2A30100]      <1> 	cmp	al, [maskcolor]
  8548 0000F0F2 7408                <1> 	je	short m_pix_op_and_8_1 ; exclude
  8549 0000F0F4 2017                <1> 	and	[edi], dl
  8550 0000F0F6 FF05[AC940100]      <1> 	inc	dword [u.r0] ; +1
  8551                              <1> m_pix_op_and_8_1:
  8552 0000F0FC 47                  <1> 	inc	edi
  8553 0000F0FD E2EC                <1> 	loop	m_pix_op_and_8_0
  8554 0000F0FF C3                  <1> 	retn
  8555                              <1> m_pix_op_and_1:
  8556 0000F100 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8557 0000F107 774A                <1> 	ja	short m_pix_op_and_3 ; 32bpp
  8558 0000F109 722B                <1> 	jb	short m_pix_op_and_2 ; 16bpp
  8559                              <1> 	; 24 bit true colors
  8560                              <1> 	;jmp	short m_pix_op_and_24
  8561                              <1> m_pix_op_and_24:
  8562                              <1> 	; 24 bit true colors
  8563 0000F10B 89C2                <1> 	mov	edx, eax ; new color
  8564                              <1> 	;and	edx, 0FFFFFFh
  8565                              <1> m_pix_op_and_24_0:
  8566 0000F10D 66AD                <1> 	lodsw
  8567 0000F10F C1E010              <1> 	shl	eax, 16
  8568 0000F112 AC                  <1> 	lodsb
  8569 0000F113 C1C010              <1> 	rol	eax, 16	
  8570 0000F116 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  8571 0000F11C 7412                <1> 	je	short m_pix_op_and_24_1 ; exclude
  8572 0000F11E 21D0                <1> 	and	eax, edx
  8573 0000F120 668907              <1> 	mov	[edi], ax
  8574 0000F123 C1E810              <1> 	shr	eax, 16
  8575 0000F126 884702              <1> 	mov	[edi+2], al
  8576 0000F129 8305[AC940100]03    <1> 	add	dword [u.r0], 3 ; +3
  8577                              <1> m_pix_op_and_24_1:
  8578 0000F130 83C703              <1> 	add	edi, 3 ; +3
  8579 0000F133 E2D8                <1> 	loop	m_pix_op_and_24_0
  8580 0000F135 C3                  <1> 	retn
  8581                              <1> 	; 65536 colors (16bpp)
  8582                              <1> m_pix_op_and_2:
  8583                              <1> 	;jmp	short m_pix_op_and_16
  8584                              <1> m_pix_op_and_16:
  8585                              <1> 	; 16 bit colors (65536 colors)
  8586 0000F136 89C2                <1> 	mov	edx, eax ; new color
  8587                              <1> 	;and	edx, 0FFFFh
  8588                              <1> m_pix_op_and_16_0:
  8589 0000F138 66AD                <1> 	lodsw
  8590 0000F13A 663B05[E2A30100]    <1> 	cmp	ax, [maskcolor]
  8591 0000F141 740A                <1> 	je	short m_pix_op_and_16_1 ; exclude
  8592 0000F143 662117              <1> 	and	[edi], dx
  8593 0000F146 8305[AC940100]02    <1> 	add	dword [u.r0], 2 ; +2
  8594                              <1> m_pix_op_and_16_1:
  8595 0000F14D 83C702              <1> 	add	edi, 2 ; +2
  8596 0000F150 E2E6                <1> 	loop	m_pix_op_and_16_0
  8597 0000F152 C3                  <1> 	retn
  8598                              <1> m_pix_op_and_3:
  8599                              <1> 	; 32 bit true colors
  8600                              <1> 	;jmp	short m_pix_op_and_32
  8601                              <1> m_pix_op_and_32:
  8602                              <1> 	; 32 bit true colors
  8603 0000F153 89C2                <1> 	mov	edx, eax ; new color
  8604                              <1> m_pix_op_and_32_0:
  8605 0000F155 AD                  <1> 	lodsd 
  8606 0000F156 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  8607 0000F15C 7409                <1> 	je	short m_pix_op_and_32_1 ; exclude
  8608 0000F15E 2117                <1> 	and	[edi], edx ; 25/02/2021
  8609 0000F160 8305[AC940100]04    <1> 	add	dword [u.r0], 4 ; +4
  8610                              <1> m_pix_op_and_32_1:
  8611 0000F167 83C704              <1> 	add	edi, 4 ; +4
  8612 0000F16A E2E9                <1> 	loop	m_pix_op_and_32_0
  8613 0000F16C C3                  <1> 	retn
  8614                              <1> 
  8615                              <1> m_pix_op_and_w:
  8616                              <1> 	; 06/02/2021
  8617                              <1> 	; AND COLOR (MASKED, window)
  8618                              <1> 	;
  8619                              <1> 	; jump from pix_op_and_w
  8620                              <1> 	;
  8621                              <1> 	; INPUT:
  8622                              <1> 	;   ecx = bytes per row (to be applied)
  8623                              <1> 	;   edx = screen width in bytes
  8624                              <1> 	;   ebx = row count
  8625                              <1> 	;   eax = color
  8626                              <1> 	;
  8627                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8628                              <1> 	;
  8629                              <1> 	; OUTPUT:
  8630                              <1> 	; 	[u.r0] will be > 0 if succesful
  8631                              <1> 
  8632                              <1> 	; window
  8633                              <1> 	;mov	edi, [v_str] ; LFB start address
  8634                              <1> 	;mov	esi, edi 
  8635                              <1> 
  8636 0000F16D 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8637 0000F174 7707                <1> 	ja	short m_pix_op_and_w_1
  8638                              <1> 
  8639                              <1> 	; 256 colors (8bpp)
  8640 0000F176 BD[E9F00000]        <1> 	mov	ebp, m_pix_op_and_8
  8641 0000F17B EB1E                <1> 	jmp	short m_pix_op_and_w_4
  8642                              <1> 
  8643                              <1> m_pix_op_and_w_1:
  8644 0000F17D 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8645 0000F184 7710                <1> 	ja	short m_pix_op_and_w_3 ; 32bpp
  8646 0000F186 7207                <1> 	jb	short m_pix_op_and_w_2 ; 16bpp
  8647                              <1> 
  8648                              <1> 	; 24 bit true colors
  8649 0000F188 BD[0BF10000]        <1> 	mov	ebp, m_pix_op_and_24
  8650 0000F18D EB0C                <1> 	jmp	short m_pix_op_and_w_4
  8651                              <1> 
  8652                              <1> 	; 65536 colors (16bpp)
  8653                              <1> m_pix_op_and_w_2:
  8654 0000F18F BD[36F10000]        <1> 	mov	ebp, m_pix_op_and_16
  8655 0000F194 EB05                <1> 	jmp	short m_pix_op_and_w_4
  8656                              <1> 
  8657                              <1> 	; 32 bit true colors
  8658                              <1> m_pix_op_and_w_3:
  8659 0000F196 BD[53F10000]        <1> 	mov	ebp, m_pix_op_and_32
  8660                              <1> m_pix_op_and_w_4:
  8661 0000F19B E997FCFFFF          <1> 	jmp	m_pix_op_and_w_x
  8662                              <1> 
  8663                              <1> m_pix_op_or:
  8664                              <1> 	; 06/02/2021
  8665                              <1> 	; OR COLOR (MASKED, full screen)
  8666                              <1> 	;
  8667                              <1> 	; jump from pix_op_orc
  8668                              <1> 	;
  8669                              <1> 	; INPUT:
  8670                              <1> 	;   eax = color (AL, AX, EAX)
  8671                              <1> 	;   ecx = [v_siz] ; display page pixel count
  8672                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  8673                              <1> 	;
  8674                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8675                              <1> 	;
  8676                              <1> 	; OUTPUT:
  8677                              <1> 	; 	[u.r0] will be > 0 if succesful
  8678                              <1> 
  8679                              <1> 	; Full screen
  8680                              <1> m_pix_op_or_0:
  8681 0000F1A0 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8682 0000F1A7 7717                <1> 	ja	short m_pix_op_or_1
  8683                              <1> 	; 256 colors (8bpp)
  8684                              <1> 	;jmp	short m_pix_op_or_8
  8685                              <1> m_pix_op_or_8:
  8686                              <1> 	; 8 bit colors (256 colors)
  8687 0000F1A9 88C2                <1> 	mov	dl, al ; new color
  8688                              <1> m_pix_op_or_8_0:
  8689 0000F1AB AC                  <1> 	lodsb 
  8690 0000F1AC 3A05[E2A30100]      <1> 	cmp	al, [maskcolor]
  8691 0000F1B2 7408                <1> 	je	short m_pix_op_or_8_1 ; exclude
  8692 0000F1B4 0817                <1> 	or	[edi], dl
  8693 0000F1B6 FF05[AC940100]      <1> 	inc	dword [u.r0] ; +1
  8694                              <1> m_pix_op_or_8_1:
  8695 0000F1BC 47                  <1> 	inc	edi
  8696 0000F1BD E2EC                <1> 	loop	m_pix_op_or_8_0
  8697 0000F1BF C3                  <1> 	retn
  8698                              <1> m_pix_op_or_1:
  8699 0000F1C0 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8700 0000F1C7 774A                <1> 	ja	short m_pix_op_or_3 ; 32bpp
  8701 0000F1C9 722B                <1> 	jb	short m_pix_op_or_2 ; 16bpp
  8702                              <1> 	; 24 bit true colors
  8703                              <1> 	;jmp	short m_pix_op_or_24
  8704                              <1> m_pix_op_or_24:
  8705                              <1> 	; 24 bit true colors
  8706 0000F1CB 89C2                <1> 	mov	edx, eax ; new color
  8707                              <1> 	;and	edx, 0FFFFFFh
  8708                              <1> m_pix_op_or_24_0:
  8709 0000F1CD 66AD                <1> 	lodsw
  8710 0000F1CF C1E010              <1> 	shl	eax, 16
  8711 0000F1D2 AC                  <1> 	lodsb
  8712 0000F1D3 C1C010              <1> 	rol	eax, 16	
  8713 0000F1D6 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  8714 0000F1DC 7412                <1> 	je	short m_pix_op_or_24_1 ; exclude
  8715 0000F1DE 09D0                <1> 	or	eax, edx
  8716 0000F1E0 668907              <1> 	mov	[edi], ax
  8717 0000F1E3 C1E810              <1> 	shr	eax, 16
  8718 0000F1E6 884702              <1> 	mov	[edi+2], al
  8719 0000F1E9 8305[AC940100]03    <1> 	add	dword [u.r0], 3 ; +3
  8720                              <1> m_pix_op_or_24_1:
  8721 0000F1F0 83C703              <1> 	add	edi, 3 ; +3
  8722 0000F1F3 E2D8                <1> 	loop	m_pix_op_or_24_0
  8723 0000F1F5 C3                  <1> 	retn
  8724                              <1> 	; 65536 colors (16bpp)
  8725                              <1> m_pix_op_or_2:
  8726                              <1> 	;jmp	short m_pix_op_or_16
  8727                              <1> m_pix_op_or_16:
  8728                              <1> 	; 16 bit colors (65536 colors)
  8729 0000F1F6 89C2                <1> 	mov	edx, eax ; new color
  8730                              <1> 	;and	edx, 0FFFFh
  8731                              <1> m_pix_op_or_16_0:
  8732 0000F1F8 66AD                <1> 	lodsw
  8733 0000F1FA 663B05[E2A30100]    <1> 	cmp	ax, [maskcolor]
  8734 0000F201 740A                <1> 	je	short m_pix_op_or_16_1 ; exclude
  8735 0000F203 660917              <1> 	or	[edi], dx
  8736 0000F206 8305[AC940100]02    <1> 	add	dword [u.r0], 2 ; +2
  8737                              <1> m_pix_op_or_16_1:
  8738 0000F20D 83C702              <1> 	add	edi, 2 ; +2
  8739 0000F210 E2E6                <1> 	loop	m_pix_op_or_16_0
  8740 0000F212 C3                  <1> 	retn
  8741                              <1> m_pix_op_or_3:
  8742                              <1> 	; 32 bit true colors
  8743                              <1> 	;jmp	short m_pix_op_or_32
  8744                              <1> m_pix_op_or_32:
  8745                              <1> 	; 32 bit true colors
  8746 0000F213 89C2                <1> 	mov	edx, eax ; new color
  8747                              <1> m_pix_op_or_32_0:
  8748 0000F215 AD                  <1> 	lodsd 
  8749 0000F216 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  8750 0000F21C 7409                <1> 	je	short m_pix_op_or_32_1 ; exclude
  8751 0000F21E 0917                <1> 	or	[edi], edx ; 25/02/2021
  8752 0000F220 8305[AC940100]04    <1> 	add	dword [u.r0], 4 ; +4
  8753                              <1> m_pix_op_or_32_1:
  8754 0000F227 83C704              <1> 	add	edi, 4 ; +4
  8755 0000F22A E2E9                <1> 	loop	m_pix_op_or_32_0
  8756 0000F22C C3                  <1> 	retn
  8757                              <1> 
  8758                              <1> m_pix_op_or_w:
  8759                              <1> 	; 06/02/2021
  8760                              <1> 	; MIX COLOR (MASKED, window)
  8761                              <1> 	;
  8762                              <1> 	; jump from pix_op_or_w
  8763                              <1> 	;
  8764                              <1> 	; INPUT:
  8765                              <1> 	;   ecx = bytes per row (to be applied)
  8766                              <1> 	;   edx = screen width in bytes
  8767                              <1> 	;   ebx = row count
  8768                              <1> 	;   eax = color
  8769                              <1> 	;
  8770                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8771                              <1> 	;
  8772                              <1> 	; OUTPUT:
  8773                              <1> 	; 	[u.r0] will be > 0 if succesful
  8774                              <1> 
  8775                              <1> 	; window
  8776                              <1> 	;mov	edi, [v_str] ; LFB start address
  8777                              <1> 	;mov	esi, edi 
  8778                              <1> 
  8779 0000F22D 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8780 0000F234 7707                <1> 	ja	short m_pix_op_or_w_1
  8781                              <1> 
  8782                              <1> 	; 256 colors (8bpp)
  8783 0000F236 BD[A9F10000]        <1> 	mov	ebp, m_pix_op_or_8
  8784 0000F23B EB1E                <1> 	jmp	short m_pix_op_or_w_4
  8785                              <1> 
  8786                              <1> m_pix_op_or_w_1:
  8787 0000F23D 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8788 0000F244 7710                <1> 	ja	short m_pix_op_or_w_3 ; 32bpp
  8789 0000F246 7207                <1> 	jb	short m_pix_op_or_w_2 ; 16bpp
  8790                              <1> 
  8791                              <1> 	; 24 bit true colors
  8792 0000F248 BD[CBF10000]        <1> 	mov	ebp, m_pix_op_or_24
  8793 0000F24D EB0C                <1> 	jmp	short m_pix_op_or_w_4
  8794                              <1> 
  8795                              <1> 	; 65536 colors (16bpp)
  8796                              <1> m_pix_op_or_w_2:
  8797 0000F24F BD[F6F10000]        <1> 	mov	ebp, m_pix_op_or_16
  8798 0000F254 EB05                <1> 	jmp	short m_pix_op_or_w_4
  8799                              <1> 
  8800                              <1> 	; 32 bit true colors
  8801                              <1> m_pix_op_or_w_3:
  8802 0000F256 BD[13F20000]        <1> 	mov	ebp, m_pix_op_or_32
  8803                              <1> m_pix_op_or_w_4:
  8804 0000F25B E9D7FBFFFF          <1> 	jmp	m_pix_op_orc_w_x
  8805                              <1> 
  8806                              <1> m_pix_op_xor:
  8807                              <1> 	; 06/02/2021
  8808                              <1> 	; XOR COLOR (MASKED, full screen)
  8809                              <1> 	;
  8810                              <1> 	; jump from pix_op_xor
  8811                              <1> 	;
  8812                              <1> 	; INPUT:
  8813                              <1> 	;   eax = color (AL, AX, EAX)
  8814                              <1> 	;   ecx = [v_siz] ; display page pixel count
  8815                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  8816                              <1> 	;
  8817                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8818                              <1> 	;
  8819                              <1> 	; OUTPUT:
  8820                              <1> 	; 	[u.r0] will be > 0 if succesful
  8821                              <1> 
  8822                              <1> 	; Full screen
  8823                              <1> m_pix_op_xor_0:
  8824 0000F260 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8825 0000F267 7717                <1> 	ja	short m_pix_op_xor_1
  8826                              <1> 	; 256 colors (8bpp)
  8827                              <1> 	;jmp	short m_pix_op_xor_8
  8828                              <1> m_pix_op_xor_8:
  8829                              <1> 	; 8 bit colors (256 colors)
  8830 0000F269 88C2                <1> 	mov	dl, al ; new color
  8831                              <1> m_pix_op_xor_8_0:
  8832 0000F26B AC                  <1> 	lodsb 
  8833 0000F26C 3A05[E2A30100]      <1> 	cmp	al, [maskcolor]
  8834 0000F272 7408                <1> 	je	short m_pix_op_xor_8_1 ; exclude
  8835 0000F274 3017                <1> 	xor	[edi], dl
  8836 0000F276 FF05[AC940100]      <1> 	inc	dword [u.r0] ; +1
  8837                              <1> m_pix_op_xor_8_1:
  8838 0000F27C 47                  <1> 	inc	edi
  8839 0000F27D E2EC                <1> 	loop	m_pix_op_xor_8_0
  8840 0000F27F C3                  <1> 	retn
  8841                              <1> m_pix_op_xor_1:
  8842 0000F280 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8843 0000F287 774A                <1> 	ja	short m_pix_op_xor_3 ; 32bpp
  8844 0000F289 722B                <1> 	jb	short m_pix_op_xor_2 ; 16bpp
  8845                              <1> 	; 24 bit true colors
  8846                              <1> 	;jmp	short m_pix_op_xor_24
  8847                              <1> m_pix_op_xor_24:
  8848                              <1> 	; 24 bit true colors
  8849 0000F28B 89C2                <1> 	mov	edx, eax ; new color
  8850                              <1> 	;and	edx, 0FFFFFFh
  8851                              <1> m_pix_op_xor_24_0:
  8852 0000F28D 66AD                <1> 	lodsw
  8853 0000F28F C1E010              <1> 	shl	eax, 16
  8854 0000F292 AC                  <1> 	lodsb
  8855 0000F293 C1C010              <1> 	rol	eax, 16	
  8856 0000F296 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  8857 0000F29C 7412                <1> 	je	short m_pix_op_xor_24_1 ; exclude
  8858 0000F29E 31D0                <1> 	xor	eax, edx
  8859 0000F2A0 668907              <1> 	mov	[edi], ax
  8860 0000F2A3 C1E810              <1> 	shr	eax, 16
  8861 0000F2A6 884702              <1> 	mov	[edi+2], al
  8862 0000F2A9 8305[AC940100]03    <1> 	add	dword [u.r0], 3 ; +3
  8863                              <1> m_pix_op_xor_24_1:
  8864 0000F2B0 83C703              <1> 	add	edi, 3 ; +3
  8865 0000F2B3 E2D8                <1> 	loop	m_pix_op_xor_24_0
  8866 0000F2B5 C3                  <1> 	retn
  8867                              <1> 	; 65536 colors (16bpp)
  8868                              <1> m_pix_op_xor_2:
  8869                              <1> 	;jmp	short m_pix_op_xor_16
  8870                              <1> m_pix_op_xor_16:
  8871                              <1> 	; 16 bit colors (65536 colors)
  8872 0000F2B6 89C2                <1> 	mov	edx, eax ; new color
  8873                              <1> 	;and	edx, 0FFFFh
  8874                              <1> m_pix_op_xor_16_0:
  8875 0000F2B8 66AD                <1> 	lodsw
  8876 0000F2BA 663B05[E2A30100]    <1> 	cmp	ax, [maskcolor]
  8877 0000F2C1 740A                <1> 	je	short m_pix_op_xor_16_1 ; exclude
  8878 0000F2C3 663117              <1> 	xor	[edi], dx
  8879 0000F2C6 8305[AC940100]02    <1> 	add	dword [u.r0], 2 ; +2
  8880                              <1> m_pix_op_xor_16_1:
  8881 0000F2CD 83C702              <1> 	add	edi, 2 ; +2
  8882 0000F2D0 E2E6                <1> 	loop	m_pix_op_xor_16_0
  8883 0000F2D2 C3                  <1> 	retn
  8884                              <1> m_pix_op_xor_3:
  8885                              <1> 	; 32 bit true colors
  8886                              <1> 	;jmp	short m_pix_op_xor_32
  8887                              <1> m_pix_op_xor_32:
  8888                              <1> 	; 32 bit true colors
  8889 0000F2D3 89C2                <1> 	mov	edx, eax ; new color
  8890                              <1> m_pix_op_xor_32_0:
  8891 0000F2D5 AD                  <1> 	lodsd
  8892 0000F2D6 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  8893 0000F2DC 7409                <1> 	je	short m_pix_op_xor_32_1 ; exclude
  8894 0000F2DE 3117                <1> 	xor	[edi], edx ; 25/02/2021
  8895 0000F2E0 8305[AC940100]04    <1> 	add	dword [u.r0], 4 ; +4
  8896                              <1> m_pix_op_xor_32_1:
  8897 0000F2E7 83C704              <1> 	add	edi, 4 ; +4
  8898 0000F2EA E2E9                <1> 	loop	m_pix_op_xor_32_0
  8899 0000F2EC C3                  <1> 	retn
  8900                              <1> 
  8901                              <1> m_pix_op_xor_w:
  8902                              <1> 	; 06/02/2021
  8903                              <1> 	; XOR COLOR (MASKED, window)
  8904                              <1> 	;
  8905                              <1> 	; jump from pix_op_xor_w
  8906                              <1> 	;
  8907                              <1> 	; INPUT:
  8908                              <1> 	;   ecx = bytes per row (to be applied)
  8909                              <1> 	;   edx = screen width in bytes
  8910                              <1> 	;   ebx = row count
  8911                              <1> 	;   eax = color
  8912                              <1> 	;
  8913                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8914                              <1> 	;
  8915                              <1> 	; OUTPUT:
  8916                              <1> 	; 	[u.r0] will be > 0 if succesful
  8917                              <1> 
  8918                              <1> 	; window
  8919                              <1> 	;mov	edi, [v_str] ; LFB start address
  8920                              <1> 	;mov	esi, edi 
  8921                              <1> 
  8922 0000F2ED 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8923 0000F2F4 7707                <1> 	ja	short m_pix_op_xor_w_1
  8924                              <1> 
  8925                              <1> 	; 256 colors (8bpp)
  8926 0000F2F6 BD[69F20000]        <1> 	mov	ebp, m_pix_op_xor_8
  8927 0000F2FB EB1E                <1> 	jmp	short m_pix_op_xor_w_4
  8928                              <1> 
  8929                              <1> m_pix_op_xor_w_1:
  8930 0000F2FD 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8931 0000F304 7710                <1> 	ja	short m_pix_op_xor_w_3 ; 32bpp
  8932 0000F306 7207                <1> 	jb	short m_pix_op_xor_w_2 ; 16bpp
  8933                              <1> 
  8934                              <1> 	; 24 bit true colors
  8935 0000F308 BD[8BF20000]        <1> 	mov	ebp, m_pix_op_xor_24
  8936 0000F30D EB0C                <1> 	jmp	short m_pix_op_xor_w_4
  8937                              <1> 
  8938                              <1> 	; 65536 colors (16bpp)
  8939                              <1> m_pix_op_xor_w_2:
  8940 0000F30F BD[B6F20000]        <1> 	mov	ebp, m_pix_op_xor_16
  8941 0000F314 EB05                <1> 	jmp	short m_pix_op_xor_w_4
  8942                              <1> 
  8943                              <1> 	; 32 bit true colors
  8944                              <1> m_pix_op_xor_w_3:
  8945 0000F316 BD[D3F20000]        <1> 	mov	ebp, m_pix_op_xor_32
  8946                              <1> m_pix_op_xor_w_4:
  8947 0000F31B E917FBFFFF          <1> 	jmp	m_pix_op_xor_w_x
  8948                              <1> 
  8949                              <1> m_pix_op_not:
  8950                              <1> 	; 06/02/2021
  8951                              <1> 	; NOT COLOR (MASKED, full screen)
  8952                              <1> 	;
  8953                              <1> 	; jump from pix_op_not
  8954                              <1> 	;
  8955                              <1> 	; INPUT:
  8956                              <1> 	;   ecx = [v_siz] ; display page pixel count
  8957                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  8958                              <1> 	;
  8959                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8960                              <1> 	;
  8961                              <1> 	; OUTPUT:
  8962                              <1> 	; 	[u.r0] will be > 0 if succesful
  8963                              <1> 
  8964                              <1> 	; Full screen
  8965                              <1> m_pix_op_not_0:
  8966 0000F320 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8967 0000F327 7715                <1> 	ja	short m_pix_op_not_1
  8968                              <1> 	; 256 colors (8bpp)
  8969                              <1> 	;jmp	short m_pix_op_not_8
  8970                              <1> m_pix_op_not_8:
  8971                              <1> 	; 8 bit colors (256 colors)
  8972 0000F329 AC                  <1> 	lodsb 
  8973 0000F32A 3A05[E2A30100]      <1> 	cmp	al, [maskcolor]
  8974 0000F330 7408                <1> 	je	short m_pix_op_not_8_1 ; exclude
  8975 0000F332 F617                <1> 	not	byte [edi]
  8976 0000F334 FF05[AC940100]      <1> 	inc	dword [u.r0] ; +1
  8977                              <1> m_pix_op_not_8_1:
  8978 0000F33A 47                  <1> 	inc	edi
  8979 0000F33B E2EC                <1> 	loop	m_pix_op_not_8
  8980 0000F33D C3                  <1> 	retn
  8981                              <1> m_pix_op_not_1:
  8982 0000F33E 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8983 0000F345 7746                <1> 	ja	short m_pix_op_not_3 ; 32bpp
  8984 0000F347 7229                <1> 	jb	short m_pix_op_not_2 ; 16bpp
  8985                              <1> 	; 24 bit true colors
  8986                              <1> 	;jmp	short m_pix_op_not_24
  8987                              <1> m_pix_op_not_24:
  8988                              <1> 	; 24 bit true colors
  8989 0000F349 66AD                <1> 	lodsw
  8990 0000F34B C1E010              <1> 	shl	eax, 16
  8991 0000F34E AC                  <1> 	lodsb
  8992 0000F34F C1C010              <1> 	rol	eax, 16	
  8993 0000F352 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  8994 0000F358 7412                <1> 	je	short m_pix_op_not_24_1 ; exclude
  8995 0000F35A F7D0                <1> 	not	eax
  8996 0000F35C 668907              <1> 	mov	[edi], ax
  8997 0000F35F C1E810              <1> 	shr	eax, 16
  8998 0000F362 884702              <1> 	mov	[edi+2], al
  8999 0000F365 8305[AC940100]03    <1> 	add	dword [u.r0], 3 ; +3
  9000                              <1> m_pix_op_not_24_1:
  9001 0000F36C 83C703              <1> 	add	edi, 3 ; +3
  9002 0000F36F E2D8                <1> 	loop	m_pix_op_not_24
  9003 0000F371 C3                  <1> 	retn
  9004                              <1> 	; 65536 colors (16bpp)
  9005                              <1> m_pix_op_not_2:
  9006                              <1> 	;jmp	short m_pix_op_not_16
  9007                              <1> m_pix_op_not_16:
  9008                              <1> 	; 16 bit colors (65536 colors)
  9009 0000F372 66AD                <1> 	lodsw
  9010 0000F374 663B05[E2A30100]    <1> 	cmp	ax, [maskcolor]
  9011 0000F37B 740A                <1> 	je	short m_pix_op_not_16_1 ; exclude
  9012 0000F37D 66F717              <1> 	not	word [edi]
  9013 0000F380 8305[AC940100]02    <1> 	add	dword [u.r0], 2 ; +2
  9014                              <1> m_pix_op_not_16_1:
  9015 0000F387 83C702              <1> 	add	edi, 2 ; +2
  9016 0000F38A E2E6                <1> 	loop	m_pix_op_not_16
  9017 0000F38C C3                  <1> 	retn
  9018                              <1> m_pix_op_not_3:
  9019                              <1> 	; 32 bit true colors
  9020                              <1> 	;jmp	short m_pix_op_not_32
  9021                              <1> m_pix_op_not_32:
  9022                              <1> 	; 32 bit true colors
  9023 0000F38D AD                  <1> 	lodsd 
  9024 0000F38E 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  9025 0000F394 7409                <1> 	je	short m_pix_op_not_32_1 ; exclude
  9026 0000F396 F717                <1> 	not	dword [edi]	
  9027 0000F398 8305[AC940100]04    <1> 	add	dword [u.r0], 4 ; +4
  9028                              <1> m_pix_op_not_32_1:
  9029 0000F39F 83C704              <1> 	add	edi, 4 ; +4
  9030 0000F3A2 E2E9                <1> 	loop	m_pix_op_not_32
  9031 0000F3A4 C3                  <1> 	retn
  9032                              <1> 
  9033                              <1> m_pix_op_not_w:
  9034                              <1> 	; 06/02/2021
  9035                              <1> 	; NOT COLOR (MASKED, window)
  9036                              <1> 	;
  9037                              <1> 	; jump from pix_op_not_w
  9038                              <1> 	;
  9039                              <1> 	; INPUT:
  9040                              <1> 	;   ecx = bytes per row (to be applied)
  9041                              <1> 	;   edx = screen width in bytes
  9042                              <1> 	;   ebx = row count
  9043                              <1> 	;
  9044                              <1> 	;   [maskcolor] = mask color (to be excluded)
  9045                              <1> 	;
  9046                              <1> 	; OUTPUT:
  9047                              <1> 	; 	[u.r0] will be > 0 if succesful
  9048                              <1> 
  9049                              <1> 	; window
  9050                              <1> 	;mov	edi, [v_str] ; LFB start address
  9051                              <1> 	;mov	esi, edi 
  9052                              <1> 
  9053 0000F3A5 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  9054 0000F3AC 7707                <1> 	ja	short m_pix_op_not_w_1
  9055                              <1> 
  9056                              <1> 	; 256 colors (8bpp)
  9057 0000F3AE BD[29F30000]        <1> 	mov	ebp, m_pix_op_not_8
  9058 0000F3B3 EB1E                <1> 	jmp	short m_pix_op_not_w_4
  9059                              <1> 
  9060                              <1> m_pix_op_not_w_1:
  9061 0000F3B5 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  9062 0000F3BC 7710                <1> 	ja	short m_pix_op_not_w_3 ; 32bpp
  9063 0000F3BE 7207                <1> 	jb	short m_pix_op_not_w_2 ; 16bpp
  9064                              <1> 
  9065                              <1> 	; 24 bit true colors
  9066 0000F3C0 BD[49F30000]        <1> 	mov	ebp, m_pix_op_not_24
  9067 0000F3C5 EB0C                <1> 	jmp	short m_pix_op_not_w_4
  9068                              <1> 
  9069                              <1> 	; 65536 colors (16bpp)
  9070                              <1> m_pix_op_not_w_2:
  9071 0000F3C7 BD[72F30000]        <1> 	mov	ebp, m_pix_op_not_16
  9072 0000F3CC EB05                <1> 	jmp	short m_pix_op_not_w_4
  9073                              <1> 
  9074                              <1> 	; 32 bit true colors
  9075                              <1> m_pix_op_not_w_3:
  9076 0000F3CE BD[8DF30000]        <1> 	mov	ebp, m_pix_op_not_32
  9077                              <1> m_pix_op_not_w_4:
  9078 0000F3D3 E95FFAFFFF          <1> 	jmp	m_pix_op_not_w_x
  9079                              <1> 
  9080                              <1> m_pix_op_neg:
  9081                              <1> 	; 06/02/2021
  9082                              <1> 	; NEGATIVE COLOR (MASKED, full screen)
  9083                              <1> 	;
  9084                              <1> 	; jump from pix_op_neg
  9085                              <1> 	;
  9086                              <1> 	; INPUT:
  9087                              <1> 	;   ecx = [v_siz] ; display page pixel count
  9088                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  9089                              <1> 	;
  9090                              <1> 	;   [maskcolor] = mask color (to be excluded)
  9091                              <1> 	;
  9092                              <1> 	; OUTPUT:
  9093                              <1> 	; 	[u.r0] will be > 0 if succesful
  9094                              <1> 
  9095                              <1> 	; Full screen
  9096                              <1> m_pix_op_neg_0:
  9097 0000F3D8 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  9098 0000F3DF 7715                <1> 	ja	short m_pix_op_neg_1
  9099                              <1> 	; 256 colors (8bpp)
  9100                              <1> 	;jmp	short m_pix_op_neg_8
  9101                              <1> m_pix_op_neg_8:
  9102                              <1> 	; 8 bit colors (256 colors)
  9103 0000F3E1 AC                  <1> 	lodsb 
  9104 0000F3E2 3A05[E2A30100]      <1> 	cmp	al, [maskcolor]
  9105 0000F3E8 7408                <1> 	je	short m_pix_op_neg_8_1 ; exclude
  9106 0000F3EA F61F                <1> 	neg	byte [edi]
  9107 0000F3EC FF05[AC940100]      <1> 	inc	dword [u.r0] ; +1
  9108                              <1> m_pix_op_neg_8_1:
  9109 0000F3F2 47                  <1> 	inc	edi
  9110 0000F3F3 E2EC                <1> 	loop	m_pix_op_neg_8
  9111 0000F3F5 C3                  <1> 	retn
  9112                              <1> m_pix_op_neg_1:
  9113 0000F3F6 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  9114 0000F3FD 7746                <1> 	ja	short m_pix_op_neg_3 ; 32bpp
  9115 0000F3FF 7229                <1> 	jb	short m_pix_op_neg_2 ; 16bpp
  9116                              <1> 	; 24 bit true colors
  9117                              <1> 	;jmp	short m_pix_op_neg_24
  9118                              <1> m_pix_op_neg_24:
  9119                              <1> 	; 24 bit true colors
  9120 0000F401 66AD                <1> 	lodsw
  9121 0000F403 C1E010              <1> 	shl	eax, 16
  9122 0000F406 AC                  <1> 	lodsb
  9123 0000F407 C1C010              <1> 	rol	eax, 16	
  9124 0000F40A 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  9125 0000F410 7412                <1> 	je	short m_pix_op_neg_24_1 ; exclude
  9126 0000F412 F7D8                <1> 	neg	eax
  9127 0000F414 668907              <1> 	mov	[edi], ax
  9128 0000F417 C1E810              <1> 	shr	eax, 16
  9129 0000F41A 884702              <1> 	mov	[edi+2], al
  9130 0000F41D 8305[AC940100]03    <1> 	add	dword [u.r0], 3 ; +3
  9131                              <1> m_pix_op_neg_24_1:
  9132 0000F424 83C703              <1> 	add	edi, 3 ; +3
  9133 0000F427 E2D8                <1> 	loop	m_pix_op_neg_24
  9134 0000F429 C3                  <1> 	retn
  9135                              <1> 	; 65536 colors (16bpp)
  9136                              <1> m_pix_op_neg_2:
  9137                              <1> 	;jmp	short m_pix_op_neg_16
  9138                              <1> m_pix_op_neg_16:
  9139                              <1> 	; 16 bit colors (65536 colors)
  9140 0000F42A 66AD                <1> 	lodsw
  9141 0000F42C 663B05[E2A30100]    <1> 	cmp	ax, [maskcolor]
  9142 0000F433 740A                <1> 	je	short m_pix_op_neg_16_1 ; exclude
  9143 0000F435 66F71F              <1> 	neg	word [edi]
  9144 0000F438 8305[AC940100]02    <1> 	add	dword [u.r0], 2 ; +2
  9145                              <1> m_pix_op_neg_16_1:
  9146 0000F43F 83C702              <1> 	add	edi, 2 ; +2
  9147 0000F442 E2E6                <1> 	loop	m_pix_op_neg_16
  9148 0000F444 C3                  <1> 	retn
  9149                              <1> m_pix_op_neg_3:
  9150                              <1> 	; 32 bit true colors
  9151                              <1> 	;jmp	short m_pix_op_neg_32
  9152                              <1> m_pix_op_neg_32:
  9153                              <1> 	; 32 bit true colors
  9154 0000F445 AD                  <1> 	lodsd 
  9155 0000F446 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  9156 0000F44C 7409                <1> 	je	short m_pix_op_neg_32_1 ; exclude
  9157 0000F44E F71F                <1> 	neg	dword [edi]
  9158 0000F450 8305[AC940100]04    <1> 	add	dword [u.r0], 4 ; +4
  9159                              <1> m_pix_op_neg_32_1:
  9160 0000F457 83C704              <1> 	add	edi, 4 ; +4
  9161 0000F45A E2E9                <1> 	loop	m_pix_op_neg_32
  9162 0000F45C C3                  <1> 	retn
  9163                              <1> 
  9164                              <1> m_pix_op_neg_w:
  9165                              <1> 	; 06/02/2021
  9166                              <1> 	; NEGATIVE COLOR (MASKED, window)
  9167                              <1> 	;
  9168                              <1> 	; jump from pix_op_neg_w
  9169                              <1> 	;
  9170                              <1> 	; INPUT:
  9171                              <1> 	;   ecx = bytes per row (to be applied)
  9172                              <1> 	;   edx = screen width in bytes
  9173                              <1> 	;   ebx = row count
  9174                              <1> 	;
  9175                              <1> 	;   [maskcolor] = mask color (to be excluded)
  9176                              <1> 	;
  9177                              <1> 	; OUTPUT:
  9178                              <1> 	; 	[u.r0] will be > 0 if succesful
  9179                              <1> 
  9180                              <1> 	; window
  9181                              <1> 	;mov	edi, [v_str] ; LFB start address
  9182                              <1> 	;mov	esi, edi 
  9183                              <1> 
  9184 0000F45D 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  9185 0000F464 7707                <1> 	ja	short m_pix_op_neg_w_1
  9186                              <1> 
  9187                              <1> 	; 256 colors (8bpp)
  9188 0000F466 BD[E1F30000]        <1> 	mov	ebp, m_pix_op_neg_8
  9189 0000F46B EB1E                <1> 	jmp	short m_pix_op_neg_w_4
  9190                              <1> 			
  9191                              <1> m_pix_op_neg_w_1:
  9192 0000F46D 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  9193 0000F474 7710                <1> 	ja	short m_pix_op_neg_w_3 ; 32bpp
  9194 0000F476 7207                <1> 	jb	short m_pix_op_neg_w_2 ; 16bpp
  9195                              <1> 
  9196                              <1> 	; 24 bit true colors
  9197 0000F478 BD[01F40000]        <1> 	mov	ebp, m_pix_op_neg_24
  9198 0000F47D EB0C                <1> 	jmp	short m_pix_op_neg_w_4
  9199                              <1> 
  9200                              <1> 	; 65536 colors (16bpp)
  9201                              <1> m_pix_op_neg_w_2:
  9202 0000F47F BD[2AF40000]        <1> 	mov	ebp, m_pix_op_neg_16
  9203 0000F484 EB05                <1> 	jmp	short m_pix_op_neg_w_4
  9204                              <1> 
  9205                              <1> 	; 32 bit true colors
  9206                              <1> m_pix_op_neg_w_3:
  9207 0000F486 BD[45F40000]        <1> 	mov	ebp, m_pix_op_neg_32
  9208                              <1> m_pix_op_neg_w_4:
  9209 0000F48B E9A7F9FFFF          <1> 	jmp	m_pix_op_neg_w_x
  9210                              <1> 
  9211                              <1> m_pix_op_inc:
  9212                              <1> 	; 06/02/2021
  9213                              <1> 	; INCREASE COLOR (MASKED, full screen)
  9214                              <1> 	;
  9215                              <1> 	; jump from pix_op_inc
  9216                              <1> 	;
  9217                              <1> 	; INPUT:
  9218                              <1> 	;   ecx = [v_siz] ; display page pixel count
  9219                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  9220                              <1> 	;
  9221                              <1> 	;   [maskcolor] = mask color (to be excluded)
  9222                              <1> 	;
  9223                              <1> 	; OUTPUT:
  9224                              <1> 	; 	[u.r0] will be > 0 if succesful
  9225                              <1> 
  9226                              <1> 	; Full screen
  9227                              <1> m_pix_op_inc_0:
  9228 0000F490 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  9229 0000F497 7719                <1> 	ja	short m_pix_op_inc_1
  9230                              <1> 	; 256 colors (8bpp)
  9231                              <1> 	;jmp	short m_pix_op_inc_8
  9232                              <1> m_pix_op_inc_8:
  9233                              <1> 	; 8 bit colors (256 colors)
  9234 0000F499 AC                  <1> 	lodsb
  9235 0000F49A 3A05[E2A30100]      <1> 	cmp	al, [maskcolor]
  9236 0000F4A0 740C                <1> 	je	short m_pix_op_inc_8_1 ; exclude
  9237 0000F4A2 FE07                <1> 	inc	byte [edi]
  9238 0000F4A4 7502                <1> 	jnz	short m_pix_op_inc_8_0
  9239 0000F4A6 FE0F                <1> 	dec	byte [edi]
  9240                              <1> m_pix_op_inc_8_0:
  9241 0000F4A8 FF05[AC940100]      <1> 	inc	dword [u.r0] ; +1
  9242                              <1> m_pix_op_inc_8_1:
  9243 0000F4AE 47                  <1> 	inc	edi
  9244 0000F4AF E2E8                <1> 	loop	m_pix_op_inc_8
  9245 0000F4B1 C3                  <1> 	retn
  9246                              <1> m_pix_op_inc_1:
  9247 0000F4B2 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  9248 0000F4B9 7752                <1> 	ja	short m_pix_op_inc_3 ; 32bpp
  9249 0000F4BB 7230                <1> 	jb	short m_pix_op_inc_2 ; 16bpp
  9250                              <1> 	; 24 bit true colors
  9251                              <1> 	;jmp	short m_pix_op_inc_24
  9252                              <1> m_pix_op_inc_24:
  9253                              <1> 	; 24 bit true colors
  9254 0000F4BD 66AD                <1> 	lodsw
  9255 0000F4BF C1E010              <1> 	shl	eax, 16
  9256 0000F4C2 AC                  <1> 	lodsb
  9257 0000F4C3 C1C010              <1> 	rol	eax, 16	
  9258 0000F4C6 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  9259 0000F4CC 7419                <1> 	je	short m_pix_op_inc_24_1 ; exclude
  9260 0000F4CE 40                  <1> 	inc	eax
  9261 0000F4CF 3DFFFFFF00          <1> 	cmp	eax, 0FFFFFFh
  9262 0000F4D4 7601                <1> 	jna	short m_pix_op_inc_24_0
  9263 0000F4D6 48                  <1> 	dec	eax
  9264                              <1> m_pix_op_inc_24_0:
  9265 0000F4D7 668907              <1> 	mov	[edi], ax
  9266 0000F4DA C1E810              <1> 	shr	eax, 16
  9267 0000F4DD 884702              <1> 	mov	[edi+2], al
  9268 0000F4E0 8305[AC940100]03    <1> 	add	dword [u.r0], 3 ; +3
  9269                              <1> m_pix_op_inc_24_1:
  9270 0000F4E7 83C703              <1> 	add	edi, 3 ; +3
  9271 0000F4EA E2D1                <1> 	loop	m_pix_op_inc_24
  9272 0000F4EC C3                  <1> 	retn
  9273                              <1> 	; 65536 colors (16bpp)
  9274                              <1> m_pix_op_inc_2:
  9275                              <1> 	;jmp	short m_pix_op_inc_16
  9276                              <1> m_pix_op_inc_16:
  9277                              <1> 	; 16 bit colors (65536 colors)
  9278 0000F4ED 66AD                <1> 	lodsw
  9279 0000F4EF 663B05[E2A30100]    <1> 	cmp	ax, [maskcolor]
  9280 0000F4F6 740F                <1> 	je	short m_pix_op_inc_16_1 ; exclude
  9281 0000F4F8 66FF07              <1> 	inc	word [edi]
  9282 0000F4FB 7503                <1> 	jnz	short m_pix_op_inc_16_0
  9283 0000F4FD 66FF0F              <1> 	dec	word [edi]
  9284                              <1> m_pix_op_inc_16_0:
  9285 0000F500 8305[AC940100]02    <1> 	add	dword [u.r0], 2 ; +2
  9286                              <1> m_pix_op_inc_16_1:
  9287 0000F507 83C702              <1> 	add	edi, 2 ; +2
  9288 0000F50A E2E1                <1> 	loop	m_pix_op_inc_16
  9289 0000F50C C3                  <1> 	retn
  9290                              <1> m_pix_op_inc_3:
  9291                              <1> 	; 32 bit true colors
  9292                              <1> 	;jmp	short m_pix_op_inc_32
  9293                              <1> m_pix_op_inc_32:
  9294                              <1> 	; 32 bit true colors
  9295 0000F50D AD                  <1> 	lodsd
  9296 0000F50E 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  9297 0000F514 740D                <1> 	je	short m_pix_op_inc_32_1 ; exclude
  9298 0000F516 FF07                <1> 	inc	dword [edi]
  9299 0000F518 7502                <1> 	jnz	short m_pix_op_inc_32_0
  9300 0000F51A FF0F                <1> 	dec	dword [edi]
  9301                              <1> m_pix_op_inc_32_0:
  9302 0000F51C 8305[AC940100]04    <1> 	add	dword [u.r0], 4 ; +4
  9303                              <1> m_pix_op_inc_32_1:
  9304 0000F523 83C704              <1> 	add	edi, 4 ; +4
  9305 0000F526 E2E5                <1> 	loop	m_pix_op_inc_32
  9306 0000F528 C3                  <1> 	retn
  9307                              <1> 
  9308                              <1> m_pix_op_inc_w:
  9309                              <1> 	; 06/02/2021
  9310                              <1> 	; INCREASE COLOR (MASKED, window)
  9311                              <1> 	;
  9312                              <1> 	; jump from pix_op_inc_w
  9313                              <1> 	;
  9314                              <1> 	; INPUT:
  9315                              <1> 	;   ecx = bytes per row (to be applied)
  9316                              <1> 	;   edx = screen width in bytes
  9317                              <1> 	;   ebx = row count
  9318                              <1> 	;
  9319                              <1> 	;   [maskcolor] = mask color (to be excluded)
  9320                              <1> 	;
  9321                              <1> 	; OUTPUT:
  9322                              <1> 	; 	[u.r0] will be > 0 if succesful
  9323                              <1> 
  9324                              <1> 	; window
  9325                              <1> 	;mov	edi, [v_str] ; LFB start address
  9326                              <1> 	;mov	esi, edi 
  9327                              <1> 
  9328 0000F529 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  9329 0000F530 7707                <1> 	ja	short m_pix_op_inc_w_1
  9330                              <1> 
  9331                              <1> 	; 256 colors (8bpp)
  9332 0000F532 BD[99F40000]        <1> 	mov	ebp, m_pix_op_inc_8
  9333 0000F537 EB1E                <1> 	jmp	short m_pix_op_inc_w_4
  9334                              <1> 
  9335                              <1> m_pix_op_inc_w_1:
  9336 0000F539 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  9337 0000F540 7710                <1> 	ja	short m_pix_op_inc_w_3 ; 32bpp
  9338 0000F542 7207                <1> 	jb	short m_pix_op_inc_w_2 ; 16bpp
  9339                              <1> 
  9340                              <1> 	; 24 bit true colors
  9341 0000F544 BD[BDF40000]        <1> 	mov	ebp, m_pix_op_inc_24
  9342 0000F549 EB0C                <1> 	jmp	short m_pix_op_inc_w_4
  9343                              <1> 
  9344                              <1> 	; 65536 colors (16bpp)
  9345                              <1> m_pix_op_inc_w_2:
  9346 0000F54B BD[EDF40000]        <1> 	mov	ebp, m_pix_op_inc_16
  9347 0000F550 EB05                <1> 	jmp	short m_pix_op_inc_w_4
  9348                              <1> 
  9349                              <1> 	; 32 bit true colors
  9350                              <1> m_pix_op_inc_w_3:
  9351 0000F552 BD[0DF50000]        <1> 	mov	ebp, m_pix_op_inc_32
  9352                              <1> m_pix_op_inc_w_4:
  9353 0000F557 E9DBF8FFFF          <1> 	jmp	m_pix_op_inc_w_x
  9354                              <1> 
  9355                              <1> m_pix_op_dec:
  9356                              <1> 	; 06/02/2021
  9357                              <1> 	; DECREASE COLOR (MASKED, full screen)
  9358                              <1> 	;
  9359                              <1> 	; jump from pix_op_dec
  9360                              <1> 	;
  9361                              <1> 	; INPUT:
  9362                              <1> 	;   ecx = [v_siz] ; display page pixel count
  9363                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  9364                              <1> 	;
  9365                              <1> 	;   [maskcolor] = mask color (to be excluded)
  9366                              <1> 	;
  9367                              <1> 	; OUTPUT:
  9368                              <1> 	; 	[u.r0] will be > 0 if succesful
  9369                              <1> 
  9370                              <1> 	; Full screen
  9371                              <1> m_pix_op_dec_0:
  9372 0000F55C 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  9373 0000F563 7719                <1> 	ja	short m_pix_op_dec_1
  9374                              <1> 	; 256 colors (8bpp)
  9375                              <1> 	;jmp	short m_pix_op_dec_8
  9376                              <1> m_pix_op_dec_8:
  9377                              <1> 	; 8 bit colors (256 colors)
  9378 0000F565 AC                  <1> 	lodsb 
  9379 0000F566 3A05[E2A30100]      <1> 	cmp	al, [maskcolor]
  9380 0000F56C 740C                <1> 	je	short m_pix_op_dec_8_1 ; exclude
  9381 0000F56E FE0F                <1> 	dec	byte [edi]
  9382 0000F570 7902                <1> 	jns	short m_pix_op_dec_8_0
  9383 0000F572 FE07                <1> 	inc	byte [edi]
  9384                              <1> m_pix_op_dec_8_0:
  9385 0000F574 FF05[AC940100]      <1> 	inc	dword [u.r0] ; +1
  9386                              <1> m_pix_op_dec_8_1:
  9387 0000F57A 47                  <1> 	inc	edi
  9388 0000F57B E2E8                <1> 	loop	m_pix_op_dec_8
  9389 0000F57D C3                  <1> 	retn
  9390                              <1> m_pix_op_dec_1:
  9391 0000F57E 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  9392 0000F585 774D                <1> 	ja	short m_pix_op_dec_3 ; 32bpp
  9393 0000F587 722B                <1> 	jb	short m_pix_op_dec_2 ; 16bpp
  9394                              <1> 	; 24 bit true colors
  9395                              <1> 	;jmp	short m_pix_op_dec_24
  9396                              <1> m_pix_op_dec_24:
  9397                              <1> 	; 24 bit true colors
  9398 0000F589 66AD                <1> 	lodsw
  9399 0000F58B C1E010              <1> 	shl	eax, 16
  9400 0000F58E AC                  <1> 	lodsb
  9401 0000F58F C1C010              <1> 	rol	eax, 16	
  9402 0000F592 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  9403 0000F598 7414                <1> 	je	short m_pix_op_dec_24_1 ; exclude
  9404 0000F59A 48                  <1> 	dec	eax
  9405 0000F59B 7901                <1> 	jns	short m_pix_op_dec_24_0
  9406 0000F59D 40                  <1> 	inc	eax 
  9407                              <1> m_pix_op_dec_24_0:
  9408 0000F59E 668907              <1> 	mov	[edi], ax
  9409 0000F5A1 C1E810              <1> 	shr	eax, 16
  9410 0000F5A4 884702              <1> 	mov	[edi+2], al
  9411 0000F5A7 8305[AC940100]03    <1> 	add	dword [u.r0], 3 ; +3
  9412                              <1> m_pix_op_dec_24_1:
  9413 0000F5AE 83C703              <1> 	add	edi, 3 ; +3
  9414 0000F5B1 E2D6                <1> 	loop	m_pix_op_dec_24
  9415 0000F5B3 C3                  <1> 	retn
  9416                              <1> 	; 65536 colors (16bpp)
  9417                              <1> m_pix_op_dec_2:
  9418                              <1> 	;jmp	short m_pix_op_dec_16
  9419                              <1> m_pix_op_dec_16:
  9420                              <1> 	; 16 bit colors (65536 colors)
  9421 0000F5B4 66AD                <1> 	lodsw
  9422 0000F5B6 663B05[E2A30100]    <1> 	cmp	ax, [maskcolor]
  9423 0000F5BD 740F                <1> 	je	short m_pix_op_dec_16_1 ; exclude
  9424 0000F5BF 66FF0F              <1> 	dec	word [edi]
  9425 0000F5C2 7903                <1> 	jns	short m_pix_op_dec_16_0
  9426 0000F5C4 66FF07              <1> 	inc	word [edi]
  9427                              <1> m_pix_op_dec_16_0:
  9428 0000F5C7 8305[AC940100]02    <1> 	add	dword [u.r0], 2 ; +2
  9429                              <1> m_pix_op_dec_16_1:
  9430 0000F5CE 83C702              <1> 	add	edi, 2 ; +2
  9431 0000F5D1 E2E1                <1> 	loop	m_pix_op_dec_16
  9432 0000F5D3 C3                  <1> 	retn
  9433                              <1> m_pix_op_dec_3:
  9434                              <1> 	; 32 bit true colors
  9435                              <1> 	;jmp	short m_pix_op_dec_32
  9436                              <1> m_pix_op_dec_32:
  9437                              <1> 	; 32 bit true colors
  9438 0000F5D4 AD                  <1> 	lodsd 
  9439 0000F5D5 3B05[E2A30100]      <1> 	cmp	eax, [maskcolor]
  9440 0000F5DB 740D                <1> 	je	short m_pix_op_dec_32_1 ; exclude
  9441 0000F5DD FF0F                <1> 	dec	dword [edi]
  9442 0000F5DF 7902                <1> 	jns	short m_pix_op_dec_32_0
  9443 0000F5E1 FF07                <1> 	inc	dword [edi]
  9444                              <1> m_pix_op_dec_32_0:
  9445 0000F5E3 8305[AC940100]04    <1> 	add	dword [u.r0], 4 ; +4
  9446                              <1> m_pix_op_dec_32_1:
  9447 0000F5EA 83C704              <1> 	add	edi, 4 ; +4
  9448 0000F5ED E2E5                <1> 	loop	m_pix_op_dec_32
  9449 0000F5EF C3                  <1> 	retn
  9450                              <1> 
  9451                              <1> m_pix_op_dec_w:
  9452                              <1> 	; 06/02/2021
  9453                              <1> 	; DECREASE COLOR (MASKED, window)
  9454                              <1> 	;
  9455                              <1> 	; jump from pix_op_dec_w
  9456                              <1> 	;
  9457                              <1> 	; INPUT:
  9458                              <1> 	;   ecx = bytes per row (to be applied)
  9459                              <1> 	;   edx = screen width in bytes
  9460                              <1> 	;   ebx = row count
  9461                              <1> 	;
  9462                              <1> 	;   [maskcolor] = mask color (to be excluded)
  9463                              <1> 	;
  9464                              <1> 	; OUTPUT:
  9465                              <1> 	; 	[u.r0] will be > 0 if succesful
  9466                              <1> 
  9467                              <1> 	; window
  9468                              <1> 	;mov	edi, [v_str] ; LFB start address
  9469                              <1> 	;mov	esi, edi 
  9470                              <1> 
  9471 0000F5F0 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  9472 0000F5F7 7707                <1> 	ja	short m_pix_op_dec_w_1
  9473                              <1> 
  9474                              <1> 	; 256 colors (8bpp)
  9475 0000F5F9 BD[65F50000]        <1> 	mov	ebp, m_pix_op_dec_8
  9476 0000F5FE EB1E                <1> 	jmp	short m_pix_op_dec_w_4
  9477                              <1> 
  9478                              <1> m_pix_op_dec_w_1:
  9479 0000F600 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  9480 0000F607 7710                <1> 	ja	short m_pix_op_dec_w_3 ; 32bpp
  9481 0000F609 7207                <1> 	jb	short m_pix_op_dec_w_2 ; 16bpp
  9482                              <1> 
  9483                              <1> 	; 24 bit true colors
  9484 0000F60B BD[89F50000]        <1> 	mov	ebp, m_pix_op_dec_24
  9485 0000F610 EB0C                <1> 	jmp	short m_pix_op_dec_w_4
  9486                              <1> 
  9487                              <1> 	; 65536 colors (16bpp)
  9488                              <1> m_pix_op_dec_w_2:
  9489 0000F612 BD[B4F50000]        <1> 	mov	ebp, m_pix_op_dec_16
  9490 0000F617 EB05                <1> 	jmp	short m_pix_op_dec_w_4
  9491                              <1> 
  9492                              <1> 	; 32 bit true colors
  9493                              <1> m_pix_op_dec_w_3:
  9494 0000F619 BD[D4F50000]        <1> 	mov	ebp, m_pix_op_dec_32
  9495                              <1> m_pix_op_dec_w_4:
  9496 0000F61E E914F8FFFF          <1> 	jmp	m_pix_op_dec_w_x
  9497                              <1> 
  9498                              <1> sysvideo_39:
  9499                              <1> 	; 15/02/2021
  9500                              <1> 	; 07/02/2021, 08/02/2021
  9501                              <1> 	; 03/01/2021, 04/01/2021
  9502                              <1> 	; 23/11/2020
  9503                              <1> 	; BH = 3
  9504                              <1> 	; PIXEL READ/WRITE
  9505                              <1> 	
  9506                              <1> 	; 07/02/2021
  9507                              <1> 	; 04/01/2021 (TRDOS 386 v2.0.3)
  9508 0000F623 80FB03              <1> 	cmp	bl, 3
  9509 0000F626 761A                <1> 	jna	short sysvideo_39_1
  9510                              <1> 	; 07/02/2021
  9511 0000F628 80FB06              <1> 	cmp	bl, 6
  9512 0000F62B 7705                <1> 	ja	short sysvideo_39_0
  9513 0000F62D E91A010000          <1> 	jmp	sysvideo_39_31
  9514                              <1> sysvideo_39_0:
  9515                              <1> 	; error
  9516 0000F632 B3FF                <1> 	mov	bl, 0FFh
  9517 0000F634 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
  9518 0000F63A 895D10              <1> 	mov	[ebp+16], ebx ; EBX
  9519 0000F63D E95ED8FFFF          <1> 	jmp	sysret
  9520                              <1> sysvideo_39_1:
  9521 0000F642 803D[DE670000]FF    <1> 	cmp	byte [CRT_MODE], 0FFh
  9522 0000F649 7312                <1> 	jnb	short sysvideo_39_2 ; SVGA (VESA VBE) video mode
  9523                              <1> 
  9524                              <1> 	; Std VGA or CGA mode
  9525 0000F64B 81C200000A00        <1> 	add	edx, 0A0000h
  9526 0000F651 72DF                <1> 	jc	short sysvideo_39_0
  9527 0000F653 81FAFFFF0A00        <1> 	cmp	edx, 0AFFFFh
  9528 0000F659 77D7                <1> 	ja	short sysvideo_39_0
  9529 0000F65B EB1E                <1> 	jmp	short sysvideo_39_3 ; 8bpp
  9530                              <1> 
  9531                              <1> sysvideo_39_2:
  9532                              <1> 	; use current vbe (svga) video mode
  9533                              <1> 
  9534                              <1> 	; get LFB address
  9535 0000F65D A1[74A30100]        <1> 	mov	eax, [LFB_ADDR] ; [LFB_Info+LFBINFO.LFB_addr]
  9536 0000F662 09C0                <1> 	or	eax, eax
  9537 0000F664 74CC                <1> 	jz	short sysvideo_39_0
  9538 0000F666 3B15[78A30100]      <1> 	cmp	edx, [LFB_SIZE] 
  9539 0000F66C 73C4                <1> 	jnb	short sysvideo_39_0
  9540                              <1> 
  9541 0000F66E 01C2                <1> 	add	edx, eax
  9542                              <1> 	;jc	short sysvideo_39_0
  9543                              <1> 
  9544                              <1> 	; Pixel read/write in VESA VBE (2/3) video mode
  9545                              <1> 	; Video memory at Linear Frame Buffer base address
  9546                              <1> 
  9547 0000F670 8A3D[80A30100]      <1> 	mov	bh, [LFB_Info+LFBINFO.bpp]
  9548                              <1> 
  9549 0000F676 80FF08              <1> 	cmp	bh, 8 ; 8bpp
  9550 0000F679 775D                <1> 	ja	short sysvideo_39_17
  9551                              <1> 
  9552                              <1> 	; 8 bits per pixel
  9553                              <1> sysvideo_39_3:
  9554 0000F67B 80FB01              <1> 	cmp	bl, 1 ; 1 = write pixel
  9555 0000F67E 7406                <1> 	je	short sysvideo_39_5
  9556 0000F680 7712                <1> 	ja	short sysvideo_39_8
  9557                              <1> sysvideo_39_4:
  9558                              <1> 	; read pixel (8bpp)
  9559 0000F682 8A02                <1> 	mov	al, [edx]
  9560                              <1> 	;mov	[u.r0], al
  9561                              <1> 	;jmp	sysret
  9562 0000F684 EB04                <1> 	jmp	short sysvideo_39_7
  9563                              <1> sysvideo_39_5:
  9564                              <1> 	; write pixel (8bpp)
  9565 0000F686 88C8                <1> 	mov	al, cl
  9566                              <1> sysvideo_39_6:
  9567 0000F688 8802                <1> 	mov	[edx], al
  9568                              <1> sysvideo_39_7:
  9569 0000F68A A2[AC940100]        <1> 	mov	[u.r0], al
  9570 0000F68F E90CD8FFFF          <1> 	jmp	sysret
  9571                              <1> sysvideo_39_8:
  9572 0000F694 80FB03              <1> 	cmp	bl, 3 ; mix
  9573 0000F697 7208                <1> 	jb	short sysvideo_39_9
  9574                              <1> 	; mix  pixel colors (8bpp)
  9575 0000F699 8A02                <1> 	mov	al, [edx]
  9576 0000F69B 00C8                <1> 	add	al, cl
  9577 0000F69D D0D8                <1> 	rcr	al, 1
  9578 0000F69F EBE7                <1> 	jmp	short sysvideo_39_6
  9579                              <1> sysvideo_39_9:
  9580                              <1> 	 ; swap pixel colors (8bpp)
  9581 0000F6A1 88C8                <1> 	mov	al, cl
  9582 0000F6A3 8602                <1> 	xchg	[edx], al
  9583 0000F6A5 EBE3                <1> 	jmp	short sysvideo_39_7
  9584                              <1> 
  9585                              <1> 	; 16 bits per pixel
  9586                              <1> sysvideo_39_10:
  9587 0000F6A7 80FB01              <1> 	cmp	bl, 1 ; 1 = write pixel
  9588 0000F6AA 7406                <1> 	je	short sysvideo_39_12
  9589 0000F6AC 7714                <1> 	ja	short sysvideo_39_15
  9590                              <1> sysvideo_39_11:
  9591                              <1> 	; read pixel (16bpp)
  9592 0000F6AE 8B02                <1> 	mov	eax, [edx]
  9593                              <1> 	;mov	[u.r0], ax
  9594                              <1> 	;jmp	sysret
  9595 0000F6B0 EB05                <1> 	jmp	short sysvideo_39_14
  9596                              <1> sysvideo_39_12:
  9597                              <1> 	; write pixel (16bpp)
  9598 0000F6B2 89C8                <1> 	mov	eax, ecx
  9599                              <1> sysvideo_39_13:
  9600 0000F6B4 668902              <1> 	mov	[edx], ax
  9601                              <1> sysvideo_39_14:
  9602 0000F6B7 66A3[AC940100]      <1> 	mov	[u.r0], ax
  9603 0000F6BD E9DED7FFFF          <1> 	jmp	sysret
  9604                              <1> sysvideo_39_15:
  9605 0000F6C2 80FB03              <1> 	cmp	bl, 3 ; mix
  9606 0000F6C5 720A                <1> 	jb	short sysvideo_39_16
  9607                              <1> 	; mix  pixel colors (16bpp)
  9608 0000F6C7 8B02                <1> 	mov	eax, [edx]
  9609 0000F6C9 6601C8              <1> 	add	ax, cx
  9610 0000F6CC 66D1D8              <1> 	rcr	ax, 1
  9611 0000F6CF EBE3                <1> 	jmp	short sysvideo_39_13
  9612                              <1> sysvideo_39_16:
  9613                              <1> 	 ; swap pixel colors (16bpp)
  9614 0000F6D1 89C8                <1> 	mov	eax, ecx
  9615 0000F6D3 668702              <1> 	xchg	[edx], ax
  9616 0000F6D6 EBDF                <1> 	jmp	short sysvideo_39_14
  9617                              <1> sysvideo_39_17:
  9618 0000F6D8 80FF18              <1> 	cmp	bh, 24
  9619 0000F6DB 7743                <1> 	ja	short sysvideo_39_24
  9620 0000F6DD 72C8                <1> 	jb	short sysvideo_39_10  
  9621                              <1> 	
  9622                              <1> 	; 24 bits per pixel
  9623 0000F6DF 81E1FFFFFF00        <1> 	and	ecx, 0FFFFFFh
  9624 0000F6E5 80FB01              <1> 	cmp	bl, 1 ; 1 = write pixel
  9625 0000F6E8 7406                <1> 	je	short sysvideo_39_19
  9626 0000F6EA 7712                <1> 	ja	short sysvideo_39_22
  9627                              <1> sysvideo_39_18:
  9628                              <1> 	; read pixel (24bpp)
  9629 0000F6EC 8B02                <1> 	mov	eax, [edx]
  9630                              <1> 	;and	eax, 0FFFFFFh
  9631                              <1> 	;mov	[u.r0], eax
  9632                              <1> 	;jmp	sysret
  9633 0000F6EE EB04                <1> 	jmp	short sysvideo_39_21
  9634                              <1> sysvideo_39_19:
  9635                              <1> 	; write pixel (24bpp)
  9636 0000F6F0 89C8                <1> 	mov	eax, ecx
  9637                              <1> sysvideo_39_20:
  9638                              <1> 	;and	eax, 0FFFFFFh
  9639 0000F6F2 8902                <1> 	mov	[edx], eax
  9640                              <1> sysvideo_39_21:
  9641 0000F6F4 A3[AC940100]        <1> 	mov	[u.r0], eax
  9642 0000F6F9 E9A2D7FFFF          <1> 	jmp	sysret
  9643                              <1> sysvideo_39_22:
  9644 0000F6FE 80FB03              <1> 	cmp	bl, 3 ; mix
  9645 0000F701 720D                <1> 	jb	short sysvideo_39_23
  9646                              <1> 	; mix  pixel colors (24bpp)
  9647 0000F703 8B02                <1> 	mov	eax, [edx]
  9648 0000F705 25FFFFFF00          <1> 	and	eax, 0FFFFFFh
  9649                              <1> 	;and	ecx, 0FFFFFFh
  9650 0000F70A 01C8                <1> 	add	eax, ecx
  9651 0000F70C D1D8                <1> 	rcr	eax, 1
  9652 0000F70E EBE2                <1> 	jmp	short sysvideo_39_20
  9653                              <1> sysvideo_39_23:
  9654                              <1> 	 ; swap pixel colors (24bpp)
  9655 0000F710 89C8                <1> 	mov	eax, ecx
  9656                              <1> 	;and	eax, 0FFFFFFh
  9657 0000F712 668702              <1> 	xchg	[edx], ax
  9658 0000F715 C1C810              <1> 	ror	eax, 16
  9659 0000F718 884202              <1> 	mov	[edx+2], al
  9660 0000F71B C1C010              <1> 	rol	eax, 16
  9661 0000F71E EBD4                <1> 	jmp	short sysvideo_39_21
  9662                              <1> 
  9663                              <1> 	; 32 bits per pixel
  9664                              <1> sysvideo_39_24:
  9665 0000F720 80FB01              <1> 	cmp	bl, 1 ; 1 = write pixel
  9666 0000F723 7406                <1> 	je	short sysvideo_39_26
  9667 0000F725 7712                <1> 	ja	short sysvideo_39_29
  9668                              <1> sysvideo_39_25:
  9669                              <1> 	; read pixel (32bpp)
  9670 0000F727 8B02                <1> 	mov	eax, [edx]
  9671                              <1> 	;mov	[u.r0], eax
  9672                              <1> 	;jmp	sysret
  9673 0000F729 EB04                <1> 	jmp	short sysvideo_39_28
  9674                              <1> sysvideo_39_26:
  9675                              <1> 	; write pixel (32bpp)
  9676 0000F72B 89C8                <1> 	mov	eax, ecx
  9677                              <1> sysvideo_39_27:
  9678 0000F72D 8902                <1> 	mov	[edx], eax
  9679                              <1> sysvideo_39_28:
  9680 0000F72F A3[AC940100]        <1> 	mov	[u.r0], eax
  9681 0000F734 E967D7FFFF          <1> 	jmp	sysret
  9682                              <1> sysvideo_39_29:
  9683 0000F739 80FB03              <1> 	cmp	bl, 3 ; mix
  9684 0000F73C 7208                <1> 	jb	short sysvideo_39_30
  9685                              <1> 	; mix  pixel colors (32bpp)
  9686 0000F73E 8B02                <1> 	mov	eax, [edx]
  9687 0000F740 01C8                <1> 	add	eax, ecx
  9688 0000F742 D1D8                <1> 	rcr	eax, 1
  9689 0000F744 EBE7                <1> 	jmp	short sysvideo_39_27
  9690                              <1> sysvideo_39_30:
  9691                              <1> 	 ; swap pixel colors (32bpp)
  9692 0000F746 89C8                <1> 	mov	eax, ecx
  9693 0000F748 8702                <1> 	xchg	[edx], eax
  9694 0000F74A EBE3                <1> 	jmp	short sysvideo_39_28
  9695                              <1> 
  9696                              <1> sysvideo_39_31:
  9697                              <1> 	; 06/03/2021
  9698                              <1> 	; 08/02/2021
  9699                              <1> 	; 07/02/2021
  9700                              <1> 	; BL = 4 -> read pixels from user defined positions
  9701                              <1> 	; BL = 5 -> write single color pixels to user defined pos.
  9702                              <1> 	; BL = 6 -> write multi color pixels to user defined pos.
  9703                              <1> 	; ECX = color (CL, CX, ECX)
  9704                              <1> 	; EDX = number of pixels
  9705                              <1> 	; ESI = user buffer contains dword pixel positions
  9706                              <1> 	;	 (and dword colors for BL input = 6)
  9707                              <1> 	; EDI = user's pixel color buff (destination) for BL = 4
  9708                              <1> 
  9709 0000F74C 890D[E2A30100]      <1> 	mov	[maskcolor], ecx
  9710 0000F752 89D5                <1> 	mov	ebp, edx ; number of pixels    
  9711 0000F754 803D[DE670000]FF    <1> 	cmp	byte [CRT_MODE], 0FFh ; SVGA flag
  9712 0000F75B 7317                <1> 	jnb	short sysvideo_39_33 ; SVGA (VESA VBE mode)
  9713                              <1> 	; Standard VGA mode
  9714 0000F75D B900000100          <1> 	mov	ecx, 65536 ; Video page size (maximum)
  9715 0000F762 39CA                <1> 	cmp	edx, ecx
  9716 0000F764 7709                <1> 	ja	short sysvideo_39_32 ; abnormal value !
  9717 0000F766 B800000A00          <1> 	mov	eax, 0A0000h ; Video page start address
  9718 0000F76B B708                <1> 	mov	bh, 8  ; 8 bits per pixel (256 colors)
  9719 0000F76D EB35                <1> 	jmp	short sysvideo_39_34
  9720                              <1> sysvideo_39_32:
  9721                              <1> 	; nonsense! (edx has abnormal value)
  9722 0000F76F E92CD7FFFF          <1> 	jmp	sysret
  9723                              <1> sysvideo_39_33:
  9724                              <1> 	; 06/03/2021
  9725 0000F774 8A3D[80A30100]      <1> 	mov	bh, [LFB_Info+LFBINFO.bpp]
  9726 0000F77A 80FF08              <1> 	cmp	bh, 8
  9727 0000F77D 7412                <1> 	je	short sysvideo_39_81 ; 8bpp
  9728 0000F77F 89D0                <1> 	mov	eax, edx
  9729 0000F781 80FF10              <1> 	cmp	bh, 16
  9730 0000F784 7409                <1> 	je	short sysvideo_39_80 ; 16bpp
  9731 0000F786 D1E2                <1> 	shl	edx, 1
  9732 0000F788 80FF20              <1> 	cmp	bh, 32
  9733 0000F78B 7502                <1> 	jne	short sysvideo_39_80 ; 24bpp
  9734 0000F78D D1E0                <1> 	shl	eax, 1
  9735                              <1> sysvideo_39_80:
  9736 0000F78F 01C2                <1> 	add	edx, eax
  9737                              <1> 	; edx = number of bytes
  9738                              <1> sysvideo_39_81:
  9739                              <1> 	; get LFB address
  9740 0000F791 A1[74A30100]        <1> 	mov	eax, [LFB_ADDR] ; [LFB_Info+LFBINFO.LFB_addr]
  9741 0000F796 09C0                <1> 	or	eax, eax
  9742 0000F798 74D5                <1> 	jz	short sysvideo_39_32 ; LFB is not ready !
  9743 0000F79A 8B0D[78A30100]      <1> 	mov	ecx, [LFB_SIZE]
  9744 0000F7A0 39CA                <1> 	cmp	edx, ecx 
  9745 0000F7A2 77CB                <1> 	ja	short sysvideo_39_32 ; abnormal value !
  9746                              <1> 
  9747                              <1> 	; 02/03/2021
  9748                              <1> 	; 08/02/2021
  9749                              <1> 	;mov	ebp, edx ; pixel count  
  9750                              <1> 	;shl	ebp, 2 ; byte count (pixel pos: 4 bytes)
  9751                              <1> 
  9752                              <1> 	; 06/03/2021
  9753                              <1> 	; bits per pixel (pixel color size)
  9754                              <1> 	;mov	bh, [LFB_Info+LFBINFO.bpp]
  9755                              <1> sysvideo_39_34:
  9756 0000F7A4 C1E502              <1> 	shl	ebp, 2 ; 15/02/2021 (byte count)
  9757 0000F7A7 A3[D2A30100]        <1> 	mov	[v_mem], eax ; Save video page start address
  9758 0000F7AC 88DE                <1> 	mov	dh, bl ; sub function
  9759                              <1> 	; 06/03/2021
  9760 0000F7AE 883D[D1A30100]      <1> 	mov	[v_bpp], bh ; bits per pixel (color size)
  9761                              <1> 	;mov	ebx, [LFB_SIZE]
  9762 0000F7B4 89CB                <1> 	mov	ebx, ecx ; [LFB_SIZE]
  9763                              <1> 
  9764 0000F7B6 B900080000          <1> 	mov	ecx, 2048
  9765 0000F7BB 39CD                <1> 	cmp	ebp, ecx
  9766 0000F7BD 7302                <1> 	jnb	short sysvideo_39_35
  9767 0000F7BF 89E9                <1> 	mov	ecx, ebp ; fix to requested byte count
  9768                              <1> sysvideo_39_35:
  9769 0000F7C1 80FE04              <1> 	cmp	dh, 4 ; 08/02/2021
  9770                              <1> 	;cmp	bl, 4 ; read pixels from user defined positions
  9771 0000F7C4 7605                <1> 	jna	short sysvideo_39_36
  9772 0000F7C6 E9B2000000          <1> 	jmp	sysvideo_39_52
  9773                              <1> 	; 08/02/2021
  9774                              <1> 	;mov	[buffer8], edi  ; user's destination buff addr
  9775                              <1> sysvideo_39_36:
  9776                              <1> 	; 08/02/2021
  9777                              <1> 	; read pixel positions
  9778                              <1> 	; as defined in user's source buffer
  9779 0000F7CB 893D[EAA30100]      <1> 	mov	[buffer8], edi  ; user's destination buff addr
  9780 0000F7D1 BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK ; kernel buffer for
  9781                              <1> 					  ; 2028 byte data
  9782                              <1> 	; esi = user's source buffer for pixel positions
  9783                              <1> 	; ecx = byte count
  9784 0000F7D6 E81F180000          <1> 	call	transfer_from_user_buffer
  9785 0000F7DB 7292                <1> 	jc	short sysvideo_39_32 ; error
  9786                              <1> 	; ecx  = transfer count (bytes)
  9787                              <1> 
  9788 0000F7DD 57                  <1> 	push	edi ; *
  9789 0000F7DE 56                  <1> 	push	esi ; **
  9790 0000F7DF 51                  <1> 	push	ecx ; ***
  9791                              <1> 
  9792 0000F7E0 89FE                <1> 	mov	esi, edi ; kernel buffer
  9793 0000F7E2 8B15[D2A30100]      <1> 	mov	edx, [v_mem] ; video memory
  9794 0000F7E8 C1E902              <1> 	shr	ecx, 2 ; pixel count (within buffer capacity)
  9795                              <1> 
  9796 0000F7EB 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  9797 0000F7F2 7753                <1> 	ja	short sysvideo_39_49
  9798                              <1> sysvideo_39_37:
  9799                              <1> 	; 8bpp
  9800 0000F7F4 AD                  <1> 	lodsd
  9801 0000F7F5 39D8                <1> 	cmp	eax, ebx ; < [LFB_SIZE]
  9802 0000F7F7 7309                <1> 	jnb	short sysvideo_39_39
  9803 0000F7F9 0FB60402            <1> 	movzx	eax, byte [edx+eax]
  9804                              <1> sysvideo_39_38:
  9805 0000F7FD AB                  <1> 	stosd
  9806 0000F7FE E2F4                <1> 	loop	sysvideo_39_37
  9807 0000F800 EB49                <1> 	jmp	short sysvideo_39_50
  9808                              <1> sysvideo_39_39:
  9809                              <1> 	; write black color for improper positions
  9810 0000F802 31C0                <1> 	xor	eax, eax
  9811 0000F804 EBF7                <1> 	jmp	short sysvideo_39_38
  9812                              <1> sysvideo_39_40:
  9813 0000F806 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  9814 0000F80D 772A                <1> 	ja	short sysvideo_39_47 ; 32bpp
  9815 0000F80F 7216                <1> 	jb	short sysvideo_39_44 ; 16bpp
  9816                              <1> sysvideo_39_41:
  9817                              <1> 	; 24bpp
  9818 0000F811 AD                  <1> 	lodsd
  9819 0000F812 39D8                <1> 	cmp	eax, ebx ; < [LFB_SIZE]
  9820 0000F814 730D                <1> 	jnb	short sysvideo_39_43
  9821 0000F816 8B0402              <1> 	mov	eax, [edx+eax]
  9822 0000F819 25FFFFFF00          <1> 	and	eax, 0FFFFFFh
  9823                              <1> sysvideo_39_42:
  9824 0000F81E AB                  <1> 	stosd
  9825 0000F81F E2F0                <1> 	loop	sysvideo_39_41
  9826 0000F821 EB28                <1> 	jmp	short sysvideo_39_50
  9827                              <1> sysvideo_39_43:
  9828                              <1> 	; write black color for improper positions
  9829 0000F823 31C0                <1> 	xor	eax, eax
  9830 0000F825 EBF7                <1> 	jmp	short sysvideo_39_42
  9831                              <1> sysvideo_39_44:
  9832                              <1> 	; 16bpp
  9833 0000F827 AD                  <1> 	lodsd
  9834 0000F828 39D8                <1> 	cmp	eax, ebx ; < [LFB_SIZE]
  9835 0000F82A 7309                <1> 	jnb	short sysvideo_39_46
  9836 0000F82C 0FB70402            <1> 	movzx	eax, word [edx+eax]
  9837                              <1> sysvideo_39_45:
  9838 0000F830 AB                  <1> 	stosd
  9839 0000F831 E2F4                <1> 	loop	sysvideo_39_44
  9840 0000F833 EB16                <1> 	jmp	short sysvideo_39_50
  9841                              <1> sysvideo_39_46:
  9842                              <1> 	; write black color for improper positions
  9843 0000F835 31C0                <1> 	xor	eax, eax
  9844 0000F837 EBF7                <1> 	jmp	short sysvideo_39_45
  9845                              <1> sysvideo_39_47:
  9846                              <1> 	; 32bpp
  9847 0000F839 AD                  <1> 	lodsd
  9848 0000F83A 39D8                <1> 	cmp	eax, ebx ; < [LFB_SIZE]
  9849 0000F83C 7309                <1> 	jnb	short sysvideo_39_49
  9850 0000F83E 0FB70402            <1> 	movzx	eax, word [edx+eax]
  9851                              <1> sysvideo_39_48:
  9852 0000F842 AB                  <1> 	stosd
  9853 0000F843 E2F4                <1> 	loop	sysvideo_39_47
  9854 0000F845 EB04                <1> 	jmp	short sysvideo_39_50
  9855                              <1> sysvideo_39_49:
  9856                              <1> 	; write black color for improper positions
  9857 0000F847 31C0                <1> 	xor	eax, eax
  9858 0000F849 EBF7                <1> 	jmp	short sysvideo_39_48
  9859                              <1> sysvideo_39_50:
  9860 0000F84B 59                  <1> 	pop	ecx ; transfer count in bytes
  9861 0000F84C 5E                  <1> 	pop	esi ; ** ; kernel buffer
  9862                              <1>  	;mov	esi, VBE3SAVERESTOREBLOCK ; kernel buffer for
  9863                              <1> 					  ; 2048 byte data
  9864 0000F84D 8B3D[EAA30100]      <1> 	mov	edi, [buffer8]
  9865                              <1> 	; edi = user's destination buffer for pixel colors
  9866                              <1> 	; ecx = byte count
  9867 0000F853 E858170000          <1> 	call	transfer_to_user_buffer
  9868 0000F858 5E                  <1> 	pop	esi ; *
  9869 0000F859 7266                <1> 	jc	short sysvideo_39_56 ; error
  9870                              <1> 	; ecx  = transfer count (bytes)
  9871 0000F85B 89C8                <1> 	mov	eax, ecx
  9872 0000F85D C1E802              <1> 	shr	eax, 2
  9873 0000F860 0105[AC940100]      <1> 	add	[u.r0], eax ; transfer count (in pixels)
  9874                              <1> 		
  9875 0000F866 29CD                <1> 	sub	ebp, ecx
  9876 0000F868 7657                <1> 	jna	short sysvideo_39_56 ; completed/finished
  9877 0000F86A 01CE                <1> 	add	esi, ecx ; next position in source buffer
  9878                              <1> 	;add	[buffer8], ecx ; next pos in destination buff
  9879 0000F86C 01CF                <1> 	add	edi, ecx
  9880 0000F86E 66B90008            <1> 	mov	cx, 2048 ; new count, limit: kernel buff size
  9881 0000F872 39CD                <1> 	cmp	ebp, ecx ; remain >= limit ?
  9882 0000F874 7302                <1> 	jnb	short sysvideo_39_51 ; yes
  9883 0000F876 89E9                <1> 	mov	ecx, ebp ; fix byte count to remain bytes
  9884                              <1> sysvideo_39_51:
  9885 0000F878 E94EFFFFFF          <1> 	jmp	sysvideo_39_36
  9886                              <1> 
  9887                              <1> sysvideo_39_52:
  9888 0000F87D 80FE05              <1> 	cmp	dh, 5 ; 08/02/2021
  9889                              <1> 	;cmp	bl, 5 ; write pixels to user defined positions 
  9890 0000F880 7605                <1> 	jna	short sysvideo_39_53
  9891 0000F882 E9A1000000          <1> 	jmp	sysvideo_39_66
  9892                              <1> sysvideo_39_53:
  9893                              <1> 	; single color pixel writing
  9894 0000F887 BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK ; kernel buffer for
  9895                              <1> 					  ; 2028 byte data
  9896                              <1> 	; esi = user's source buffer for pixel positions
  9897                              <1> 	; ecx = byte count
  9898 0000F88C E869170000          <1> 	call	transfer_from_user_buffer
  9899 0000F891 722E                <1> 	jc	short sysvideo_39_56 ; error
  9900                              <1> 	; ecx = transfer count (bytes)
  9901                              <1> 
  9902                              <1> 	; write pixels by using (user) defined positions
  9903                              <1> 	; ecx = byte count (1,2,3,4 times pixel count)	
  9904                              <1> 	; edi = system buffer address
  9905                              <1> 
  9906 0000F893 56                  <1> 	push	esi ; *
  9907 0000F894 51                  <1> 	push	ecx ; **
  9908                              <1> 
  9909 0000F895 89FE                <1> 	mov	esi, edi
  9910 0000F897 8B3D[D2A30100]      <1> 	mov	edi, [v_mem]
  9911                              <1> 
  9912                              <1> 	; 08/02/2021
  9913 0000F89D C1E902              <1> 	shr	ecx, 2 ; pixel count
  9914 0000F8A0 8B15[E2A30100]      <1> 	mov	edx, [maskcolor]
  9915                              <1> 	;mov	ebx, [v_siz]
  9916                              <1> 
  9917 0000F8A6 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  9918 0000F8AD 7717                <1> 	ja	short sysvideo_39_57
  9919                              <1> sysvideo_39_54:
  9920                              <1> 	; 8bpp
  9921 0000F8AF AD                  <1> 	lodsd
  9922 0000F8B0 39D8                <1> 	cmp	eax, ebx ; < [v_siz]
  9923 0000F8B2 7309                <1> 	jnb	short sysvideo_39_55
  9924 0000F8B4 881407              <1> 	mov	[edi+eax], dl
  9925                              <1> 	; 06/03/2021
  9926 0000F8B7 FF05[AC940100]      <1> 	inc	dword [u.r0]
  9927                              <1> sysvideo_39_55:
  9928 0000F8BD E2F0                <1> 	loop	sysvideo_39_54
  9929 0000F8BF EB50                <1> 	jmp	short sysvideo_39_64
  9930                              <1> sysvideo_39_56:
  9931 0000F8C1 E9DAD5FFFF          <1> 	jmp	sysret
  9932                              <1> sysvideo_39_57:
  9933 0000F8C6 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  9934 0000F8CD 7732                <1> 	ja	short sysvideo_39_62 ; 32bpp
  9935 0000F8CF 721D                <1> 	jb	short sysvideo_39_60 ; 16bpp
  9936                              <1> sysvideo_39_58:
  9937                              <1> 	; 24bpp
  9938 0000F8D1 AD                  <1> 	lodsd
  9939 0000F8D2 39D8                <1> 	cmp	eax, ebx ; < [v_siz]
  9940 0000F8D4 7314                <1> 	jnb	short sysvideo_39_59
  9941 0000F8D6 881407              <1> 	mov	[edi+eax], dl
  9942 0000F8D9 40                  <1> 	inc	eax
  9943 0000F8DA C1CA08              <1> 	ror	edx, 8
  9944 0000F8DD 66891407            <1> 	mov	[edi+eax], dx
  9945 0000F8E1 C1C208              <1> 	rol	edx, 8
  9946 0000F8E4 FF05[AC940100]      <1> 	inc	dword [u.r0]
  9947                              <1> sysvideo_39_59:
  9948 0000F8EA E2E5                <1> 	loop	sysvideo_39_58
  9949 0000F8EC EB23                <1> 	jmp	short sysvideo_39_64
  9950                              <1> sysvideo_39_60:
  9951                              <1> 	; 16bpp
  9952 0000F8EE AD                  <1> 	lodsd
  9953 0000F8EF 39D8                <1> 	cmp	eax, ebx ; < [v_siz]
  9954 0000F8F1 730A                <1> 	jnb	short sysvideo_39_61
  9955 0000F8F3 66891407            <1> 	mov	[edi+eax], dx
  9956 0000F8F7 FF05[AC940100]      <1> 	inc	dword [u.r0]
  9957                              <1> sysvideo_39_61:	
  9958 0000F8FD E2EF                <1> 	loop	sysvideo_39_60
  9959 0000F8FF EB10                <1> 	jmp	short sysvideo_39_64
  9960                              <1> sysvideo_39_62:
  9961                              <1> 	; 32bpp
  9962 0000F901 AD                  <1> 	lodsd
  9963 0000F902 39D8                <1> 	cmp	eax, ebx ; < [v_siz]
  9964 0000F904 7309                <1> 	jnb	short sysvideo_39_63
  9965 0000F906 891407              <1> 	mov	[edi+eax], edx
  9966 0000F909 FF05[AC940100]      <1> 	inc	dword [u.r0]
  9967                              <1> sysvideo_39_63:
  9968 0000F90F E2F0                <1> 	loop	sysvideo_39_62
  9969                              <1> sysvideo_39_64:
  9970 0000F911 59                  <1> 	pop	ecx ; **
  9971 0000F912 5E                  <1> 	pop	esi ; *	
  9972 0000F913 29CD                <1> 	sub	ebp, ecx
  9973 0000F915 76AA                <1> 	jna	short sysvideo_39_56
  9974 0000F917 01CE                <1> 	add	esi, ecx
  9975 0000F919 66B90008            <1> 	mov	cx, 2048
  9976 0000F91D 39CD                <1> 	cmp	ebp, ecx
  9977 0000F91F 7302                <1> 	jnb	short sysvideo_39_65
  9978 0000F921 89E9                <1> 	mov	ecx, ebp
  9979                              <1> sysvideo_39_65:
  9980 0000F923 E95FFFFFFF          <1> 	jmp	sysvideo_39_53
  9981                              <1> 
  9982                              <1> sysvideo_39_66:
  9983                              <1> 	; 15/02/2021
  9984 0000F928 D1E5                <1> 	shl	ebp, 1 ; 8 bytes per pixel (position&color)
  9985                              <1> sysvideo_39_67:
  9986 0000F92A 66B90008            <1> 	mov	cx, 2048
  9987 0000F92E 39CD                <1> 	cmp	ebp, ecx
  9988 0000F930 7302                <1> 	jnb	short sysvideo_39_68
  9989 0000F932 89E9                <1> 	mov	ecx, ebp
  9990                              <1> sysvideo_39_68:
  9991                              <1> 	; multi colors pixel writing
  9992 0000F934 BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK ; kernel buffer for
  9993                              <1> 					  ; 2048 byte data
  9994                              <1> 	; esi = user's source buffer for pixel positions
  9995                              <1> 	; ecx = byte count
  9996 0000F939 E8BC160000          <1> 	call	transfer_from_user_buffer
  9997 0000F93E 7281                <1> 	jc	short sysvideo_39_56 ; error
  9998                              <1> 	; ecx  = transfer count
  9999                              <1> 	
 10000                              <1> 	; write pixels & colors as defined in user buffer
 10001                              <1> 	; ecx = byte count (2,4,6,8 times pixel count)
 10002                              <1> 	; edi = system buffer address
 10003                              <1> 
 10004 0000F940 56                  <1> 	push	esi ; **
 10005 0000F941 51                  <1> 	push	ecx ; *
 10006                              <1> 
 10007 0000F942 89FE                <1> 	mov	esi, edi
 10008 0000F944 8B3D[D2A30100]      <1> 	mov	edi, [v_mem]
 10009                              <1> 
 10010                              <1> 	; 08/02/2021
 10011 0000F94A C1E903              <1> 	shr	ecx, 3 ; pixel count
 10012                              <1> 
 10013                              <1> 	;mov	ebx, [v_siz]
 10014                              <1> 
 10015 0000F94D 803D[D1A30100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
 10016 0000F954 7715                <1> 	ja	short sysvideo_39_71
 10017                              <1> sysvideo_39_69:
 10018                              <1> 	; 8bpp
 10019 0000F956 AD                  <1> 	lodsd	; position
 10020 0000F957 89C2                <1> 	mov	edx, eax
 10021 0000F959 AD                  <1> 	lodsd	; color
 10022 0000F95A 39DA                <1> 	cmp	edx, ebx ; < [v_siz]
 10023 0000F95C 7309                <1> 	jnb	short sysvideo_39_70
 10024 0000F95E 880417              <1> 	mov	[edi+edx], al
 10025                              <1> 	; 06/03/2021
 10026 0000F961 FF05[AC940100]      <1> 	inc	dword [u.r0]
 10027                              <1> sysvideo_39_70:
 10028 0000F967 E2ED                <1> 	loop	sysvideo_39_69
 10029 0000F969 EB51                <1> 	jmp	short sysvideo_39_78
 10030                              <1> sysvideo_39_71:
 10031 0000F96B 803D[D1A30100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
 10032 0000F972 7735                <1> 	ja	short sysvideo_39_76 ; 32bpp
 10033 0000F974 721D                <1> 	jb	short sysvideo_39_74 ; 16bpp
 10034                              <1> sysvideo_39_72:
 10035                              <1> 	; 24bpp
 10036 0000F976 AD                  <1> 	lodsd	; position
 10037 0000F977 89C2                <1> 	mov	edx, eax
 10038 0000F979 AD                  <1> 	lodsd	; color
 10039 0000F97A 39DA                <1> 	cmp	edx, ebx ; < [v_siz]
 10040 0000F97C 7311                <1> 	jnb	short sysvideo_39_73
 10041 0000F97E 880417              <1> 	mov	[edi+edx], al
 10042 0000F981 42                  <1> 	inc	edx
 10043 0000F982 C1E808              <1> 	shr	eax, 8
 10044 0000F985 66890417            <1> 	mov	[edi+edx], ax
 10045 0000F989 FF05[AC940100]      <1> 	inc	dword [u.r0]
 10046                              <1> sysvideo_39_73:	
 10047 0000F98F E2E5                <1> 	loop	sysvideo_39_72
 10048 0000F991 EB29                <1> 	jmp	short sysvideo_39_78
 10049                              <1> sysvideo_39_74:
 10050                              <1> 	; 16bpp
 10051 0000F993 AD                  <1> 	lodsd	; position
 10052 0000F994 89C2                <1> 	mov	edx, eax
 10053 0000F996 AD                  <1> 	lodsd	; color
 10054 0000F997 39DA                <1> 	cmp	edx, ebx ; < [v_siz]
 10055 0000F999 730A                <1> 	jnb	short sysvideo_39_75
 10056 0000F99B 66890417            <1> 	mov	[edi+edx], ax
 10057 0000F99F FF05[AC940100]      <1> 	inc	dword [u.r0]
 10058                              <1> sysvideo_39_75:	
 10059 0000F9A5 E2EC                <1> 	loop	sysvideo_39_74
 10060 0000F9A7 EB13                <1> 	jmp	short sysvideo_39_78
 10061                              <1> sysvideo_39_76:
 10062                              <1> 	; 32bpp
 10063 0000F9A9 AD                  <1> 	lodsd	; position
 10064 0000F9AA 89C2                <1> 	mov	edx, eax
 10065 0000F9AC AD                  <1> 	lodsd	; color
 10066 0000F9AD 39DA                <1> 	cmp	edx, ebx ; < [v_siz]
 10067 0000F9AF 7309                <1> 	jnb	short sysvideo_39_77
 10068 0000F9B1 890417              <1> 	mov	[edi+edx], eax
 10069 0000F9B4 FF05[AC940100]      <1> 	inc	dword [u.r0]
 10070                              <1> sysvideo_39_77:	
 10071 0000F9BA E2ED                <1> 	loop	sysvideo_39_76
 10072                              <1> sysvideo_39_78:
 10073 0000F9BC 59                  <1> 	pop	ecx ; *
 10074 0000F9BD 5E                  <1> 	pop	esi ; **
 10075                              <1> 
 10076 0000F9BE 29CD                <1> 	sub	ebp, ecx
 10077 0000F9C0 762A                <1> 	jna	short sysvideo_39_79
 10078 0000F9C2 01CE                <1> 	add	esi, ecx
 10079 0000F9C4 E961FFFFFF          <1> 	jmp	sysvideo_39_67
 10080                              <1> ;sysvideo_39_79:
 10081                              <1> ;	jmp	sysret
 10082                              <1> 
 10083                              <1> sysvideo_16:
 10084                              <1> 	; 11/08/2022
 10085                              <1> 	; 23/07/2022
 10086                              <1> 	; 06/03/2021
 10087                              <1> 	; 23/11/2020
 10088 0000F9C9 80FF04              <1> 	cmp	bh, 4
 10089                              <1> 	;jb	sysvideo_39 ; bh = 3, pixel r/w
 10090                              <1> 	;ja	short sysvideo_17
 10091                              <1> 	; 23/07/2022
 10092 0000F9CC 7407                <1> 	je	short sysvideo_16_0
 10093 0000F9CE 7721                <1> 	ja	short sysvideo_17
 10094 0000F9D0 E94EFCFFFF          <1> 	jmp	sysvideo_39
 10095                              <1> sysvideo_16_0:
 10096                              <1> 	; BH = 4
 10097                              <1> 	; Direct User Access for CGA video memory.
 10098                              <1> 	; Setup user's page tables for direct access to 0B8000h.
 10099                              <1> 	;
 10100                              <1> 	; Permission checks are not implemented yet !
 10101                              <1> 	; (11/07/2016)
 10102                              <1> 
 10103 0000F9D5 B800800B00          <1> 	mov	eax, 0B8000h
 10104                              <1> 	;mov	ecx, 8 ; 8 pages (8*4K=32K)
 10105                              <1> 	; 11/08/2022
 10106 0000F9DA 31C9                <1> 	xor	ecx, ecx
 10107 0000F9DC B108                <1> 	mov	cl, 8
 10108 0000F9DE 89C3                <1> 	mov	ebx, eax ; 12/05/2017 ; virtual = physical
 10109 0000F9E0 E89865FFFF          <1> 	call	direct_memory_access
 10110                              <1> 	;jc	sysret
 10111 0000F9E5 7205                <1> 	jc	short sysvideo_39_79 ; 06/03/2021
 10112                              <1> 	; eax = 0B8000h if there is not an error
 10113 0000F9E7 A3[AC940100]        <1> 	mov	[u.r0], eax
 10114                              <1> sysvideo_39_79: ; 08/01/2021
 10115 0000F9EC E9AFD4FFFF          <1> 	jmp	sysret
 10116                              <1> 
 10117                              <1> sysvideo_17:
 10118                              <1> 	; 23/07/2022
 10119                              <1> 	; 23/12/2020
 10120                              <1> 	; 11/12/2020
 10121                              <1> 	; 10/12/2020
 10122                              <1> 	; 23/11/2020
 10123 0000F9F1 80FF06              <1> 	cmp	bh, 6
 10124 0000F9F4 7424                <1> 	je	short sysvideo_17_0 ; 23/07/2022
 10125 0000F9F6 7205                <1> 	jb	short sysvideo_18 ; 23/07/2022
 10126 0000F9F8 E95E010000          <1> 	jmp	sysvideo_20 ; ja
 10127                              <1> 
 10128                              <1> 	; 23/07/2022
 10129                              <1> sysvideo_18:
 10130                              <1> 	; BH = 5
 10131                              <1> 	; Direct User Access for VGA video memory.
 10132                              <1> 	; Setup user's page tables for direct access to 0A0000h.
 10133                              <1> 	;
 10134                              <1> 	; Permission checks are not implemented yet !
 10135                              <1> 	; (11/07/2016)
 10136                              <1> 
 10137 0000F9FD B800000A00          <1> 	mov	eax, 0A0000h
 10138 0000FA02 B910000000          <1> 	mov	ecx, 16 ; 16 pages (16*4K=64K)
 10139 0000FA07 89C3                <1> 	mov	ebx, eax ; 12/05/2017 ; virtual = physical
 10140 0000FA09 E86F65FFFF          <1> 	call	direct_memory_access	
 10141                              <1> 	;jc	sysret
 10142                              <1> 	; 23/07/2022
 10143 0000FA0E 7205                <1> 	jc	short sysvideo_18_0
 10144                              <1> 	; eax = 0A0000h if there is not an error
 10145 0000FA10 A3[AC940100]        <1> 	mov	[u.r0], eax
 10146                              <1> sysvideo_18_0:
 10147 0000FA15 E986D4FFFF          <1> 	jmp	sysret
 10148                              <1> 
 10149                              <1> sysvideo_17_0:
 10150                              <1> 	; BH = 6
 10151                              <1> 	; Direct User Access to Linear Frame Buffer.
 10152                              <1> 	; Setup user's page tables for direct access to LFB.
 10153                              <1> 	;
 10154                              <1> 	; Permission checks are not implemented yet !
 10155                              <1> 	; (10/12/2020)
 10156                              <1> 
 10157 0000FA1A 80FBFF              <1> 	cmp	bl, 0FFh ; current video mode
 10158 0000FA1D 722C                <1> 	jb	short sysvideo_17_2 ; for desired video mode
 10159                              <1> 
 10160 0000FA1F 381D[DE670000]      <1> 	cmp	[CRT_MODE], bl ; VESA VBE video mode ?
 10161 0000FA25 750E                <1> 	jne	short sysvideo_17_1
 10162 0000FA27 668B0D[66A30100]    <1> 	mov	cx, [video_mode]
 10163 0000FA2E 6681E1FF01          <1> 	and	cx, 1FFh
 10164 0000FA33 EB29                <1> 	jmp	short sysvideo_17_3
 10165                              <1> sysvideo_17_1:
 10166                              <1> 	; 11/12/2020
 10167 0000FA35 88DF                <1> 	mov	bh, bl ; 0FFh
 10168 0000FA37 8A1D[DE670000]      <1> 	mov	bl, [CRT_MODE] ; VGA/CGA video mode
 10169 0000FA3D 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
 10170                              <1> 	; 23/12/2020
 10171 0000FA43 895D10              <1> 	mov	[ebp+16], ebx ; return to user with EBX value
 10172 0000FA46 E955D4FFFF          <1> 	jmp	sysret ; return to user with EAX = 0
 10173                              <1> sysvideo_17_2:
 10174                              <1> 	; bl = VESA video mode - 100h
 10175 0000FA4B B701                <1> 	mov	bh, 1 ; bx = 1XXh
 10176 0000FA4D 53                  <1> 	push	ebx ; requested vesa video mode
 10177 0000FA4E E81A40FFFF          <1> 	call	vbe_biosfn_return_current_mode
 10178 0000FA53 59                  <1> 	pop	ecx ; requested vesa video mode
 10179 0000FA54 6681E3FF01          <1> 	and	bx, 1FFh
 10180 0000FA59 6639D9              <1> 	cmp	cx, bx
 10181 0000FA5C 7564                <1> 	jne	short sysvideo_17_8
 10182                              <1> sysvideo_17_3:
 10183 0000FA5E 663B0D[72A30100]    <1> 	cmp	cx, [LFB_Info+LFBINFO.mode]
 10184 0000FA65 755B                <1> 	jne	short sysvideo_17_8
 10185                              <1> sysvideo_17_4:
 10186                              <1> 	; 11/12/2020
 10187 0000FA67 A1[74A30100]        <1> 	mov	eax, [LFB_Info+LFBINFO.LFB_addr]
 10188                              <1> 	; 21/12/2020
 10189 0000FA6C 09C0                <1> 	or	eax, eax
 10190 0000FA6E 744D                <1> 	jz	short sysvideo_17_7
 10191                              <1> 	;
 10192 0000FA70 8B0D[78A30100]      <1> 	mov	ecx, [LFB_Info+LFBINFO.LFB_size] ; buff size
 10193 0000FA76 89C3                <1> 	mov 	ebx, eax ; user's address = physical address
 10194                              <1> 	;push	ebx
 10195 0000FA78 51                  <1> 	push	ecx
 10196                              <1> 	; 21/12/2020
 10197 0000FA79 81C1FF0F0000        <1> 	add	ecx, 4095  ; PAGESIZE - 1
 10198                              <1> 	; 14/12/2020
 10199 0000FA7F C1E90C              <1> 	shr	ecx, 12  ; convert bytes to pages
 10200 0000FA82 E8F664FFFF          <1> 	call	direct_memory_access
 10201 0000FA87 5A                  <1> 	pop	edx  ; linear frame buffer size in bytes
 10202                              <1> 	;pop	eax  ; linear frame buffer address (physical)
 10203 0000FA88 7233                <1> 	jc	short sysvideo_17_7 ; [u.r0] = eax = 0
 10204                              <1> sysvideo_17_5:
 10205 0000FA8A 668B0D[7EA30100]    <1> 	mov	cx, [LFB_Info+LFBINFO.Y_res] ; screen height
 10206 0000FA91 C1E110              <1> 	shl	ecx, 16
 10207 0000FA94 668B0D[7CA30100]    <1> 	mov	cx,  [LFB_Info+LFBINFO.X_res] ; screen width
 10208 0000FA9B 31DB                <1> 	xor	ebx, ebx
 10209 0000FA9D 8A1D[80A30100]      <1> 	mov	bl, [LFB_Info+LFBINFO.bpp] ; bits per pixel
 10210 0000FAA3 8A3D[72A30100]      <1> 	mov	bh, [LFB_Info+LFBINFO.mode] ; XX part of 1XXh
 10211                              <1> sysvideo_26_4: ; 23/12/2020	
 10212 0000FAA9 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
 10213 0000FAAF 895514              <1> 	mov	[ebp+20], edx ; return to user with EDX value
 10214 0000FAB2 895D10              <1> 	mov	[ebp+16], ebx ; EBX
 10215 0000FAB5 894D18              <1> 	mov	[ebp+24], ecx ; ECX
 10216                              <1> sysvideo_17_6:
 10217 0000FAB8 A3[AC940100]        <1> 	mov	[u.r0], eax ; LFB address
 10218                              <1> sysvideo_17_7:
 10219 0000FABD E9DED3FFFF          <1> 	jmp	sysret 
 10220                              <1> sysvideo_17_8:
 10221                              <1> 	; cx = mode
 10222                              <1> 	; 21/12/2020
 10223 0000FAC2 80CD40              <1> 	or	ch, 40h  ; Linear frame buffer flag
 10224 0000FAC5 E8C63DFFFF          <1> 	call	_vbe_biosfn_return_mode_info
 10225 0000FACA 72F1                <1> 	jc	short sysvideo_17_7
 10226 0000FACC EB99                <1> 	jmp	short sysvideo_17_4
 10227                              <1> 
 10228                              <1> sysvideo_19:
 10229                              <1> 	; 23/07/2022
 10230                              <1> 	; 22/01/2021
 10231                              <1> 	; 12/12/2020
 10232                              <1> 	; 11/12/2020
 10233                              <1> 	; 23/11/2020
 10234                              <1> 	; BH = 7
 10235                              <1> 	; Get (Super/Extended VGA) mode
 10236                              <1> 	; and Linear Frame Buffer info.
 10237                              <1> 	
 10238                              <1> 	; 22/01/2021
 10239 0000FACE B3FF                <1> 	mov	bl, 0FFh
 10240                              <1> 	; 11/12/2020
 10241                              <1> 	;cmp	byte [CRT_MODE], 0FFh ; (extended mode?)
 10242                              <1> 	; 22/01/2021
 10243 0000FAD0 381D[DE670000]      <1> 	cmp	[CRT_MODE], bl  ; 0FFh
 10244                              <1> 	;jb	short sysvideo_17_1 ; not a VESA VBE mode
 10245                              <1> 	; 23/07/2022
 10246                              <1> 	; 12/12/2020
 10247 0000FAD6 7305                <1> 	jnb	short sysvideo_19_0
 10248                              <1> 	; 23/07/2022
 10249 0000FAD8 E958FFFFFF          <1> 	jmp	sysvideo_17_1
 10250                              <1> 
 10251                              <1> sysvideo_19_0:
 10252 0000FADD E88B3FFFFF          <1> 	call	vbe_biosfn_return_current_mode
 10253 0000FAE2 6681E3FF01          <1> 	and	bx, 1FFh
 10254 0000FAE7 663B1D[72A30100]    <1> 	cmp	bx, [LFB_Info+LFBINFO.mode]
 10255 0000FAEE 750D                <1> 	jne	short sysvideo_19_2
 10256                              <1> sysvideo_19_1:
 10257 0000FAF0 A1[74A30100]        <1> 	mov	eax, [LFB_Info+LFBINFO.LFB_addr]
 10258 0000FAF5 8B15[78A30100]      <1> 	mov	edx, [LFB_Info+LFBINFO.LFB_size]
 10259 0000FAFB EB8D                <1> 	jmp	sysvideo_17_5
 10260                              <1> sysvideo_19_2:
 10261 0000FAFD E88E3DFFFF          <1> 	call	_vbe_biosfn_return_mode_info
 10262 0000FB02 73EC                <1> 	jnc	short sysvideo_19_1
 10263 0000FB04 E997D3FFFF          <1> 	jmp	sysret
 10264                              <1> 
 10265                              <1> sysvideo_20_1:
 10266                              <1> 	; cx = vesa video mode
 10267 0000FB09 6689C8              <1> 	mov	ax, cx
 10268 0000FB0C 663D0001            <1> 	cmp	ax, 100h
 10269 0000FB10 725C                <1> 	jb	short sysvideo_20_0 ; VGA/CGA mode
 10270 0000FB12 663DFF01            <1> 	cmp	ax, 1FFh
 10271                              <1> 	;ja	short sysvideo_20_4 ; not valid
 10272 0000FB16 773E                <1> 	ja	short sysvideo_20_3
 10273 0000FB18 50                  <1> 	push	eax
 10274 0000FB19 6689C3              <1> 	mov	bx, ax
 10275 0000FB1C 66B8024F            <1> 	mov	ax, 4F02h
 10276                              <1> 
 10277                              <1> 	; simulate _int10h (int 31h) for func 4F02h
 10278                              <1> 	;pushfd
 10279                              <1> 	;push	cs
 10280                              <1> 	;push	sysvideo_20_1_retn 
 10281                              <1> 	;push	es ; *
 10282                              <1> 	;push	ds ; **	; SAVE WORK AND PARAMETER REGISTERS
 10283                              <1> 	;jmp	VBE_func
 10284                              <1> ;sysvideo_20_1_retn:
 10285                              <1> 
 10286 0000FB20 E8FF1BFFFF          <1> 	call	_int10h ; simulate int 10h (int 31h)
 10287                              <1> 
 10288 0000FB25 6683F84F            <1> 	cmp	ax, 004Fh
 10289 0000FB29 58                  <1> 	pop	eax
 10290 0000FB2A 752A                <1> 	jne	short sysvideo_20_3 ; error
 10291                              <1> 	;pop	eax
 10292 0000FB2C 40                  <1> 	inc	eax
 10293 0000FB2D A3[AC940100]        <1> 	mov	[u.r0], eax ; video mode + 1
 10294 0000FB32 09D2                <1> 	or	edx, edx ; is LFBINFO requested by user ?
 10295                              <1> 	;jz	short sysvideo_20_4
 10296 0000FB34 7420                <1> 	jz	short sysvideo_20_3 ; no
 10297                              <1> 
 10298                              <1> 	; 11/12/2020
 10299                              <1> 	; Check LFBINFO table/structure
 10300                              <1> 	; (it is set by vbe2 'vbe_biosfn_set_mode'
 10301                              <1> 	; but if vbe3 vbios pmi is in use,
 10302                              <1> 	; it will not set LFBINFO table)
 10303                              <1> 
 10304 0000FB36 52                  <1> 	push	edx
 10305 0000FB37 48                  <1> 	dec	eax  ; video mode
 10306 0000FB38 BE[72A30100]        <1> 	mov	esi, LFB_Info
 10307 0000FB3D 663B06              <1> 	cmp	ax, [esi+LFBINFO.mode]
 10308 0000FB40 7407                <1> 	je	short sysvideo_20_2
 10309                              <1> 
 10310 0000FB42 E8493DFFFF          <1> 	call	_vbe_biosfn_return_mode_info
 10311                              <1> 	;jnc	short sysvideo_20_2
 10312 0000FB47 723B                <1> 	jc	short sysvideo_20_4 ; edx = 0
 10313                              <1> 
 10314                              <1> 	;; clear LFBINFO table for invalidating	
 10315                              <1> 	;mov	ecx, LFBINFO.size ; 16
 10316                              <1> 	;mov	edi, esi ; LFB_Info table address
 10317                              <1> 	;xor	eax, eax
 10318                              <1> 	;rep	stosb
 10319                              <1> 
 10320                              <1> sysvideo_20_2:
 10321                              <1> 	;pop	ecx
 10322                              <1> 	;mov	edi, ecx ; user buffer
 10323 0000FB49 5F                  <1> 	pop	edi
 10324 0000FB4A B910000000          <1> 	mov	ecx, LFBINFO.size ; 16
 10325 0000FB4F E85C140000          <1> 	call	transfer_to_user_buffer ; fast transfer
 10326 0000FB54 722F                <1> 	jc	short sysvideo_20_5
 10327                              <1> 
 10328                              <1> 	;jmp	sysret
 10329                              <1> sysvideo_20_3:	
 10330                              <1> 	;pop	eax ; [u.r0] = 0
 10331                              <1> ;sysvideo_20_4:
 10332 0000FB56 E945D3FFFF          <1> 	jmp	sysret
 10333                              <1> 
 10334                              <1> 	; 23/07/2022
 10335                              <1> sysvideo_20:
 10336                              <1> 	; 11/12/2020
 10337                              <1> 	; 23/11/2020
 10338 0000FB5B 80FF08              <1> 	cmp	bh, 8
 10339                              <1> 	; 08/08/2022
 10340                              <1> 	;jb	short sysvideo_19 ; video mode & lfb info
 10341 0000FB5E 7407                <1> 	je	short sysvideo_20_6
 10342                              <1> 	; 23/07/2022
 10343 0000FB60 7733                <1> 	ja	short sysvideo_21 ; 12/12/2020
 10344                              <1> 	; 08/08/2022 - jb
 10345 0000FB62 E967FFFFFF          <1> 	jmp	sysvideo_19
 10346                              <1> sysvideo_20_6:
 10347                              <1> 	; BH = 8
 10348                              <1> 	; Set (Super/Extended VGA) mode & return LFB info
 10349                              <1> 
 10350                              <1> 	; 11/12/2020
 10351 0000FB67 80FBFF              <1> 	cmp	bl, 0FFh  ; CGA/VGA mode ?
 10352 0000FB6A 739D                <1> 	jnb	short sysvideo_20_1
 10353                              <1> 
 10354                              <1> 	;xor	ah, ah
 10355 0000FB6C 88D8                <1> 	mov	al, bl
 10356                              <1> sysvideo_20_0:
 10357 0000FB6E E8B11BFFFF          <1> 	call	_int10h  ; uses vbe3 pmi32 option
 10358 0000FB73 83F8FF              <1> 	cmp	eax, 0FFFFFFFFh ; -1
 10359 0000FB76 74DE                <1> 	je	short sysvideo_20_3 ; error
 10360                              <1> 	
 10361                              <1> 	; 11/12/2020
 10362                              <1> 	; alternative (it does not use vbe3 pmi32)
 10363                              <1> 	;push	eax
 10364                              <1> 	;call	_set_mode
 10365                              <1> 	;pop	eax
 10366                              <1> 	;jc	short sysvideo_20_3
 10367                              <1> 
 10368                              <1> 	;inc	eax
 10369 0000FB78 FEC0                <1> 	inc	al
 10370                              <1> 	;mov	[u.r0], ax ; video mode + 1
 10371 0000FB7A A2[AC940100]        <1> 	mov	[u.r0], al
 10372 0000FB7F E91CD3FFFF          <1> 	jmp	sysret
 10373                              <1> 
 10374                              <1> sysvideo_20_4:
 10375 0000FB84 5A                  <1> 	pop	edx
 10376                              <1> sysvideo_20_5:
 10377 0000FB85 31D2                <1> 	xor	edx, edx ; 0
 10378                              <1> 	; edx = 0 -> invalid LFBINFO data
 10379 0000FB87 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
 10380 0000FB8D 895514              <1> 	mov	[ebp+20], edx ; return to user with EDX value
 10381 0000FB90 E90BD3FFFF          <1> 	jmp	sysret
 10382                              <1> 
 10383                              <1> sysvideo_21:
 10384                              <1> 	; 23/07/2022
 10385                              <1> 	; 04/01/2021
 10386                              <1> 	; 03/12/2020
 10387 0000FB95 80FF0A              <1> 	cmp	bh, 10
 10388                              <1> 	;jb	sysvideo_22 ; VESA VBE3 pmi parms
 10389                              <1> 	; 23/07/2022
 10390 0000FB98 723F                <1> 	jb	short sysvideo_21_19
 10391                              <1> 	; 23/12/2020
 10392                              <1> 	;je	sysvideo_26 ; Video memory mapping
 10393                              <1> 	; 23/07/2022
 10394 0000FB9A 7442                <1> 	je	short sysvideo_21_20
 10395                              <1> 
 10396                              <1> 	; 04/01/2020
 10397 0000FB9C 80FF0B              <1> 	cmp	bh, 11
 10398                              <1> 	;ja	sysvideo_27
 10399                              <1> 	; 23/07/2022
 10400 0000FB9F 7742                <1> 	ja	short sysvideo_21_21
 10401                              <1> 		
 10402                              <1> 	; BH = 11
 10403                              <1> 	; set/read DAC color registers (for 8bpp)
 10404                              <1> 
 10405 0000FBA1 80FB04              <1> 	cmp	bl, 4
 10406                              <1> 	;jnb	sysvideo_21_7	; BMP file type palette
 10407                              <1> 				; handling
 10408                              <1> 	; 23/07/2022
 10409                              <1> 	;jnb	short sysvideo_21_7
 10410                              <1> 	; 08/08/2022
 10411 0000FBA4 7205                <1> 	jb	short sysvideo_21_18
 10412 0000FBA6 E989000000          <1> 	jmp	sysvideo_21_7
 10413                              <1> sysvideo_21_18:	
 10414 0000FBAB F6C301              <1> 	test	bl, 1
 10415 0000FBAE 7563                <1> 	jnz	short sysvideo_21_4 ; set/write DAC colors
 10416                              <1> 		
 10417                              <1> 	; Read DAC color register or all DAC color registers
 10418 0000FBB0 F6C302              <1> 	test	bl, 2  ; read single DAC color register
 10419 0000FBB3 7433                <1> 	jz	short sysvideo_21_2 ; read all DAC color regs
 10420                              <1> 
 10421                              <1> 	; read single DAC color register
 10422                              <1> 	; CL = DAC color register (index)
 10423                              <1>  	
 10424 0000FBB5 66BAC703            <1> 	mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
 10425 0000FBB9 88C8                <1> 	mov	al, cl	; DAC color register
 10426 0000FBBB 31C9                <1> 	xor	ecx, ecx ; (this may not be necessary)
 10427 0000FBBD EE                  <1> 	out	dx, al
 10428                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10429 0000FBBE B2C9                <1> 	mov	dl, 0C9h
 10430 0000FBC0 EC                  <1> 	in	al, dx
 10431 0000FBC1 88C4                <1> 	mov	ah, al	; red
 10432 0000FBC3 EC                  <1> 	in	al, dx
 10433 0000FBC4 88C1                <1> 	mov	cl, al	; green
 10434 0000FBC6 EC                  <1> 	in	al, dx
 10435 0000FBC7 88C5                <1> 	mov	ch, al	; blue
 10436 0000FBC9 C1E108              <1> 	shl	ecx, 8
 10437 0000FBCC 88E1                <1> 	mov	cl, ah	; red
 10438                              <1> 	; CL = Red, CH = Green, byte 3 = Blue, byte 4 = 0
 10439                              <1> sysvideo_21_0:
 10440 0000FBCE 890D[AC940100]      <1> 	mov	[u.r0], ecx
 10441                              <1> sysvideo_21_1:
 10442 0000FBD4 E9C7D2FFFF          <1> 	jmp	sysret
 10443                              <1> sysvideo_21_19:
 10444                              <1> 	; 23/07/2022
 10445 0000FBD9 E97A010000          <1> 	jmp	sysvideo_22
 10446                              <1> sysvideo_21_20:
 10447                              <1> 	; 23/07/2022
 10448 0000FBDE E930020000          <1> 	jmp	sysvideo_26
 10449                              <1> sysvideo_21_21:
 10450                              <1> 	; 23/07/2022
 10451 0000FBE3 E9B6020000          <1> 	jmp	sysvideo_27
 10452                              <1> sysvideo_21_2:
 10453                              <1> 	; read all DAC color registers
 10454 0000FBE8 89CB                <1> 	mov	ebx, ecx ; user's buffer address
 10455 0000FBEA BF00600900          <1> 	mov	edi, VBE3STACKADDR
 10456 0000FBEF 89FE                <1> 	mov	esi, edi
 10457                              <1> 	;mov	ecx, 768 ; 256*3
 10458                              <1> 	; 08/08/2022
 10459 0000FBF1 29C9                <1> 	sub	ecx, ecx
 10460 0000FBF3 B503                <1> 	mov	ch, 3
 10461                              <1> 	; ecx = 768 = 300h
 10462                              <1> 	;push	ecx
 10463 0000FBF5 66BAC703            <1> 	mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
 10464 0000FBF9 28C0                <1> 	sub	al, al ; 0
 10465 0000FBFB EE                  <1> 	out	dx, al
 10466                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10467 0000FBFC B2C9                <1> 	mov	dl, 0C9h
 10468                              <1> sysvideo_21_3:
 10469 0000FBFE EC                  <1> 	in	al, dx
 10470 0000FBFF AA                  <1> 	stosb
 10471 0000FC00 EC                  <1> 	in	al, dx
 10472 0000FC01 AA                  <1> 	stosb
 10473 0000FC02 EC                  <1> 	in	al, dx
 10474 0000FC03 AA                  <1> 	stosb
 10475 0000FC04 E2F8                <1> 	loop	sysvideo_21_3
 10476                              <1> 	;pop	ecx
 10477                              <1> 	; 18/08/2022
 10478 0000FC06 B503                <1> 	mov	ch, 3
 10479                              <1> 	; ecx = 768 = 300h
 10480                              <1> 
 10481 0000FC08 89DF                <1> 	mov	edi, ebx ; user's buffer address
 10482                              <1> 	;mov	esi, VBE3STACKADDR
 10483                              <1> 	;mov	ecx, 256*3 = 768
 10484 0000FC0A E8A1130000          <1> 	call	transfer_to_user_buffer
 10485 0000FC0F 72C3                <1> 	jc	short sysvideo_21_1
 10486                              <1> 	;mov	[u.r0], ecx ; actual transfer count
 10487 0000FC11 EBBB                <1> 	jmp	short sysvideo_21_0
 10488                              <1> 
 10489                              <1> sysvideo_21_4:
 10490                              <1> 	; Set/Write DAC color register or all registers
 10491 0000FC13 F6C302              <1> 	test	bl, 2 ; write/set single DAC color register
 10492 0000FC16 7456                <1> 	jz	short sysvideo_21_5 ; set all DAC color regs
 10493                              <1> 
 10494                              <1> 	; set single DAC color register
 10495                              <1> 	; CL = DAC color register (index)
 10496                              <1> 	; (byte 1 = Red, byte 2 = Green, byte 3 = Blue)
 10497                              <1> 
 10498 0000FC18 66BAC803            <1> 	mov	dx, 3C8h ; VGAREG_DAC_WRITE_ADDRESS
 10499 0000FC1C 89C8                <1> 	mov	eax, ecx ; DAC color register (index)
 10500 0000FC1E C1E910              <1> 	shr	ecx, 16  ; CL = green, AH = Red
 10501 0000FC21 EE                  <1> 	out	dx, al
 10502                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10503 0000FC22 FEC2                <1> 	inc	dl
 10504 0000FC24 88E0                <1> 	mov	al, ah	; Red
 10505 0000FC26 EE                  <1> 	out	dx, al
 10506 0000FC27 88C8                <1> 	mov	al, cl	; Green
 10507 0000FC29 EE                  <1> 	out	dx, al
 10508 0000FC2A 88E8                <1> 	mov	al, ch	; Blue
 10509 0000FC2C EE                  <1> 	out	dx, al
 10510                              <1> 	;rol	ecx, 8
 10511 0000FC2D C1E108              <1> 	shl	ecx, 8	; 21/02/2021
 10512 0000FC30 88E1                <1> 	mov	cl, ah	; Red
 10513                              <1> 		; ecx = 00BBGGRRh
 10514 0000FC32 EB9A                <1> 	jmp	short sysvideo_21_0
 10515                              <1> 
 10516                              <1> 	; 23/07/2022
 10517                              <1> sysvideo_21_7:	
 10518                              <1> 	; BMP file type palette handling
 10519                              <1> 
 10520 0000FC34 F6C301              <1> 	test	bl, 1
 10521                              <1> 	;jnz	short sysvideo_21_12 ; set/write DAC colors
 10522                              <1> 	; 08/08/2022
 10523 0000FC37 7405                <1> 	jz	short sysvideo_21_16
 10524 0000FC39 E9A3000000          <1> 	jmp	sysvideo_21_12
 10525                              <1> 
 10526                              <1> sysvideo_21_16:
 10527                              <1> 	; Read DAC color register or all DAC color registers
 10528 0000FC3E F6C302              <1> 	test	bl, 2  ; read single DAC color register
 10529 0000FC41 7460                <1> 	jz	short sysvideo_21_10 ; read all DAC color regs
 10530                              <1> 
 10531                              <1> 	; read single DAC color register
 10532                              <1> 	; CL = DAC color register (index)
 10533                              <1>  	
 10534 0000FC43 66BAC703            <1> 	mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
 10535 0000FC47 88C8                <1> 	mov	al, cl	; DAC color register
 10536 0000FC49 31C9                <1> 	xor	ecx, ecx
 10537 0000FC4B EE                  <1> 	out	dx, al
 10538                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10539 0000FC4C B2C9                <1> 	mov	dl, 0C9h
 10540 0000FC4E EC                  <1> 	in	al, dx
 10541 0000FC4F C0E002              <1> 	shl	al, 2
 10542 0000FC52 88C5                <1> 	mov	ch, al	; red
 10543 0000FC54 EC                  <1> 	in	al, dx
 10544 0000FC55 C0E002              <1> 	shl	al, 2
 10545 0000FC58 88C1                <1> 	mov	cl, al	; green
 10546 0000FC5A EC                  <1> 	in	al, dx
 10547 0000FC5B C0E002              <1> 	shl	al, 2
 10548                              <1> 	; 21/02/2021
 10549 0000FC5E C1E108              <1> 	shl	ecx, 8
 10550 0000FC61 88C1                <1> 	mov	cl, al	; blue
 10551                              <1> 	; CL = Blue, CH = Green, byte 3 = Red, byte 4 = 0
 10552                              <1> sysvideo_21_8:
 10553 0000FC63 890D[AC940100]      <1> 	mov	[u.r0], ecx
 10554                              <1> sysvideo_21_9:
 10555 0000FC69 E932D2FFFF          <1> 	jmp	sysret
 10556                              <1> 
 10557                              <1> sysvideo_21_5:
 10558                              <1> 	; write/set all DAC color registers
 10559 0000FC6E 89CE                <1> 	mov	esi, ecx ; user's buffer address
 10560 0000FC70 BF00600900          <1> 	mov	edi, VBE3STACKADDR
 10561 0000FC75 89FB                <1> 	mov	ebx, edi
 10562 0000FC77 B900030000          <1> 	mov	ecx, 768 ; 256*3
 10563 0000FC7C E879130000          <1> 	call	transfer_from_user_buffer
 10564                              <1> 	;jc	short sysvideo_21_1
 10565                              <1> 	; 08/08/2022
 10566 0000FC81 7305                <1> 	jnc	short sysvideo_21_17
 10567 0000FC83 E94CFFFFFF          <1> 	jmp	sysvideo_21_1
 10568                              <1> sysvideo_21_17:
 10569 0000FC88 890D[AC940100]      <1> 	mov	[u.r0], ecx ; actual transfer count
 10570                              <1> 
 10571 0000FC8E 89DE                <1> 	mov	esi, ebx ; VBE3STACKADDR
 10572 0000FC90 66BAC803            <1> 	mov	dx, 3C8h ; VGAREG_DAC_WRITE_ADDRESS
 10573 0000FC94 28C0                <1> 	sub	al, al ; 0
 10574 0000FC96 EE                  <1> 	out	dx, al
 10575                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10576 0000FC97 FEC2                <1> 	inc	dl
 10577                              <1> sysvideo_21_6:
 10578 0000FC99 AC                  <1> 	lodsb
 10579 0000FC9A EE                  <1> 	out	dx, al
 10580 0000FC9B AC                  <1> 	lodsb
 10581 0000FC9C EE                  <1> 	out	dx, al
 10582 0000FC9D AC                  <1> 	lodsb
 10583 0000FC9E EE                  <1> 	out	dx, al
 10584 0000FC9F E2F8                <1> 	loop	sysvideo_21_6
 10585 0000FCA1 EBC6                <1> 	jmp	short sysvideo_21_9
 10586                              <1> 
 10587                              <1> sysvideo_21_10:
 10588                              <1> 	; read all DAC color registers
 10589 0000FCA3 89CD                <1> 	mov	ebp, ecx ; user's buffer address
 10590 0000FCA5 BF00600900          <1> 	mov	edi, VBE3STACKADDR
 10591 0000FCAA 89FE                <1> 	mov	esi, edi
 10592 0000FCAC B900040000          <1> 	mov	ecx, 1024 ; 256*4
 10593 0000FCB1 51                  <1> 	push	ecx
 10594 0000FCB2 66BAC703            <1> 	mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
 10595 0000FCB6 28C0                <1> 	sub	al, al ; 0
 10596 0000FCB8 EE                  <1> 	out	dx, al
 10597                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10598 0000FCB9 B2C9                <1> 	mov	dl, 0C9h
 10599                              <1> sysvideo_21_11:
 10600 0000FCBB 31DB                <1> 	xor	ebx, ebx
 10601 0000FCBD EC                  <1> 	in	al, dx	; Red
 10602 0000FCBE C0E002              <1> 	shl	al, 2
 10603 0000FCC1 88C7                <1> 	mov	bh, al
 10604 0000FCC3 EC                  <1> 	in	al, dx	; Green
 10605 0000FCC4 C0E002              <1> 	shl	al, 2
 10606 0000FCC7 88C3                <1> 	mov	bl, al
 10607 0000FCC9 EC                  <1> 	in	al, dx	; Blue
 10608 0000FCCA C0E002              <1> 	shl	al, 2
 10609 0000FCCD C1E308              <1> 	shl	ebx, 8
 10610 0000FCD0 89D8                <1> 	mov	eax, ebx ; 00RRGGBBh
 10611 0000FCD2 AB                  <1> 	stosd	
 10612 0000FCD3 E2E6                <1> 	loop	sysvideo_21_11
 10613 0000FCD5 59                  <1> 	pop	ecx
 10614                              <1> 
 10615 0000FCD6 89EF                <1> 	mov	edi, ebp ; user's buffer address
 10616                              <1> 	;mov	esi, VBE3STACKADDR
 10617                              <1> 	;mov	ecx, 1024 = 4*256
 10618 0000FCD8 E8D3120000          <1> 	call	transfer_to_user_buffer
 10619 0000FCDD 728A                <1> 	jc	short sysvideo_21_9
 10620                              <1> 	;mov	[u.r0], ecx ; actual transfer count
 10621 0000FCDF EB82                <1> 	jmp	short sysvideo_21_8
 10622                              <1> 
 10623                              <1> sysvideo_21_12:
 10624                              <1> 	; Set/Write DAC color register or all registers
 10625 0000FCE1 F6C302              <1> 	test	bl, 2 ; write/set single DAC color register
 10626 0000FCE4 742A                <1> 	jz	short sysvideo_21_13 ; set all DAC color regs
 10627                              <1> 
 10628                              <1> 	; set single DAC color register
 10629                              <1> 	; CL = DAC color register (index)
 10630                              <1> 	; (byte 1 = Blue, byte 2 = Green, byte 3 = Red)
 10631                              <1> 
 10632 0000FCE6 66BAC803            <1> 	mov	dx, 3C8h ; VGAREG_DAC_WRITE_ADDRESS
 10633 0000FCEA 88C8                <1> 	mov	al, cl	; DAC color register (index)
 10634 0000FCEC 88EC                <1> 	mov	ah, ch	; Blue
 10635 0000FCEE C1E910              <1> 	shr	ecx, 16
 10636 0000FCF1 EE                  <1> 	out	dx, al
 10637                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10638 0000FCF2 FEC2                <1> 	inc	dl
 10639 0000FCF4 88E8                <1> 	mov	al, ch	; Red
 10640 0000FCF6 C0E802              <1> 	shr	al, 2
 10641 0000FCF9 EE                  <1> 	out	dx, al
 10642 0000FCFA 88C8                <1> 	mov	al, cl	; Green
 10643 0000FCFC C0E802              <1> 	shr	al, 2
 10644 0000FCFF EE                  <1> 	out	dx, al
 10645 0000FD00 88E0                <1> 	mov	al, ah	; Blue
 10646 0000FD02 C0E802              <1> 	shr	al, 2
 10647 0000FD05 EE                  <1> 	out	dx, al
 10648                              <1> 	;rol	ecx, 8
 10649 0000FD06 C1E108              <1> 	shl	ecx, 8 ; 21/02/2021
 10650 0000FD09 88E1                <1> 	mov	cl, ah
 10651 0000FD0B E953FFFFFF          <1> 	jmp	sysvideo_21_8 ; 08/08/2022
 10652                              <1> 
 10653                              <1> sysvideo_21_13:
 10654                              <1> 	; write/set all DAC color registers
 10655 0000FD10 89CE                <1> 	mov	esi, ecx ; user's buffer address
 10656 0000FD12 BF00600900          <1> 	mov	edi, VBE3STACKADDR
 10657 0000FD17 89FB                <1> 	mov	ebx, edi
 10658 0000FD19 B900040000          <1> 	mov	ecx, 1024 ; 256*4
 10659 0000FD1E E8D7120000          <1> 	call	transfer_from_user_buffer
 10660 0000FD23 722E                <1> 	jc	short sysvideo_21_15
 10661 0000FD25 890D[AC940100]      <1> 	mov	[u.r0], ecx ; actual transfer count
 10662                              <1> 
 10663 0000FD2B 89DE                <1> 	mov	esi, ebx ; VBE3STACKADDR
 10664 0000FD2D 66BAC803            <1> 	mov	dx, 3C8h ; VGAREG_DAC_WRITE_ADDRESS
 10665 0000FD31 28C0                <1> 	sub	al, al ; 0
 10666 0000FD33 EE                  <1> 	out	dx, al
 10667                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10668 0000FD34 FEC2                <1> 	inc	dl
 10669                              <1> sysvideo_21_14:
 10670 0000FD36 AD                  <1> 	lodsd
 10671                              <1> 	; byte 0 = Blue, byte 1 = Green, byte 2 = Red
 10672                              <1> 	; 21/02/2021
 10673 0000FD37 89C3                <1> 	mov	ebx, eax ; BL = Blue, BH = Green
 10674 0000FD39 C1CB08              <1> 	ror	ebx, 8 ; BL = Green, BH = Red
 10675 0000FD3C 88F8                <1> 	mov	al, bh
 10676 0000FD3E C0E802              <1> 	shr	al, 2
 10677 0000FD41 EE                  <1> 	out	dx, al ; Red
 10678 0000FD42 88D8                <1> 	mov	al, bl
 10679 0000FD44 C0E802              <1> 	shr	al, 2	
 10680 0000FD47 EE                  <1> 	out	dx, al ; Green
 10681 0000FD48 C1C308              <1> 	rol	ebx, 8 ; BL = Blue
 10682 0000FD4B 88D8                <1> 	mov	al, bl
 10683 0000FD4D C0E802              <1> 	shr	al, 2
 10684 0000FD50 EE                  <1> 	out	dx, al ; Blue 
 10685 0000FD51 E2E3                <1> 	loop	sysvideo_21_14
 10686                              <1> sysvideo_21_15:
 10687 0000FD53 E948D1FFFF          <1> 	jmp	sysret
 10688                              <1> 
 10689                              <1> sysvideo_22:
 10690                              <1> 	; 28/02/2021
 10691                              <1> 	; 22/01/2021
 10692                              <1> 	; 17/01/2021
 10693                              <1> 	; 04/12/2020
 10694                              <1> 	; 03/12/2020
 10695                              <1> 	; BH = 9
 10696                              <1> 	; Set/Get VESA VBE3 protected mode interface params
 10697                              <1> 
 10698                              <1> 	; 22/01/2021
 10699                              <1> 	;cmp	byte [vbe3], 3
 10700                              <1> 	;jne	short sysvideo_25 ; not applicable if
 10701                              <1> 				; vbe3 compatible video bios
 10702                              <1> 				; is not detected by kernel
 10703 0000FD58 80FB02              <1> 	cmp	bl, 2
 10704                              <1> 	;ja	short sysvideo_25 ; bl > 2 not implemented
 10705                              <1> 	; 17/01/2021
 10706 0000FD5B 7716                <1> 	ja	short sysvideo_22_0 ; srvs flag sub function
 10707                              <1> 	;jb	short sysvideo_23
 10708                              <1> 
 10709                              <1> 	; 21/01/2021
 10710 0000FD5D 803D[86090000]03    <1> 	cmp	byte [vbe3], 3
 10711                              <1> 	;jne	short sysvideo_25 ; not applicable if
 10712                              <1> 				; vbe3 compatible video bios
 10713                              <1> 				; is not detected by kernel
 10714 0000FD64 75ED                <1> 	jne	short sysvideo_21_15 ; 28/02/2021
 10715                              <1> 	
 10716 0000FD66 80FB01              <1> 	cmp	bl, 1
 10717 0000FD69 7673                <1> 	jna	short sysvideo_23
 10718                              <1> 
 10719 0000FD6B 8A1D[64A30100]      <1> 	mov	bl, [pmi32] ; Video bios 32 bit PMI functions
 10720 0000FD71 EB78                <1> 	jmp	short sysvideo_24
 10721                              <1> 
 10722                              <1> sysvideo_22_0:
 10723                              <1> 	; 17/01/2021
 10724                              <1> 	; save/restore video state user permission
 10725 0000FD73 80FB05              <1> 	cmp	bl, 5
 10726 0000FD76 771E                <1> 	ja	short sysvideo_22_2
 10727 0000FD78 7208                <1> 	jb	short sysvideo_22_1
 10728                              <1> 	; get srvs flag value/status
 10729 0000FD7A 8A1D[C8A30100]      <1> 	mov	bl, [srvsf] ; 0 = disabled, 1 = enabled
 10730 0000FD80 EB2C                <1> 	jmp	short sysvideo_22_3
 10731                              <1> 
 10732                              <1> sysvideo_22_1:
 10733                              <1> 	; permission (root and multi tasking) check
 10734 0000FD82 E836000000          <1> 	call	sysvideo_22_4
 10735 0000FD87 736A                <1> 	jnc	short sysvideo_25 ; not permitted !
 10736                              <1> 	; cf = 1
 10737 0000FD89 80EB03              <1> 	sub	bl, 3 ; disable = 0, enable = 1
 10738                              <1> 	; 22/01/2021
 10739 0000FD8C 881D[C8A30100]      <1> 	mov	[srvsf], bl
 10740 0000FD92 FEC3                <1> 	inc	bl ; 1 = disabled, 2 = enabled
 10741 0000FD94 EB18                <1> 	jmp	short sysvideo_22_3
 10742                              <1> 
 10743                              <1> sysvideo_22_2:
 10744 0000FD96 80FB06              <1> 	cmp	bl, 6
 10745                              <1> 	;ja	short sysvideo_25 ; invalid/unimplemented
 10746                              <1> 	; 28/02/2021
 10747 0000FD99 7733                <1> 	ja	short sysvideo_22_6
 10748                              <1> 	; get VESA VBE number/status
 10749 0000FD9B 8A25[86090000]      <1> 	mov	ah, [vbe3] ; vbe3 = 3, vbe2 = 2, others = 0
 10750 0000FDA1 A0[87090000]        <1> 	mov	al, [vbe2bios] ; bochs/qemu/vbox emulator status
 10751 0000FDA6 66A3[AC940100]      <1> 	mov	[u.r0], ax
 10752 0000FDAC EB45                <1> 	jmp	short sysvideo_25
 10753                              <1> 
 10754                              <1> sysvideo_22_3:
 10755                              <1> 	; 22/01/2021
 10756 0000FDAE 8A3D[C9A30100]      <1> 	mov	bh, [srvso] ; state options (> 80h -> svga)
 10757 0000FDB4 66891D[AC940100]    <1> 	mov	[u.r0], bx ; function result is return value 
 10758 0000FDBB EB36                <1> 	jmp	short sysvideo_25 
 10759                              <1> 
 10760                              <1> sysvideo_22_4:
 10761                              <1> 	; 17/01/2021 - permission will be given by root only
 10762 0000FDBD 803D[8A890100]00    <1> 	cmp	byte [multi_tasking], 0 ; in single user mode
 10763 0000FDC4 7707                <1> 	ja	short sysvideo_22_5
 10764                              <1> 	; 19/01/2021
 10765 0000FDC6 803D[FE940100]01    <1>  	cmp	byte [u.uid], 1 ; ([u.uid] = 0 -> root)
 10766                              <1> sysvideo_22_5:
 10767                              <1> 	; [multi_tasking] = 0 & [u.uid] = 0 -> CF = 1
 10768                              <1> 	; otherwise -> CF = 0 
 10769 0000FDCD C3                  <1> 	retn
 10770                              <1> 
 10771                              <1> sysvideo_22_6:
 10772                              <1> 	; 28/02/2021
 10773 0000FDCE 80FB09              <1> 	cmp	bl, 9
 10774 0000FDD1 7720                <1> 	ja	short sysvideo_25 ; invalid/unimplemented
 10775 0000FDD3 7436                <1> 	je	short sysvideo_22_9
 10776 0000FDD5 80FB08              <1> 	cmp	bl, 8
 10777 0000FDD8 721E                <1> 	jb	short sysvideo_22_7
 10778                              <1> 
 10779                              <1> 	; BL = 8
 10780                              <1> 	; Set default true color bpp to 24
 10781                              <1> 
 10782 0000FDDA B318                <1> 	mov	bl, 24
 10783                              <1> 	;mov	[truecolor], al	; 24bpp (RRGGBBh)
 10784                              <1> 	;mov	[u.r0], al
 10785                              <1> 	;jmp	short sysvideo_25
 10786 0000FDDC EB25                <1> 	jmp	short sysvideo_22_8
 10787                              <1> 
 10788                              <1> sysvideo_23:
 10789                              <1> 	; 17/01/2021
 10790                              <1> 	; permission (root and multi tasking) check
 10791 0000FDDE E8DAFFFFFF          <1> 	call	sysvideo_22_4
 10792 0000FDE3 730E                <1> 	jnc	short sysvideo_25 ; not permitted !
 10793                              <1> 
 10794 0000FDE5 881D[64A30100]      <1> 	mov	[pmi32], bl ; 1 = enabled, 0 = disabled
 10795                              <1> sysvideo_24:
 10796 0000FDEB FEC3                <1> 	inc	bl
 10797                              <1> sysvideo_22_10:	; 28/02/2021
 10798 0000FDED 881D[AC940100]      <1> 	mov	[u.r0], bl ; function result is return value
 10799                              <1> sysvideo_25:
 10800 0000FDF3 E9A8D0FFFF          <1> 	jmp	sysret
 10801                              <1> 
 10802                              <1> sysvideo_22_7:
 10803                              <1> 	; BL = 7
 10804                              <1> 	; Set default true color bpp to 32
 10805                              <1> 	; (it will set if [VBE3]=3)
 10806                              <1> 
 10807                              <1> 	; Note: This sub function is used to set 24bpp
 10808                              <1> 	; VESA VBE video modes to 32bpp.. because,
 10809                              <1> 	; old hardware uses 24 bpp but new video hardware
 10810                              <1> 	; uses 32bpp for same VESA VBE truecolor modes.
 10811                              <1> 	; (For example: VBE mode 112h is 640*480, 24bpp but
 10812                              <1> 	; new hardware uses/apply it as 640*480, 32bpp.)
 10813                              <1> 	; So, TRDOS 386 v2.0.3 kernel will check [truecolor]
 10814                              <1> 	; status is 32 bpp or not and it will change 24bpp
 10815                              <1> 	; to 32bpp if default [truecolor] value is 32, for
 10816                              <1> 	; same video mode number.
 10817                              <1> 
 10818 0000FDF8 803D[86090000]03    <1> 	cmp	byte [vbe3], 3
 10819 0000FDFF 75F2                <1> 	jne	short sysvideo_25 ; Only applicable 
 10820                              <1> 				  ; for VBE3 video hardware!
 10821 0000FE01 B320                <1> 	mov	bl, 32
 10822                              <1> sysvideo_22_8:
 10823 0000FE03 881D[B7790100]      <1> 	mov	[truecolor], bl	; 32bpp (00RRGGBBh)
 10824                              <1> 	;mov	[u.r0], bl
 10825                              <1> 	;jmp	short sysvideo_25
 10826 0000FE09 EBE2                <1> 	jmp	short sysvideo_22_10
 10827                              <1> 
 10828                              <1> sysvideo_22_9:
 10829                              <1> 	; BL = 9
 10830                              <1> 	; Return default true color bpp
 10831 0000FE0B 8A1D[B7790100]      <1> 	mov	bl, [truecolor]
 10832 0000FE11 EBDA                <1> 	jmp	short sysvideo_22_10
 10833                              <1> ;sysvideo_22_10:
 10834                              <1> 	;mov	[u.r0], bl
 10835                              <1> 	;jmp	sysret
 10836                              <1> 
 10837                              <1> sysvideo_26:
 10838                              <1> 	; 23/12/2020
 10839                              <1> 	; BH = 10
 10840                              <1> 	; Map video memory to user's buffer
 10841                              <1> 	; (multiuser/owner r/w permisions are ignored
 10842                              <1> 	;  for current TRDOS 386 version !)
 10843                              <1> 
 10844 0000FE13 6681E100F0          <1> 	and	cx, ~4095  ; clear low 12 bits
 10845 0000FE18 09C9                <1> 	or	ecx, ecx ; start address of user's buffer
 10846 0000FE1A 74D7                <1> 	jz	short sysvideo_25 ; error !
 10847                              <1> 
 10848 0000FE1C 80FB01              <1> 	cmp	bl, 1  ; VGA memory mapping ?
 10849 0000FE1F 740E                <1> 	je	short sysvideo_26_1
 10850 0000FE21 7718                <1> 	ja	short sysvideo_26_2
 10851                              <1> sysvideo_26_0:
 10852                              <1> 	; BL = 0 : CGA memory (0B8000h) map (32K)
 10853 0000FE23 B800800B00          <1> 	mov	eax, 0B8000h
 10854 0000FE28 BB00800000          <1> 	mov	ebx, 32768
 10855 0000FE2D EB37                <1> 	jmp	short sysvideo_26_3
 10856                              <1> sysvideo_26_1:
 10857                              <1> 	; BL = 1 : VGA memory (0A0000h) map (64K)
 10858 0000FE2F B800000A00          <1> 	mov	eax, 0A0000h
 10859 0000FE34 BB00000100          <1> 	mov	ebx, 65536
 10860 0000FE39 EB2B                <1> 	jmp	short sysvideo_26_3
 10861                              <1> sysvideo_26_2:
 10862                              <1> 	; BL = 2 : SVGA memory (LFB) map to user's buffer
 10863 0000FE3B 803D[86090000]02    <1> 	cmp	byte [vbe3], 2  ; VESA VBE 2/3 vbios ready ?
 10864 0000FE42 72AF                <1> 	jb	short sysvideo_25  ; no, error !
 10865 0000FE44 6681E200F0          <1> 	and	dx, ~4095 ; clear low 12 bits
 10866 0000FE49 09D2                <1> 	or	edx, edx  ; buffer size in bytes
 10867 0000FE4B 74A6                <1> 	jz	short sysvideo_25  ; error
 10868 0000FE4D 89D3                <1> 	mov	ebx, edx
 10869 0000FE4F A1[74A30100]        <1> 	mov	eax, [LFB_ADDR] ; [LFB_Info+LFBINFO.LFB_addr]
 10870 0000FE54 21C0                <1> 	and	eax, eax
 10871 0000FE56 7425                <1> 	jz	short sysvideo_26_5
 10872                              <1> 				; (LFB parms are not set yet)
 10873 0000FE58 3B1D[78A30100]      <1> 	cmp	ebx, [LFB_SIZE] ; [LFB_Info+LFBINFO.LFB_size]
 10874 0000FE5E 7606                <1> 	jna	short sysvideo_26_3
 10875 0000FE60 8B1D[78A30100]      <1> 	mov	ebx, [LFB_SIZE]
 10876                              <1> sysvideo_26_3: 
 10877 0000FE66 52                  <1> 	push	edx
 10878 0000FE67 53                  <1> 	push	ebx	; buffer size in bytes
 10879 0000FE68 51                  <1> 	push	ecx	; user's buffer address
 10880 0000FE69 87D9                <1> 	xchg	ebx, ecx
 10881 0000FE6B C1E90C              <1> 	shr	ecx, 12 ; convert buffer size to page count
 10882 0000FE6E E80A61FFFF          <1> 	call	direct_memory_access
 10883 0000FE73 59                  <1> 	pop	ecx	; user's buffer address
 10884 0000FE74 5B                  <1> 	pop	ebx	; buffer size
 10885 0000FE75 5A                  <1> 	pop	edx
 10886                              <1> 	;jc	short sysvideo_25 ; error !
 10887                              <1> 				  ; [u.r0] = 0
 10888                              <1> 	; 28/02/2021
 10889 0000FE76 7235                <1> 	jc	short sysvideo_27_0 ; error !
 10890                              <1> 
 10891                              <1> ;sysvideo_26_4:
 10892                              <1> 	;mov	ebp, [u.usp] ; ebp points to user's registers
 10893                              <1> 	;mov	[ebp+20], edx ; return to user with EDX value
 10894                              <1> 	;mov	[ebp+16], ebx ; EBX
 10895                              <1> 	;mov	[ebp+24], ecx ; ECX
 10896                              <1> 	; eax = physical address of video memory (LFB)
 10897                              <1> 	;mov	[u.r0], eax
 10898                              <1> 	;jmp	sysret
 10899 0000FE78 E92CFCFFFF          <1> 	jmp	sysvideo_26_4
 10900                              <1> 
 10901                              <1> sysvideo_26_5:
 10902 0000FE7D 66A1[1A0F0000]      <1> 	mov	ax, [def_LFB_addr] ; default LFB for mode 118h
 10903                              <1> 	; ah must be 0C0h or 0D0h or E0h
 10904                              <1> 	; others are nonsence !?
 10905 0000FE83 08E4                <1>  	or	ah, ah
 10906                              <1> 	;jz	short sysvideo_25 ; invalid lfb addr or
 10907                              <1> 			  	; it is not a vbe2 -bochs emu-
 10908                              <1> 			  	; or vbe3 -real- video bios
 10909                              <1> 	; 28/02/2021
 10910 0000FE85 7426                <1> 	jz	short sysvideo_27_0 ; invalid LFB address
 10911                              <1>  
 10912 0000FE87 80FCF0              <1> 	cmp	ah, 0F0h  
 10913                              <1> 	;jnb	short sysvideo_25 ; nonsence !?
 10914                              <1> 	; 28/02/2021
 10915 0000FE8A 7321                <1> 	jnb	short sysvideo_27_0 ; nonsence !?
 10916                              <1> 
 10917 0000FE8C C1E010              <1> 	shl	eax, 16
 10918                              <1> 	;jz	short sysvideo_25 ; eax = 0 
 10919                              <1> 
 10920 0000FE8F 81FB00907E00        <1> 	cmp	ebx, 1920*1080*4 ; maximum value of possible
 10921                              <1> 				 ; buffer sizes
 10922 0000FE95 76CF                <1> 	jna	short sysvideo_26_3  ; buffer size is proper
 10923                              <1> 	; resize buffer to fit 4GB limit
 10924 0000FE97 BB00907E00          <1> 	mov	ebx, 1920*1080*4
 10925 0000FE9C EBC8                <1> 	jmp	short sysvideo_26_3
 10926                              <1> 
 10927                              <1> sysvideo_27:
 10928                              <1> 	; 23/07/2022
 10929                              <1> 	; 16/02/2021
 10930                              <1> 	; 18/01/2021
 10931 0000FE9E 80FF0C              <1> 	cmp	bh, 12
 10932                              <1> 	;ja	sysvideo_28 ; 19/01/2021
 10933                              <1> 	; 23/07/2022
 10934 0000FEA1 7605                <1> 	jna	short sysvideo_27_24
 10935 0000FEA3 E970010000          <1> 	jmp	sysvideo_28
 10936                              <1> 
 10937                              <1> sysvideo_27_24:	; 23/07/2022
 10938                              <1> 	; BH = 12
 10939                              <1> 	; Font sub functions.
 10940                              <1> 	; 12/02/2021
 10941                              <1> 	; 11/01/2021
 10942                              <1> 	; 10/01/2021
 10943                              <1> 	;   BL = 0 : Disable system font overwrite
 10944                              <1> 	;   BL = 1 : Enable system font overwrite
 10945                              <1> 	;   BL = 2 : Read system font 8x8
 10946                              <1> 	;   BL = 3 : Read system font 8x14
 10947                              <1> 	;   BL = 4 : Read system font 8x16
 10948                              <1> 	;   BL = 5 : Read user defined font 8x8
 10949                              <1> 	;   BL = 6 : Read user defined font 8x16
 10950                              <1> 	;   BL = 7 : Write system font 8x8
 10951                              <1> 	;   BL = 8 : Write system font 8x14
 10952                              <1> 	;   BL = 9 : Write system font 8x16
 10953                              <1> 	;   BL = 10 : Write user defined font 8x8
 10954                              <1> 	;   BL = 11 : Write user defined font 8x16
 10955                              <1> 	;
 10956                              <1> 	;  BL > 11 : invalid (not implemented)
 10957                              <1> 	;
 10958                              <1> 	; For BL = 1 to 11
 10959                              <1> 	;   ECX = number of characters (<= 256)
 10960                              <1> 	;   EDX = first character (ascii code in DL)
 10961                              <1> 	;   ESI = user's buffer address
 10962                              <1> 	;
 10963                              <1> 	; Return: EAX = character count 
 10964                              <1> 
 10965 0000FEA8 80FB0B              <1> 	cmp	bl, 11
 10966 0000FEAB 7605                <1> 	jna	short sysvideo_27_1
 10967                              <1> sysvideo_27_0:
 10968 0000FEAD E9EECFFFFF          <1> 	jmp	sysret ; not implemented yet !
 10969                              <1> sysvideo_27_1:
 10970 0000FEB2 66B80001            <1> 	mov	ax, 256
 10971 0000FEB6 08DB                <1> 	or	bl, bl
 10972 0000FEB8 750E                <1>  	jnz	short sysvideo_27_3
 10973                              <1> 	
 10974                              <1> 	; bl = 0
 10975                              <1> 	; disable system font overwrite 
 10976                              <1> 
 10977 0000FEBA 8025[C6A30100]7F    <1> 	and	byte [ufont], 7Fh ; clear bit 7
 10978                              <1> sysvideo_27_2:
 10979                              <1> 	;mov	word [u.r0], 256  ; > 0 -> successful
 10980 0000FEC1 A3[AC940100]        <1> 	mov	[u.r0], eax ; 256
 10981 0000FEC6 EBE5                <1> 	jmp	short sysvideo_27_0
 10982                              <1> sysvideo_27_3:
 10983 0000FEC8 80FB01              <1> 	cmp	bl, 1
 10984 0000FECB 7710                <1> 	ja	short sysvideo_27_4
 10985                              <1> 
 10986                              <1> 	; bl = 1
 10987                              <1> 	; enable system font overwrite 
 10988                              <1> 	;	if [multi_tasking]= 0 and [u.uid] = 0
 10989                              <1> 
 10990                              <1> 	;cmp	byte [multi_tasking], 0 
 10991                              <1> 	;			; multi tasking enabled ?
 10992                              <1> 	;ja	short sysvideo_27_0 ; yes
 10993                              <1> 	;; 19/01/2021 
 10994                              <1> 	;; system maintenance or single user mode
 10995                              <1> 	;cmp	byte [u.uid], 0  ; root ?
 10996                              <1> 	;ja	short sysvideo_27_0 ; no
 10997                              <1> 
 10998                              <1> 	; 19/01/2021
 10999                              <1> 	; multi tasking & root check
 11000 0000FECD E8EBFEFFFF          <1> 	call	sysvideo_22_4
 11001 0000FED2 73D9                <1> 	jnc	short sysvideo_27_0 ; not permitted
 11002                              <1> 
 11003                              <1> 	; [multi_tasking]= 0 and [u.uid] = 0
 11004                              <1> 
 11005 0000FED4 800D[C6A30100]80    <1> 	or	byte [ufont], 80h ; set bit 7
 11006                              <1> 		
 11007 0000FEDB EBE4                <1>  	jmp	short sysvideo_27_2
 11008                              <1> 
 11009                              <1> sysvideo_27_4:
 11010 0000FEDD 09C9                <1> 	or	ecx, ecx
 11011 0000FEDF 74CC                <1> 	jz	short sysvideo_27_0
 11012 0000FEE1 21D2                <1> 	and	edx, edx
 11013 0000FEE3 7410                <1> 	jz	short sysvideo_27_4_0
 11014                              <1> 	;mov	ax, 256
 11015 0000FEE5 39C1                <1> 	cmp	ecx, eax ; 256
 11016 0000FEE7 77C4                <1> 	ja	short sysvideo_27_0
 11017 0000FEE9 48                  <1> 	dec	eax
 11018 0000FEEA 39C2                <1> 	cmp	edx, eax ; 255
 11019 0000FEEC 77BF                <1> 	ja	short sysvideo_27_0
 11020 0000FEEE 40                  <1> 	inc	eax
 11021 0000FEEF 29D0                <1> 	sub	eax, edx ; 256 - DX
 11022 0000FEF1 39C8                <1> 	cmp	eax, ecx
 11023 0000FEF3 72B8                <1> 	jb	short sysvideo_27_0
 11024                              <1> 
 11025                              <1> sysvideo_27_4_0:
 11026 0000FEF5 89F5                <1> 	mov	ebp, esi
 11027                              <1> 
 11028 0000FEF7 80FB06              <1> 	cmp	bl, 6
 11029 0000FEFA 7768                <1> 	ja	short sysvideo_27_13
 11030 0000FEFC 7210                <1> 	jb	short sysvideo_27_5
 11031                              <1> 	; bl = 6
 11032 0000FEFE F605[C6A30100]10    <1> 	test	byte [ufont], 16 ; 8x16 user font loaded ?
 11033 0000FF05 74A6                <1> 	jz	short sysvideo_27_0
 11034                              <1> 	; read 8x16 user defined font
 11035 0000FF07 BE00400900          <1> 	mov	esi, VGAFONT16USER
 11036 0000FF0C EB0C                <1> 	jmp	short sysvideo_27_6
 11037                              <1> sysvideo_27_5:
 11038 0000FF0E 80FB04              <1> 	cmp	bl, 4
 11039 0000FF11 7239                <1> 	jb	short sysvideo_27_11
 11040 0000FF13 7721                <1> 	ja	short sysvideo_27_9
 11041                              <1> 	; bl = 4
 11042                              <1> 	; read 8x16 system font
 11043 0000FF15 BE[84690100]        <1> 	mov	esi, vgafont16
 11044                              <1> sysvideo_27_6:
 11045                              <1> 	; read 8x16 font
 11046                              <1> 	;shl	dx, 4 ; * 16
 11047                              <1> 	;shl	cx, 4 ; * 16 ; 16 bytes per char
 11048                              <1> 	; 23/07/2022
 11049 0000FF1A C1E204              <1> 	shl	edx, 4 ; * 16
 11050 0000FF1D C1E104              <1> 	shl	ecx, 4 ; * 16
 11051                              <1> sysvideo_27_7:
 11052 0000FF20 89EF                <1> 	mov	edi, ebp
 11053                              <1> 	;add	edi, edx ; 16/02/2021
 11054 0000FF22 01D6                <1> 	add	esi, edx
 11055                              <1> 	; ecx = byte count
 11056                              <1> 	; esi = source (in system memory)
 11057                              <1> 	; edi = destination (in user memory)
 11058 0000FF24 E887100000          <1> 	call	transfer_to_user_buffer
 11059 0000FF29 7206                <1> 	jc	short sysvideo_27_8
 11060 0000FF2B 890D[AC940100]      <1> 	mov	[u.r0], ecx
 11061                              <1> sysvideo_27_8:
 11062 0000FF31 E96ACFFFFF          <1> 	jmp	sysret
 11063                              <1> sysvideo_27_9:
 11064                              <1> 	; bl = 5
 11065 0000FF36 F605[C6A30100]08    <1> 	test	byte [ufont], 8 ; 8x8 user font loaded ?
 11066 0000FF3D 74F2                <1> 	jz	short sysvideo_27_8
 11067                              <1> 	; read 8x8 user defined font
 11068 0000FF3F BE00500900          <1> 	mov	esi, VGAFONT8USER
 11069                              <1> sysvideo_27_10:
 11070                              <1> 	; read 8x8 font
 11071                              <1> 	;shl	dx, 3 ; * 8
 11072                              <1> 	;shl	cx, 3 ; * 8 ; 8 bytes per char
 11073                              <1> 	; 23/07/2022
 11074 0000FF44 C1E203              <1> 	shl	edx, 3 ; * 8
 11075 0000FF47 C1E103              <1> 	shl	ecx, 3 ; * 8
 11076 0000FF4A EBD4                <1> 	jmp	short sysvideo_27_7
 11077                              <1> 
 11078                              <1> sysvideo_27_11:
 11079 0000FF4C 80FB03              <1> 	cmp	bl, 3  ; 8x14 system font
 11080 0000FF4F 720C                <1> 	jb	short sysvideo_27_12 ; 8x8 system font
 11081                              <1> 	; bl = 3
 11082                              <1> 	; read 8x14 system font
 11083                              <1> 	;mov	al, 14
 11084                              <1> 	;mul	dl
 11085                              <1> 	;mov	dx, ax
 11086                              <1> 	;push	edx
 11087                              <1> 	;mov	ax, 14
 11088                              <1> 	;mul	cx
 11089                              <1> 	;mov	cx, ax
 11090                              <1> 	;pop	edx
 11091 0000FF51 E8A5000000          <1> 	call	sysvideo_27_14
 11092 0000FF56 BE[845B0100]        <1> 	mov	esi, vgafont14
 11093 0000FF5B EBC3                <1> 	jmp	short sysvideo_27_7
 11094                              <1> 	
 11095                              <1> sysvideo_27_12:
 11096                              <1> 	; bl = 2
 11097                              <1> 	; read 8x8 system font
 11098 0000FF5D BE[84530100]        <1> 	mov	esi, vgafont8
 11099 0000FF62 EBE0                <1> 	jmp	short sysvideo_27_10
 11100                              <1> 
 11101                              <1> sysvideo_27_13:
 11102                              <1> 	; overwrite font
 11103 0000FF64 80FB0A              <1> 	cmp	bl, 10
 11104 0000FF67 776E                <1> 	ja	short sysvideo_27_22 ; 8x16 user font
 11105 0000FF69 7224                <1> 	jb	short sysvideo_27_15
 11106                              <1> 	; bl = 10
 11107 0000FF6B BF00500900          <1> 	mov	edi, VGAFONT8USER
 11108 0000FF70 F605[C6A30100]08    <1> 	test	byte [ufont], 8 ; 8x8 user font loaded ?
 11109 0000FF77 7556                <1> 	jnz	short sysvideo_27_21 ; yes
 11110 0000FF79 08ED                <1> 	or	ch, ch ; cx = 256
 11111                              <1> 	;jnz	short sysvideo_27_21 ; 256 chars
 11112 0000FF7B 7406                <1> 	jz	short sysvideo_27_13_0
 11113 0000FF7D 66B90008            <1> 	mov	cx, 8*256
 11114 0000FF81 EB35                <1> 	jmp	short sysvideo_27_18_0
 11115                              <1> sysvideo_27_13_0:
 11116                              <1> 	; copy system font to user font before overwrite
 11117 0000FF83 BE[84530100]        <1> 	mov	esi, vgafont8
 11118                              <1> 	;push	edi
 11119                              <1> 	;push	ecx
 11120                              <1> 	;mov	cl, 64
 11121                              <1> 	;rep	movsd
 11122                              <1> 	;pop	ecx
 11123                              <1> 	;pop	edi
 11124                              <1> 	;mov	esi, ebp ; user's font buffer
 11125 0000FF88 E880000000          <1> 	call	sysvideo_27_23
 11126 0000FF8D EB40                <1> 	jmp	short sysvideo_27_21
 11127                              <1> 
 11128                              <1> sysvideo_27_15:
 11129                              <1> 	; check system font overwrite permission
 11130 0000FF8F F605[C6A30100]80    <1> 	test	byte [ufont], 80h
 11131 0000FF96 7499                <1> 	jz	short sysvideo_27_8
 11132                              <1> 
 11133 0000FF98 80FB08              <1> 	cmp	bl, 8
 11134 0000FF9B 773A                <1> 	ja	short sysvideo_27_22 ; 8x16 system font
 11135 0000FF9D 722B                <1> 	jb	short sysvideo_27_20 ; 8x8 system font
 11136                              <1> 	; bl = 8
 11137                              <1> 	; overwrite 8x14 system font
 11138                              <1> 	;mov	al, 14
 11139                              <1> 	;mul	dl
 11140                              <1> 	;mov	dx, ax
 11141                              <1> 	;push	edx
 11142                              <1> 	;mov	ax, 14
 11143                              <1> 	;mul	cx
 11144                              <1> 	;mov	cx, ax
 11145                              <1> 	;pop	edx
 11146 0000FF9F E857000000          <1> 	call	sysvideo_27_14
 11147 0000FFA4 BF[845B0100]        <1> 	mov	edi, vgafont14
 11148 0000FFA9 EB0B                <1> 	jmp	short sysvideo_27_18
 11149                              <1> sysvideo_27_16:
 11150                              <1> 	; bl = 9
 11151                              <1> 	; overwrite 8x16 system font
 11152 0000FFAB BF[84690100]        <1> 	mov	edi, vgafont16
 11153                              <1> sysvideo_27_17:
 11154                              <1> 	; overwrite 8x16 font
 11155                              <1> 	;shl	dx, 4 ; * 16
 11156                              <1> 	;shl	cx, 4 ; * 16 ; 16 bytes per char
 11157                              <1> 	; 23/07/2022
 11158 0000FFB0 C1E204              <1> 	shl	edx, 4 ; * 16
 11159 0000FFB3 C1E104              <1> 	shl	ecx, 4 ; * 16
 11160                              <1> sysvideo_27_18:
 11161 0000FFB6 01D7                <1> 	add	edi, edx
 11162                              <1> 	;add	esi, edx ; 16/02/2021
 11163                              <1> sysvideo_27_18_0:
 11164                              <1> 	; ecx = byte count
 11165                              <1> 	; esi = source (in user memory)
 11166                              <1> 	; edi = destination (in system memory)
 11167 0000FFB8 E83D100000          <1> 	call	transfer_from_user_buffer
 11168 0000FFBD 7206                <1> 	jc	short sysvideo_27_19
 11169 0000FFBF 890D[AC940100]      <1> 	mov	[u.r0], ecx
 11170                              <1> sysvideo_27_19:
 11171 0000FFC5 E9D6CEFFFF          <1> 	jmp	sysret
 11172                              <1> sysvideo_27_20:
 11173                              <1> 	; bl = 7
 11174                              <1> 	; overwrite 8x8 system font
 11175 0000FFCA BF[84530100]        <1> 	mov	edi, vgafont8
 11176                              <1> sysvideo_27_21:
 11177                              <1> 	; overwrite 8x8 font
 11178                              <1> 	;shl	dx, 3 ; * 8
 11179                              <1> 	;shl	cx, 3 ; * 8 ; 8 bytes per char
 11180                              <1> 	; 23/07/2022
 11181 0000FFCF C1E203              <1> 	shl	edx, 3 ; * 8
 11182 0000FFD2 C1E103              <1> 	shl	ecx, 3 ; * 8
 11183 0000FFD5 EBDF                <1> 	jmp	short sysvideo_27_18
 11184                              <1> sysvideo_27_22:
 11185                              <1> 	; bl = 11
 11186                              <1> 	; overwrite 8x16 user defined font
 11187 0000FFD7 BF00400900          <1> 	mov	edi, VGAFONT16USER
 11188 0000FFDC F605[C6A30100]10    <1> 	test	byte [ufont], 16 ; 8x16 user font loaded ?
 11189 0000FFE3 75CB                <1> 	jnz	short sysvideo_27_17 ; yes
 11190 0000FFE5 08ED                <1> 	or	ch, ch ; cx = 256
 11191                              <1> 	;jnz	short sysvideo_27_17 ; 256 chars
 11192 0000FFE7 7406                <1> 	jz	short sysvideo_27_22_0
 11193 0000FFE9 66B90010            <1> 	mov	cx, 16*256
 11194 0000FFED EBC9                <1> 	jmp	short sysvideo_27_18_0
 11195                              <1> sysvideo_27_22_0:
 11196                              <1> 	; copy system font to user font before overwrite
 11197 0000FFEF BE[84690100]        <1> 	mov	esi, vgafont16
 11198                              <1> 	;push	edi
 11199                              <1> 	;push	ecx
 11200                              <1> 	;mov	cl, 64
 11201                              <1> 	;rep	movsd
 11202                              <1> 	;pop	ecx
 11203                              <1> 	;pop	edi
 11204                              <1> 	;mov	esi, ebp ; user's font buffer
 11205 0000FFF4 E814000000          <1> 	call	sysvideo_27_23
 11206 0000FFF9 EBB5                <1> 	jmp	short sysvideo_27_17
 11207                              <1> 
 11208                              <1> sysvideo_27_14:
 11209                              <1> 	; 16/02/2021
 11210 0000FFFB 52                  <1> 	push	edx
 11211 0000FFFC 66B80E00            <1> 	mov	ax, 14
 11212 00010000 66F7E1              <1> 	mul	cx
 11213 00010003 89C1                <1> 	mov	ecx, eax
 11214 00010005 5A                  <1> 	pop	edx
 11215 00010006 B00E                <1> 	mov	al, 14
 11216 00010008 F6E2                <1> 	mul	dl
 11217 0001000A 89C2                <1> 	mov	edx, eax
 11218 0001000C C3                  <1> 	retn
 11219                              <1> 
 11220                              <1> 	;mov	al, 14
 11221                              <1> 	;mul	dl
 11222                              <1> 	;mov	dx, ax
 11223                              <1> 	;push	edx
 11224                              <1> 	;; 12/02/2021
 11225                              <1> 	;mov	ax, 14
 11226                              <1> 	;;mov	eax, 14
 11227                              <1> 	;;mul	cx
 11228                              <1> 	;mul	ecx
 11229                              <1> 	;;mov	cx, ax
 11230                              <1> 	;mov	ecx, eax
 11231                              <1> 	;pop	edx
 11232                              <1> 	;retn
 11233                              <1> 
 11234                              <1> sysvideo_27_23:
 11235 0001000D 57                  <1> 	push	edi
 11236 0001000E 51                  <1> 	push	ecx
 11237 0001000F B140                <1> 	mov	cl, 64
 11238 00010011 F3A5                <1> 	rep	movsd
 11239 00010013 59                  <1> 	pop	ecx
 11240 00010014 5F                  <1> 	pop	edi
 11241 00010015 89EE                <1> 	mov	esi, ebp ; user's font buffer
 11242 00010017 C3                  <1> 	retn
 11243                              <1> 
 11244                              <1> sysvideo_28:
 11245                              <1> 	; 23/07/2022
 11246                              <1> 	; 24/01/2021
 11247                              <1> 	; 23/01/2021
 11248                              <1> 	; 18/01/2021
 11249 00010018 80FF0E              <1> 	cmp	bh, 14
 11250                              <1> 	;jb	sysvideo_29
 11251                              <1> 	; 23/07/2022
 11252 0001001B 7222                <1> 	jb	short sysvideo_28_29
 11253                              <1> 	;ja	sysvideo_30
 11254                              <1> 	; 23/07/2022
 11255 0001001D 7725                <1> 	ja	short sysvideo_28_30
 11256                              <1> 
 11257                              <1> 	; BH = 14
 11258                              <1> 	; Save/Restore Super VGA video state
 11259                              <1> 	
 11260                              <1> 	; BL = options
 11261                              <1> 	;	bit 0 - Save (0) or Restore (1)	
 11262                              <1> 	;	bit 1 - controller hardware state
 11263                              <1> 	;	bit 2 - BIOS data state
 11264                              <1> 	;	bit 3 - DAC state
 11265                              <1> 	;	bit 4 - (extended) Register state
 11266                              <1> 	;	bit 5 - system (0) or user (1) memory
 11267                              <1> 	;	bit 6 - verify without transfer
 11268                              <1> 	;	bit 7 - not used (must be 0)
 11269                              <1> 
 11270                              <1> 	; ECX = Buffer address or VideoStateID
 11271                              <1> 
 11272 0001001F 803D[86090000]02    <1> 	cmp	byte [vbe3], 2 ;  VESA VBE2 or VBE3 ?
 11273 00010026 7721                <1> 	ja	short sysvideo_28_0 ; yes
 11274 00010028 7210                <1> 	jb	short sysvideo_28_16 ; not a SVGA sys !
 11275                              <1> 
 11276                              <1> 	; == VBE2 ==
 11277                              <1> 	; Check Bochs/Qemu/VirtualBox PC emulator
 11278                              <1> 	; (vbe2 is usable only for emulator's vbios)
 11279 0001002A 8A25[87090000]      <1> 	mov	ah, [vbe2bios]
 11280 00010030 80FCC0              <1> 	cmp	ah, 0C0h
 11281 00010033 7205                <1> 	jb	short sysvideo_28_16 ; unknown vbios !
 11282 00010035 80FCC5              <1> 	cmp	ah, 0C5h
 11283 00010038 760F                <1> 	jna	short sysvideo_28_0
 11284                              <1> 		; Use kernel's vbios functions (video.s)
 11285                              <1> sysvideo_28_16:
 11286                              <1> 	; unknown vbios !
 11287 0001003A E961CEFFFF          <1> 	jmp	sysret
 11288                              <1> 
 11289                              <1> sysvideo_28_29:
 11290                              <1> 	; 23/07/2022
 11291 0001003F E955010000          <1> 	jmp	sysvideo_29
 11292                              <1> sysvideo_28_30:
 11293                              <1> 	; 23/07/2022
 11294 00010044 E935020000          <1> 	jmp	sysvideo_30
 11295                              <1> 
 11296                              <1> sysvideo_28_0:
 11297 00010049 80FB7F              <1> 	cmp	bl, 7Fh
 11298 0001004C 77EC                <1> 	ja	short sysvideo_28_16 ; unknown options
 11299                              <1> 
 11300 0001004E 88DA                <1> 	mov	dl, bl
 11301 00010050 80E21F              <1> 	and	dl, 1Fh 
 11302 00010053 D0EA                <1> 	shr	dl, 1
 11303 00010055 74E3                <1> 	jz	short sysvideo_28_16 ; invalid !
 11304                              <1> 	; DL = VBE Function 4F04h Save/Restore options
 11305                              <1> 	;  bit 0 : controller hardware state
 11306                              <1> 	;  bit 1 : BIOS data state
 11307                              <1> 	;  bit 2 : DAC state
 11308                              <1> 	;  bit 3 : (extended) Register state
 11309                              <1> 	
 11310 00010057 F6C320              <1> 	test	bl, 32 ; bit 5
 11311                              <1> 	;jnz	sysvideo_28_7 ; user buffer
 11312                              <1> 	; 23/07/2022
 11313 0001005A 7405                <1> 	jz	short sysvideo_28_17
 11314 0001005C E9B1000000          <1> 	jmp	sysvideo_28_7
 11315                              <1> 
 11316                              <1> sysvideo_28_17:	 ; 23/07/2022
 11317                              <1> 	; source or destination is kernel/system buffer
 11318                              <1> 
 11319 00010061 803D[C8A30100]00    <1> 	cmp	byte [srvsf], 0 ; srs permission flag
 11320 00010068 76D0                <1> 	jna	short sysvideo_28_16 ; not permitted
 11321                              <1> 
 11322 0001006A F6C301              <1> 	test	bl, 1
 11323 0001006D 743A                <1> 	jz	short sysvideo_28_4 ; Save
 11324                              <1> 
 11325                              <1> 	; Restore
 11326 0001006F 3B0D[CAA30100]      <1> 	cmp	ecx, [VideoStateID]
 11327 00010075 75C3                <1> 	jne	short sysvideo_28_16 ; not correct ID !
 11328                              <1> 
 11329 00010077 0FB6CA              <1> 	movzx	ecx, dl
 11330 0001007A 80CA80              <1> 	or	dl, 80h
 11331 0001007D 3A15[C9A30100]      <1> 	cmp	dl, [srvso]
 11332 00010083 75B5                <1> 	jne	short sysvideo_28_16 ; not correct !
 11333                              <1> 
 11334 00010085 88DA                <1> 	mov	dl, bl
 11335                              <1> 
 11336                              <1> 	; ecx = cl = options
 11337 00010087 E8A53AFFFF          <1> 	call	vbe_srs_gbs
 11338                              <1> 	; ebx = state buffer size (data size)
 11339                              <1> 
 11340 0001008C 891D[AC940100]      <1> 	mov	[u.r0], ebx
 11341                              <1> 
 11342 00010092 F6C240              <1> 	test	dl, 64 ; verify without transfer
 11343 00010095 75A3                <1> 	jnz	short sysvideo_28_16 ; yes
 11344                              <1> 
 11345 00010097 BE00580900          <1> 	mov	esi, VBE3VIDEOSTATE
 11346 0001009C BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK
 11347 000100A1 87CB                <1> 	xchg	ecx, ebx
 11348 000100A3 F3A4                <1> 	rep	movsb
 11349                              <1> 
 11350 000100A5 88D9                <1> 	mov	cl, bl
 11351                              <1> 
 11352                              <1> 	; 23/01/2021
 11353 000100A7 EB44                <1> 	jmp	short sysvideo_28_10
 11354                              <1> 
 11355                              <1> sysvideo_28_4:
 11356 000100A9 53                  <1> 	push	ebx
 11357                              <1> 	; 24/01/2021
 11358 000100AA 31DB                <1> 	xor	ebx, ebx ; 0 ; use kernel's buffer
 11359 000100AC 881D[C9A30100]      <1> 	mov	[srvso], bl ; 0 ; invalidate
 11360 000100B2 891D[CAA30100]      <1> 	mov	[VideoStateID], ebx ; 0 ; invalidate
 11361 000100B8 0FB6CA              <1> 	movzx	ecx, dl ; options
 11362 000100BB B201                <1> 	mov	dl, 1 ; save state
 11363 000100BD E890000000          <1> 	call	sysvideo_28_11 ; 23/01/2021
 11364                              <1> 	; Note: VBE3 BIOS data save option will be
 11365                              <1> 	;	disabled.. ; 24/01/2021
 11366 000100C2 89CA                <1> 	mov	edx, ecx ; state (save) options
 11367 000100C4 5B                  <1> 	pop	ebx
 11368                              <1> 
 11369 000100C5 6683F84F            <1> 	cmp	ax, 4Fh ; successful ?
 11370 000100C9 7536                <1> 	jne	short sysvideo_28_3 ; no !
 11371                              <1> 
 11372 000100CB F6C340              <1> 	test	bl, 64 ; verify without transfer
 11373 000100CE 7536                <1> 	jnz	short sysvideo_28_6 ; yes
 11374                              <1> 
 11375                              <1> 	; ecx = cl = options
 11376 000100D0 E85C3AFFFF          <1> 	call	vbe_srs_gbs
 11377                              <1> 	; ebx = state buffer size (data size)
 11378                              <1> 
 11379 000100D5 BE00760900          <1> 	mov	esi, VBE3SAVERESTOREBLOCK
 11380 000100DA BF00580900          <1> 	mov	edi, VBE3VIDEOSTATE
 11381 000100DF 89D9                <1> 	mov	ecx, ebx
 11382 000100E1 F3A4                <1> 	rep	movsb
 11383                              <1> 
 11384 000100E3 88D1                <1> 	mov	cl, dl
 11385 000100E5 80C980              <1> 	or	cl, 80h ; SVGA (VESA VBE) flag
 11386                              <1> 	;mov	[srvso], dl
 11387                              <1> 
 11388 000100E8 E908010000          <1> 	jmp	sysvideo_28_15
 11389                              <1> 
 11390                              <1> 	; 23/01/2021
 11391                              <1> sysvideo_28_10:
 11392                              <1> 	; CL = VESA VBE3 Save/Restore options
 11393                              <1> 
 11394 000100ED B202                <1> 	mov	dl, 2 ; restore state
 11395                              <1> 
 11396 000100EF E85C000000          <1> 	call	sysvideo_28_1
 11397                              <1> 
 11398 000100F4 6683F84F            <1> 	cmp	ax, 4Fh ; successful ?
 11399 000100F8 7407                <1> 	je	short sysvideo_28_3
 11400                              <1> 	;jmp	short sysvideo_28_9
 11401                              <1> 
 11402                              <1> sysvideo_28_9:
 11403                              <1> 	; return zero size (error) to user
 11404 000100FA 29C0                <1> 	sub	eax, eax
 11405                              <1> sysvideo_28_5:
 11406 000100FC A3[AC940100]        <1> 	mov	[u.r0], eax
 11407                              <1> sysvideo_28_3:
 11408 00010101 E99ACDFFFF          <1> 	jmp	sysret
 11409                              <1> 
 11410                              <1> sysvideo_28_6:
 11411                              <1> 	; use timer ticks as VideoStateID
 11412 00010106 A1[707D0100]        <1> 	mov	eax, [TIMER_LH]
 11413 0001010B 09C0                <1> 	or 	eax, eax
 11414 0001010D 75ED                <1> 	jnz	short sysvideo_28_5
 11415 0001010F 40                  <1> 	inc	eax
 11416 00010110 EBEA                <1> 	jmp	short sysvideo_28_5
 11417                              <1> 
 11418                              <1> sysvideo_28_7:
 11419                              <1> 	; save/restore to/from user buffer
 11420                              <1> 
 11421                              <1> 	; 23/01/2021
 11422 00010112 89CE                <1> 	mov	esi, ecx ; user's vstate buffer
 11423 00010114 BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK
 11424                              <1> 
 11425 00010119 0FB6CA              <1> 	movzx	ecx, dl ; VESA VBE func 4F04h options
 11426                              <1> 
 11427                              <1> 	; source or destination is user buffer
 11428 0001011C F6C301              <1> 	test	bl, 1
 11429 0001011F 7444                <1> 	jz	short sysvideo_28_12  ; Save
 11430                              <1> 
 11431                              <1> 	; Restore
 11432 00010121 803D[C8A30100]00    <1> 	cmp	byte [srvsf], 0 ; srs permission flag
 11433 00010128 766A                <1> 	jna	short sysvideo_28_14 ; not permitted
 11434                              <1> 
 11435 0001012A 88DA                <1> 	mov	dl, bl ; 'sysvideo' options
 11436                              <1> 
 11437                              <1> 	; ecx = cl = options
 11438 0001012C E8003AFFFF          <1> 	call	vbe_srs_gbs
 11439                              <1> 	; ebx = state buffer size (data size)
 11440                              <1> 
 11441 00010131 891D[AC940100]      <1> 	mov	[u.r0], ebx ; transfer count
 11442                              <1> 
 11443 00010137 F6C240              <1> 	test	dl, 64 ; verify without transfer
 11444 0001013A 7558                <1> 	jnz	short sysvideo_28_14 ; yes
 11445                              <1> 
 11446 0001013C 6681FB0008          <1> 	cmp	bx, 2048
 11447 00010141 73B7                <1> 	jnb	short sysvideo_28_9 ; invalid
 11448                              <1> 
 11449 00010143 87CB                <1> 	xchg	ecx, ebx
 11450                              <1> 	; esi = user buffer
 11451                              <1> 	; edi = VBE3SAVERESTOREBLOCK
 11452                              <1> 
 11453 00010145 E8B00E0000          <1> 	call	transfer_from_user_buffer
 11454 0001014A 72AE                <1> 	jc	short sysvideo_28_9 ; error 
 11455                              <1> 
 11456 0001014C 89D9                <1> 	mov	ecx, ebx ; Function 4F04h options
 11457 0001014E EB9D                <1> 	jmp	short sysvideo_28_10 ; 23/01/2021
 11458                              <1> 
 11459                              <1> sysvideo_28_1:
 11460 00010150 31DB                <1> 	xor	ebx, ebx ; 0 ; use kernel's buffer
 11461                              <1> sysvideo_28_11:
 11462                              <1> 	; 24/01/2021
 11463 00010152 803D[86090000]03    <1> 	cmp	byte [vbe3], 3
 11464 00010159 7405                <1> 	je	short sysvideo_28_2
 11465                              <1> 
 11466                              <1> 	; VESA VBE2 (BOCHS/QEMU/VBOX) video bios
 11467 0001015B E93A39FFFF          <1> 	jmp	_vbe_biosfn_save_restore_state
 11468                              <1> sysvideo_28_2:
 11469                              <1> 	;24/01/2021
 11470                              <1> 	;mov	eax, 4F04h  ; Save/Restore vstate
 11471                              <1> 	; VESA VBE3 video bios
 11472 00010160 E9B018FFFF          <1> 	jmp	_vbe3_pmfn_save_restore_state
 11473                              <1> 
 11474                              <1> sysvideo_28_12:
 11475                              <1> 	; Save
 11476                              <1> 	;mov	edi, VBE3SAVERESTOREBLOCK
 11477                              <1> 
 11478                              <1> 	;movzx	ecx, dl ; options
 11479 00010165 56                  <1> 	push	esi
 11480 00010166 53                  <1> 	push	ebx
 11481                              <1> 	; 23/01/2021
 11482 00010167 B201                <1> 	mov	dl, 1 ; save state
 11483 00010169 E8E2FFFFFF          <1> 	call	sysvideo_28_1
 11484 0001016E 5A                  <1> 	pop	edx ; 'sysvideo' options
 11485 0001016F 5F                  <1> 	pop	edi ; user's video state buffer
 11486                              <1> 
 11487 00010170 6683F84F            <1> 	cmp	ax, 4Fh ; successful ?
 11488 00010174 751E                <1> 	jne	short sysvideo_28_14 ; no !
 11489                              <1> 
 11490                              <1> 	; ecx = cl = options
 11491 00010176 E8B639FFFF          <1> 	call	vbe_srs_gbs
 11492                              <1> 	; ebx = state buffer size (data size)
 11493                              <1> 
 11494 0001017B 89D9                <1> 	mov	ecx, ebx ; transfer count
 11495                              <1> 
 11496 0001017D F6C240              <1> 	test	dl, 64 ; verify without transfer
 11497 00010180 750C                <1> 	jnz	short sysvideo_28_13 ; yes
 11498                              <1> 		
 11499                              <1> 	;mov	edi, esi
 11500 00010182 BE00760900          <1> 	mov	esi, VBE3SAVERESTOREBLOCK
 11501 00010187 E8240E0000          <1> 	call	transfer_to_user_buffer
 11502 0001018C 7206                <1> 	jc	short sysvideo_28_14
 11503                              <1> sysvideo_28_13:
 11504 0001018E 890D[AC940100]      <1> 	mov	[u.r0], ecx
 11505                              <1> sysvideo_28_14:
 11506 00010194 E907CDFFFF          <1> 	jmp	sysret
 11507                              <1> 
 11508                              <1> sysvideo_29:
 11509                              <1> 	; 18/01/2021
 11510                              <1> 	; BH = 13
 11511                              <1> 	; Save/Restore std VGA video state
 11512                              <1> 
 11513                              <1> 	; bl = 0..3
 11514                              <1> 	;	save to or restore from
 11515                              <1> 	;	system buffer, VBE3VIDEOSTATE
 11516                              <1> 	;	ECX = VideoStateID for restoring
 11517                              <1> 	; bl = 4..7
 11518                              <1> 	;	save to or restore from
 11519                              <1> 	;	user buffer pointed by ECX
 11520                              <1> 
 11521 00010199 80FB03              <1> 	cmp	bl, 3
 11522 0001019C 7776                <1> 	ja	short sysvideo_29_6
 11523                              <1> 
 11524                              <1> 	; source or destination is kernel/system buffer
 11525                              <1> 
 11526 0001019E 803D[C8A30100]00    <1> 	cmp	byte [srvsf], 0 ; srs permission flag
 11527 000101A5 7668                <1> 	jna	short sysvideo_29_5 ; not permitted
 11528                              <1> 
 11529 000101A7 F6C301              <1> 	test	bl, 1
 11530 000101AA 7437                <1> 	jz	short sysvideo_29_2  ; Save
 11531                              <1> 
 11532                              <1> 	; Restore
 11533 000101AC 3B0D[CAA30100]      <1> 	cmp	ecx, [VideoStateID]
 11534 000101B2 755B                <1> 	jne	short sysvideo_29_5 ; not correct ID !
 11535 000101B4 80FB01              <1> 	cmp	bl, 1
 11536 000101B7 7709                <1> 	ja	short sysvideo_29_0
 11537                              <1> 	; bl = 1
 11538 000101B9 BB6E000000          <1> 	mov	ebx, 110 
 11539 000101BE B103                <1> 	mov	cl, 3 ; ctrl, vbios data
 11540 000101C0 EB07                <1> 	jmp	short sysvideo_29_1
 11541                              <1> sysvideo_29_0:
 11542                              <1>  	; bl  = 3
 11543 000101C2 BB72030000          <1> 	mov	ebx, 882 
 11544 000101C7 B107                <1> 	mov	cl, 7 ; ctrl, vbios data, dac
 11545                              <1> sysvideo_29_1:
 11546 000101C9 3A0D[C9A30100]      <1> 	cmp	cl, [srvso]
 11547 000101CF 753E                <1> 	jne	short sysvideo_29_5 ; not correct !
 11548                              <1> 
 11549 000101D1 BE00580900          <1> 	mov	esi, VBE3VIDEOSTATE ; 22/01/2021
 11550 000101D6 E8EA3AFFFF          <1> 	call	biosfn_restore_video_state
 11551 000101DB 891D[AC940100]      <1> 	mov	[u.r0], ebx ; video state size (bytes)
 11552                              <1> 	;jmp	sysret
 11553 000101E1 EB2C                <1> 	jmp	short sysvideo_29_5
 11554                              <1> sysvideo_29_2:
 11555                              <1> 	;mov	esi, ecx
 11556 000101E3 BF00580900          <1> 	mov	edi, VBE3VIDEOSTATE
 11557                              <1> 
 11558 000101E8 B107                <1> 	mov	cl, 7 ; ctrl, vbios data, dac
 11559 000101EA 08DB                <1> 	or	bl, bl
 11560 000101EC 7502                <1> 	jnz	short sysvideo_29_3 ; bl = 2
 11561                              <1> 	; bl = 0
 11562 000101EE B103                <1> 	mov	cl, 3 ; ctrl, vbios data
 11563                              <1> sysvideo_29_3:
 11564 000101F0 E86839FFFF          <1> 	call	biosfn_save_video_state
 11565                              <1> sysvideo_28_15:
 11566                              <1> 	; use timer ticks as VideoStateID
 11567 000101F5 A1[707D0100]        <1> 	mov	eax, [TIMER_LH]
 11568 000101FA 21C0                <1> 	and 	eax, eax
 11569 000101FC 7501                <1> 	jnz	short sysvideo_29_4
 11570 000101FE 40                  <1> 	inc	eax
 11571                              <1> sysvideo_29_4:
 11572 000101FF 880D[C9A30100]      <1> 	mov	[srvso], cl
 11573 00010205 A3[CAA30100]        <1> 	mov	[VideoStateID], eax
 11574 0001020A A3[AC940100]        <1> 	mov	[u.r0], eax
 11575                              <1> sysvideo_29_5:
 11576 0001020F E98CCCFFFF          <1> 	jmp	sysret
 11577                              <1> 
 11578                              <1> sysvideo_29_6:
 11579 00010214 80FB07              <1> 	cmp	bl, 7
 11580 00010217 77F6                <1> 	ja	short sysvideo_29_5 ; invalid sub function 
 11581                              <1> 
 11582 00010219 89CE                <1> 	mov	esi, ecx
 11583 0001021B BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK
 11584                              <1> 
 11585                              <1> 	; source or destination is user buffer
 11586 00010220 F6C301              <1> 	test	bl, 1
 11587 00010223 7434                <1> 	jz	short sysvideo_29_9  ; Save
 11588                              <1> 
 11589                              <1> 	; Restore
 11590 00010225 803D[C8A30100]00    <1> 	cmp	byte [srvsf], 0 ; srs permission flag
 11591 0001022C 76E1                <1> 	jna	short sysvideo_29_5 ; not permitted
 11592                              <1> 	
 11593                              <1> 	;mov	esi, ecx
 11594                              <1> 	;mov	edi, VBE3SAVERESTOREBLOCK
 11595                              <1> 	
 11596 0001022E 80FB07              <1> 	cmp	bl, 7
 11597 00010231 7409                <1> 	je	short sysvideo_29_7
 11598                              <1> 	; bl = 5 
 11599 00010233 B303                <1> 	mov	bl, 3
 11600 00010235 B96E000000          <1> 	mov	ecx, 110
 11601 0001023A EB05                <1> 	jmp	short sysvideo_29_8
 11602                              <1> sysvideo_29_7:
 11603                              <1> 	; bl = 7
 11604 0001023C B972030000          <1> 	mov	ecx, 882
 11605                              <1> sysvideo_29_8:
 11606 00010241 E8B40D0000          <1> 	call	transfer_from_user_buffer
 11607 00010246 72C7                <1> 	jc	short sysvideo_29_5
 11608 00010248 890D[AC940100]      <1> 	mov	[u.r0], ecx
 11609 0001024E 88D9                <1> 	mov	cl, bl ; mov cl,7 (mov cl,3)
 11610 00010250 89FE                <1> 	mov	esi, edi ; VBE3SAVERESTOREBLOCK
 11611                              <1> 	; cl = 3 or 7
 11612 00010252 E86E3AFFFF          <1> 	call	biosfn_restore_video_state
 11613 00010257 EBB6                <1> 	jmp	sysvideo_29_5
 11614                              <1> 	;jmp	sysret
 11615                              <1> sysvideo_29_9:
 11616                              <1> 	; Save
 11617                              <1> 	;mov	edi, VBE3SAVERESTOREBLOCK
 11618                              <1> 
 11619 00010259 80FB06              <1> 	cmp	bl, 6
 11620 0001025C 7409                <1> 	je	short sysvideo_29_10
 11621                              <1> 	; bl = 4
 11622 0001025E BB6E000000          <1> 	mov	ebx, 110
 11623 00010263 B103                <1> 	mov	cl, 3 ; ctrl, vbios data
 11624 00010265 EB07                <1> 	jmp	short sysvideo_29_11
 11625                              <1> sysvideo_29_10:
 11626                              <1> 	; bl = 6
 11627 00010267 BB72030000          <1> 	mov	ebx, 882
 11628 0001026C B107                <1> 	mov	cl, 7 ; ctrl, vbios data, dac
 11629                              <1> sysvideo_29_11:
 11630 0001026E E8EA38FFFF          <1> 	call	biosfn_save_video_state
 11631                              <1> 
 11632 00010273 89D9                <1> 	mov	ecx, ebx ; transfer count
 11633 00010275 89F7                <1> 	mov	edi, esi
 11634 00010277 BE00760900          <1> 	mov	esi, VBE3SAVERESTOREBLOCK
 11635                              <1> 
 11636                              <1> 	;call	transfer_to_user_buffer
 11637                              <1> 	;jc	short sysvideo_29_5
 11638                              <1> 	;mov	[u.r0], ecx ; transfer count
 11639                              <1> 	;;jmp	sysret
 11640                              <1> 	;jmp	short sysvideo_29_5
 11641                              <1>  
 11642 0001027C EB1A                <1> 	jmp	short sysvideo_29_12
 11643                              <1> 
 11644                              <1> sysvideo_30:
 11645 0001027E 80FF0F              <1> 	cmp	bh, 15
 11646 00010281 7722                <1> 	ja	short sysvideo_31 ; invalid function
 11647                              <1> 
 11648                              <1> 	; BH = 15
 11649                              <1> 	; Copy VESA EDID to user's buffer
 11650                              <1> 
 11651 00010283 803D[D3410000]4F    <1> 	cmp	byte [edid], 4Fh
 11652 0001028A 7519                <1> 	jne	short sysvideo_31 ; not ready !
 11653                              <1> 
 11654                              <1> 	;and	ecx, ecx
 11655                              <1> 	;jz	short sysvideo_31
 11656                              <1> 
 11657                              <1> 	; ecx = user's buffer address
 11658 0001028C 89CF                <1> 	mov	edi, ecx
 11659 0001028E BE[E4A20100]        <1> 	mov	esi, edid_info
 11660 00010293 B980000000          <1> 	mov	ecx, 128 ; 128 bytes
 11661                              <1> sysvideo_29_12:
 11662 00010298 E8130D0000          <1> 	call	transfer_to_user_buffer
 11663 0001029D 7206                <1> 	jc	short sysvideo_31
 11664                              <1> 
 11665 0001029F 890D[AC940100]      <1> 	mov	[u.r0], ecx ; EDID size, 128 bytes
 11666                              <1> sysvideo_31:
 11667 000102A5 E9F6CBFFFF          <1> 	jmp	sysret
 11668                              <1> 
 11669                              <1> mkdir:
 11670                              <1> 	; 04/12/2015 (14 byte directory names)
 11671                              <1> 	; 12/10/2015
 11672                              <1> 	; 17/06/2015 (Retro UNIX 386 v1 - Beginning)
 11673                              <1> 	; 29/04/2013 - 01/08/2013 (Retro UNIX 8086 v1)
 11674                              <1> 	;
 11675                              <1> 	; 'mkdir' makes a directory entry from the name pointed to
 11676                              <1> 	; by u.namep into the current directory.
 11677                              <1> 	;
 11678                              <1> 	; INPUTS ->
 11679                              <1> 	;    u.namep - points to a file name 
 11680                              <1> 	;	           that is about to be a directory entry.
 11681                              <1> 	;    ii - current directory's i-number.	
 11682                              <1> 	; OUTPUTS ->
 11683                              <1> 	;    u.dirbuf+2 - u.dirbuf+10 - contains file name.
 11684                              <1> 	;    u.off - points to entry to be filled
 11685                              <1> 	;	     in the current directory
 11686                              <1> 	;    u.base - points to start of u.dirbuf.
 11687                              <1> 	;    r1 - contains i-number of current directory
 11688                              <1> 	;
 11689                              <1> 	; ((AX = R1)) output
 11690                              <1> 	;
 11691                              <1> 	;    (Retro UNIX Prototype : 11/11/2012, UNIXCOPY.ASM)
 11692                              <1>         ;    ((Modified registers: EAX, EDX, EBX, ECX, ESI, EDI, EBP))
 11693                              <1> 	;
 11694                              <1> 
 11695                              <1> 	; 17/06/2015 - 32 bit modifications (Retro UNIX 386 v1)
 11696 000102AA 31C0                <1> 	xor 	eax, eax
 11697 000102AC BF[E6940100]        <1> 	mov     edi, u.dirbuf+2
 11698 000102B1 89FE                <1> 	mov	esi, edi
 11699 000102B3 AB                  <1> 	stosd
 11700 000102B4 AB                  <1> 	stosd
 11701                              <1> 	; 04/12/2015 (14 byte directory names)
 11702 000102B5 AB                  <1> 	stosd
 11703 000102B6 66AB                <1> 	stosw
 11704                              <1> 		; jsr r0,copyz; u.dirbuf+2; u.dirbuf+10. / clear this
 11705 000102B8 89F7                <1> 	mov	edi, esi ; offset to u.dirbuf
 11706                              <1> 	; 12/10/2015 ([u.namep] -> ebp)
 11707                              <1> 	;mov 	ebp, [u.namep]
 11708 000102BA E8BA040000          <1> 	call	trans_addr_nmbp ; convert virtual address to physical
 11709                              <1> 		; esi = physical address (page start + offset)
 11710                              <1> 		; ecx = byte count in the page (1 - 4096)
 11711                              <1> 	; edi = offset to u.dirbuf (edi is not modified in trans_addr_nm)
 11712                              <1> 		; mov u.namep,r2 / r2 points to name of directory entry
 11713                              <1> 		; mov $u.dirbuf+2,r3 / r3 points to u.dirbuf+2
 11714                              <1> mkdir_1: ; 1:
 11715 000102BF 45                  <1> 	inc	ebp ; 12/10/2015
 11716                              <1> 	;
 11717                              <1> 	; / put characters in the directory name in u.dirbuf+2 - u.dirbuf+10
 11718                              <1> 	 ; 01/08/2013
 11719 000102C0 AC                  <1> 	lodsb
 11720                              <1> 		; movb (r2)+,r1 / move character in name to r1
 11721 000102C1 20C0                <1> 	and 	al, al
 11722 000102C3 7427                <1> 	jz 	short mkdir_3
 11723                              <1> 		; beq 1f / if null, done
 11724 000102C5 3C2F                <1> 	cmp	al, '/'
 11725                              <1> 		; cmp r1,$'/ / is it a "/"?
 11726 000102C7 7414                <1> 	je	short mkdir_err
 11727                              <1> 	;je	error
 11728                              <1> 		; beq error9 / yes, error
 11729                              <1> 	; 12/10/2015
 11730 000102C9 6649                <1> 	dec	cx
 11731 000102CB 7505                <1> 	jnz	short mkdir_2
 11732                              <1> 	; 12/10/2015 ([u.namep] -> ebp)
 11733 000102CD E8AD040000          <1> 	call	trans_addr_nm ; convert virtual address to physical
 11734                              <1> 		; esi = physical address (page start + offset)
 11735                              <1> 		; ecx = byte count in the page
 11736                              <1> 	; edi = offset to u.dirbuf (edi is not modified in trans_addr_nm)
 11737                              <1> mkdir_2:
 11738 000102D2 81FF[F4940100]      <1> 	cmp     edi, u.dirbuf+16 ; ; 04/12/2015 (10 -> 16)
 11739                              <1> 		; cmp r3,$u.dirbuf+10. / have we reached the last slot for
 11740                              <1> 				     ; / a char?
 11741 000102D8 74E5                <1> 	je	short mkdir_1
 11742                              <1> 		; beq 1b / yes, go back
 11743 000102DA AA                  <1> 	stosb
 11744                              <1> 		; movb r1,(r3)+ / no, put the char in the u.dirbuf
 11745 000102DB EBE2                <1> 	jmp 	short mkdir_1
 11746                              <1> 		; br 1b / get next char
 11747                              <1> mkdir_err:
 11748                              <1> 	; 17/06/2015
 11749 000102DD C705[18950100]1300- <1> 	mov	dword [u.error], ERR_NOT_DIR ; 'not a valid directory !'
 11749 000102E5 0000                <1>
 11750 000102E7 E994CBFFFF          <1> 	jmp	error
 11751                              <1> 
 11752                              <1> mkdir_3: ; 1:
 11753 000102EC A1[C4940100]        <1> 	mov	eax, [u.dirp]
 11754 000102F1 A3[CC940100]        <1> 	mov	[u.off], eax
 11755                              <1> 		; mov u.dirp,u.off / pointer to empty current directory
 11756                              <1> 				 ; / slot to u.off
 11757                              <1> wdir: ; 29/04/2013
 11758 000102F6 C705[D0940100]-     <1>         mov     dword [u.base], u.dirbuf
 11758 000102FC [E4940100]          <1>
 11759                              <1> 		; mov $u.dirbuf,u.base / u.base points to created file name
 11760 00010300 C705[D4940100]1000- <1>         mov     dword [u.count], 16 ; 04/12/2015 (10 -> 16) 
 11760 00010308 0000                <1>
 11761                              <1> 		; mov $10.,u.count / u.count = 10
 11762 0001030A 66A1[B4950100]      <1> 	mov	ax, [ii] 
 11763                              <1> 		; mov ii,r1 / r1 has i-number of current directory
 11764 00010310 B201                <1> 	mov	dl, 1 ; owner flag mask ; RETRO UNIX 8086 v1 modification !
 11765 00010312 E80D1D0000          <1> 	call 	access
 11766                              <1> 		; jsr r0,access; 1 / get i-node and set its file up
 11767                              <1> 				 ; / for writing
 11768                              <1> 	; AX = i-number of current directory
 11769                              <1> 	; 01/08/2013
 11770 00010317 FE05[12950100]      <1> 	inc     byte [u.kcall] ; the caller is 'mkdir' sign
 11771 0001031D E8F00E0000          <1> 	call	writei
 11772                              <1> 		; jsr r0,writei / write into directory
 11773 00010322 C3                  <1> 	retn
 11774                              <1> 		; rts r0
 11775                              <1> 
 11776                              <1> sysexec:
 11777                              <1> 	; 07/07/2025 - TRDOS 386 v2.0.10
 11778                              <1> 	; 21/08/2024 - TRDOS 386 v2.0.9
 11779                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 11780                              <1> 	; 06/02/2022 - Retro UNIX 386 v1.2
 11781                              <1> 	; 18/11/2017
 11782                              <1> 	; 14/11/2017
 11783                              <1> 	; 13/11/2017
 11784                              <1> 	; 24/10/2016 - 04/01/2017
 11785                              <1> 	; 24/04/2016 - TRDOS 386 (TRDOS v2.0)
 11786                              <1> 	; 23/06/2015 - 23/10/2015 (Retro UNIX 386 v1)
 11787                              <1> 	; 03/06/2013 - 06/12/2013 (Retro UNIX 8086 v1)
 11788                              <1> 	;
 11789                              <1> 	; 'sysexec' initiates execution of a file whose path name if
 11790                              <1> 	; pointed to by 'name' in the sysexec call. 
 11791                              <1> 	; 'sysexec' performs the following operations:
 11792                              <1> 	;    1. obtains i-number of file to be executed via 'namei'.
 11793                              <1> 	;    2. obtains i-node of file to be exceuted via 'iget'.
 11794                              <1> 	;    3. sets trap vectors to system routines.
 11795                              <1> 	;    4. loads arguments to be passed to executing file into
 11796                              <1> 	;	highest locations of user's core
 11797                              <1> 	;    5. puts pointers to arguments in locations immediately
 11798                              <1> 	;	following arguments.
 11799                              <1> 	;    6.	saves number of arguments in next location.
 11800                              <1> 	;    7. initializes user's stack area so that all registers
 11801                              <1> 	;	will be zeroed and the PS is cleared and the PC set
 11802                              <1> 	;	to core when 'sysret' restores registers
 11803                              <1> 	;	and does an rti.
 11804                              <1> 	;    8. initializes u.r0 and u.sp
 11805                              <1> 	;    9. zeros user's core down to u.r0
 11806                              <1> 	;   10.	reads executable file from storage device into core
 11807                              <1> 	;	starting at location 'core'.
 11808                              <1> 	;   11.	sets u.break to point to end of user's code with
 11809                              <1> 	;	data area appended.
 11810                              <1> 	;   12.	calls 'sysret' which returns control at location
 11811                              <1> 	;	'core' via 'rti' instruction.
 11812                              <1> 	;
 11813                              <1> 	; Calling sequence:
 11814                              <1> 	;	sysexec; namep; argp
 11815                              <1> 	; Arguments:
 11816                              <1> 	;	namep - points to pathname of file to be executed
 11817                              <1> 	;	argp  - address of table of argument pointers
 11818                              <1> 	;	argp1... argpn - table of argument pointers
 11819                              <1> 	;	argp1:<...0> ... argpn:<...0> - argument strings
 11820                              <1> 	; Inputs: (arguments)
 11821                              <1> 	; Outputs: -	
 11822                              <1> 	; ...............................................................
 11823                              <1> 	;
 11824                              <1> 	; Retro UNIX 386 v1 modification:
 11825                              <1> 	;	User application runs in it's own virtual space 
 11826                              <1> 	;	which is izolated from kernel memory (and other
 11827                              <1> 	;	memory pages) via 80386	paging in ring 3 
 11828                              <1> 	;	privilige mode. Virtual start address is always 0.
 11829                              <1> 	;	User's core memory starts at linear address 400000h
 11830                              <1> 	;	(the end of the 1st 4MB).
 11831                              <1> 	;
 11832                              <1> 	; Retro UNIX 8086 v1 modification:
 11833                              <1> 	;	user/application segment and system/kernel segment
 11834                              <1> 	;	are different and sysenter/sysret/sysrele routines
 11835                              <1> 	;	are different (user's registers are saved to 
 11836                              <1> 	;	and then restored from system's stack.)
 11837                              <1> 	;
 11838                              <1> 	;	NOTE: Retro UNIX 8086 v1 'arg2' routine gets these
 11839                              <1> 	;	      arguments which were in these registers;
 11840                              <1> 	;	      but, it returns by putting the 1st argument
 11841                              <1> 	;	      in 'u.namep' and the 2nd argument
 11842                              <1> 	;	      on top of stack. (1st argument is offset of the
 11843                              <1> 	;	      file/path name in the user's program segment.)
 11844                              <1> 	
 11845                              <1> 	;call	arg2
 11846                              <1> 	; * name - 'u.namep' points to address of file/path name
 11847                              <1> 	;          in the user's program segment ('u.segmnt')
 11848                              <1> 	;          with offset in BX register (as sysopen argument 1).
 11849                              <1> 	; * argp - sysexec argument 2 is in CX register 
 11850                              <1> 	;          which is on top of stack.
 11851                              <1> 	;
 11852                              <1> 		; jsr r0,arg2 / arg0 in u.namep,arg1 on top of stack
 11853                              <1> 
 11854                              <1> 	; 23/06/2015 (32 bit modifications)
 11855                              <1> 
 11856                              <1> 	;; 13/11/2017
 11857                              <1> 	;;mov	[u.namep], ebx ; argument 1
 11858                              <1>         ; 18/10/2015
 11859 00010323 890D[AC950100]      <1> 	mov     [argv], ecx  ; * ; argument 2
 11860                              <1> 
 11861                              <1> 	; 13/11/2017
 11862 00010329 89DE                <1> 	mov	esi, ebx
 11863 0001032B E8E61F0000          <1> 	call	set_working_path_x
 11864 00010330 7319                <1> 	jnc	short sysexec_0
 11865                              <1> 
 11866                              <1> 	;; 'bad command or file name'
 11867                              <1> 	;mov	eax, ERR_BAD_CMD_ARG ; 01h ; TRDOS 8086
 11868                              <1> 	
 11869                              <1> 	; 'file not found !' error
 11870 00010332 B802000000          <1> 	mov	eax, ERR_NOT_FOUND ; 02h ; TRDOS 8086
 11871                              <1> sysexec_not_found_err:
 11872                              <1> sysexec_access_error:
 11873                              <1> sysexec_ext_error:
 11874 00010337 A3[AC940100]        <1> 	mov	[u.r0], eax
 11875 0001033C A3[18950100]        <1> 	mov	[u.error], eax
 11876 00010341 E8A5200000          <1> 	call 	reset_working_path
 11877 00010346 E935CBFFFF          <1> 	jmp	error
 11878                              <1> 
 11879                              <1> sysexec_0:
 11880                              <1> 	; 13/11/2017
 11881                              <1> 	;mov	esi, FindFile_Name
 11882 0001034B 66B80018            <1>         mov	ax, 1800h ; Only files
 11883 0001034F E81688FFFF          <1> 	call	find_first_file
 11884 00010354 72E1                <1> 	jc	short sysexec_not_found_err ; eax = 2
 11885                              <1> 
 11886                              <1> 	; check_ file attributes
 11887                              <1> 	; (attribute bits = 00ADVSHR) ; 18h = Directory+Volume
 11888                              <1> 	; BL = Attributes byte
 11889                              <1> 	
 11890 00010356 F6C306              <1>         test	bl, 6  ; system file or hidden file (S+H) 
 11891                              <1> 	;jz	short sysexec_0ext
 11892 00010359 7417                <1> 	jz	short sysexec_1 ; yes
 11893                              <1> 
 11894                              <1> 	; 13/11/2017 
 11895                              <1> 	; /// TRDOS386 permission check for multiuser mode ///
 11896                              <1> 	; SYSTEM file or HIDDEN file !!
 11897                              <1> 	; (Only super user has permission to run this file.)
 11898                              <1> 	
 11899                              <1> 	; ([u.uid]=0 for super user or root in multiuser mode)
 11900                              <1> 	; ([u.uid]=0 for any users in singleuser mode)
 11901 0001035B 803D[FE940100]00    <1> 	cmp 	byte [u.uid], 0 ; Super User ([u.uid]=0) ?
 11902                              <1> 	;jna	short sysexec_0ext
 11903 00010362 760E                <1> 	jna	short sysexec_1 ; yes
 11904                              <1> 
 11905                              <1> 	; 'permission denied !' error
 11906 00010364 B80B000000          <1>         mov	eax, ERR_FILE_ACCESS  ; 11 = ERR_PERM_DENIED
 11907 00010369 EBCC                <1>         jmp	short sysexec_access_error
 11908                              <1> 
 11909                              <1> sysexec_not_exf:
 11910                              <1> 	; 'not executable file !' error
 11911 0001036B B816000000          <1> 	mov	eax, ERR_NOT_EXECUTABLE
 11912 00010370 EBC5                <1> 	jmp	sysexec_ext_error
 11913                              <1> 
 11914                              <1> ;sysexec_0ext:
 11915                              <1> sysexec_1:
 11916                              <1> 	; 18/11/2017
 11917 00010372 BE[94860100]        <1> 	mov	esi, FindFile_Name
 11918                              <1> 	; 13/11/2017
 11919                              <1> 	; check program file name extension
 11920                              <1> 	; ('.PRG' for current TRDOS version)
 11921 00010377 E8F2A1FFFF          <1> 	call	check_prg_filename_ext
 11922 0001037C 72ED                <1> 	jc	short sysexec_not_exf
 11923                              <1> 	
 11924                              <1> 	; 18/11/2017
 11925 0001037E 3C50                <1> 	cmp	al, 'P'
 11926 00010380 75E9                <1> 	jne	short sysexec_not_exf
 11927                              <1> 
 11928                              <1> 	; '.PRG' extension is OK.
 11929                              <1> 	; Only '.PRG' files are valid program files
 11930                              <1> 	; for current TRDOS 386 version.
 11931                              <1> 
 11932 00010382 8B15[C0860100]      <1> 	mov	edx, [FindFile_DirEntry+DirEntry_FileSize]
 11933 00010388 66A1[B8860100]      <1> 	mov	ax, [FindFile_DirEntry+DirEntry_FstClusHI]
 11934 0001038E C1E010              <1> 	shl	eax, 16
 11935 00010391 66A1[BE860100]      <1> 	mov	ax, [FindFile_DirEntry+DirEntry_FstClusLO]
 11936                              <1> 	; EAX = First Cluster number
 11937                              <1> 	; EDX = File Size
 11938                              <1> 
 11939 00010397 A3[B4950100]        <1> 	mov	[ii], eax
 11940 0001039C 8915[B8950100]      <1> 	mov	[i.size], edx
 11941                              <1> 
 11942                              <1> ;sysexec_1:
 11943                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 11944                              <1> 	; 06/02/2022 - Retro UNIX 386 v1.2
 11945                              <1> 	; 13/11/2017 - TRDOS 386 (TRDOS v2.0)
 11946                              <1> 	; 24/06/2015 - 23/10/2015 (Retro UNIX 386 v1)
 11947                              <1>         ; Moving arguments to the end of [u.upage]
 11948                              <1> 	; (by regarding page borders in user's memory space)
 11949                              <1> 	;
 11950                              <1> 	; 10/10/2015
 11951                              <1> 	; 21/07/2015
 11952                              <1> 	;mov	ebp, esp ; (**)
 11953                              <1> 	; 18/10/2015
 11954                              <1> 	;mov 	edi, ebp
 11955                              <1> 	; 23/07/2022
 11956 000103A2 89E7                <1> 	mov	edi, esp ; (**)
 11957 000103A4 B900010000          <1> 	mov 	ecx, MAX_ARG_LEN ; 256
 11958                              <1> 	;sub	edi, MAX_ARG_LEN ; 256
 11959 000103A9 29CF                <1> 	sub	edi, ecx
 11960 000103AB 89FC                <1> 	mov	esp, edi ; *!*
 11961 000103AD 31C0                <1> 	xor	eax, eax
 11962 000103AF A3[D8940100]        <1> 	mov 	[u.nread], eax ; 0
 11963                              <1> 	; ([argc] must be cleared because previous 'sysexec'
 11964                              <1> 	; may leave it with any value after an error))
 11965                              <1> 	;mov	[argc], ax ; 0 ; 13/11/2017
 11966                              <1> 	; 23/07/2022
 11967 000103B4 A3[A8950100]        <1> 	mov	[argc], eax ; 0
 11968 000103B9 49                  <1> 	dec	ecx ; 256 - 1
 11969 000103BA 890D[D4940100]      <1> 	mov 	[u.count], ecx ; MAX_ARG_LEN - 1 ; 255
 11970                              <1> 	;mov 	dword [u.count], MAX_ARG_LEN - 1 ; 255
 11971                              <1> sysexec_2:
 11972 000103C0 8B35[AC950100]      <1> 	mov	esi, [argv] ; 18/10/2015 
 11973 000103C6 E86E020000          <1> 	call	get_argp
 11974                              <1> 	;mov	ecx, 4
 11975                              <1> 	; 23/07/2022
 11976 000103CB 31C9                <1> 	xor	ecx, ecx
 11977 000103CD B104                <1> 	mov	cl, 4
 11978                              <1> sysexec_3:
 11979 000103CF 21C0                <1> 	and	eax, eax
 11980 000103D1 7453                <1>         jz	short sysexec_6 ; 23/07/2022
 11981                              <1> 	; 18/10/2015
 11982 000103D3 010D[AC950100]      <1> 	add	[argv], ecx ; 4
 11983                              <1> 	;;inc	word [argc]
 11984                              <1> 	; 23/07/2022
 11985                              <1> 	;inc	dword [argc]
 11986 000103D9 FE05[A8950100]      <1> 	inc	byte [argc]
 11987                              <1> 	;
 11988 000103DF A3[D0940100]        <1> 	mov	[u.base], eax
 11989                              <1>  	; 23/10/2015
 11990 000103E4 66C705[10950100]00- <1> 	mov	word [u.pcount], 0
 11990 000103EC 00                  <1>
 11991                              <1> sysexec_4:
 11992 000103ED E85F0B0000          <1> 	call	cpass ; get a character from user's core memory
 11993 000103F2 750B                <1>         jnz	short sysexec_5
 11994                              <1> 		; (max. 255 chars + null)
 11995                              <1> 	; 18/10/2015
 11996 000103F4 28C0                <1> 	sub 	al, al
 11997 000103F6 AA                  <1> 	stosb
 11998 000103F7 FF05[D8940100]      <1> 	inc	dword [u.nread]
 11999                              <1> 	; 23/07/2022
 12000 000103FD EB27                <1> 	jmp	short sysexec_6 ; 24/04/2016
 12001                              <1> sysexec_5:
 12002 000103FF AA                  <1> 	stosb
 12003 00010400 20C0                <1> 	and 	al, al
 12004 00010402 75E9                <1> 	jnz	short sysexec_4
 12005                              <1> 	;mov	ecx, 4
 12006                              <1> 	; 23/07/2022
 12007 00010404 31C9                <1> 	xor	ecx, ecx
 12008 00010406 B104                <1> 	mov	cl, 4
 12009 00010408 390D[A4950100]      <1> 	cmp	[ncount], ecx ; 4
 12010 0001040E 72B0                <1> 	jb	short sysexec_2
 12011 00010410 8B35[A0950100]      <1> 	mov	esi, [nbase]
 12012 00010416 010D[A0950100]      <1> 	add	[nbase], ecx ; 4
 12013                              <1> 	;sub	[ncount], cx 
 12014                              <1> 	; 23/07/2022
 12015 0001041C 290D[A4950100]      <1> 	sub	[ncount], ecx
 12016 00010422 8B06                <1> 	mov	eax, [esi]
 12017 00010424 EBA9                <1> 	jmp	short sysexec_3
 12018                              <1> 
 12019                              <1> sysexec_6:
 12020                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 12021                              <1> 	; 19/11/2017
 12022                              <1> 	; 18/11/2017
 12023                              <1> 	; 14/11/2017
 12024                              <1> 	; 13/11/2017
 12025 00010426 8925[AC950100]      <1> 	mov	[argv], esp ; *!* ; start address of argument list
 12026                              <1> 
 12027                              <1> 	; 04/01/2017
 12028                              <1> 	; 24/10/2016
 12029                              <1> 	;;02/05/2016
 12030                              <1> 	; 23/04/2016 (TRDOS 386)
 12031                              <1> 	; 18/10/2015 ('sysexec_6')
 12032                              <1> 	; 23/06/2015
 12033 0001042C A1[04950100]        <1> 	mov	eax, [u.pgdir] ; physical address of page directory
 12034                              <1> 	;cmp 	eax, [k_page_dir] ; TRDOS MainProg ?
 12035                              <1> 	;je	short sysexec_7
 12036                              <1> 	; 19/11/2017
 12037 00010431 8B1D[08950100]      <1> 	mov	ebx, [u.ppgdir] ; phy addr of the parent's page dir
 12038 00010437 E8D454FFFF          <1> 	call	deallocate_page_dir
 12039                              <1> sysexec_7:
 12040 0001043C E80454FFFF          <1> 	call	make_page_dir
 12041                              <1> 	;jc	panic  ; allocation error 
 12042                              <1> 	;	       ; after a deallocation would be nonsence !?
 12043                              <1> 	; 23/07/2022
 12044 00010441 7243                <1> 	jc	short sysexec_panic
 12045                              <1> 
 12046                              <1> 	; 24/07/2015
 12047                              <1> 	; map kernel pages (1st 4MB) to PDE 0
 12048                              <1> 	;     of the user's page directory
 12049                              <1> 	;     (It is needed for interrupts!)
 12050                              <1> 	; 18/10/2015
 12051 00010443 8B15[F07C0100]      <1> 	mov	edx, [k_page_dir] ; Kernel's page directory
 12052 00010449 8B02                <1> 	mov	eax, [edx] ; physical address of
 12053                              <1> 			   ; kernel's first page table (1st 4 MB)
 12054                              <1> 			   ; (PDE 0 of kernel's page directory)
 12055 0001044B 8B15[04950100]      <1> 	mov 	edx, [u.pgdir]
 12056 00010451 8902                <1> 	mov	[edx], eax ; PDE 0 (1st 4MB)
 12057                              <1> 	;
 12058                              <1> 	; 20/07/2015
 12059 00010453 BB00004000          <1> 	mov	ebx, CORE ; start address = 0 (virtual) + CORE
 12060                              <1> 	; 18/10/2015
 12061 00010458 BE[98950100]        <1> 	mov	esi, pcore ; physical start address
 12062                              <1> sysexec_8:	
 12063 0001045D B907000000          <1> 	mov	ecx, PDE_A_USER + PDE_A_WRITE + PDE_A_PRESENT
 12064 00010462 E8FC53FFFF          <1> 	call	make_page_table
 12065                              <1> 	;jc	panic
 12066                              <1> 	; 23/07/2022
 12067 00010467 721D                <1> 	jc	short sysexec_panic
 12068                              <1> 	;
 12069                              <1> 	;mov	ecx, PTE_A_USER + PTE_A_WRITE + PTE_A_PRESENT
 12070 00010469 E80354FFFF          <1> 	call	make_page ; make new page, clear and set the pte
 12071                              <1> 	;jc	panic
 12072                              <1> 	; 23/07/2022
 12073 0001046E 7216                <1> 	jc	short sysexec_panic
 12074                              <1> 	;
 12075 00010470 8906                <1> 	mov	[esi], eax ; 24/06/2015
 12076                              <1> 	; ebx = virtual address (24/07/2015)
 12077                              <1> 	; 23/07/2022
 12078                              <1> 	;call 	add_to_swap_queue
 12079                              <1> 	; 18/10/2015
 12080 00010472 81FE[9C950100]      <1> 	cmp	esi, ecore ; user's stack (last) page ?
 12081 00010478 7411                <1> 	je	short sysexec_9 ; yes
 12082 0001047A BE[9C950100]        <1> 	mov	esi, ecore  ; physical address of the last page
 12083                              <1> 	; 20/07/2015
 12084 0001047F BB00F0FFFF          <1> 	mov	ebx, (ECORE - PAGE_SIZE) + CORE
 12085                              <1> 	; ebx = virtual end address + segment base address - 4K
 12086 00010484 EBD7                <1>         jmp     short sysexec_8
 12087                              <1> sysexec_panic:
 12088                              <1> 	; 23/07/2022
 12089 00010486 E93E69FFFF          <1> 	jmp	panic
 12090                              <1> 
 12091                              <1> sysexec_9:
 12092                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 12093                              <1> 	; 19/11/2017 
 12094                              <1> 	; 24/04/2016 (TRDOS 386 = TRDOS v2.0)
 12095                              <1> 	; 25/06/2015 - 26/08/2015 - 18/10/2015
 12096                              <1> 	; move arguments from kernel stack to [ecore]
 12097                              <1> 	; (argument list/line will be copied from kernel stack
 12098                              <1> 	; frame to the last (stack) page of user's core memory)
 12099                              <1> 	; 18/10/2015
 12100 0001048B 8B3D[9C950100]      <1> 	mov	edi, [ecore]
 12101 00010491 81C700100000        <1> 	add	edi, PAGE_SIZE
 12102                              <1> 	; 19/11/2017
 12103                              <1> 	;sub	edi, 4
 12104                              <1> 	;mov	dword [edi], 0
 12105                              <1> 	;mov	ebx, edi
 12106                              <1> 	;
 12107                              <1> 	;movzx	eax, word [argc]
 12108                              <1> 	;or	eax, eax
 12109                              <1> 	;jz	short sysexec_13 ; 19/11/2017
 12110                              <1> 	;;jnz	short sysexec_10
 12111                              <1> 	;;mov 	ebx, edi
 12112                              <1> 	;;sub	ebx, 4 
 12113                              <1> 	;;mov	[ebx], eax ; 0
 12114                              <1> 	;;jmp 	short sysexec_13
 12115                              <1> 	; 23/07/2022
 12116                              <1> 	; [argc] < 32
 12117 00010497 A1[A8950100]        <1> 	mov	eax, [argc]
 12118 0001049C 09C0                <1> 	or	eax, eax
 12119 0001049E 7509                <1> 	jnz	short sysexec_10
 12120 000104A0 89FB                <1> 	mov 	ebx, edi
 12121 000104A2 83EB04              <1> 	sub	ebx, 4 
 12122 000104A5 8903                <1> 	mov	[ebx], eax ; 0
 12123 000104A7 EB47                <1> 	jmp 	short sysexec_13
 12124                              <1> 
 12125                              <1> sysexec_10:
 12126 000104A9 8B0D[D8940100]      <1> 	mov	ecx, [u.nread]
 12127                              <1> 	; 13/11/2017
 12128                              <1> 	;;mov	esi, TextBuffer ; 'load_and_execute_file'
 12129                              <1> 	;mov	esi, esp  	; 'sysexec'
 12130 000104AF 8B35[AC950100]      <1> 	mov	esi, [argv] ; 24/04/2016 (TRDOS 386  = TRDOS v2.0)
 12131                              <1> 	; 23/07/2022
 12132 000104B5 29CF                <1> 	sub	edi, ecx ; page end address - argument list length
 12133                              <1> 	;sub	ebx, ecx ; 19/11/2017
 12134                              <1> 
 12135                              <1> 	;;;;
 12136                              <1> 	; 23/07/2022
 12137                              <1> 	; (move edi -backward- to dword boundary)
 12138                              <1> 	; ((this will prevent 'general protection fault' error
 12139                              <1> 	;  as result of a lodsd or dword move instruction
 12140                              <1> 	;  at the end of argument list))
 12141 000104B7 83EF03              <1> 	sub	edi, 3
 12142 000104BA 83E7FC              <1> 	and	edi, ~3 ; (*)
 12143                              <1> 	;;;
 12144                              <1> 
 12145 000104BD 89C2                <1> 	mov	edx, eax
 12146 000104BF FEC2                <1> 	inc	dl ; argument count + 1 for argc value
 12147 000104C1 C0E202              <1> 	shl 	dl, 2  ; 4 * (argument count + 1)
 12148                              <1> 	; edx <= 128
 12149 000104C4 89FB                <1> 	mov	ebx, edi
 12150                              <1> 	;mov	edi, ebx ; 19//11/2017
 12151                              <1> 	; 23/07/2022 (*) - edi is already dword aligned -
 12152                              <1> 	;and	bl, 0FCh ; 32 bit (dword) alignment
 12153 000104C6 29D3                <1> 	sub 	ebx, edx
 12154 000104C8 89FA                <1> 	mov	edx, edi
 12155 000104CA F3A4                <1> 	rep	movsb
 12156 000104CC 89D6                <1> 	mov 	esi, edx
 12157 000104CE 89DF                <1> 	mov 	edi, ebx
 12158 000104D0 BA00F0BFFF          <1> 	mov	edx, ECORE - PAGE_SIZE ; virtual addr. of the last page
 12159 000104D5 2B15[9C950100]      <1> 	sub 	edx, [ecore] ; difference (virtual - physical)
 12160 000104DB AB                  <1> 	stosd	; eax = argument count
 12161                              <1> sysexec_11:
 12162 000104DC 89F0                <1> 	mov	eax, esi
 12163 000104DE 01D0                <1> 	add	eax, edx
 12164 000104E0 AB                  <1> 	stosd  ; eax = virtual address
 12165                              <1> 	; 23/07/2022
 12166 000104E1 FE0D[A8950100]      <1> 	dec	byte [argc]
 12167                              <1> 	;dec	dword [argc]
 12168                              <1> 	;;dec	word [argc] ; 14/11/2017
 12169 000104E7 7407                <1> 	jz	short sysexec_13
 12170                              <1> sysexec_12:
 12171 000104E9 AC                  <1> 	lodsb
 12172 000104EA 20C0                <1> 	and	al, al
 12173 000104EC 75FB                <1> 	jnz	short sysexec_12
 12174 000104EE EBEC                <1> 	jmp	short sysexec_11
 12175                              <1> sysexec_13:
 12176                              <1> 	; 24/10/2016
 12177                              <1> 	; 24/04/2016 - TRDOS 386 (TRDOS v2.0)
 12178                              <1> 	; 23/06/2015 - 19/10/2015 (Retro UNIX 386 v1, 'sysexec_13')
 12179                              <1> 	;
 12180                              <1> 	; moving arguments to [ecore] is OK here..
 12181                              <1> 	;
 12182                              <1> 	; ebx = beginning addres of argument list pointers
 12183                              <1> 		;	in user's stack
 12184 000104F0 2B1D[9C950100]      <1> 	sub 	ebx, [ecore]
 12185 000104F6 81C300F0BFFF        <1> 	add     ebx, (ECORE - PAGE_SIZE)
 12186                              <1> 			; end of core - 4096 (last page)
 12187                              <1> 			; (virtual address)
 12188 000104FC 891D[AC950100]      <1> 	mov	[argv], ebx
 12189 00010502 891D[DC940100]      <1> 	mov	[u.break], ebx ; available user memory
 12190                              <1> 	;
 12191 00010508 29C0                <1> 	sub	eax, eax
 12192 0001050A C705[D4940100]2000- <1> 	mov	dword [u.count], 32 ; Executable file header size
 12192 00010512 0000                <1>
 12193 00010514 C705[C0940100]-     <1> 	mov	dword [u.fofp], u.off
 12193 0001051A [CC940100]          <1>
 12194 0001051E A3[CC940100]        <1> 	mov	[u.off], eax ; 0
 12195 00010523 A3[D0940100]        <1> 	mov	[u.base], eax ; 0, start of user's core (virtual)
 12196                              <1> 	; 24/10/2016
 12197 00010528 A0[B27D0100]        <1> 	mov	al, [Current_Drv]
 12198 0001052D A2[91940100]        <1> 	mov	[cdev], al
 12199                              <1> 	;
 12200 00010532 A1[B4950100]        <1> 	mov	eax, [ii] ; Fist Cluster of the Program (PRG) file
 12201                              <1> 	; EAX = First cluster of the executable file
 12202 00010537 E8BB050000          <1> 	call	readi
 12203                              <1> 
 12204 0001053C 8B0D[DC940100]      <1> 	mov	ecx, [u.break] ; top of user's stack (physical addr.)
 12205 00010542 890D[D4940100]      <1> 	mov	[u.count], ecx ; save for overrun check
 12206                              <1> 	;
 12207 00010548 8B0D[D8940100]      <1> 	mov	ecx, [u.nread]
 12208 0001054E 890D[DC940100]      <1> 	mov	[u.break], ecx ; virtual address (offset from start)
 12209 00010554 80F920              <1> 	cmp	cl, 32
 12210 00010557 7540                <1>         jne     short sysexec_15
 12211                              <1> 	;:
 12212                              <1> 	; Retro UNIX 386 v1 (32 bit) executable file header format
 12213 00010559 8B35[98950100]      <1> 	mov	esi, [pcore] ; start address of user's core memory 
 12214                              <1> 		             ; (phys. start addr. of the exec. file)
 12215 0001055F AD                  <1> 	lodsd
 12216 00010560 663DEB1E            <1> 	cmp	ax, 1EEBh ; EBH, 1Eh -> jump to +32
 12217 00010564 7533                <1> 	jne	short sysexec_15
 12218 00010566 AD                  <1> 	lodsd
 12219 00010567 89C1                <1> 	mov	ecx, eax ; text (code) section size
 12220 00010569 AD                  <1> 	lodsd
 12221 0001056A 01C1                <1> 	add	ecx, eax ; + data section size (initialized data)
 12222 0001056C 89CB                <1> 	mov	ebx, ecx
 12223 0001056E AD                  <1> 	lodsd	
 12224 0001056F 01C3                <1> 	add	ebx, eax ; + bss section size (for overrun checking)
 12225 00010571 3B1D[D4940100]      <1> 	cmp	ebx, [u.count]
 12226 00010577 7711                <1> 	ja	short sysexec_14  ; program overruns stack !
 12227                              <1> 	;
 12228                              <1> 	; add bss section size to [u.break]
 12229 00010579 0105[DC940100]      <1> 	add 	[u.break], eax
 12230                              <1> 	;
 12231 0001057F 83E920              <1> 	sub	ecx, 32  ; header size (already loaded)
 12232                              <1> 	;cmp	ecx, [u.count]
 12233                              <1> 	;jnb	short sysexec_16
 12234 00010582 890D[D4940100]      <1> 	mov	[u.count], ecx ; required read count
 12235 00010588 EB29                <1> 	jmp	short sysexec_16
 12236                              <1> sysexec_14:
 12237                              <1> 	; insufficient (out of) memory
 12238 0001058A C705[18950100]0400- <1> 	mov	dword [u.error], ERR_MINOR_IM ; 1
 12238 00010592 0000                <1>
 12239 00010594 E9E7C8FFFF          <1> 	jmp	error
 12240                              <1> sysexec_15:
 12241 00010599 8B15[B8950100]      <1>         mov	edx, [i.size] ; file size
 12242 0001059F 29CA                <1> 	sub	edx, ecx ; file size - loaded bytes
 12243 000105A1 7626                <1> 	jna	short sysexec_17 ; no need to next read
 12244 000105A3 01D1                <1> 	add	ecx, edx ; [i.size]
 12245 000105A5 3B0D[D4940100]      <1> 	cmp	ecx, [u.count] ; overrun check (!)
 12246 000105AB 77DD                <1> 	ja	short sysexec_14
 12247 000105AD 8915[D4940100]      <1> 	mov	[u.count], edx
 12248                              <1> sysexec_16:
 12249 000105B3 A1[B4950100]        <1> 	mov	eax, [ii] ; first cluster
 12250 000105B8 E83A050000          <1> 	call	readi
 12251 000105BD 8B0D[D8940100]      <1> 	mov	ecx, [u.nread]
 12252 000105C3 010D[DC940100]      <1> 	add	[u.break], ecx
 12253                              <1> sysexec_17:
 12254                              <1> 	; 07/07/2025
 12255                              <1> 	;mov	eax, [ii] ; first cluster
 12256                              <1> 	;call	iclose
 12257 000105C9 31C0                <1> 	xor     eax, eax
 12258                              <1> 	
 12259                              <1> 	; 21/08/2024
 12260                              <1> 	;inc	al
 12261                              <1> 	;mov	[u.intr], ax ; 1 (interrupt/time-out is enabled)
 12262                              <1> 	;mov	[u.quit], ax ; 1 ('crtl+brk' signal is enabled)
 12263                              <1> 	; 23/07/2022
 12264                              <1> 	;dec	al
 12265                              <1> 	; 21/08/2024
 12266 000105CB 48                  <1> 	dec	eax
 12267 000105CC 66A3[F8940100]      <1> 	mov	[u.intr], ax ; -1 ; 0FFFFh ; enable CTRL+CRK
 12268 000105D2 40                  <1> 	inc	eax
 12269 000105D3 66A3[FA940100]      <1> 	mov	[u.quit], ax ; 0 ; reset CTRL+BRK flag
 12270                              <1> 
 12271                              <1> 	;cmp	dword [u.ppgdir], 0  ; is the caller MainProg (kernel) ?
 12272 000105D9 3905[08950100]      <1> 	cmp	[u.ppgdir], eax ; 0 ; 23/07/2022
 12273 000105DF 770C                <1> 	ja	short sysexec_18 ; no, the caller is user process
 12274                              <1> 	; If the caller is kernel (MainProg), 'sysexec' will come here
 12275 000105E1 8B15[F07C0100]      <1> 	mov	edx, [k_page_dir] ; kernel's page directory
 12276 000105E7 8915[08950100]      <1> 	mov	[u.ppgdir], edx ; next time 'sysexec' must not come here
 12277                              <1> sysexec_18:
 12278                              <1> 	; 02/05/2016
 12279                              <1> 	; 24/04/2016 (TRDOS 386 = TRDOS v2.0)
 12280                              <1> 	; 18/10/2015 (Retro UNIX 386 v1)
 12281                              <1> 	; 05/08/2015
 12282                              <1> 	; 29/07/2015
 12283                              <1> 
 12284                              <1> ;	; **** arguments list test start - 19/11/2017
 12285                              <1> ;	mov	ebp, [argv]
 12286                              <1> ;	sub	ebp, ECORE - 4096
 12287                              <1> ;	add	ebp, [ecore]
 12288                              <1> ;
 12289                              <1> ;	mov	ebx, [ebp]
 12290                              <1> ;	mov	[argc], bx
 12291                              <1> ;	add	ebp, 4
 12292                              <1> ;	mov	byte [ccolor], 1Fh
 12293                              <1> ;_zx0:
 12294                              <1> ;	cmp	word [argc], 0
 12295                              <1> ;	jna	short _zx2
 12296                              <1> ;_zx1:
 12297                              <1> ;	push	ebp
 12298                              <1> ;	mov	esi, [ebp]
 12299                              <1> ;
 12300                              <1> ;	sub	esi, ECORE - 4096
 12301                              <1> ;	add	esi, [ecore]
 12302                              <1> ;
 12303                              <1> ;	call	print_cmsg
 12304                              <1> ;
 12305                              <1> ;	dec	word [argc]
 12306                              <1> ;	jz	short _zx2
 12307                              <1> ;
 12308                              <1> ;	mov	al, '.'
 12309                              <1> ;	mov	bl, 07h
 12310                              <1> ;	mov	bh, [u.ttyn]
 12311                              <1> ;	call 	_write_tty 
 12312                              <1> ;
 12313                              <1> ;	pop	ebp
 12314                              <1> ;	add	ebp, 4
 12315                              <1> ;	jmp	short _zx1
 12316                              <1> ;_zx2:
 12317                              <1> ;	pop	ebp
 12318                              <1> ;	mov	byte [ccolor], 07h
 12319                              <1> ;	mov	eax, 1
 12320                              <1> ;	; **** arguments list test stop
 12321                              <1> ;	Test result is OK! (there is not a wrong thing) - 19/11/2017
 12322                              <1> 
 12323 000105ED 8B2D[AC950100]      <1> 	mov	ebp, [argv] ; user's stack pointer must point to argument
 12324                              <1> 			    ; list pointers (argument count)
 12325 000105F3 FA                  <1> 	cli
 12326 000105F4 8B25[8C7C0100]      <1>         mov     esp, [tss.esp0] ; ring 0 (kernel) stack pointer
 12327                              <1> 	;mov   	esp, [u.sp] ; Restore Kernel stack
 12328                              <1> 			    ; for this process
 12329                              <1> 	;add	esp, 20 ; --> EIP, CS, EFLAGS, ESP, SS
 12330                              <1> 	;;xor	eax, eax ; 0
 12331                              <1> 	; 23/07/2022
 12332                              <1> 	;dec	al ; eax = 0
 12333                              <1> 	; eax = 0
 12334                              <1> 
 12335                              <1> 	;mov	edx, UDATA
 12336                              <1> 	; 18/11/2017
 12337 000105FA 6A23                <1> 	push	UDATA ; user's stack segment
 12338                              <1> 	;push	edx
 12339 000105FC 55                  <1> 	push	ebp ; user's stack pointer
 12340                              <1> 		    ; (points to number of arguments)
 12341                              <1> 	
 12342                              <1> 	; 04/01/2017
 12343                              <1> 	; MainProg comes here while [sysflg]= 0FFh
 12344                              <1> 	; (but sysexec comes here while [sysflg]= 0)
 12345 000105FD C605[A0940100]00    <1> 	mov	byte [sysflg], 0 ; 04/01/2017
 12346                              <1> 				 ; (timer_int sysflg control)
 12347 00010604 FB                  <1> 	sti
 12348 00010605 9C                  <1> 	pushfd	; EFLAGS
 12349                              <1> 		; Set IF for enabling interrupts in user mode
 12350                              <1> 	;or	dword [esp], 200h 
 12351                              <1> 	;
 12352                              <1> 	;mov	bx, UCODE
 12353                              <1> 	;push	bx ; user's code segment
 12354 00010606 6A1B                <1> 	push	UCODE
 12355                              <1> 	;push	0
 12356 00010608 50                  <1> 	push	eax ; EIP (=0) - start address -
 12357 00010609 8925[A4940100]      <1> 	mov	[u.sp], esp ; 29/07/2015
 12358                              <1> 	; 05/08/2015
 12359                              <1> 	; Remedy of a General Protection Fault during 'iretd' is here !
 12360                              <1> 	; ('push dx' would cause to general protection fault, 
 12361                              <1> 	; after 'pop ds' etc.)
 12362                              <1> 	;
 12363                              <1> 	;; push dx ; ds (UDATA)
 12364                              <1> 	;; push dx ; es (UDATA)
 12365                              <1> 	;; push dx ; fs (UDATA)
 12366                              <1> 	;; push dx ; gs (UDATA)
 12367                              <1> 	;
 12368                              <1> 	; This is a trick to prevent general protection fault
 12369                              <1> 	; during 'iretd' intruction at the end of 'sysrele' (in u1.s):
 12370 0001060F 66BA2300            <1> 	mov	dx, UDATA ; 19/11/2017
 12371 00010613 8EC2                <1> 	mov 	es, dx ; UDATA
 12372 00010615 06                  <1> 	push 	es ; ds (UDATA)
 12373 00010616 06                  <1> 	push 	es ; es (UDATA)
 12374 00010617 06                  <1> 	push 	es ; fs (UDATA)
 12375 00010618 06                  <1> 	push	es ; gs (UDATA)
 12376 00010619 66BA1000            <1> 	mov	dx, KDATA
 12377 0001061D 8EC2                <1> 	mov	es, dx
 12378                              <1> 	;
 12379                              <1> 	;; pushad simulation
 12380 0001061F 89E5                <1> 	mov	ebp, esp ; esp before pushad
 12381 00010621 50                  <1> 	push	eax ; eax (0)
 12382 00010622 50                  <1> 	push	eax ; ecx (0)
 12383 00010623 50                  <1> 	push	eax ; edx (0)
 12384 00010624 50                  <1> 	push	eax ; ebx (0)
 12385 00010625 55                  <1> 	push	ebp ; esp before pushad
 12386 00010626 50                  <1> 	push	eax ; ebp (0)
 12387 00010627 50                  <1> 	push	eax ; esi (0)
 12388 00010628 50                  <1> 	push	eax ; edi (0)
 12389                              <1> 	;
 12390 00010629 A3[AC940100]        <1> 	mov	[u.r0], eax ; eax = 0
 12391 0001062E 8925[A8940100]      <1> 	mov	[u.usp], esp
 12392                              <1> 
 12393                              <1> 	; 14/11/2017
 12394 00010634 E969C8FFFF          <1> 	jmp	sysret0
 12395                              <1> 
 12396                              <1> get_argp:
 12397                              <1> 	; 08/08/2022
 12398                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 12399                              <1> 	; 11/12/2021 - Retro UNIX 386 v1.2 
 12400                              <1> 	; 14/11/2017 - TRDOS 386 (TRDOS v2.0)
 12401                              <1> 	; 18/10/2015 (nbase, ncount)
 12402                              <1> 	; 21/07/2015
 12403                              <1> 	; 24/06/2015 (Retro UNIX 386 v1)
 12404                              <1> 	; Get (virtual) address of argument from user's core memory
 12405                              <1> 	;
 12406                              <1> 	; INPUT:
 12407                              <1> 	;	esi = virtual address of argument pointer
 12408                              <1> 	; OUTPUT:
 12409                              <1> 	;	eax = virtual address of argument
 12410                              <1> 	;
 12411                              <1> 	; Modified registers: EAX, EBX, ECX, EDX, ESI 
 12412                              <1> 	;
 12413 00010639 833D[08950100]00    <1>  	cmp     dword [u.ppgdir], 0 ; /etc/init ?
 12414                              <1> 				    ; (the caller is kernel)
 12415                              <1> 	;jna	short get_argpk
 12416                              <1> 	; 08/08/2022
 12417 00010640 7705                <1> 	ja	short get_argp5
 12418 00010642 E985000000          <1> 	jmp	get_argpk
 12419                              <1> get_argp5:
 12420 00010647 89F3                <1>      	mov	ebx, esi
 12421 00010649 E87055FFFF          <1> 	call	get_physical_addr ; get physical address
 12422 0001064E 7253                <1>         jc      short get_argp_err ; 23/07/2022
 12423 00010650 A3[A0950100]        <1> 	mov 	[nbase], eax ; physical address
 12424                              <1> 	;mov	[ncount], cx ; remain byte count in page (1-4096)
 12425                              <1> 	; 23/07/2022
 12426 00010655 890D[A4950100]      <1> 	mov	[ncount], ecx
 12427                              <1> 	;mov	eax, 4 ; 21/07/2015
 12428 0001065B 31C0                <1> 	xor	eax, eax
 12429 0001065D B004                <1> 	mov	al, 4
 12430                              <1> 	;cmp	cx, ax ; 4
 12431                              <1> 	; 23/07/2022
 12432 0001065F 39C1                <1> 	cmp	ecx, eax ; 4
 12433 00010661 7354                <1> 	jnb	short get_argp2
 12434 00010663 89F3                <1> 	mov	ebx, esi
 12435 00010665 01CB                <1> 	add	ebx, ecx
 12436 00010667 E85255FFFF          <1> 	call	get_physical_addr ; get physical address
 12437 0001066C 7235                <1> 	jc	short get_argp_err
 12438                              <1> 	;push	esi
 12439 0001066E 89C6                <1> 	mov	esi, eax
 12440                              <1> 	;xchg	cx, [ncount]
 12441                              <1> 	; 23/07/2022
 12442 00010670 870D[A4950100]      <1> 	xchg	ecx, [ncount]
 12443 00010676 8735[A0950100]      <1> 	xchg	esi, [nbase]
 12444 0001067C B504                <1> 	mov	ch, 4
 12445 0001067E 28CD                <1> 	sub	ch, cl
 12446                              <1> get_argp0:
 12447 00010680 AC                  <1> 	lodsb
 12448                              <1> 	;push	ax
 12449                              <1> 	; 23/07/2022
 12450 00010681 50                  <1> 	push	eax
 12451 00010682 FEC9                <1> 	dec	cl
 12452 00010684 75FA                <1>         jnz     short get_argp0
 12453 00010686 8B35[A0950100]      <1> 	mov	esi, [nbase]
 12454                              <1> 	; 21/07/2015
 12455 0001068C 0FB6C5              <1> 	movzx	eax, ch
 12456 0001068F 0105[A0950100]      <1> 	add	[nbase], eax
 12457                              <1> 	;sub	[ncount], ax
 12458                              <1> 	; 23/07/2022
 12459 00010695 2905[A4950100]      <1> 	sub	[ncount], eax
 12460                              <1> get_argp1:
 12461 0001069B AC                  <1> 	lodsb
 12462 0001069C FECD                <1> 	dec	ch
 12463 0001069E 7445                <1>         jz      short get_argp3
 12464                              <1>         ;push	ax
 12465                              <1> 	; 23/07/2022
 12466 000106A0 50                  <1> 	push	eax
 12467 000106A1 EBF8                <1> 	jmp     short get_argp1
 12468                              <1> get_argp_err:
 12469 000106A3 A3[18950100]        <1> 	mov	[u.error], eax
 12470                              <1> 	; 14/11/2017
 12471 000106A8 B801000000          <1> 	mov	eax, ERR_BAD_CMD_ARG ; 01h ; TRDOS 8086
 12472 000106AD A3[AC940100]        <1> 	mov	[u.r0], eax
 12473 000106B2 E9C9C7FFFF          <1> 	jmp	error
 12474                              <1> get_argp2:
 12475                              <1> 	; 21/07/2015
 12476                              <1> 	;mov	eax, 4
 12477 000106B7 8B15[A0950100]      <1> 	mov 	edx, [nbase] ; 18/10/2015
 12478 000106BD 0105[A0950100]      <1> 	add	[nbase], eax
 12479                              <1> 	;sub	[ncount], ax
 12480                              <1> 	; 23/07/2022
 12481 000106C3 2905[A4950100]      <1> 	sub	[ncount], eax
 12482                              <1> 	;
 12483 000106C9 8B02                <1> 	mov	eax, [edx]
 12484 000106CB C3                  <1> 	retn
 12485                              <1> get_argpk:
 12486                              <1> 	; Argument is in kernel's memory space
 12487 000106CC 66C705[A4950100]00- <1> 	mov	word [ncount], PAGE_SIZE ; 4096
 12487 000106D4 10                  <1>
 12488 000106D5 8935[A0950100]      <1> 	mov	[nbase], esi
 12489 000106DB 8305[A0950100]04    <1> 	add	dword [nbase], 4
 12490 000106E2 8B06                <1> 	mov	eax, [esi] ; virtual addr. = physical addr.
 12491 000106E4 C3                  <1> 	retn
 12492                              <1> get_argp3:
 12493 000106E5 B103                <1> 	mov	cl, 3
 12494                              <1> get_argp4:
 12495 000106E7 C1E008              <1> 	shl	eax, 8
 12496                              <1> 	;pop	dx
 12497                              <1> 	; 23/07/2022
 12498 000106EA 5A                  <1> 	pop	edx
 12499 000106EB 88D0                <1> 	mov 	al, dl
 12500 000106ED E2F8                <1>         loop    get_argp4
 12501                              <1> 	;pop	esi
 12502 000106EF C3                  <1> 	retn
 12503                              <1> 
 12504                              <1> 	; 23/07/2022
 12505                              <1> %if 0	
 12506                              <1> 
 12507                              <1> sysstat: 
 12508                              <1> 	; 13/01/2017 - TRDOS 386 (TRDOS v2.0)
 12509                              <1> 	; temporary !
 12510                              <1> 	mov	eax, ERR_INV_FNUMBER ; 'invalid function number !'
 12511                              <1>         mov     [u.error], eax
 12512                              <1>         mov     [u.r0], eax 
 12513                              <1> 	jmp	error
 12514                              <1> 
 12515                              <1> sysfstat: 
 12516                              <1> 	; 13/01/2017 - TRDOS 386 (TRDOS v2.0)
 12517                              <1> 	; temporary !
 12518                              <1> 	mov	eax, ERR_INV_FNUMBER ; 'invalid function number !'
 12519                              <1>         mov     [u.error], eax
 12520                              <1>         mov     [u.r0], eax 
 12521                              <1> 	jmp	error
 12522                              <1> 
 12523                              <1> %endif
 12524                              <1> 
 12525                              <1> fclose:
 12526                              <1> 	; 24/04/2025 - TRDOS 386 Kernel v2.0.10
 12527                              <1> 	; 18/09/2024 - TRDOS 386 Kernel v2.0.9
 12528                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 12529                              <1> 	; 06/10/2016 (TRDOS 386 = TRDOS v2.0)
 12530                              <1> 	;
 12531                              <1> 	; 18/06/2015 (Retro UNIX 386 v1 - Beginning)
 12532                              <1> 	;            (32 bit offset pointer modification)
 12533                              <1> 	; 19/04/2013 - 12/01/2014 (Retro UNIX 8086 v1)
 12534                              <1> 	;
 12535                              <1> 	; Given the file descriptor (index to the u.fp list)
 12536                              <1> 	; 'fclose' first gets the i-number of the file via 'getf'.
 12537                              <1> 	; If i-node is active (i-number > 0) the entry in 
 12538                              <1> 	; u.fp list is cleared. If all the processes that opened
 12539                              <1> 	; that file close it, then fsp etry is freed and the file
 12540                              <1> 	; is closed. If not a return is taken. 
 12541                              <1> 	; If the file has been deleted while open, 'anyi' is called
 12542                              <1> 	; to see anyone else has it open, i.e., see if it is appears
 12543                              <1> 	; in another entry in the fsp table. Upon return from 'anyi'
 12544                              <1> 	; a check is made to see if the file is special.
 12545                              <1> 	;
 12546                              <1> 	; INPUTS ->
 12547                              <1> 	;    r1 - contains the file descriptor (value=0,1,2...)
 12548                              <1> 	;    u.fp - list of entries in the fsp table
 12549                              <1> 	;    fsp - table of entries (4 words/entry) of open files.
 12550                              <1> 	; OUTPUTS ->
 12551                              <1> 	;    r1 - contains the same file descriptor
 12552                              <1> 	;    r2 - contains i-number
 12553                              <1> 	;
 12554                              <1> 	; ((AX = R1))
 12555                              <1> 	; ((Modified registers: EDX, EBX, ECX, ESI, EDI, EBP))
 12556                              <1> 	;
 12557                              <1> 	; Retro UNIX 8086 v1 modification : CF = 1
 12558                              <1> 	;              if i-number of the file is 0. (error)
 12559                              <1> 	;
 12560                              <1> 	; TRDOS 386 (06/10/2016)
 12561                              <1> 	; 
 12562                              <1> 	; INPUT:
 12563                              <1> 	;	EAX = File Handle (File Descriptor, File Index)
 12564                              <1> 	;
 12565                              <1> 	; OUTPUT:
 12566                              <1> 	;	CF = 1 -> File not open !
 12567                              <1> 	;	CF = 0 -> OK!
 12568                              <1> 	;	     EBX = File Number (System)
 12569                              <1> 	;	     [cdev] = Logical DOS Drive Number
 12570                              <1> 	;	     EAX = File Handle/Number (user)
 12571                              <1> 	;
 12572                              <1> 	; Modified Registers: EBX
 12573                              <1> 
 12574 000106F0 50                  <1> 	push	eax ; File handle
 12575                              <1> 
 12576 000106F1 E83D000000          <1> 	call	getf
 12577                              <1> 	;jc	device_close ; eax = device number
 12578                              <1> 	; 17/04/2021 (temporary)
 12579 000106F6 7302                <1> 	jnc	short _fclose_0
 12580                              <1> 	; 24/04/2025 (BugFix for 'sysexit')
 12581 000106F8 58                  <1> 	pop	eax
 12582                              <1> 	;jmp	rw2 ; file not open !
 12583 000106F9 C3                  <1> 	retn
 12584                              <1> _fclose_0:
 12585 000106FA 80BB[5C8A0100]01    <1> 	cmp	byte [ebx+OF_MODE], 1 ; open mode ; 0 = empty entry
 12586 00010701 7227                <1> 	jb	short fclose_1	      ; 1 = read, 2 = write
 12587                              <1> 	
 12588                              <1> 	; 18/09/2024 (EMPTY FILE BugFix)
 12589                              <1> 	;cmp	eax, 1 ; is the first cluster number > 0
 12590                              <1> 	;jb	short fclose_1 ; no, this is empty entry
 12591                              <1> 
 12592                              <1> fclose_0:
 12593 00010703 FE8B[9C8A0100]      <1> 	dec	byte [ebx+OF_OPENCOUNT] ; decrement the number of processes
 12594                              <1> 			                ; that have opened the file
 12595 00010709 791F                <1> 	jns	short fclose_1 ; jump if not negative (jump if bit 7 is 0)
 12596                              <1> 			; if all processes haven't closed the file, return
 12597                              <1> 	;
 12598                              <1> 	; eax ; First cluster
 12599 0001070B 31C0                <1> 	xor	eax, eax ; 0
 12600 0001070D 8883[5C8A0100]      <1> 	mov	[ebx+OF_MODE], al ; 0 = empty entry
 12601                              <1> 	;mov	[ebx+OF_STATUS], al ; 0 = empty entry
 12602                              <1> 	;shl	bx, 2 
 12603                              <1> 	; 23/07/2022
 12604                              <1> 	;shl	bl, 2
 12605 00010713 C1E302              <1> 	shl	ebx, 2
 12606 00010716 8983[BC890100]      <1> 	mov	[ebx+OF_FCLUSTER], eax ; 0
 12607 0001071C 8983[3C8D0100]      <1> 	mov	[ebx+OF_CCLUSTER], eax ; 0
 12608                              <1> 	;mov	[ebx+OF_CCINDEX], eax ; 0
 12609                              <1> 	; 23/07/2022
 12610                              <1> 	;mov	[ebx+OF_OPENCOUNT], al ; 0
 12611 00010722 A3[C0940100]        <1> 	mov	[u.fofp], eax ; 0
 12612                              <1> 	;shr	bx, 2
 12613                              <1> 	; 23/07/2022
 12614                              <1> 	;shr	bl, 2
 12615 00010727 C1EB02              <1> 	shr	ebx, 2
 12616                              <1> fclose_1: ; 1:
 12617 0001072A 58                  <1> 	pop	eax ; File handle (File Descriptor, File Index)
 12618 0001072B C680[B6940100]00    <1> 	mov	byte [eax+u.fp], 0 ; clear that entry in the u.fp list
 12619 00010732 C3                  <1> 	retn
 12620                              <1> 
 12621                              <1> getf:
 12622                              <1> 	; 03/09/2024 - TRDOS 386 v2.0.9
 12623                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 12624                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
 12625                              <1> 	;	(temporary modifications)
 12626                              <1> 	; 12/10/2016
 12627                              <1> 	; 11/10/2016
 12628                              <1> 	; 08/10/2016
 12629                              <1> 	; 06/10/2016 (TRDOS 386 = TRDOS v2.0)
 12630                              <1> 	; / get the device number and the i-number of an open file
 12631                              <1> 	; 13/05/2015
 12632                              <1> 	; 11/05/2015 (Retro UNIX 386 v1 - Beginning)
 12633                              <1> 	; 19/04/2013 - 18/11/2013 (Retro UNIX 8086 v1)
 12634                              <1> 	;
 12635 00010733 89C3                <1> 	mov	ebx, eax
 12636                              <1> getf1:
 12637 00010735 83FB0A              <1> 	cmp	ebx, 10
 12638 00010738 730A                <1>         jnb	short getf2
 12639 0001073A 8A9B[B6940100]      <1> 	mov	bl, [ebx+u.fp]
 12640 00010740 08DB                <1> 	or	bl, bl
 12641 00010742 7504                <1> 	jnz	short getf3
 12642                              <1> getf2:
 12643                              <1> 	; 'File not open !' error (ax=0)
 12644 00010744 29C0                <1> 	sub	eax, eax
 12645                              <1> 	; 03/09/2024
 12646 00010746 F9                  <1> 	stc
 12647 00010747 C3                  <1> 	retn
 12648                              <1> getf3:
 12649                              <1> 	; 23/07/2022
 12650                              <1> 	;test	bl, 80h
 12651                              <1> 	;jnz	short getf5 ; device
 12652 00010748 FECB                <1> 	dec	bl ; 0 based
 12653 0001074A 8A83[3C8A0100]      <1> 	mov	al, [ebx+OF_DRIVE]
 12654 00010750 A2[91940100]        <1> 	mov	[cdev], al
 12655 00010755 C0E302              <1> 	shl	bl, 2 ; *4 (dword offset)
 12656                              <1> 	; 23/07/2022
 12657                              <1> 	;shl	ebx, 2
 12658 00010758 8B83[3C8B0100]      <1> 	mov	eax, [ebx+OF_SIZE]
 12659 0001075E A3[B8950100]        <1> 	mov	[i.size], eax ; file size
 12660 00010763 8D83[BC8A0100]      <1> 	lea	eax, [ebx+OF_POINTER] ; 12/10/2016
 12661 00010769 A3[C0940100]        <1> 	mov	[u.fofp], eax
 12662 0001076E 8B83[BC890100]      <1> 	mov	eax, [ebx+OF_FCLUSTER]
 12663 00010774 C0EB02              <1> 	shr	bl, 2 ; /4 (byte offset)
 12664                              <1> 	; 23/07/2022
 12665                              <1> 	;shr	ebx, 2
 12666                              <1> 	; 17/04/2021
 12667 00010777 F8                  <1> 	clc 
 12668                              <1> getf4:
 12669 00010778 C3                  <1> 	retn
 12670                              <1> ;getf5: 
 12671                              <1> 	; 17/04/2021
 12672                              <1> 	; (following code is disabled as temporary)
 12673                              <1> 	;
 12674                              <1> 	;; get device number
 12675                              <1> 	;and	bl, 7Fh ; 1 to 7Fh
 12676                              <1> 	;dec	bl ; 0 based (0 to 7Eh)
 12677                              <1> 	;mov	al, [ebx+DEV_DRIVER]
 12678                              <1> 	;mov	ch, [ebx+DEV_ACCESS]
 12679                              <1> 	;mov	cl, [ebx+DEV_OPENMODE]
 12680                              <1> 	;and	ch, 0FEh ; reset bit 0 ; dev_close
 12681                              <1> 	;
 12682                              <1> 	; 23/07/2022
 12683                              <1> 	;stc ; cf = 1
 12684                              <1> 	;retn
 12685                              <1> 
 12686                              <1> trans_addr_nmbp:
 12687                              <1> 	; 18/10/2015
 12688                              <1> 	; 12/10/2015
 12689 00010779 8B2D[C8940100]      <1> 	mov 	ebp, [u.namep]
 12690                              <1> trans_addr_nm: 
 12691                              <1> 	; Convert virtual (pathname) address to physical address
 12692                              <1> 	; (Retro UNIX 386 v1 feature only !)
 12693                              <1> 	; 18/10/2015
 12694                              <1> 	; 12/10/2015 (u.pnbase & u.pncount has been removed from code)
 12695                              <1> 	; 02/07/2015
 12696                              <1> 	; 17/06/2015
 12697                              <1> 	; 16/06/2015
 12698                              <1> 	;
 12699                              <1> 	; INPUTS: 
 12700                              <1> 	;	ebp = pathname address (virtual) ; [u.namep]
 12701                              <1> 	;	[u.pgdir] = user's page directory
 12702                              <1> 	; OUTPUT:
 12703                              <1> 	;       esi = physical address of the pathname
 12704                              <1> 	;	ecx = remain byte count in the page
 12705                              <1> 	;
 12706                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX, ESI)
 12707                              <1> 	;
 12708 0001077F 833D[08950100]00    <1>         cmp     dword [u.ppgdir], 0  ; /etc/init ? (sysexec)
 12709 00010786 7618                <1> 	jna	short trans_addr_nmk ; the caller is os kernel;
 12710                              <1> 				     ; it is already physical address
 12711 00010788 50                  <1>    	push	eax
 12712 00010789 89EB                <1> 	mov	ebx, ebp ; [u.namep] ; pathname address (virtual)
 12713 0001078B E82E54FFFF          <1>        	call	get_physical_addr ; get physical address
 12714 00010790 7204                <1> 	jc	short tr_addr_nm_err
 12715                              <1> 	; 18/10/2015
 12716                              <1> 	; eax = physical address 
 12717                              <1> 	; cx = remain byte count in page (1-4096)
 12718                              <1> 		; 12/10/2015 (cx = [u.pncount])
 12719 00010792 89C6                <1> 	mov	esi, eax ; 12/10/2015 (esi=[u.pnbase])
 12720 00010794 58                  <1> 	pop	eax
 12721 00010795 C3                  <1> 	retn
 12722                              <1> 
 12723                              <1> tr_addr_nm_err:
 12724 00010796 A3[18950100]        <1> 	mov	[u.error], eax
 12725                              <1> 	;pop 	eax
 12726 0001079B E9E0C6FFFF          <1> 	jmp	error
 12727                              <1> 
 12728                              <1> trans_addr_nmk:
 12729                              <1> 	; 12/10/2015
 12730                              <1> 	; 02/07/2015
 12731 000107A0 8B35[C8940100]      <1> 	mov	esi, [u.namep]  ; [u.pnbase]
 12732 000107A6 66B90010            <1> 	mov	cx, PAGE_SIZE ; 4096 ; [u.pncount]
 12733 000107AA C3                  <1> 	retn
 12734                              <1> 
 12735                              <1> sysbreak:
 12736                              <1> 	; 06/09/2024 - TRDOS 386 v2.0.9
 12737                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 12738                              <1> 	; 18/10/2015
 12739                              <1> 	; 07/10/2015
 12740                              <1> 	; 23/06/2015 (Retro UNIX 386 v1 - Beginning)
 12741                              <1> 	; 20/06/2013 - 24/03/2014 (Retro UNIX 8086 v1)
 12742                              <1> 	;
 12743                              <1> 	; 'sysbreak' sets the programs break points. 
 12744                              <1> 	; It checks the current break point (u.break) to see if it is
 12745                              <1> 	; between "core" and the stack (sp). If it is, it is made an
 12746                              <1> 	; even address (if it was odd) and the area between u.break
 12747                              <1> 	; and the stack is cleared. The new breakpoint is then put
 12748                              <1> 	; in u.break and control is passed to 'sysret'.
 12749                              <1> 	;
 12750                              <1> 	; Calling sequence:
 12751                              <1> 	;	sysbreak; addr
 12752                              <1> 	; Arguments: -
 12753                              <1> 	;	
 12754                              <1> 	; Inputs: u.break - current breakpoint
 12755                              <1> 	; Outputs: u.break - new breakpoint 
 12756                              <1> 	;	area between old u.break and the stack (sp) is cleared.
 12757                              <1> 	; 
 12758                              <1> 	; ...............................................................
 12759                              <1> 	; 06/09/2024 - TRDOS 386 v2.0.9 - Major Modification -
 12760                              <1> 	;
 12761                              <1> 	; 	This system call performs "malloc" function as in C.
 12762                              <1> 	; Input:
 12763                              <1> 	;    EBX = new u.break address (virtual, user's space)
 12764                              <1> 	; (Note: Default/Initial u.break address is the start of the BSS
 12765                              <1> 	;	 section. Or it is file size for PRG -flat image- files.)
 12766                              <1> 	; If EBX = 0FFFFFFFFh ; -1
 12767                              <1> 	;    Return current u.break in EAX
 12768                              <1> 	; Output:
 12769                              <1> 	;    If EBX input is -1, EAX = current u.break address (virtual)
 12770                              <1> 	;	otherwise, EAX = new u.break address
 12771                              <1> 	; Area between the new u.break and the old u.break is cleared.
 12772                              <1> 	; (Note: If the new break address cross overs user's esp,
 12773                              <1> 	;	 this area <new break - old break> is not cleared.)
 12774                              <1> 	; If CF=1 at return, it means Memory Allocation Error.
 12775                              <1> 	;		(or "Insufficient Memory" error)
 12776                              <1> 	;	EAX = 0
 12777                              <1> 	; ...............................................................
 12778                              <1> 	;	
 12779                              <1> 	; Retro UNIX 8086 v1 modification:
 12780                              <1> 	;	The user/application program puts breakpoint address
 12781                              <1> 	;       in BX register as 'sysbreak' system call argument.
 12782                              <1> 	; 	(argument transfer method 1)
 12783                              <1> 	;
 12784                              <1> 	;  NOTE: Beginning of core is 0 in Retro UNIX 8086 v1 !
 12785                              <1> 	; 	((!'sysbreak' is not needed in Retro UNIX 8086 v1!))
 12786                              <1> 	;  NOTE:
 12787                              <1> 	; 	'sysbreak' clears extended part (beyond of previous
 12788                              <1> 	;	'u.break' address) of user's memory for original unix's
 12789                              <1> 	;	'bss' compatibility with Retro UNIX 8086 v1 (19/11/2013)
 12790                              <1> 	
 12791                              <1> 		; mov u.break,r1 / move users break point to r1
 12792                              <1> 		; cmp r1,$core / is it the same or lower than core?
 12793                              <1> 		; blos 1f / yes, 1f
 12794                              <1> 	; 23/06/2015
 12795 000107AB 8B2D[DC940100]      <1> 	mov	ebp, [u.break] ; virtual address (offset)
 12796                              <1> 	
 12797                              <1> 	; 06/09/2024
 12798 000107B1 31C0                <1> 	xor	eax, eax
 12799 000107B3 A3[AC940100]        <1> 	mov	[u.r0], eax ; 0 ; default ('memory allocation error')
 12800 000107B8 48                  <1> 	dec	eax ; -1
 12801                              <1> 
 12802                              <1> 	; 06/09/2024 - TRDOS 386 v2.0.9
 12803                              <1> 	; get u.break address (for 'malloc' in c compiler)
 12804                              <1> 	; for PRG files:
 12805                              <1> 	; default/initial u.break address is file size
 12806 000107B9 39C3                <1> 	cmp	ebx, eax ; -1 ; 0FFFFFFFFh
 12807 000107BB 7214                <1> 	jb	short sysbreak_@
 12808                              <1> 
 12809                              <1> sysbreak_4:
 12810 000107BD 89EB                <1> 	mov	ebx, ebp
 12811                              <1> 	;(allocates a new page for user if it is not present)
 12812 000107BF E8FA53FFFF          <1> 	call	get_physical_addr ; get physical address
 12813 000107C4 72D0                <1> 	jc	short tr_addr_nm_err
 12814                              <1> 
 12815 000107C6 892D[AC940100]      <1> 	mov	[u.r0], ebp  ; start of bss space (to be allocated)
 12816 000107CC E9CFC6FFFF          <1> 	jmp	sysret
 12817                              <1> 
 12818                              <1> sysbreak_@:
 12819                              <1> 	;and	ebp, ebp
 12820                              <1> 	;jz	short sysbreak_3 
 12821                              <1> 	; Retro UNIX 386 v1 NOTE: u.break points to virtual address !!!
 12822                              <1> 	; (Even break point address is not needed for Retro UNIX 386 v1)
 12823 000107D1 8B15[A4940100]      <1> 	mov	edx, [u.sp] ; kernel stack at the beginning of sys call
 12824 000107D7 83C20C              <1> 	add	edx, 12 ; EIP -4-> CS -4-> EFLAGS -4-> ESP (user) 
 12825                              <1> 	; 07/10/2015
 12826                              <1> 	;mov	[u.break], ebx ; virtual address !!!
 12827                              <1> 	;
 12828                              <1> 	; 06/09/2024
 12829                              <1> 	; ebp = old/current u.break
 12830                              <1> 
 12831 000107DA 3B1A                <1> 	cmp	ebx, [edx] ; compare new break point with 
 12832                              <1> 			   ; with top of user's stack (virtual!)
 12833 000107DC 732B                <1> 	jnb	short sysbreak_3
 12834                              <1> 		; cmp r1,sp / is it the same or higher 
 12835                              <1> 			  ; / than the stack?
 12836                              <1> 		; bhis 1f / yes, 1f
 12837 000107DE 89DE                <1> 	mov	esi, ebx
 12838 000107E0 29EE                <1> 	sub	esi, ebp ; new break point - old break point
 12839                              <1> 	;jna	short sysbreak_3 
 12840                              <1> 	; 06/09/2024
 12841 000107E2 7706                <1> 	ja	short sysbreak_1
 12842 000107E4 74D7                <1> 	jz	short sysbreak_4
 12843 000107E6 F7DE                <1> 	neg	esi ; convert to positive number (big-small)
 12844 000107E8 89DD                <1> 	mov	ebp, ebx ; move small number (address) to ebp
 12845                              <1> 
 12846                              <1> sysbreak_1:
 12847                              <1> 	; 06/09/2024
 12848 000107EA 53                  <1> 	push	ebx
 12849 000107EB 89EB                <1> 	mov	ebx, ebp
 12850 000107ED E8CC53FFFF          <1> 	call	get_physical_addr ; get physical address
 12851 000107F2 5B                  <1> 	pop	ebx
 12852 000107F3 72A1                <1> 	jc	short tr_addr_nm_err ; 23/07/2022
 12853                              <1> 	; 18/10/2015
 12854 000107F5 89C7                <1> 	mov	edi, eax
 12855 000107F7 29C0                <1> 	sub	eax, eax ; 0
 12856                              <1> 		 ; ECX = remain byte count in page (1-4096)
 12857 000107F9 39CE                <1> 	cmp	esi, ecx
 12858 000107FB 7302                <1> 	jnb	short sysbreak_2
 12859 000107FD 89F1                <1> 	mov	ecx, esi
 12860                              <1> sysbreak_2:
 12861 000107FF 29CE                <1> 	sub	esi, ecx
 12862 00010801 01CD                <1> 	add	ebp, ecx
 12863 00010803 F3AA                <1> 	rep 	stosb
 12864 00010805 09F6                <1> 	or	esi, esi
 12865 00010807 75E1                <1> 	jnz	short sysbreak_1
 12866                              <1> 		; bit $1,r1 / is it an odd address
 12867                              <1> 		; beq 2f / no, its even
 12868                              <1> 		; clrb (r1)+ / yes, make it even
 12869                              <1> 	; 2: / clear area between the break point and the stack
 12870                              <1> 		; cmp r1,sp / is it higher or same than the stack
 12871                              <1> 		; bhis 1f / yes, quit
 12872                              <1> 		; clr (r1)+ / clear word
 12873                              <1> 		; br 2b / go back
 12874                              <1> 	;pop	ebx
 12875                              <1> sysbreak_3: ; 1:
 12876                              <1> 	; 06/09/2024
 12877 00010809 891D[DC940100]      <1> 	mov	[u.break], ebx ; virtual address !!!
 12878                              <1> 		; jsr r0,arg; u.break / put the "address"
 12879                              <1> 			; / in u.break (set new break point)
 12880                              <1> 		; br sysret4 / br sysret
 12881                              <1> 	; 06/09/2024
 12882 0001080F 891D[AC940100]      <1> 	mov	[u.r0], ebx ; return new break point in eax
 12883 00010815 E986C6FFFF          <1> 	jmp	sysret
 12884                              <1> 
 12885                              <1> sysseek: ; / moves read write pointer in an fsp entry
 12886                              <1> 	; 06/11/2016 - TRDOS 386 (TRDOS v2.0)
 12887                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
 12888                              <1> 	; 07/07/2013 - 05/08/2013 (Retro UNIX 8086 v1)
 12889                              <1> 	;
 12890                              <1> 	; 'sysseek' changes the r/w pointer of (3rd word of in an
 12891                              <1> 	; fsp entry) of an open file whose file descriptor is in u.r0.
 12892                              <1> 	; The file descriptor refers to a file open for reading or
 12893                              <1> 	; writing. The read (or write) pointer is set as follows:
 12894                              <1> 	;	* if 'ptrname' is 0, the pointer is set to offset.
 12895                              <1> 	;	* if 'ptrname' is 1, the pointer is set to its
 12896                              <1> 	;	  current location plus offset.
 12897                              <1> 	;	* if 'ptrname' is 2, the pointer is set to the
 12898                              <1> 	;	  size of file plus offset.
 12899                              <1> 	; The error bit (e-bit) is set for an undefined descriptor.
 12900                              <1> 	;
 12901                              <1> 	; Calling sequence:
 12902                              <1> 	;	sysseek; offset; ptrname
 12903                              <1> 	; Arguments:
 12904                              <1> 	;	offset - number of bytes desired to move
 12905                              <1> 	;		 the r/w pointer
 12906                              <1> 	;	ptrname - a switch indicated above
 12907                              <1> 	;
 12908                              <1> 	; Inputs: r0 - file descriptor 
 12909                              <1> 	; Outputs: -
 12910                              <1> 	; ...............................................................
 12911                              <1> 	;	
 12912                              <1> 	; Retro UNIX 8086 v1 modification: 
 12913                              <1> 	;       'sysseek' system call has three arguments; so,
 12914                              <1> 	;	* 1st argument, file descriptor is in BX (BL) register
 12915                              <1> 	;	* 2nd argument, offset is in CX register
 12916                              <1> 	;	* 3rd argument, ptrname/switch is in DX (DL) register
 12917                              <1> 
 12918 0001081A E821000000          <1> 	call	seektell
 12919                              <1> 	; EAX = Current R/W pointer of the file
 12920                              <1> 	; EBX = [u.fofp]
 12921                              <1> 	; [u.base] = offset (ECX input)
 12922                              <1> 
 12923 0001081F 0305[D0940100]      <1> 	add	eax, [u.base]
 12924 00010825 8903                <1> 	mov	[ebx], eax
 12925 00010827 E974C6FFFF          <1> 	jmp	sysret
 12926                              <1> 
 12927                              <1> systell: ; / get the r/w pointer
 12928                              <1> 	; 06/11/2016 - TRDOS 386 (TRDOS v2.0) - temporary !-
 12929                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
 12930                              <1> 	; 07/07/2013 - 05/08/2013 (Retro UNIX 8086 v1)
 12931                              <1> 	;
 12932                              <1> 	; Retro UNIX 8086 v1 modification:
 12933                              <1> 	; ! 'systell' does not work in original UNIX v1,
 12934                              <1> 	; 	    it returns with error !
 12935                              <1> 	; Inputs: r0 - file descriptor 
 12936                              <1> 	; Outputs: r0 - file r/w pointer
 12937                              <1> 
 12938                              <1> 	;xor	ecx, ecx ; 0
 12939 0001082C BA01000000          <1> 	mov	edx, 1 ; 05/08/2013
 12940                              <1> 	;call 	seektell
 12941 00010831 E810000000          <1> 	call 	seektell0 ; 05/08/2013
 12942                              <1> 	;; 06/11/2016
 12943                              <1> 	;; mov	eax, [ebx]
 12944 00010836 A3[AC940100]        <1> 	mov	[u.r0], eax
 12945 0001083B E960C6FFFF          <1> 	jmp	sysret
 12946                              <1> 
 12947                              <1> ; Original unix v1 'systell' system call:
 12948                              <1> 		; jsr r0,seektell
 12949                              <1> 		; br error4
 12950                              <1> 
 12951                              <1> seektell:
 12952                              <1> 	; 06/11/2016 - TRDOS 386 (TRDOS v2.0)
 12953                              <1> 	; 03/01/2016
 12954                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
 12955                              <1> 	; 07/07/2013 - 05/08/2013 (Retro UNIX 8086 v1)
 12956                              <1> 	;
 12957                              <1> 	; 'seektell' puts the arguments from sysseek and systell
 12958                              <1> 	; call in u.base and u.count. It then gets the i-number of
 12959                              <1> 	; the file from the file descriptor in u.r0 and by calling
 12960                              <1> 	; getf. The i-node is brought into core and then u.count
 12961                              <1> 	; is checked to see it is a 0, 1, or 2.
 12962                              <1> 	; If it is 0 - u.count stays the same
 12963                              <1> 	;          1 - u.count = offset (u.fofp)
 12964                              <1> 	;	   2 - u.count = i.size (size of file)
 12965                              <1> 	;
 12966                              <1> 	; !! Retro UNIX 8086 v1 modification:
 12967                              <1> 	;	Argument 1, file descriptor is in BX;
 12968                              <1> 	;	Argument 2, offset is in CX;
 12969                              <1> 	;	Argument 3, ptrname/switch is in DX register.
 12970                              <1> 	;
 12971                              <1> 	; ((Return -> eax = base for offset (position= base+offset))
 12972                              <1> 	;
 12973 00010840 890D[D0940100]      <1> 	mov 	[u.base], ecx ; offset
 12974                              <1> seektell0:
 12975 00010846 8915[D4940100]      <1> 	mov 	[u.count], edx
 12976                              <1> 	; EBX = file descriptor (file number)
 12977 0001084C E8E4FEFFFF          <1> 	call	getf1
 12978                              <1> 	; EAX = First cluster of the file
 12979                              <1> 	; EBX = File number (Open file number)
 12980                              <1> 	; [u.fofp] = Pointer to File pointer
 12981                              <1> 	; [i.size] = File size
 12982                              <1> 
 12983 00010851 09C0                <1> 	or	eax, eax
 12984 00010853 7505                <1> 	jnz	short seektell1
 12985                              <1> 
 12986                              <1> 	; 24/04/2025 - TRDOS 386 v2.0.10
 12987                              <1> 	;mov	eax, ERR_FILE_NOT_OPEN
 12988                              <1> 	;mov	[u.r0], eax 
 12989                              <1> 	;mov	dword [u.error], eax ; 'file not open !'
 12990                              <1> 	;jmp	error
 12991                              <1> 	; 24/04/2025
 12992 00010855 E96FCDFFFF          <1> 	jmp	seektell_err ; sysclose_err
 12993                              <1> 
 12994                              <1> seektell1:
 12995 0001085A 8B1D[C0940100]      <1>         mov     ebx, [u.fofp]
 12996 00010860 803D[D4940100]01    <1> 	cmp	byte [u.count], 1
 12997 00010867 7705                <1> 	ja	short seektell2
 12998 00010869 7409                <1> 	je	short seektell3
 12999 0001086B 31C0                <1> 	xor	eax, eax
 13000 0001086D C3                  <1> 	retn
 13001                              <1> 
 13002                              <1> seektell2:
 13003 0001086E A1[B8950100]        <1>         mov   	eax, [i.size]
 13004 00010873 C3                  <1> 	retn
 13005                              <1> 
 13006                              <1> seektell3:
 13007 00010874 8B03                <1> 	mov	eax, [ebx]
 13008 00010876 C3                  <1> 	retn
 13009                              <1> 
 13010                              <1> sysintr: ; / set interrupt handling
 13011                              <1> 	; 21/08/2024 - TRDOS 386 v2.0.9 modification
 13012                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
 13013                              <1> 	; 07/07/2013 (Retro UNIX 8086 v1)
 13014                              <1> 	;
 13015                              <1> 	; 'sysintr' sets the interrupt handling value. It puts
 13016                              <1> 	; argument of its call in u.intr then branches into 'sysquit'
 13017                              <1> 	; routine. u.tty is checked if to see if a control tty exists.
 13018                              <1> 	; If one does the interrupt character in the tty buffer is
 13019                              <1> 	; cleared and 'sysret'is called. If one does not exits
 13020                              <1> 	; 'sysret' is just called.
 13021                              <1> 	;
 13022                              <1> 	; Calling sequence:
 13023                              <1> 	;	sysintr; arg
 13024                              <1> 	; Argument:
 13025                              <1> 	;	arg - if 0, interrupts (ASCII DELETE) are ignored.
 13026                              <1> 	;	    - if 1, interrupts cause their normal result
 13027                              <1> 	;		 i.e force an exit.
 13028                              <1> 	;	    - if arg is a location within the program,
 13029                              <1> 	;		control is passed to that location when
 13030                              <1> 	;		an interrupt occurs.
 13031                              <1> 	; Inputs: -
 13032                              <1> 	; Outputs: -
 13033                              <1> 	; ...............................................................
 13034                              <1> 	;	
 13035                              <1> 	; Retro UNIX 8086 v1 modification: 
 13036                              <1> 	;       'sysintr' system call sets u.intr to value of BX
 13037                              <1> 	;	then branches into sysquit.
 13038                              <1> 
 13039                              <1> 	; 21/08/2024 - TRDOS 386
 13040                              <1> 	; enable/disable terminate (CTRL+BREAK) interrupt 
 13041                              <1> 	;
 13042                              <1> 	; INPUT:
 13043                              <1> 	;	bx = 0 -> disable CTRL+BREAK
 13044                              <1> 	;		-u.intr will be set to 0, u.quit will be ignored-
 13045                              <1> 	;	bx > 0 -> enable CTRL+BREAK (also default at start)
 13046                              <1> 	;		-u.intr will be set to 0FFFFh, u.quit will be used-
 13047                              <1> 	;	NOTE: u.quit is flag for CTRL+BREAK key press status
 13048                              <1> 	;	      -1 = pressed -termination request-, 0 = not pressed 
 13049                              <1> 	; OUTPUT:
 13050                              <1> 	;	none
 13051                              <1> 
 13052                              <1> 	;;;
 13053                              <1> 	; 21/08/2024
 13054 00010877 F7C3FFFF0000        <1> 	test	ebx, 0FFFFh
 13055 0001087D 7403                <1> 	jz	short sysintr_@ ; 0
 13056                              <1> 	;mov	bx, 0FFFFh
 13057 0001087F 31DB                <1> 	xor	ebx, ebx
 13058 00010881 4B                  <1> 	dec	ebx ; -1
 13059                              <1> sysintr_@:
 13060                              <1> 	;;;
 13061 00010882 66891D[F8940100]    <1> 	mov	[u.intr], bx
 13062                              <1> 		; jsr r0,arg; u.intr / put the argument in u.intr
 13063                              <1> 		; br 1f / go into quit routine
 13064 00010889 E912C6FFFF          <1> 	jmp	sysret
 13065                              <1> 
 13066                              <1> sysquit:
 13067                              <1> 	; 21/08/2024 - TRDOS 386 v2.0.9 modification
 13068                              <1> 	;	get/reset QUIT (u.quit) status
 13069                              <1> 	;
 13070                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
 13071                              <1> 	; 07/07/2013 (Retro UNIX 8086 v1)
 13072                              <1> 	;
 13073                              <1> 	; 'sysquit' turns off the quit signal. it puts the argument of
 13074                              <1> 	; the call in u.quit. u.tty is checked if to see if a control 
 13075                              <1> 	; tty exists. If one does the interrupt character in the tty
 13076                              <1> 	; buffer is cleared and 'sysret'is called. If one does not exits
 13077                              <1> 	; 'sysret' is just called.
 13078                              <1> 	;
 13079                              <1> 	; Calling sequence:
 13080                              <1> 	;	sysquit; arg
 13081                              <1> 	; Argument:
 13082                              <1> 	;	arg - if 0, this call diables quit signals from the
 13083                              <1> 	;		typewriter (ASCII FS)
 13084                              <1> 	;	    - if 1, quits are re-enabled and cause execution to
 13085                              <1> 	;		cease and a core image to be produced.
 13086                              <1> 	;		 i.e force an exit.
 13087                              <1> 	;	    - if arg is an addres in the program,
 13088                              <1> 	;		a quit causes control to sent to that
 13089                              <1> 	;		location.
 13090                              <1> 	; Inputs: -
 13091                              <1> 	; Outputs: -
 13092                              <1> 	; ...............................................................
 13093                              <1> 	;	
 13094                              <1> 	; Retro UNIX 8086 v1 modification: 
 13095                              <1> 	;       'sysquit' system call sets u.quit to value of BX
 13096                              <1> 	;	then branches into 'sysret'.
 13097                              <1> 
 13098                              <1> 	; 21/08/2024
 13099                              <1> 	;mov	[u.quit], bx
 13100                              <1> 	;jmp	sysret
 13101                              <1> 		; jsr r0,arg; u.quit / put argument in u.quit
 13102                              <1> 	;1:
 13103                              <1> 		; mov u.ttyp,r1 / move pointer to control tty buffer
 13104                              <1> 			      ; / to r1
 13105                              <1> 		; beq sysret4 / return to user
 13106                              <1> 		; clrb 6(r1) / clear the interrupt character
 13107                              <1> 			   ; / in the tty buffer
 13108                              <1> 		; br sysret4 / return to user
 13109                              <1> 
 13110                              <1> 	; 21/08/2024 - TRDOS 386
 13111                              <1> 	; get/reset QUIT (u.quit) status
 13112                              <1> 	;
 13113                              <1> 	; INPUT:
 13114                              <1> 	;	none
 13115                              <1> 	; OUTPUT:
 13116                              <1> 	;	eax = 0 -> no CTRL+BREAK
 13117                              <1> 	;	eax = -1 -> CTRL+BREAK status (but not applied)
 13118                              <1> 	;		-u.intr may be 0-
 13119                              <1> 	;	NOTE: u.quit will be reset to 0
 13120                              <1> 
 13121 0001088E 31C0                <1> 	xor	eax, eax ; 0
 13122 00010890 663905[FA940100]    <1> 	cmp	[u.quit], ax
 13123 00010897 7407                <1> 	jz	short sysquit_@ ; already 0
 13124 00010899 66A3[FA940100]      <1> 	mov	[u.quit], ax ; 0 ; reset
 13125 0001089F 48                  <1> 	dec	eax ; -1
 13126                              <1> sysquit_@:
 13127 000108A0 A3[AC940100]        <1> 	mov	[u.r0], eax
 13128 000108A5 E9F6C5FFFF          <1> 	jmp	sysret	
 13129                              <1> 
 13130                              <1> %if 0
 13131                              <1> 
 13132                              <1> anyi: 
 13133                              <1> 	; 23/07/2022
 13134                              <1> 	; 06/10/2016 (TRDOS 386 = TRDOS v2.0)
 13135                              <1> 	; Major Modification!
 13136                              <1> 	; TRDOS 386 does not permit to delete a file while it is open 
 13137                              <1> 	; The role of 'anyi' procedure has beeen changed to ensure that.
 13138                              <1> 	; 	
 13139                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
 13140                              <1> 	; 25/04/2013 (Retro UNIX 8086 v1)
 13141                              <1> 	;
 13142                              <1> 	; 'anyi' is called if a file deleted while open.
 13143                              <1> 	; "anyi" checks to see if someone else has opened this file.
 13144                              <1> 	;
 13145                              <1> 	; INPUTS ->
 13146                              <1> 	;    r1 - contains an i-number
 13147                              <1> 	;    fsp - start of table containing open files
 13148                              <1> 	;
 13149                              <1> 	; OUTPUTS ->
 13150                              <1> 	;    "deleted" flag set in fsp entry of another occurrence of
 13151                              <1> 	;	   this file and r2 points 1st word of this fsp entry.
 13152                              <1> 	;    if file not found - bit in i-node map is cleared
 13153                              <1> 	;    			 (i-node is freed)
 13154                              <1> 	;               all blocks related to i-node are freed
 13155                              <1> 	;	        all flags in i-node are cleared
 13156                              <1> 	; ((AX = R1)) input
 13157                              <1> 	;
 13158                              <1> 	;    (Retro UNIX Prototype : 02/12/2012, UNIXCOPY.ASM)
 13159                              <1>         ;    ((Modified registers: EDX, ECX, EBX, ESI, EDI, EBP))
 13160                              <1> 	;
 13161                              <1> 	; / r1 contains an i-number
 13162                              <1> 
 13163                              <1> 	; TRDOS 386 (06/10/2016)
 13164                              <1> 	; 
 13165                              <1> 	; INPUT:
 13166                              <1> 	;	EAX = First Cluster
 13167                              <1> 	;	 DL = Logical DOS Drive Number
 13168                              <1> 	;
 13169                              <1> 	; OUTPUT:
 13170                              <1> 	;	CF = 1 -> EBX = File Handle/Number/Index
 13171                              <1> 	;	CF = 0 -> EBX = 0
 13172                              <1> 	;
 13173                              <1> 	; Modified Registers: EBX
 13174                              <1> 
 13175                              <1> 	xor	ebx, ebx
 13176                              <1> anyi_0: 
 13177                              <1> 	cmp	byte [ebx+OF_MODE], 0 ; 0 = empty entry
 13178                              <1> 	ja	short anyi_2 ; 1 (r), 2 (w) or 3 (r&w)
 13179                              <1> anyi_1:
 13180                              <1> 	inc	bl
 13181                              <1> 	cmp	bl, OPENFILES ; max. count of open files
 13182                              <1> 	jb	short anyi_0
 13183                              <1> 	xor	eax, eax
 13184                              <1> 	retn 
 13185                              <1> anyi_2:
 13186                              <1> 	cmp	dl, [ebx+OF_DRIVE]
 13187                              <1> 	jne	short anyi_1
 13188                              <1> 	;shl	bx, 2 ; *4 (dword offset)
 13189                              <1> 	shl	ebx, 2 ; 23/07/2022
 13190                              <1> 	cmp	eax, [ebx+OF_FCLUSTER]
 13191                              <1> 	je	short anyi_3
 13192                              <1> 	;shr	bx, 2 ; /4 (byte offset)
 13193                              <1> 	shr	ebx, 2 ; 23/07/2022
 13194                              <1> 	jmp	short anyi_1 	
 13195                              <1> anyi_3:
 13196                              <1> 	;shr	bx, 2 ; /4 (bytes offset) (index)
 13197                              <1> 	shr	ebx, 2 ; 23/07/2022
 13198                              <1> 	stc
 13199                              <1> 	retn
 13200                              <1> 
 13201                              <1> %endif
 13202                              <1> 
 13203                              <1> ; Retro UNIX 386 v1 Kernel (v0.2) - SYS9.INC
 13204                              <1> ; Last Modification: 09/12/2015
 13205                              <1> 
 13206                              <1> syssleep:
 13207                              <1> 	; 28/08/2024 - TRDOS 386 v2.0.9
 13208                              <1> 	; 24/07/2022 - TRDOS 386 v2.0.5
 13209                              <1> 	; 29/06/2015 - (Retro UNIX 386 v1)
 13210                              <1> 	; 11/06/2014 - (Retro UNIX 8086 v1)
 13211                              <1> 	;
 13212                              <1> 	; Retro UNIX 8086 v1 feature only
 13213                              <1> 	; (INPUT -> none)
 13214                              <1> 	
 13215                              <1> 	; Temporary - 24/07/2022
 13216 000108AA 891D[AC940100]      <1> 	mov	[u.r0], ebx
 13217                              <1> 	;
 13218 000108B0 0FB61D[FD940100]    <1> 	movzx	ebx, byte [u.uno] ; process number
 13219 000108B7 8AA3[BF930100]      <1> 	mov	ah, [ebx+p.ttyc-1] ; current/console tty
 13220 000108BD E862170000          <1> 	call	sleep
 13221                              <1> 
 13222                              <1> 	; 23/08/2024 - restore [u.usp]
 13223                              <1> 	; swap changes [u.usp] to esp which points to
 13224                              <1> 	; return of sleep
 13225 000108C2 8925[A8940100]      <1> 	mov	[u.usp], esp
 13226                              <1> 		; points to user's regs on top ofn system stack
 13227                              <1> 
 13228                              <1> 	; 24/07/2022
 13229 000108C8 FF05[AC940100]      <1> 	inc	dword [u.r0] ; Temporary !
 13230 000108CE E9CDC5FFFF          <1> 	jmp	sysret
 13231                              <1> 
 13232                              <1> _vp_clr:
 13233                              <1> 	; Reset/Clear Video Page
 13234                              <1> 	;
 13235                              <1> 	; 24/07/2022 - TRDOS 386 v2.0.5
 13236                              <1> 	; 30/06/2015 - (Retro UNIX 386 v1)
 13237                              <1> 	; 21/05/2013 - 30/10/2013(Retro UNIX 8086 v1) (U0.ASM)
 13238                              <1> 	;
 13239                              <1> 	; Retro UNIX 8086 v1 feature only !
 13240                              <1> 	;
 13241                              <1> 	; INPUTS -> 
 13242                              <1> 	;   BH = video page number
 13243                              <1> 	;
 13244                              <1> 	; OUTPUT ->
 13245                              <1> 	;   none
 13246                              <1> 	; ((Modified registers: EAX, BH, ECX, EDX, ESI, EDI))
 13247                              <1> 	;
 13248                              <1> 	; 04/12/2013
 13249 000108D3 28C0                <1> 	sub	al, al
 13250                              <1> 	; al = 0 (clear video page)
 13251                              <1> 	; bh = video page ; 13/05/2016
 13252 000108D5 B407                <1> 	mov	ah, 07h
 13253                              <1> 	; ah = 7 (attribute/color)
 13254                              <1> 	;xor 	cx, cx ; 0, left upper column (cl) & row (cl)
 13255                              <1> 	;mov	dx, 184Fh ; right lower column & row (dl=24, dh=79)
 13256                              <1> 	; 24/07/2022
 13257 000108D7 31C9                <1> 	xor	ecx, ecx
 13258 000108D9 BA4F180000          <1> 	mov	edx, 184Fh
 13259 000108DE E80417FFFF          <1> 	call	_scroll_up
 13260                              <1> 	; bh = video page
 13261                              <1> 	;xor	dx, dx ; 0 (cursor position)
 13262                              <1> 	; 24/07/2022
 13263 000108E3 31D2                <1> 	xor	edx, edx
 13264 000108E5 E9431AFFFF          <1> 	jmp 	_set_cpos
 13265                              <1> 
 13266                              <1> sysmsg:
 13267                              <1> 	; 28/08/2024 - TRDOS 386 v2.0.9
 13268                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 13269                              <1> 	; 07/12/2020
 13270                              <1> 	; 05/12/2020
 13271                              <1> 	; 13/05/2016
 13272                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 13273                              <1> 	; 01/07/2015 - 11/11/2015 (Retro UNIX 386 v1)
 13274                              <1> 	; Print user-application message on user's console tty
 13275                              <1> 	;
 13276                              <1> 	; Input -> EBX = Message address
 13277                              <1> 	;	   ECX = Message length (max. 255)
 13278                              <1> 	;	   DL = Color (IBM PC Rombios color attributes)
 13279                              <1> 	;
 13280 000108EA 81F9FF000000        <1> 	cmp	ecx, MAX_MSG_LEN ; 255
 13281                              <1> 	;ja	sysret ; nothing to do with big message size
 13282                              <1> 	; 23/07/2022
 13283 000108F0 7605                <1> 	jna	short sysmsg8
 13284                              <1> sysmsg7:
 13285 000108F2 E9A9C5FFFF          <1> 	jmp	sysret
 13286                              <1> sysmsg8:	; 23/07/2022
 13287 000108F7 08C9                <1> 	or	cl, cl
 13288                              <1> 	;jz	sysret
 13289                              <1> 	; 23/07/2022
 13290 000108F9 74F7                <1> 	jz	short sysmsg7
 13291 000108FB 20D2                <1> 	and	dl, dl
 13292 000108FD 7502                <1> 	jnz	short sysmsg0
 13293 000108FF B207                <1> 	mov	dl, 07h ; default color
 13294                              <1> 		; (black background, light gray character)
 13295                              <1> sysmsg0:
 13296 00010901 891D[D0940100]      <1> 	mov	[u.base], ebx
 13297 00010907 8815[1F7D0100]      <1> 	mov	[ccolor], dl ; color attributes
 13298 0001090D 89E5                <1> 	mov	ebp, esp ; save stack pointer
 13299 0001090F 31DB                <1> 	xor	ebx, ebx ; 0
 13300 00010911 891D[D8940100]      <1> 	mov	[u.nread], ebx ; 0
 13301                              <1> 	;
 13302 00010917 381D[12950100]      <1> 	cmp	[u.kcall], bl ; 0
 13303 0001091D 7770                <1> 	ja	short sysmsgk ; Temporary (01/07/2015)
 13304                              <1> 	;
 13305 0001091F 890D[D4940100]      <1> 	mov	[u.count], ecx
 13306                              <1> 	;inc	ecx ; + 00h ; ASCIIZ
 13307                              <1> 	;
 13308                              <1> 	; 07/12/2020
 13309                              <1> 	;add	ecx, 3
 13310 00010925 6683C103            <1> 	add	cx, 3
 13311 00010929 80E1FC              <1> 	and	cl, ~3  ; not 3
 13312                              <1> 	;
 13313                              <1> 	;;;
 13314                              <1> 	; 20/08/2024
 13315                              <1> 	; for safety, against a possibility which if ecx+1
 13316                              <1> 	; chars (without a 0 in ecx chars) overs stack frame
 13317                              <1> 	; (for example 255 chars without 0, safe stack frame
 13318                              <1> 	; size is 260.)
 13319                              <1> 	; !!! 'sysmsg' will put a 0 at ecx+1 position.!!!
 13320 0001092C 51                  <1> 	push	ecx
 13321                              <1> 	;;;
 13322                              <1> 	;
 13323 0001092D 29CC                <1> 	sub	esp, ecx
 13324 0001092F 89E7                <1> 	mov	edi, esp
 13325 00010931 89E6                <1> 	mov	esi, esp
 13326 00010933 66891D[10950100]    <1> 	mov	[u.pcount], bx ; reset page (phy. addr.) counter
 13327                              <1> 	; 11/11/2015
 13328 0001093A 8A25[E0940100]      <1> 	mov 	ah, [u.ttyp] ; recent open tty
 13329                              <1> 	; 0 = none
 13330 00010940 FECC                <1> 	dec	ah
 13331 00010942 790C                <1> 	jns	short sysmsg1
 13332 00010944 8A1D[FD940100]      <1> 	mov	bl, [u.uno] ; process number
 13333 0001094A 8AA3[BF930100]      <1> 	mov	ah, [ebx+p.ttyc-1] ; user's (process's) console tty
 13334                              <1> sysmsg1:
 13335 00010950 8825[E2940100]      <1> 	mov	[u.ttyn], ah
 13336                              <1> sysmsg2:
 13337 00010956 E8F6050000          <1> 	call	cpass
 13338 0001095B 7416                <1> 	jz	short sysmsg5
 13339 0001095D AA                  <1> 	stosb
 13340 0001095E 20C0                <1> 	and	al, al
 13341 00010960 75F4                <1> 	jnz	short sysmsg2
 13342                              <1> sysmsg3:
 13343 00010962 80FC07              <1> 	cmp	ah, 7 ; tty number
 13344 00010965 7711                <1> 	ja	short sysmsg6 ; serial port
 13345 00010967 E83E000000          <1> 	call	print_cmsg ; 05/12/2020
 13346                              <1> sysmsg4:
 13347 0001096C 89EC                <1> 	mov	esp, ebp ; restore stack pointer
 13348 0001096E E92DC5FFFF          <1> 	jmp	sysret
 13349                              <1> sysmsg5:
 13350 00010973 C60700              <1> 	mov	byte [edi], 0
 13351 00010976 EBEA                <1> 	jmp	short sysmsg3
 13352                              <1> sysmsg6:
 13353 00010978 8A06                <1> 	mov	al, [esi]
 13354 0001097A E8A5160000          <1> 	call	sndc
 13355 0001097F 72EB                <1> 	jc	short sysmsg4
 13356 00010981 803E00              <1> 	cmp	byte [esi], 0  ; 0 is stop character
 13357 00010984 76E6                <1> 	jna	short sysmsg4
 13358 00010986 46                  <1> 	inc 	esi
 13359 00010987 8A25[E2940100]      <1> 	mov	ah, [u.ttyn]
 13360 0001098D EBE9                <1> 	jmp	short sysmsg6
 13361                              <1> 
 13362                              <1> sysmsgk: ; Temporary (01/07/2015)
 13363                              <1> 	; The message has been sent by Kernel (ASCIIZ string)
 13364                              <1> 	; (ECX -character count- will not be considered)
 13365 0001098F 8B35[D0940100]      <1> 	mov	esi, [u.base]
 13366 00010995 8A25[1E7D0100]      <1> 	mov	ah, [ptty] ; present/current screen (video page)
 13367 0001099B 8825[E2940100]      <1> 	mov	[u.ttyn], ah
 13368 000109A1 C605[12950100]00    <1> 	mov	byte [u.kcall], 0
 13369 000109A8 EBB8                <1> 	jmp	short sysmsg3
 13370                              <1> 
 13371                              <1> print_cmsg:
 13372                              <1> 	; 08/12/2020
 13373                              <1> 	; 07/12/2020
 13374                              <1> 	; 05/12/2020
 13375                              <1> 	; 18/11/2017
 13376                              <1> 	; 13/05/2016 - TRDOS 386 (TRDOS v2.0)
 13377                              <1> 	; 01/07/2015 (Retro UNIX 386 v1)
 13378                              <1> 	;
 13379                              <1> 	; print message (on user's console tty)
 13380                              <1> 	;	with requested color
 13381                              <1> 	;
 13382                              <1> 	; INPUTS:
 13383                              <1> 	;	esi = message address
 13384                              <1> 	;	[u.ttyn] = tty number (0 to 7)
 13385                              <1> 	;	[ccolor] = color attributes (IBM PC BIOS colors)
 13386                              <1> 	;
 13387                              <1> 	; Modified registers: eax, ebx, ecx, edx, esi, edi
 13388                              <1> 	; (ebp must be preserved)
 13389                              <1> 
 13390                              <1> 	;mov	bh, ah
 13391 000109AA 8A3D[E2940100]      <1> 	mov	bh, [u.ttyn]
 13392 000109B0 8A1D[1F7D0100]      <1> 	mov	bl, [ccolor] ; * ; 05/12/2020
 13393                              <1> 
 13394                              <1> 	; 05/12/2020
 13395 000109B6 803D[64A30100]00    <1> 	cmp	byte [pmi32], 0 ; is vbios's 32 bit pmi enabled ?
 13396 000109BD 772E                <1> 	ja	short pcmsg5 ; yes
 13397                              <1> pcmsg1:
 13398                              <1> 	; 08/12/2020
 13399 000109BF 8A1D[1F7D0100]      <1> 	mov	bl, [ccolor] ; * (video.s 'u11'&'beep' change BL)
 13400                              <1> 	
 13401 000109C5 AC                  <1> 	lodsb
 13402 000109C6 20C0                <1> 	and 	al, al  ; 0
 13403 000109C8 743A                <1> 	jz 	short pcmsg2
 13404                              <1> pcmsg7:
 13405 000109CA 56                  <1> 	push 	esi
 13406                              <1> 	;mov	bl, [ccolor] ; * (video.s 'u11'&'beep' change BL)
 13407                              <1> 	; 05/12/2020
 13408                              <1> 	;;mov	bh, [u.ttyn]
 13409                              <1> 	;call 	_write_tty
 13410                              <1> 	;pop	esi
 13411                              <1> 	;jmp	short pcmsg1
 13412                              <1> ;pcmsg2:
 13413                              <1> 	;retn
 13414                              <1> 
 13415                              <1> 	; 07/12/2020
 13416 000109CB 803D[DE670000]03    <1> 	cmp     byte [CRT_MODE], 3
 13417 000109D2 7708                <1> 	ja 	short pcmsg4
 13418                              <1> pcmsg3:
 13419 000109D4 E8CF18FFFF          <1> 	call	_write_tty_m3
 13420 000109D9 5E                  <1> 	pop	esi
 13421 000109DA EBE3                <1> 	jmp	short pcmsg1
 13422                              <1> pcmsg4:
 13423 000109DC 803D[DE670000]07    <1>         cmp     byte [CRT_MODE], 7
 13424 000109E3 76EF                <1> 	jna 	short pcmsg3
 13425 000109E5 E88725FFFF          <1> 	call	vga_write_teletype
 13426 000109EA 5E                  <1> 	pop	esi
 13427 000109EB EBD2                <1> 	jmp	short pcmsg1
 13428                              <1> pcmsg5:
 13429                              <1> 	; 07/12/2020
 13430 000109ED 803D[DE670000]07    <1>         cmp     byte [CRT_MODE], 7
 13431 000109F4 76C9                <1> 	jna 	short pcmsg1
 13432                              <1> 
 13433                              <1> 	; 05/12/2020
 13434                              <1> 	; writing message by using
 13435                              <1> 	; VESA VBE3 video bios protected mode interface
 13436                              <1> 	
 13437 000109F6 B40E                <1> 	mov	ah, 0Eh
 13438                              <1> pcmsg6:
 13439 000109F8 AC                  <1> 	lodsb
 13440 000109F9 20C0                <1> 	and 	al, al  ; 0
 13441 000109FB 7407                <1> 	jz 	short pcmsg2
 13442                              <1> 	; bh = video page
 13443                              <1> 	; ah = 0Eh 
 13444                              <1> 	; al = character
 13445                              <1> 	; bl = color
 13446 000109FD E8E70FFFFF          <1> 	call	int10h_32bit_pmi
 13447 00010A02 EBF4                <1> 	jmp	short pcmsg6
 13448                              <1> pcmsg2:
 13449 00010A04 C3                  <1> 	retn
 13450                              <1> 
 13451                              <1> sysgeterr:
 13452                              <1> 	; 09/12/2015
 13453                              <1> 	; 21/09/2015 - (Retro UNIX 386 v1 feature only!)
 13454                              <1> 	; Get last error number or page fault count
 13455                              <1> 	; (for debugging)
 13456                              <1> 	;
 13457                              <1> 	; Input -> EBX = return type
 13458                              <1> 	;	   0 = last error code (which is in 'u.error')
 13459                              <1> 	;	   FFFFFFFFh = page fault count for running process
 13460                              <1> 	;	   FFFFFFFEh = total page fault count
 13461                              <1> 	;	   1 .. FFFFFFFDh = undefined 
 13462                              <1> 	;
 13463                              <1> 	; Output -> EAX = last error number or page fault count
 13464                              <1> 	;	   (depending on EBX input)
 13465                              <1> 	;
 13466 00010A05 21DB                <1> 	and 	ebx, ebx
 13467 00010A07 750B                <1> 	jnz	short glerr_2
 13468                              <1> glerr_0:
 13469 00010A09 A1[18950100]        <1> 	mov	eax, [u.error]
 13470                              <1> glerr_1:
 13471 00010A0E A3[AC940100]        <1> 	mov	[u.r0], eax
 13472 00010A13 C3                  <1>  	retn
 13473                              <1> glerr_2:
 13474 00010A14 43                  <1> 	inc	ebx ; FFFFFFFFh -> 0, FFFFFFFEh -> FFFFFFFFh
 13475 00010A15 74FD                <1> 	jz	short glerr_2 ; page fault count for process
 13476 00010A17 43                  <1> 	inc	ebx ; FFFFFFFFh -> 0	
 13477 00010A18 75EF                <1> 	jnz	short glerr_0
 13478 00010A1A A1[C8960100]        <1> 	mov	eax, [PF_Count] ; total page fault count
 13479 00010A1F EBED                <1>         jmp     short glerr_1
 13480                              <1> glerr_3:
 13481 00010A21 A1[1C950100]        <1> 	mov 	eax, [u.pfcount]
 13482 00010A26 EBE6                <1> 	jmp	short glerr_1
 13483                              <1> 
 13484                              <1> load_and_run_file:
 13485                              <1> 	; 07/07/2025 - TRDOS 386 Kernel v2.0.10
 13486                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 13487                              <1> 	; 18/11/2017
 13488                              <1> 	; 22/01/2017
 13489                              <1> 	; 04/01/2017 - 07/01/2017
 13490                              <1> 	; 24/10/2016
 13491                              <1> 	; 24/04/2016 - 02/05/2016 - 03/05/2016 - 06/05/2016
 13492                              <1> 	; 23/04/2016 (TRDOS 386 = TRDOS v2.0)
 13493                              <1> 	; 23/10/2015 (Retro UNIX 386 v1, 'sysexec')
 13494                              <1> 	; 23/06/2015 (Retro UNIX 386 v1 - Beginning)
 13495                              <1> 	; 03/06/2013 - 06/12/2013 (Retro UNIX 8086 v1)
 13496                              <1> 	; EAX = First Cluster number
 13497                              <1> 	; EDX = File Size
 13498                              <1> 	; ESI = Argument list address
 13499                              <1> 	; [argc] = argument count
 13500                              <1> 	; [u.nread] = argument list length
 13501                              <1> 	; [esp] = return address to the caller (*)
 13502                              <1> 	;
 13503 00010A28 8935[AC950100]      <1> 	mov	[argv], esi
 13504 00010A2E 8915[B8950100]      <1> 	mov	[i.size], edx
 13505 00010A34 A3[B4950100]        <1> 	mov	[ii], eax
 13506                              <1> 
 13507                              <1> 	;sti	; 07/01/2017
 13508                              <1> 	;mov	eax, [k_page_dir]
 13509                              <1> 	;mov	[u.pgdir], eax
 13510 00010A39 31C0                <1> 	xor 	eax, eax ; clc ; *** ; 04/01/2017
 13511                              <1> 	;mov	[u.r0], eax ; 0 ; 07/01/2017
 13512                              <1> 
 13513                              <1> 	; 06/05/2016
 13514                              <1> 	; Set 'sysexit' return order to MainProg
 13515                              <1> 	;
 13516 00010A3B 58                  <1> 	pop	eax ; * 'loc_load_and_run_file_8:' address
 13517                              <1> 	;; 22/01/2017
 13518                              <1> 	;;cli ; 07/01/2017
 13519 00010A3C 8B25[8C7C0100]      <1> 	mov	esp, [tss.esp0]
 13520                              <1> 	;
 13521                              <1> 	; 'loc_load_run_file_8' address has 
 13522                              <1> 	; 'jmp loc_file_rw_restore_retn' instruction
 13523                              <1> 	; 'loc_file_rw_restore_retn:' will return to
 13524                              <1> 	; [mainprog_return_addr] 
 13525                              <1> 	; just after 'call command_interpreter'
 13526                              <1> 	;
 13527 00010A42 68[486D0000]        <1> 	push	_end_of_mainprog ; we must not return to here !
 13528 00010A47 FF35[78890100]      <1> 	push	dword [mainprog_return_addr]
 13529 00010A4D 89E5                <1> 	mov	ebp, esp ; **
 13530                              <1> 	;	
 13531 00010A4F 9C                  <1> 	pushfd  ; EFLAGS      ; IRETD ; ***
 13532 00010A50 6A08                <1> 	push	KCODE ; cs    ; IRETD
 13533 00010A52 50                  <1> 	push	eax ; * (eip) ; IRETD
 13534 00010A53 8925[A4940100]      <1> 	mov	[u.sp], esp
 13535                              <1> 	;mov	byte [u.quant], time_count
 13536 00010A59 1E                  <1> 	push	ds
 13537 00010A5A 06                  <1> 	push	es
 13538 00010A5B 0FA0                <1> 	push	fs
 13539 00010A5D 0FA8                <1> 	push	gs
 13540                              <1> 	;mov	eax, [u.r0]
 13541 00010A5F 29C0                <1> 	sub	eax, eax
 13542 00010A61 60                  <1> 	pushad
 13543 00010A62 68[A0CE0000]        <1> 	push	sysret
 13544                              <1> 	;push	sysrel1 ; 07/01/2017
 13545 00010A67 8925[A8940100]      <1> 	mov	[u.usp], esp
 13546                              <1> 	;
 13547 00010A6D E8FA030000          <1> 	call	wswap ; Save MainProg (process 1) 'u' structure
 13548                              <1> 		      ; and registers for return (from program)
 13549 00010A72 89EC                <1> 	mov	esp, ebp ; **
 13550                              <1> 	;;22/01/2017
 13551                              <1> 	;;sti ; 07/01/2017
 13552                              <1> 	; 23/07/2022
 13553                              <1> 	;push	eax  ; * 'loc_load_and_run_file_8:' address
 13554                              <1> 	;
 13555                              <1> 	;;; 02/05/2016
 13556                              <1> 	;;; Create a new process (parent: MainProg)
 13557 00010A74 31F6                <1> 	xor 	esi, esi
 13558                              <1> cnpm_1: ; search p.stat table for unused process number
 13559 00010A76 46                  <1> 	inc	esi
 13560 00010A77 80BE[DF930100]00    <1> 	cmp	byte [esi+p.stat-1], 0 ; SFREE
 13561                              <1> 				; is process active, unused, dead
 13562 00010A7E 760B                <1> 	jna	short cnpm_2	; it's unused so branch
 13563 00010A80 6683FE10            <1> 	cmp	si, nproc 	; all processes checked
 13564 00010A84 72F0                <1> 	jb	short cnpm_1    ; no, branch back
 13565                              <1> cnpm_panic:
 13566 00010A86 E93E63FFFF          <1> 	jmp	panic 
 13567                              <1> cnpm_2:
 13568 00010A8B A1[04950100]        <1> 	mov	eax, [u.pgdir] ; page directory of MainProg
 13569 00010A90 A3[08950100]        <1> 	mov	[u.ppgdir], eax ; parent's page directory
 13570 00010A95 E8464DFFFF          <1> 	call	allocate_page
 13571                              <1> 	;jc	panic
 13572                              <1> 	; 23/07/2022
 13573 00010A9A 72EA                <1> 	jc	short cnpm_panic
 13574                              <1> 
 13575                              <1> 	; EAX = UPAGE (user structure page) address
 13576 00010A9C A3[00950100]        <1> 	mov	[u.upage], eax ; memory page for 'user' struct (child)
 13577 00010AA1 89F7                <1> 	mov	edi, esi
 13578                              <1> 	;shl	di, 2
 13579                              <1> 	; 23/07/2022
 13580 00010AA3 C1E702              <1> 	shl	edi, 2
 13581 00010AA6 8987[EC930100]      <1> 	mov	[edi+p.upage-4], eax ; memory page for 'user' struct
 13582 00010AAC E8A04DFFFF          <1> 	call	clear_page ; 03/05/2016
 13583                              <1> 	;;movzx	eax, byte [p.ttyc] ; console tty (for MainProg)
 13584                              <1> 	;sub	ax, ax ; 0
 13585                              <1> 	; 23/07/2022
 13586 00010AB1 29C0                <1> 	sub	eax, eax
 13587 00010AB3 668986[BF930100]    <1> 	mov     [esi+p.ttyc-1], ax ; al - set child's console tty
 13588                              <1> 				   ; ah - reset child's wait channel
 13589 00010ABA 66A3[E0940100]      <1> 	mov 	[u.ttyp], ax ; 0
 13590                              <1> 
 13591 00010AC0 89F2                <1> 	mov	edx, esi
 13592 00010AC2 8815[FD940100]      <1> 	mov	[u.uno], dl ; child process number
 13593 00010AC8 FE86[DF930100]      <1>         inc     byte [esi+p.stat-1] ; 1, SRUN
 13594                              <1> 	;shl	si, 1 ; multiply si by 2 to get index into p.pid table
 13595                              <1> 	; 23/07/2022
 13596 00010ACE D1E6                <1> 	shl	esi, 1
 13597 00010AD0 66FF05[94940100]    <1> 	inc	word [mpid] ; increment m.pid; get a new process name
 13598                              <1> 
 13599                              <1> 	; 23/07/2022
 13600                              <1> 	;mov	ax, [p.pid]  ; get process name of MainProg
 13601                              <1> 	;mov	ax, 1
 13602 00010AD7 FEC0                <1> 	inc	al ; eax = 1
 13603 00010AD9 668986[9E930100]    <1> 	mov	[esi+p.ppid-2], ax ; put parent process name
 13604                              <1> 			           ; in parent process slot for child
 13605 00010AE0 A2[F6940100]        <1> 	mov	[u.pri], al ; 1	; normal priority
 13606                              <1> 
 13607                              <1> 	;dec	ax ; 0
 13608                              <1> 	;mov 	[u.ttyp], ax ; 0
 13609                              <1> 
 13610 00010AE5 66A1[94940100]      <1> 	mov	ax, [mpid]
 13611 00010AEB 668986[7E930100]    <1> 	mov	[esi+p.pid-2], ax ; put new process name
 13612                              <1> 				  ; in child process' name slot
 13613                              <1> 	;;;
 13614                              <1> 	; 07/07/2025
 13615                              <1> 	;mov 	eax, [ii]
 13616                              <1> 	; 23/07/2022
 13617                              <1> 	; Retro UNIX 386 v1, 'sysexec' (u2.s)
 13618                              <1> 	;call	iopen
 13619                              <1> 	; 06/06/2016
 13620                              <1> 	;mov	byte [u.pri], 1 ; normal priority
 13621                              <1> 	;
 13622                              <1> 	;jmp	short sysexec_7 ; 02/05/2016
 13623                              <1> 	; 23/07/2022
 13624 00010AF2 E945F9FFFF          <1> 	jmp	sysexec_7
 13625                              <1> 
 13626                              <1> ;	; 02/05/2016
 13627                              <1> ;	;inc	byte [sysflg] ; 0FFh -> 0
 13628                              <1> ;	;mov	byte [sysflg], 0 ; 04/01/2017
 13629                              <1> ;	movzx	ebx, byte [u.uno]
 13630                              <1> ;	shl	bl, 1 ; 13/11/2017
 13631                              <1> ;	cmp	word [ebx+p.ppid-2], 1 ; MainProg
 13632                              <1> ;	ja	sysret0 ; 03/05/2016
 13633                              <1> ;	push	sysret ; * 
 13634                              <1> ;	mov	[u.usp], esp
 13635                              <1> ;	call	wswap ; save child process 'u' structure and
 13636                              <1> ;		      ; registers
 13637                              <1> ;	add	dword [u.usp], 4 ; 03/05/2016 
 13638                              <1> ;sysexec_19: ; 02/05/2016
 13639                              <1> ;	retn ; * 'sysret' ; byte [sysflg] -> 0FFh
 13640                              <1> 
 13641                              <1> readi:
 13642                              <1> 	; 09/08/2022
 13643                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 13644                              <1> 	; 01/05/2016
 13645                              <1> 	; 25/04/2016 - TRDOS 386 (TRDOS v2.0)
 13646                              <1> 	; 20/05/2015 - Retro UNIX 386 v1
 13647                              <1> 	; 11/03/2013 - 31/07/2013 (Retro UNIX 8086 v1)
 13648                              <1> 	;
 13649                              <1> 	; Reads from a file whose the first cluster number in EAX
 13650                              <1> 	; 
 13651                              <1> 	; INPUTS ->
 13652                              <1> 	;    EAX - First cluster number of the file
 13653                              <1> 	;    u.count - byte count user desires
 13654                              <1> 	;    u.base - points to user buffer
 13655                              <1> 	;    u.fofp - points to dword with current file offset
 13656                              <1> 	;    i.size - file size
 13657                              <1> 	;    cdev - logical dos drive number of the file
 13658                              <1> 	; OUTPUTS ->
 13659                              <1> 	;    u.count - cleared
 13660                              <1> 	;    u.nread - accumulates total bytes passed back
 13661                              <1> 	;
 13662                              <1> 	; ((EAX)) input/output
 13663                              <1> 	; (Retro UNIX Prototype : 14/12/2012 - 01/03/2013, UNIXCOPY.ASM)
 13664                              <1>         ; ((Modified registers: edx, ebx, ecx, esi, edi))
 13665                              <1> 
 13666 00010AF7 31D2                <1> 	xor	edx, edx ; 0
 13667 00010AF9 8915[D8940100]      <1> 	mov 	[u.nread], edx ; 0
 13668 00010AFF 668915[10950100]    <1> 	mov	[u.pcount], dx ; 19/05/2015
 13669 00010B06 3915[D4940100]      <1> 	cmp 	[u.count], edx ; 0
 13670                              <1> 	;ja 	short readi_1
 13671                              <1> 	;retn
 13672                              <1> 	; 09/08/2022
 13673 00010B0C 765E                <1> 	jna	short dskr_5 ; retn
 13674                              <1> ;readi_1:
 13675                              <1> dskr:
 13676                              <1> 	; 01/05/2016
 13677                              <1> 	; 25/04/2016 - TRDOS 386 (TRDOS v2.0)
 13678                              <1> 	; 24/05/2015 - 12/10/2015 (Retro UNIX 386 v1)
 13679                              <1> 	; 26/04/2013 - 03/08/2013 (Retro UNIX 8086 v1)
 13680                              <1> dskr_0:
 13681 00010B0E 8B15[B8950100]      <1>         mov	edx, [i.size]
 13682 00010B14 8B1D[C0940100]      <1> 	mov	ebx, [u.fofp]
 13683 00010B1A 2B13                <1> 	sub	edx, [ebx]
 13684 00010B1C 7647                <1> 	jna	short dskr_4
 13685                              <1> 	;
 13686 00010B1E 50                  <1> 	push	eax ; 01/05/2016
 13687 00010B1F 3B15[D4940100]      <1> 	cmp     edx, [u.count] 
 13688 00010B25 7306                <1> 	jnb	short dskr_1
 13689 00010B27 8915[D4940100]      <1> 	mov	[u.count], edx
 13690                              <1> dskr_1:
 13691                              <1> 	; EAX = First Cluster
 13692                              <1> 	; [Current_Drv] = Physical drive number 
 13693 00010B2D E83B000000          <1> 	call	mget_r
 13694                              <1> 	; NOTE: in 'mget_r', relevant sector will be read in buffer
 13695                              <1> 	; if it is not already in buffer !
 13696 00010B32 BB[D4960100]        <1> 	mov	ebx, readi_buffer
 13697 00010B37 803D[12950100]00    <1> 	cmp	byte [u.kcall], 0 ; the caller is 'namei' sign (=1)
 13698 00010B3E 770F                <1> 	ja	short dskr_3	  ; zf=0 -> the caller is 'namei'
 13699 00010B40 66833D[10950100]00  <1> 	cmp	word [u.pcount], 0
 13700 00010B48 7705                <1> 	ja	short dskr_3
 13701                              <1> dskr_2:
 13702                              <1> 	; [u.base] = virtual address to transfer (as destination address)
 13703 00010B4A E88D010000          <1> 	call	trans_addr_w ; translate virtual address to physical (w)
 13704                              <1> dskr_3:
 13705                              <1> 	; EBX (r5) = system (I/O) buffer address -physical-
 13706 00010B4F E8F0010000          <1> 	call	sioreg
 13707 00010B54 87F7                <1> 	xchg	esi, edi
 13708                              <1> 	; EDI = file (user data) offset
 13709                              <1> 	; ESI = sector (I/O) buffer offset
 13710                              <1> 	; ECX = byte count
 13711 00010B56 F3A4                <1> 	rep	movsb
 13712                              <1> 	; eax = remain bytes in buffer
 13713                              <1>         ;       (check if remain bytes in the buffer > [u.pcount])
 13714 00010B58 09C0                <1> 	or	eax, eax
 13715 00010B5A 75EE                <1> 	jnz	short dskr_2 ; (page end before system buffer end!)
 13716 00010B5C 58                  <1> 	pop	eax  ; (first cluster number)
 13717 00010B5D 390D[D4940100]      <1> 	cmp	[u.count], ecx ; 0
 13718 00010B63 77A9                <1> 	ja	short dskr_0
 13719                              <1> dskr_4:
 13720 00010B65 C605[12950100]00    <1> 	mov	byte [u.kcall], 0
 13721                              <1> dskr_5:		; 23/07/2022
 13722 00010B6C C3                  <1> 	retn
 13723                              <1> 
 13724                              <1> mget_r:
 13725                              <1> 	; 29/08/2023
 13726                              <1> 	; 30/07/2022
 13727                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 13728                              <1> 	; 24/10/2016
 13729                              <1> 	; 22/10/2016
 13730                              <1> 	; 12/10/2016
 13731                              <1> 	; 29/04/2016
 13732                              <1> 	; 25/04/2016 - TRDOS 386 (TRDOS v2.0)
 13733                              <1> 	; 03/06/2015 (Retro UNIX 386 v1, 'mget', u.5s)
 13734                              <1> 	; 22/03/2013 - 31/07/2013 (Retro UNIX 8086 v1)
 13735                              <1> 	;
 13736                              <1> 	; Get existing or (allocate) a new disk block for file
 13737                              <1> 	; 
 13738                              <1> 	; INPUTS ->
 13739                              <1> 	;    [u.fofp] = file offset pointer
 13740                              <1> 	;    EAX = First Cluster
 13741                              <1> 	;    [cdev] = Logical dos drive number
 13742                              <1> 	;    ([u.off] = file offset)
 13743                              <1> 	; OUTPUTS ->
 13744                              <1> 	;    EAX = logical sector number
 13745                              <1> 	;    ESI = Logical Dos Drive Description Table address
 13746                              <1> 	;
 13747                              <1> 	; Modified registers: EDX, EBX, ECX, ESI, EDI
 13748                              <1> 
 13749 00010B6D 8B35[C0940100]      <1> 	mov     esi, [u.fofp]
 13750 00010B73 8B1E                <1> 	mov	ebx, [esi] ; (u.off)
 13751                              <1> 
 13752 00010B75 29C9                <1> 	sub	ecx, ecx
 13753 00010B77 8A2D[91940100]      <1> 	mov	ch, [cdev]
 13754                              <1> 
 13755 00010B7D BE00010900          <1> 	mov	esi, Logical_DOSDisks
 13756 00010B82 01CE                <1> 	add	esi, ecx
 13757                              <1> 
 13758 00010B84 380D[24890100]      <1> 	cmp	[readi.valid], cl ; 0
 13759 00010B8A 7648                <1> 	jna	short mget_r_0
 13760                              <1> 	
 13761 00010B8C 3A2D[25890100]      <1> 	cmp	ch, [readi.drv]
 13762 00010B92 7540                <1> 	jne	short mget_r_0
 13763                              <1> 
 13764 00010B94 3B05[38890100]      <1> 	cmp	eax, [readi.fclust]
 13765 00010B9A 7561                <1> 	jne	short mget_r_3
 13766                              <1> 	
 13767 00010B9C 89D8                <1> 	mov	eax, ebx ; file offset
 13768 00010B9E 668B0D[2C890100]    <1> 	mov	cx, [readi.bpc]
 13769 00010BA5 41                  <1> 	inc	ecx ; <= 65536
 13770 00010BA6 29D2                <1> 	sub	edx, edx
 13771 00010BA8 F7F1                <1> 	div	ecx
 13772                              <1> 
 13773 00010BAA 8B3D[34890100]      <1> 	mov	edi, [readi.c_index] ; cluster index
 13774                              <1> 
 13775 00010BB0 39F8                <1> 	cmp	eax, edi
 13776 00010BB2 7576                <1>         jne     short mget_r_4  ; (*)
 13777                              <1> 
 13778                              <1> 	; edx = byte offset in cluster (<= 65535)
 13779 00010BB4 668915[2E890100]    <1> 	mov	[readi.offset], dx
 13780                              <1> 	; 23/07/2022
 13781                              <1> 	;shr	dx, 9 ; / 512
 13782 00010BBB C1EA09              <1> 	shr	edx, 9
 13783 00010BBE 8815[27890100]      <1> 	mov	[readi.s_index], dl ; sector index in cluster (0 to spc -1)
 13784                              <1> 
 13785 00010BC4 A1[30890100]        <1> 	mov	eax, [readi.cluster]  ; > 0 if [readi.valid] = 1
 13786 00010BC9 8B15[3C890100]      <1> 	mov	edx, [readi.fs_index]
 13787 00010BCF E996000000          <1>         jmp     mget_r_7
 13788                              <1> 
 13789                              <1> mget_r_0:
 13790 00010BD4 882D[25890100]      <1> 	mov	[readi.drv], ch ; physical drive number
 13791 00010BDA 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
 13792 00010BDE 7707                <1> 	ja	short mget_r_1
 13793 00010BE0 8A4E12              <1> 	mov	cl, [esi+LD_FS_BytesPerSec+1]
 13794 00010BE3 D0E9                <1> 	shr	cl, 1 ;  ; 1 for 512 bytes, 4 for 2048 bytes
 13795 00010BE5 EB03                <1> 	jmp	short mget_r_2	
 13796                              <1> mget_r_1:
 13797 00010BE7 8A4E13              <1> 	mov	cl, [esi+LD_BPB+BPB_SecPerClust]
 13798                              <1> mget_r_2:
 13799 00010BEA 880D[26890100]      <1> 	mov	[readi.spc], cl  ; sectors per cluster
 13800                              <1> 	; NOTE: readi bytes per sector value is always 512 !
 13801                              <1> 	; 23/07/2022
 13802                              <1> 	;xor	ch, ch
 13803                              <1> 	; 29/08/2023
 13804 00010BF0 C1E109              <1> 	shl	ecx, 9 
 13805                              <1> 	;shl	cx, 9 ; * 512
 13806                              <1> 	;dec	cx ; bytes per cluster - 1
 13807                              <1> 	; 23/07/2022
 13808 00010BF3 49                  <1> 	dec	ecx
 13809 00010BF4 66890D[2C890100]    <1> 	mov	[readi.bpc], cx
 13810                              <1> 	;sub	cx, cx
 13811                              <1> 	; 23/07/2022
 13812 00010BFB 29C9                <1> 	sub	ecx, ecx
 13813                              <1> mget_r_3:
 13814 00010BFD A3[38890100]        <1> 	mov	[readi.fclust], eax ; first cluster (or FDT address)
 13815 00010C02 880D[24890100]      <1> 	mov	[readi.valid], cl ; 0 
 13816                              <1> 	;mov	[readi.s_index], cl ; 0
 13817                              <1> 	;mov	[readi.offset], cx ; 0
 13818 00010C08 890D[34890100]      <1> 	mov	[readi.c_index], ecx ; 0
 13819 00010C0E 890D[30890100]      <1> 	mov	[readi.cluster], ecx ; 0
 13820 00010C14 890D[28890100]      <1> 	mov	[readi.sector], ecx ; 0
 13821                              <1> 
 13822 00010C1A 89D8                <1> 	mov	eax, ebx ; file offset
 13823 00010C1C 668B0D[2C890100]    <1> 	mov	cx, [readi.bpc]
 13824 00010C23 41                  <1> 	inc	ecx ; <= 65536
 13825 00010C24 29D2                <1> 	sub	edx, edx
 13826 00010C26 F7F1                <1> 	div	ecx
 13827                              <1> 	;mov	edi, [readi.c_index] ; previous cluster index
 13828 00010C28 29FF                <1> 	sub	edi, edi
 13829                              <1> mget_r_4:
 13830 00010C2A A3[34890100]        <1> 	mov	[readi.c_index], eax ; cluster index
 13831                              <1> 	; edx = byte offset in cluster (<= 65535)
 13832 00010C2F 668915[2E890100]    <1> 	mov	[readi.offset], dx
 13833                              <1> 	; 23/07/2022
 13834                              <1> 	;shr	dx, 9 ; / 512
 13835 00010C36 C1EA09              <1> 	shr	edx, 9
 13836 00010C39 8815[27890100]      <1> 	mov	[readi.s_index], dl ; sector index in cluster (0 to spc -1)
 13837                              <1> 
 13838 00010C3F 89C1                <1> 	mov	ecx, eax ; current cluster index
 13839 00010C41 A1[38890100]        <1> 	mov	eax, [readi.fclust]
 13840 00010C46 09C9                <1> 	or	ecx, ecx ; cluster index
 13841 00010C48 741B                <1> 	jz	short mget_r_6
 13842                              <1> 
 13843 00010C4A 39CF                <1> 	cmp	edi, ecx
 13844 00010C4C 7710                <1> 	ja	short mget_r_5 ; old cluster index is higher
 13845 00010C4E 8B15[30890100]      <1> 	mov	edx, [readi.cluster]
 13846 00010C54 21D2                <1> 	and	edx, edx
 13847 00010C56 7406                <1> 	jz	short mget_r_5
 13848                              <1> 	; valid 'readi' parameters (*)
 13849 00010C58 89D0                <1> 	mov	eax, edx
 13850 00010C5A 29F9                <1> 	sub	ecx, edi
 13851 00010C5C 740C                <1> 	jz	short mget_r_7
 13852                              <1> mget_r_5:
 13853                              <1> 	; EAX = Beginning cluster
 13854                              <1> 	; EDX = Sector index in disk/file section
 13855                              <1> 	;	(Only for SINGLIX file system!)
 13856                              <1> 	; ECX = Cluster sequence number after the beginning cluster
 13857                              <1> 	; ESI = Logical DOS Drive Description Table address
 13858 00010C5E E851C0FFFF          <1> 	call	get_cluster_by_index
 13859 00010C63 724C                <1> 	jc	short mget_r_err
 13860                              <1> 	; EAX = Cluster number
 13861                              <1> mget_r_6:
 13862 00010C65 A3[30890100]        <1> 	mov	[readi.cluster], eax ; FDT number for Singlix File System
 13863                              <1> mget_r_7:
 13864 00010C6A 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
 13865 00010C6E 765D                <1> 	jna	short mget_r_12
 13866                              <1> 
 13867                              <1> 	;sub	eax, 2
 13868                              <1> 	; 30/07/2022
 13869 00010C70 48                  <1> 	dec	eax
 13870 00010C71 48                  <1> 	dec	eax
 13871 00010C72 0FB615[26890100]    <1> 	movzx	edx, byte [readi.spc]
 13872 00010C79 F7E2                <1> 	mul	edx
 13873                              <1> 
 13874 00010C7B 034668              <1> 	add	eax, [esi+LD_DATABegin]
 13875 00010C7E 8A15[27890100]      <1> 	mov	dl, [readi.s_index]
 13876 00010C84 01D0                <1> 	add	eax, edx
 13877                              <1> mget_r_8:
 13878                              <1> 	; eax = logical sector number
 13879 00010C86 803D[24890100]00    <1> 	cmp	byte [readi.valid], 0
 13880 00010C8D 7608                <1> 	jna	short mget_r_9
 13881 00010C8F 3B05[28890100]      <1> 	cmp	eax, [readi.sector]
 13882 00010C95 7435                <1> 	je	short mget_r_11 ; sector is already in 'readi' buffer
 13883                              <1> mget_r_9:
 13884 00010C97 A3[28890100]        <1> 	mov	[readi.sector], eax
 13885 00010C9C BB[D4960100]        <1> 	mov	ebx, readi_buffer ; buffer address
 13886                              <1> 	;mov	ecx, 1
 13887                              <1> 	; 30/07/2022
 13888 00010CA1 31C9                <1> 	xor	ecx, ecx
 13889 00010CA3 FEC1                <1> 	inc	cl
 13890                              <1> 	; ecx = 1	
 13891                              <1> 
 13892                              <1> 	; 29/04/2016
 13893                              <1> 	;xor	dl, dl
 13894                              <1> 
 13895                              <1> 	; EAX = Logical sector number
 13896                              <1> 	; ECX = Sector count
 13897                              <1> 	; EBX = Buffer address
 13898                              <1> 	; (EDX = 0)
 13899                              <1> 	; ESI = Logical DOS drive description table address
 13900                              <1> 
 13901 00010CA5 E88A130000          <1> 	call	disk_read
 13902 00010CAA 7314                <1> 	jnc	short mget_r_10
 13903                              <1> 
 13904                              <1> 	; 22/10/2016 (15h -> 17)
 13905 00010CAC B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error !
 13906                              <1> mget_r_err:
 13907 00010CB1 A3[18950100]        <1> 	mov	[u.error], eax
 13908                              <1> 	; 12/10/2016
 13909 00010CB6 A3[AC940100]        <1> 	mov	[u.r0], eax
 13910 00010CBB E9C0C1FFFF          <1> 	jmp	error
 13911                              <1> mget_r_10:
 13912 00010CC0 C605[24890100]01    <1> 	mov	byte [readi.valid], 1 ; 24/10/2016
 13913 00010CC7 A1[28890100]        <1> 	mov	eax, [readi.sector]
 13914                              <1> mget_r_11:
 13915 00010CCC C3                  <1> 	retn
 13916                              <1> mget_r_12:
 13917                              <1> 	; EAX = FDT number
 13918                              <1> 	; EDX = Sector index from FDT sector (0,1,2,3,4...)
 13919 00010CCD 40                  <1> 	inc	eax ; the first data sector in FS disk section
 13920 00010CCE 8915[3C890100]      <1> 	mov	[readi.fs_index], edx
 13921 00010CD4 01D0                <1> 	add	eax, edx
 13922 00010CD6 EBAE                <1> 	jmp	short mget_r_8
 13923                              <1> 
 13924                              <1> trans_addr_r:
 13925                              <1> 	; 12/10/2016
 13926                              <1> 	; 02/05/2016 - TRDOS 386 (TRDOS v2.0)
 13927                              <1> 	; Translate virtual address to physical address 
 13928                              <1> 	; for reading from user's memory space
 13929                              <1> 	; 04/06/2015 - 18/10/2015 (Retro UNIX 386 v1)
 13930                              <1> 
 13931 00010CD8 31D2                <1> 	xor	edx, edx ; 0 (read access sign)
 13932 00010CDA EB04                <1> 	jmp 	short trans_addr_rw
 13933                              <1> 
 13934                              <1> trans_addr_w:
 13935                              <1> 	; 12/10/2016
 13936                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 13937                              <1> 	; Translate virtual address to physical address
 13938                              <1> 	; for writing to user's memory space
 13939                              <1> 	; 04/06/2015 - 18/10/2015 (Retro UNIX 386 v1)
 13940                              <1> 	
 13941 00010CDC 29D2                <1> 	sub	edx, edx
 13942 00010CDE FEC2                <1> 	inc	dl ; 1 (write access sign)
 13943                              <1> trans_addr_rw:
 13944 00010CE0 50                  <1> 	push	eax
 13945 00010CE1 53                  <1> 	push	ebx
 13946 00010CE2 52                  <1> 	push 	edx ; r/w sign (in DL)
 13947                              <1> 	;
 13948 00010CE3 8B1D[D0940100]      <1> 	mov	ebx, [u.base]
 13949 00010CE9 E8D04EFFFF          <1> 	call	get_physical_addr ; get physical address
 13950 00010CEE 730F                <1> 	jnc	short passc_0
 13951 00010CF0 A3[18950100]        <1> 	mov	[u.error], eax
 13952 00010CF5 A3[AC940100]        <1> 	mov	[u.r0], eax ; 12/10/2016
 13953                              <1> 	;pop	edx
 13954                              <1> 	;pop 	ebx
 13955                              <1> 	;pop	eax
 13956 00010CFA E981C1FFFF          <1> 	jmp	error
 13957                              <1> passc_0:
 13958 00010CFF F6C202              <1> 	test	dl, PTE_A_WRITE ; writable page
 13959 00010D02 5A                  <1> 	pop	edx
 13960 00010D03 751C                <1> 	jnz	short passc_1
 13961                              <1> 	
 13962 00010D05 20D2                <1> 	and 	dl, dl
 13963 00010D07 7418                <1> 	jz	short passc_1
 13964                              <1> 	; read only (duplicated) page -must be copied to a new page-
 13965                              <1> 	; EBX = linear address
 13966 00010D09 51                  <1> 	push 	ecx
 13967 00010D0A E8204EFFFF          <1> 	call 	copy_page
 13968 00010D0F 59                  <1> 	pop	ecx
 13969 00010D10 721E                <1> 	jc	short passc_2
 13970 00010D12 50                  <1> 	push	eax ; physical address of the new/allocated page
 13971 00010D13 E8A64EFFFF          <1> 	call	add_to_swap_queue
 13972 00010D18 58                  <1> 	pop	eax
 13973 00010D19 81E3FF0F0000        <1> 	and 	ebx, PAGE_OFF ; 0FFFh
 13974                              <1> 	;mov 	ecx, PAGE_SIZE
 13975                              <1> 	;sub	ecx, ebx
 13976 00010D1F 01D8                <1> 	add	eax, ebx
 13977                              <1> passc_1: 
 13978 00010D21 A3[0C950100]        <1> 	mov 	[u.pbase], eax ; physical address
 13979 00010D26 66890D[10950100]    <1> 	mov	[u.pcount], cx ; remain byte count in page (1-4096)
 13980 00010D2D 5B                  <1> 	pop	ebx
 13981 00010D2E 58                  <1> 	pop	eax
 13982 00010D2F C3                  <1> 	retn
 13983                              <1> passc_2:
 13984 00010D30 B804000000          <1> 	mov	eax, ERR_MINOR_IM ; "Insufficient memory !" error
 13985 00010D35 A3[AC940100]        <1> 	mov	[u.r0], eax ; 12/10/2016
 13986 00010D3A A3[18950100]        <1> 	mov	[u.error], eax
 13987                              <1> 	;pop 	ebx
 13988                              <1> 	;pop	eax
 13989 00010D3F E93CC1FFFF          <1> 	jmp	error
 13990                              <1> 
 13991                              <1> sioreg: 
 13992                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 13993                              <1> 	; 19/05/2015 - 25/07/2015 (Retro UNIX 386 v1)
 13994                              <1> 	; 12/03/2013 - 22/07/2013 (Retro UNIX 8086 v1)
 13995                              <1> 	; INPUTS -> 
 13996                              <1> 	;     EBX = system buffer (data) address (r5)
 13997                              <1> 	;     [u.fofp] = pointer to file offset pointer
 13998                              <1> 	;     [u.base] = virtual address of the user buffer
 13999                              <1> 	;     [u.pbase] = physical address of the user buffer
 14000                              <1> 	;     [u.count] = byte count
 14001                              <1> 	;     [u.pcount] = byte count within page frame
 14002                              <1> 	; OUTPUTS -> 
 14003                              <1> 	;     ESI = user data offset (r1)
 14004                              <1> 	;     EDI = system (I/O) buffer offset (r2)
 14005                              <1> 	;     ECX = byte count (r3)
 14006                              <1> 	;     EAX = remain bytes after byte count within page frame
 14007                              <1> 	;	(If EAX > 0, transfer will continue from the next page)
 14008                              <1>         ;
 14009                              <1> 	; ((Modified registers:  EDX))
 14010                              <1>  
 14011 00010D44 8B35[C0940100]      <1>         mov     esi, [u.fofp]
 14012 00010D4A 8B3E                <1>         mov     edi, [esi]
 14013 00010D4C 89F9                <1> 	mov	ecx, edi
 14014 00010D4E 81C900FEFFFF        <1> 	or	ecx, 0FFFFFE00h
 14015 00010D54 81E7FF010000        <1> 	and	edi, 1FFh
 14016 00010D5A 01DF                <1> 	add	edi, ebx ; EBX = system buffer (data) address
 14017 00010D5C F7D9                <1> 	neg	ecx
 14018 00010D5E 3B0D[D4940100]      <1> 	cmp	ecx, [u.count]
 14019 00010D64 7606                <1> 	jna	short sioreg_0
 14020 00010D66 8B0D[D4940100]      <1> 	mov	ecx, [u.count]
 14021                              <1> sioreg_0:
 14022 00010D6C 803D[12950100]00    <1> 	cmp	byte [u.kcall], 0
 14023 00010D73 7613                <1> 	jna	short sioreg_1
 14024                              <1> 	 ; the caller is 'mkdir' or 'namei'
 14025 00010D75 A1[D0940100]        <1> 	mov	eax, [u.base]
 14026 00010D7A A3[0C950100]        <1> 	mov 	[u.pbase], eax ; physical address = virtual address
 14027 00010D7F 66890D[10950100]    <1> 	mov	word [u.pcount], cx ; remain bytes in buffer (1 sector)
 14028 00010D86 EB0B                <1> 	jmp	short sioreg_2
 14029                              <1> sioreg_1:
 14030 00010D88 0FB715[10950100]    <1> 	movzx	edx, word [u.pcount]
 14031 00010D8F 39D1                <1> 	cmp	ecx, edx
 14032 00010D91 772A                <1> 	ja	short sioreg_4 ; transfer count > [u.pcount]
 14033                              <1> sioreg_2: ; 2:
 14034 00010D93 31C0                <1> 	xor 	eax, eax
 14035                              <1> sioreg_3:
 14036 00010D95 010D[D8940100]      <1> 	add 	[u.nread], ecx
 14037 00010D9B 290D[D4940100]      <1> 	sub 	[u.count], ecx
 14038 00010DA1 010D[D0940100]      <1> 	add 	[u.base], ecx
 14039 00010DA7 010E                <1>         add 	[esi], ecx 
 14040 00010DA9 8B35[0C950100]      <1> 	mov	esi, [u.pbase]
 14041 00010DAF 66290D[10950100]    <1> 	sub	[u.pcount], cx
 14042 00010DB6 010D[0C950100]      <1> 	add	[u.pbase], ecx
 14043 00010DBC C3                  <1>         retn
 14044                              <1> sioreg_4:
 14045                              <1> 	; transfer count > [u.pcount]
 14046                              <1> 	; (ecx > edx)
 14047 00010DBD 89C8                <1> 	mov	eax, ecx
 14048 00010DBF 29D0                <1> 	sub	eax, edx ; remain bytes for 1 sector (block) transfer
 14049 00010DC1 89D1                <1> 	mov	ecx, edx ; current transfer count = [u.pcount]
 14050 00010DC3 EBD0                <1> 	jmp	short sioreg_3
 14051                              <1> 
 14052                              <1> tswitch: ; Retro UNIX 386 v1
 14053                              <1> tswap:
 14054                              <1> 	; 16/01/2017
 14055                              <1> 	; 21/05/2016 - TRDOS 386 (TRDOS v2.0)
 14056                              <1> 	; 10/05/2015 - 01/09/2015 (Retro UNIX 386 v1)
 14057                              <1> 	; 14/04/2013 - 14/02/2014 (Retro UNIX 8086 v1)
 14058                              <1> 	; time out swap, called when a user times out.
 14059                              <1> 	; the user is put on the low priority queue.
 14060                              <1> 	; This is done by making a link from the last user
 14061                              <1> 	; on the low priority queue to him via a call to 'putlu'.
 14062                              <1> 	; then he is swapped out.
 14063                              <1> 
 14064                              <1> 	; TRDOS 386 (TRDOS v2.0) modification ->  ** 21/05/2016 **
 14065                              <1> 	;     * when a high priority (event) process will be stopped
 14066                              <1> 	;	(swapped out, swithched out/off), 'tswap/tswitch' will
 14067                              <1> 	;	not add it to a run queue. 
 14068                              <1> 	;	/// What for: Process may be already in a run queue, 
 14069                              <1> 	;	it is unspeficied state because process might be started
 14070                              <1> 	;	by a timer event which does not regard previous priority
 14071                              <1> 	;	level and run queue of the process (for fast executing!).
 14072                              <1> 	;	After the 'run for event', process will be sequenced
 14073                              <1> 	;	to run by it's actual run queue. ///
 14074                              <1> 	;
 14075                              <1> 	; Retro UNIX 386 v1 modification ->
 14076                              <1> 	;       swap (software task switch) is performed by changing
 14077                              <1> 	;	user's page directory (u.pgdir) instead of segment change
 14078                              <1> 	;	as in Retro UNIX 8086 v1.
 14079                              <1> 	;
 14080                              <1> 	; RETRO UNIX 8086 v1 modification ->
 14081                              <1> 	;       'swap to disk' is replaced with 'change running segment'
 14082                              <1> 	;	according to 8086 cpu (x86 real mode) architecture.
 14083                              <1> 	;	pdp-11 was using 64KB uniform memory while IBM PC
 14084                              <1> 	;	compatibles was using 1MB segmented memory
 14085                              <1> 	;	in 8086/8088 times.
 14086                              <1> 	;
 14087                              <1> 	; INPUTS ->
 14088                              <1> 	;    u.uno - users process number
 14089                              <1> 	;    runq+4 - lowest priority queue
 14090                              <1> 	; OUTPUTS ->
 14091                              <1> 	;    r0 - users process number
 14092                              <1> 	;    r2 - lowest priority queue address
 14093                              <1> 	;
 14094                              <1> 	; ((AX = R0, BX = R2)) output
 14095                              <1> 	; ((Modified registers: EDX, EBX, ECX, ESI, EDI))
 14096                              <1> 	;
 14097                              <1> 
 14098                              <1> 	NOTE:
 14099                              <1> 	;* [u.pri] priority level is specified by run queue which is process 
 14100                              <1> 	;  comes to run from.
 14101                              <1> 	;* Initial [u.pri] is 1 ('normal/regular') for programs 
 14102                              <1> 	;  (which are launched by MainProg or 'sysexec'), it is changed
 14103                              <1> 	;  to 2 ('high') by timer event, if program uses 'systimer' system call.
 14104                              <1> 	;* Program (Process) also can change it's running priority 
 14105                              <1> 	;  from 1 to 0 or up to 2 by using 'syspri' system call; but,
 14106                              <1> 	;  if program selects priority level 2 (high) for running, next time
 14107                              <1> 	;  it is reduced to 1 (normal/regular) because 'syspri' adds this
 14108                              <1> 	;  program to 'run for normal' queue while running duration is a bit
 14109                              <1> 	;  protected from swap/switch out immediate, behalf of other high 
 14110                              <1> 	;  priority process in sequence. Program (with high priority) will not
 14111                              <1> 	;  be swapped/switched out (by timer event) before it's time quantum
 14112                              <1> 	;  will be elapsed, but, this will be temporary if program is not using
 14113                              <1> 	;  timer event function.
 14114                              <1> 
 14115                              <1> 	;For example:
 14116                              <1> 	;If a process frequently gets a timer event, it runs at high priority
 14117                              <1> 	;level but when it returns from running it returns to actual run queue,
 14118                              <1> 	;not to 'run for event' queue again.
 14119                              <1> 	;'tswap' will not change the sequence at return/stop(swap out) stage.
 14120                              <1> 	;But if priority level not high (=2, 'run for event'), 'tswap/tswitch'
 14121                              <1> 	;will add the stopping process to relevant run queue according to
 14122                              <1> 	;[u.pri] priority level.
 14123                              <1> 
 14124                              <1> 	; 16/01/2017
 14125 00010DC5 BB[9C940100]        <1> 	mov	ebx, runq+2 	; 'runq_normal' ; normal/regular priority
 14126                              <1> 	; 21/05/2016
 14127                              <1> 	;cmp	byte [u.pri], 2	; high priority (run for event) ?
 14128                              <1> 	;jnb	short swap
 14129                              <1> 	; 16/01/2017
 14130                              <1> 	; (Normal and also high/event priority processes will be added to
 14131                              <1> 	; normal priority run queue for ensuring circular running sequence!)
 14132                              <1> 	; (Timer interrupt or 'syspri' system call may change priority and run
 14133                              <1> 	; queue to high/event level.)
 14134 00010DCA 803D[F6940100]00    <1> 	cmp	byte [u.pri], 0
 14135 00010DD1 7702                <1> 	ja	short tswap_1	; normal priority run queue
 14136                              <1> 	;
 14137 00010DD3 43                  <1> 	inc	ebx
 14138 00010DD4 43                  <1> 	inc	ebx		; runq+4, 'runq_background', low priority
 14139                              <1> tswap_1:
 14140 00010DD5 A0[FD940100]        <1> 	mov 	al, [u.uno]
 14141                              <1> 	       	; movb u.uno,r1 / move users process number to r1
 14142                              <1> 		; mov  $runq+4,r2 
 14143                              <1> 			; / move lowest priority queue address to r2
 14144                              <1>       	; ebx = run queue
 14145 00010DDA E8FD000000          <1> 	call 	putlu
 14146                              <1> 		; jsr r0,putlu / create link from last user on Q to 
 14147                              <1> 		             ; / u.uno's user
 14148                              <1> 
 14149                              <1> switch: ; Retro UNIX 386 v1
 14150                              <1> swap:
 14151                              <1> 	; 20/08/2024
 14152                              <1> 	; 02/01/2017
 14153                              <1> 	; 21/05/2016
 14154                              <1> 	; 20/05/2016
 14155                              <1> 	; 02/05/2016
 14156                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 14157                              <1> 	; 10/05/2015 - 02/09/2015 (Retro UNIX 386 v1)
 14158                              <1> 	; 14/04/2013 - 08/03/2014 (Retro UNIX 8086 v1)
 14159                              <1> 	;
 14160                              <1> 	; 'swap' is routine that controls the swapping of processes
 14161                              <1> 	; in and out of core.
 14162                              <1> 	;
 14163                              <1> 	; TRDOS 386 (TRDOS v2.0) modification ->  ** 20/05/2016 **
 14164                              <1> 	;     * 3 different priority level is applied
 14165                              <1> 	;	(just as original unix v1)
 14166                              <1> 	;	1) high priority (event) run queue, 'runq_event'
 14167                              <1> 	;	2) normal priority (regular) run queue, 'runq_normal'
 14168                              <1> 	;	3) low priority (background) run queue, 'runq_backgroud'
 14169                              <1> 	;	'swap' code will run a process which has max. priority
 14170                              <1>         ;       (for earliest event at first)
 14171                              <1> 	;
 14172                              <1> 	; Retro UNIX 386 v1 modification ->
 14173                              <1> 	;       swap (software task switch) is performed by changing
 14174                              <1> 	;	user's page directory (u.pgdir) instead of segment change
 14175                              <1> 	;	as in Retro UNIX 8086 v1.
 14176                              <1> 	;
 14177                              <1> 	; RETRO UNIX 8086 v1 modification ->
 14178                              <1> 	;       'swap to disk' is replaced with 'change running segment'
 14179                              <1> 	;	according to 8086 cpu (x86 real mode) architecture.
 14180                              <1> 	;	pdp-11 was using 64KB uniform memory while IBM PC
 14181                              <1> 	;	compatibles was using 1MB segmented memory
 14182                              <1> 	;	in 8086/8088 times.
 14183                              <1> 	;
 14184                              <1> 	; INPUTS ->
 14185                              <1> 	;    runq table - contains processes to run.
 14186                              <1> 	;    p.link - contains next process in line to be run.
 14187                              <1> 	;    u.uno - process number of process in core
 14188                              <1> 	;    s.stack - swap stack used as an internal stack for swapping.
 14189                              <1> 	; OUTPUTS ->
 14190                              <1> 	;    (original unix v1 -> present process to its disk block)
 14191                              <1> 	;    (original unix v1 -> new process into core -> 
 14192                              <1> 	;	   Retro Unix 8086 v1 -> segment registers changed 
 14193                              <1> 	;	   for new process)
 14194                              <1> 	;    u.quant = 3 (Time quantum for a process)
 14195                              <1> 	; 	((INT 1Ch count down speed -> 18.2 times per second)
 14196                              <1> 	;    RETRO UNIX 8086 v1 will use INT 1Ch (18.2 times per second)
 14197                              <1> 	;	 for now, it will swap the process if there is not
 14198                              <1> 	;	 a keyboard event (keystroke) (Int 15h, function 4Fh)
 14199                              <1> 	;	 or will count down from 3 to 0 even if there is a
 14200                              <1> 	;        keyboard event locking due to repetitive key strokes.
 14201                              <1> 	;	 u.quant will be reset to 3 for RETRO UNIX 8086 v1.
 14202                              <1> 	;
 14203                              <1> 	; ((Modified registers: EAX, EDX, EBX, ECX, ESI, EDI))
 14204                              <1> 
 14205                              <1> 	;NOTE:
 14206                              <1> 	;High priority queue is the first for selecting a process to run.
 14207                              <1> 	;If there is not a process in high priority level run queue,
 14208                              <1> 	;a process in normal priority run queue will be selected
 14209                              <1> 	;or a proces in low priority run queue will be selected if normal
 14210                              <1> 	;priority level run queue is empty.
 14211                              <1> 	
 14212                              <1> 	; 21/05/2016 -(3 priority levels, 3 run queues)
 14213 00010DDF BE[9A940100]        <1> 	mov	esi, runq ; 'runq_event' ; high priority, 'run for event'
 14214 00010DE4 C605[88890100]03    <1> 	mov	byte [priority], 3 ; high priority + 1
 14215 00010DEB 31DB                <1> 	xor	ebx, ebx ; 02/01/2017
 14216                              <1> swap_0: ; 1: / search runq table for highest priority process
 14217 00010DED 66AD                <1> 	lodsw  ; mov ax, [esi], add esi+2
 14218                              <1> 	;xor	ebx, ebx ; 02/05/2016
 14219 00010DEF 6621C0              <1> 	and 	ax, ax ; are there any processes to run in this Q entry
 14220 00010DF2 750E                <1> 	jnz	short swap_2
 14221                              <1> 	; 21/05/2026
 14222                              <1> 	; runq_normal = runq+2, runq_background = runq+4
 14223 00010DF4 FE0D[88890100]      <1> 	dec	byte [priority] ; 3 -> 3, 2 -> 1, 1-> 0
 14224 00010DFA 75F1                <1> 	jnz	short swap_0
 14225                              <1> 	;cmp	esi, runq+6  ; if zero compare address to end of table
 14226                              <1> 	;jb	short swap_0 ; if not at end, go back
 14227                              <1> swap_1:
 14228                              <1> 	; 02/05/2016
 14229                              <1> 	; 29/04/2016 (TRDOS 386 = TRDOS v2.0)
 14230                              <1> 	; No user process to run...
 14231                              <1> 	; Run the kernel process... MainProg: Internal Command Interpreter
 14232 00010DFC FEC0                <1> 	inc	al ; mov al, 1  ; process number of MainProg
 14233 00010DFE FEC3                <1> 	inc	bl ; mov bl, al ; 1
 14234 00010E00 EB1D                <1> 	jmp	short swap_4
 14235                              <1> swap_2:
 14236                              <1> 	; 21/05/2016
 14237 00010E02 FE0D[88890100]      <1> 	dec	byte [priority] ; priority level of present user/process
 14238                              <1> 			        ; 0, 1, 2
 14239 00010E08 4E                  <1> 	dec	esi
 14240 00010E09 4E                  <1>         dec     esi
 14241                              <1> 	;
 14242 00010E0A 88C3                <1> 	mov	bl, al
 14243 00010E0C 38E0                <1> 	cmp	al, ah ; is there only 1 process in the queue to be run
 14244 00010E0E 740A                <1> 	je	short swap_3 ; yes
 14245 00010E10 8AA3[CF930100]      <1> 	mov	ah, [ebx+p.link-1]
 14246 00010E16 8826                <1>        	mov	[esi], ah ; move next process in line into run queue
 14247 00010E18 EB05                <1> 	jmp	short swap_4
 14248                              <1> swap_3:
 14249                              <1> 	;xor	dx, dx
 14250                              <1> 	; 20/08/2024
 14251 00010E1A 31D2                <1> 	xor	edx, edx
 14252 00010E1C 668916              <1> 	mov	[esi], dx ; zero the entry; no processes on the Q
 14253                              <1> swap_4:
 14254 00010E1F 8A25[FD940100]      <1> 	mov 	ah, [u.uno]
 14255 00010E25 38C4                <1> 	cmp	ah, al ; is this process the same as the process in core?
 14256 00010E27 743B                <1>        	je	short swap_8 ; yes, don't have to swap
 14257 00010E29 08E4                <1> 	or	ah, ah ; is the process # = 0
 14258 00010E2B 740D                <1>        	jz	short swap_6 ; 'sysexit'
 14259                              <1> 	;cmp	ah, al ; is this process the same as the process in core?
 14260                              <1>        	;je	short swap_8 ; yes, don't have to swap
 14261 00010E2D 8925[A8940100]      <1> 	mov	[u.usp], esp ; return address for 'syswait' & 'sleep'
 14262 00010E33 E834000000          <1> 	call	wswap  ; write out core to disk
 14263 00010E38 EB1C                <1> 	jmp 	short swap_7
 14264                              <1> swap_6:
 14265                              <1> 	; Deallocate memory pages belong to the process
 14266                              <1> 	; which is being terminated.
 14267                              <1> 	; (Retro UNIX 386 v1 modification !)
 14268                              <1> 	;
 14269 00010E3A 53                  <1> 	push	ebx
 14270 00010E3B A1[04950100]        <1> 	mov 	eax, [u.pgdir]  ; page directory of the process
 14271 00010E40 8B1D[08950100]      <1> 	mov	ebx, [u.ppgdir] ; page directory of the parent process
 14272 00010E46 E8C54AFFFF          <1> 	call	deallocate_page_dir
 14273 00010E4B A1[00950100]        <1> 	mov	eax, [u.upage] ; 'user' structure page of the process
 14274 00010E50 E84A4BFFFF          <1> 	call	deallocate_page
 14275 00010E55 5B                  <1> 	pop	ebx
 14276                              <1> swap_7:
 14277 00010E56 C0E302              <1> 	shl	bl, 2 ; * 4
 14278                              <1> 	;;;
 14279 00010E59 8B83[EC930100]      <1> 	mov	eax, [ebx+p.upage-4] ; the 'u' page of the new process
 14280 00010E5F E840000000          <1> 	call	rswap ; read new process into core
 14281                              <1> swap_8:
 14282                              <1> 	; Retro UNIX  8086 v1 modification !
 14283 00010E64 C605[F4940100]04    <1> 	mov	byte [u.quant], time_count
 14284 00010E6B C3                  <1> 	retn
 14285                              <1> 
 14286                              <1> wswap:  ; < swap out, swap to disk >
 14287                              <1> 	; 28/02/2017 (fnsave)
 14288                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 14289                              <1> 	; 09/05/2015 (Retro UNIX 386 v1)
 14290                              <1> 	; 26/05/2013 - 08/03/2014 (Retro UNIX 8086 v1)
 14291                              <1> 	; 'wswap' writes out the process that is in core onto its
 14292                              <1> 	; appropriate disk area.
 14293                              <1> 	;
 14294                              <1> 	; Retro UNIX 386 v1 modification ->
 14295                              <1> 	;       User (u) structure content and the user's register content
 14296                              <1> 	;	will be copied to the process's/user's UPAGE (a page for
 14297                              <1> 	;	saving 'u' structure and user registers for task switching).
 14298                              <1> 	;	u.usp - points to kernel stack address which contains
 14299                              <1> 	;		user's registers while entering system call.
 14300                              <1> 	;	u.sp  - points to kernel stack address 
 14301                              <1> 	;		to return from system call -for IRET-.
 14302                              <1> 	;	[u.usp]+32+16 = [u.sp] 
 14303                              <1> 	;	[u.usp] -> edi, esi, ebp, esp (= [u.usp]+32), ebx, 
 14304                              <1> 	;		edx, ecx, eax, gs, fs, es, ds, -> [u.sp].
 14305                              <1> 	;
 14306                              <1> 	; Retro UNIX 8086 v1 modification ->
 14307                              <1> 	;       'swap to disk' is replaced with 'change running segment'
 14308                              <1> 	;	according to 8086 cpu (x86 real mode) architecture.
 14309                              <1> 	;	pdp-11 was using 64KB uniform memory while IBM PC
 14310                              <1> 	;	compatibles was using 1MB segmented memory 
 14311                              <1> 	;	in 8086/8088 times.
 14312                              <1> 	;
 14313                              <1> 	; INPUTS ->
 14314                              <1> 	;    u.break - points to end of program
 14315                              <1> 	;    u.usp - stack pointer at the moment of swap
 14316                              <1> 	;    core - beginning of process program
 14317                              <1> 	;    ecore - end of core 	
 14318                              <1> 	;    user - start of user parameter area
 14319                              <1> 	;    u.uno - user process number
 14320                              <1> 	;    p.dska - holds block number of process
 14321                              <1> 	; OUTPUTS ->
 14322                              <1> 	;    swp I/O queue
 14323                              <1> 	;    p.break - negative word count of process 
 14324                              <1> 	;    r1 - process disk address
 14325                              <1> 	;    r2 - negative word count
 14326                              <1> 	;
 14327                              <1> 	; RETRO UNIX 8086 v1 input/output:
 14328                              <1> 	;
 14329                              <1> 	; INPUTS ->
 14330                              <1> 	;    u.uno - process number (to be swapped out)
 14331                              <1> 	; OUTPUTS ->
 14332                              <1> 	;    none
 14333                              <1> 	;
 14334                              <1> 	;   ((Modified registers: ECX, ESI, EDI))
 14335                              <1> 	;
 14336                              <1> 
 14337                              <1> 	; 28/02/2017
 14338                              <1> 	;cmp	byte [multi_tasking], 0  ; Musti tasking mode ?
 14339                              <1> 	;jna	short wswp
 14340 00010E6C 803D[2B950100]00    <1> 	cmp	byte [u.fpsave], 0 ; 28/02/2017
 14341 00010E73 7606                <1> 	jna	short wswp
 14342 00010E75 DD35[2C950100]      <1> 	fnsave	[u.fpregs] ; save floating point registers (94 bytes)
 14343                              <1> wswp:
 14344 00010E7B 8B3D[00950100]      <1> 	mov	edi, [u.upage] ; process's user (u) structure page addr
 14345 00010E81 B93D000000          <1> 	mov	ecx, (U_SIZE + 3) / 4
 14346 00010E86 BE[A4940100]        <1> 	mov	esi, user ; active user (u) structure
 14347 00010E8B F3A5                <1> 	rep	movsd
 14348                              <1> 	;
 14349 00010E8D 8B35[A8940100]      <1> 	mov	esi, [u.usp] ; esp (system stack pointer,
 14350                              <1> 			     ;      points to user registers)
 14351 00010E93 8B0D[A4940100]      <1> 	mov	ecx, [u.sp]  ; return address from the system call
 14352                              <1> 			     ; (for IRET)
 14353                              <1> 			     ; [u.sp] -> EIP (user)
 14354                              <1> 			     ; [u.sp+4]-> CS (user)
 14355                              <1> 			     ; [u.sp+8] -> EFLAGS (user)
 14356                              <1> 			     ; [u.sp+12] -> ESP (user)
 14357                              <1> 			     ; [u.sp+16] -> SS (user)
 14358 00010E99 29F1                <1> 	sub	ecx, esi     ; required space for user registers
 14359 00010E9B 83C114              <1> 	add	ecx, 20	     ; +5 dwords to return from system call
 14360                              <1> 			     ; (for IRET)
 14361 00010E9E C1E902              <1> 	shr	ecx, 2
 14362 00010EA1 F3A5                <1> 	rep	movsd
 14363 00010EA3 C3                  <1> 	retn
 14364                              <1> 
 14365                              <1> rswap:  ; < swap in, swap from disk >
 14366                              <1> 	; 28/02/2017 (frstor)
 14367                              <1> 	; 15/01/2017
 14368                              <1> 	; 14/01/2017
 14369                              <1> 	; 21/05/2016
 14370                              <1> 	; 03/05/2016
 14371                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 14372                              <1> 	; 09/05/2015 - 15/09/2015 (Retro UNIX 386 v1)
 14373                              <1> 	; 26/05/2013 - 08/03/2014 (Retro UNIX 8086 v1)
 14374                              <1> 	; 'rswap' reads a process whose number is in r1,
 14375                              <1> 	; from disk into core.
 14376                              <1> 	;
 14377                              <1> 	; Retro UNIX 386 v1 modification ->
 14378                              <1> 	;       User (u) structure content and the user's register content
 14379                              <1> 	;	will be restored from process's/user's UPAGE (a page for
 14380                              <1> 	;	saving 'u' structure and user registers for task switching).
 14381                              <1> 	;	u.usp - points to kernel stack address which contains
 14382                              <1> 	;		user's registers while entering system call.
 14383                              <1> 	;	u.sp  - points to kernel stack address 
 14384                              <1> 	;		to return from system call -for IRET-.
 14385                              <1> 	;	[u.usp]+32+16 = [u.sp] 
 14386                              <1> 	;	[u.usp] -> edi, esi, ebp, esp (= [u.usp]+32), ebx,
 14387                              <1> 	;		edx, ecx, eax, gs, fs, es, ds, -> [u.sp].
 14388                              <1> 	;
 14389                              <1> 	; RETRO UNIX 8086 v1 modification ->
 14390                              <1> 	;       'swap to disk' is replaced with 'change running segment'
 14391                              <1> 	;	according to 8086 cpu (x86 real mode) architecture.
 14392                              <1> 	;	pdp-11 was using 64KB uniform memory while IBM PC
 14393                              <1> 	;	compatibles was using 1MB segmented memory
 14394                              <1> 	;	in 8086/8088 times.
 14395                              <1> 	;
 14396                              <1> 	; INPUTS ->
 14397                              <1> 	;    r1 - process number of process to be read in
 14398                              <1> 	;    p.break - negative of word count of process
 14399                              <1> 	;    p.dska - disk address of the process
 14400                              <1> 	;    u.emt - determines handling of emt's
 14401                              <1> 	;    u.ilgins - determines handling of illegal instructions
 14402                              <1> 	; OUTPUTS ->
 14403                              <1> 	;    8 = (u.ilgins)
 14404                              <1> 	;    24 = (u.emt)
 14405                              <1> 	;    swp - bit 10 is set to indicate read 
 14406                              <1> 	;		(bit 15=0 when reading is done)
 14407                              <1> 	;    swp+2 - disk block address
 14408                              <1> 	;    swp+4 - negative word count
 14409                              <1> 	;      ((swp+6 - address of user structure))
 14410                              <1> 	;
 14411                              <1> 	; RETRO UNIX 8086 v1 input/output:
 14412                              <1> 	;
 14413                              <1> 	; INPUTS ->
 14414                              <1> 	;    AL	- new process number (to be swapped in)
 14415                              <1> 	; OUTPUTS ->
 14416                              <1> 	;    none
 14417                              <1> 	;
 14418                              <1> 	;   ((Modified registers: EAX, ECX, ESI, EDI, ESP))
 14419                              <1> 	;
 14420                              <1> 	; Retro UNIX 386 v1 - modification ! 14/05/2015
 14421 00010EA4 89C6                <1> 	mov	esi, eax  ; process's user (u) structure page addr
 14422 00010EA6 B93D000000          <1> 	mov	ecx, (U_SIZE + 3) / 4
 14423 00010EAB BF[A4940100]        <1> 	mov	edi, user ; active user (u) structure
 14424 00010EB0 F3A5                <1> 	rep	movsd
 14425 00010EB2 58                  <1> 	pop	eax	; 'rswap' return address
 14426                              <1> 	;
 14427                              <1> 	;cli
 14428 00010EB3 8B3D[A8940100]      <1> 	mov	edi, [u.usp] ; esp (system stack pointer,
 14429                              <1> 			     ;     points to user registers)
 14430 00010EB9 89FC                <1> 	mov	esp, edi     ; 14/01/2017
 14431 00010EBB 8B0D[A4940100]      <1> 	mov	ecx, [u.sp]  ; return address from the system call
 14432                              <1> 			     ; (for IRET)
 14433                              <1> 			     ; [u.sp] -> EIP (user)
 14434                              <1> 			     ; [u.sp+4]-> CS (user)
 14435                              <1> 			     ; [u.sp+8] -> EFLAGS (user)
 14436                              <1> 			     ; [u.sp+12] -> ESP (user)
 14437                              <1> 			     ; [u.sp+16] -> SS (user)
 14438 00010EC1 29F9                <1> 	sub	ecx, edi     ; required space for user registers
 14439 00010EC3 83C114              <1> 	add	ecx, 20	     ; +5 dwords to return from system call
 14440                              <1> 			     ; (for IRET)
 14441 00010EC6 C1E902              <1> 	shr	ecx, 2
 14442 00010EC9 F3A5                <1> 	rep	movsd
 14443                              <1> 	;mov	esp, [u.usp] ; 15/09/2015
 14444                              <1> 	;sti
 14445                              <1> 	; 28/02/2017
 14446                              <1> 	;cmp	byte [multi_tasking], 0  ; Multi tasking mode ?
 14447                              <1> 	;jna	short rswp_retn
 14448 00010ECB 803D[2B950100]00    <1> 	cmp	byte [u.fpsave], 0
 14449 00010ED2 7606                <1> 	jna	short rswp_retn
 14450 00010ED4 DD25[2C950100]      <1> 	frstor	[u.fpregs] ; restore floating point regs (94 bytes)
 14451                              <1> 			; 108 bytes (22/08/2024)	
 14452                              <1> rswp_retn:
 14453 00010EDA 50                  <1> 	push	eax	; 'rswap' return address
 14454 00010EDB C3                  <1> 	retn
 14455                              <1> 
 14456                              <1> putlu: 
 14457                              <1> 	; 20/05/2016
 14458                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 14459                              <1> 	; 10/05/2015 - 12/09/2015 (Retro UNIX 386 v1)
 14460                              <1> 	; 15/04/2013 - 23/02/2014 (Retro UNIX 8086 v1)
 14461                              <1> 	; 'putlu' is called with a process number in r1 and a pointer
 14462                              <1> 	; to lowest priority Q (runq+4) in r2. A link is created from
 14463                              <1> 	; the last process on the queue to process in r1 by putting
 14464                              <1> 	; the process number in r1 into the last process's link.
 14465                              <1> 	;
 14466                              <1> 	; INPUTS ->
 14467                              <1> 	;    r1 - user process number
 14468                              <1> 	;    r2 - points to lowest priority queue
 14469                              <1> 	;    p.dska - disk address of the process
 14470                              <1> 	;    u.emt - determines handling of emt's
 14471                              <1> 	;    u.ilgins - determines handling of illegal instructions
 14472                              <1> 	; OUTPUTS ->
 14473                              <1> 	;    r3 - process number of last process on the queue upon
 14474                              <1> 	;	  entering putlu
 14475                              <1> 	;    p.link-1 + r3 - process number in r1
 14476                              <1> 	;    r2 - points to lowest priority queue
 14477                              <1> 	;
 14478                              <1> 	; ((Modified registers: EDX, EBX))
 14479                              <1> 	;
 14480                              <1> 	; / r1 = user process no.; r2 points to lowest priority queue
 14481                              <1> 
 14482                              <1> 	; EBX = r2
 14483                              <1> 	; EAX = r1 (AL=r1b)
 14484                              <1> 
 14485                              <1> 	; 20/05/2016
 14486                              <1> 	; AL = process number (1 to 16) // Retro UNIX 8086, 386 v1 //
 14487                              <1> 	;     (max. 16 processes available for current kernel version)
 14488                              <1> 	; EBX = run queue address ; 20/05/2016 (TRDOS 386)
 14489                              <1> 		; which is one of following addresses:
 14490                              <1> 		;  1) 'runq_event' high priority run queue
 14491                              <1> 		;  2) 'runq_normal' normal/regular priority run queue
 14492                              <1> 		;  3) 'runq_background' low priority run queue
 14493                              <1> 
 14494                              <1> 	;mov	ebx, runq
 14495 00010EDC 0FB613              <1> 	movzx  	edx, byte [ebx]
 14496 00010EDF 43                  <1> 	inc	ebx
 14497 00010EE0 20D2                <1> 	and	dl, dl
 14498                              <1> 		; tstb (r2)+ / is queue empty?
 14499 00010EE2 740A                <1>        	jz	short putlu_1
 14500                              <1> 		; beq 1f / yes, branch
 14501 00010EE4 8A13                <1> 	mov 	dl, [ebx] ; 12/09/2015
 14502                              <1> 		; movb (r2),r3 / no, save the "last user" process number
 14503                              <1> 			     ; / in r3
 14504 00010EE6 8882[CF930100]      <1>        	mov	[edx+p.link-1], al
 14505                              <1> 		; movb r1,p.link-1(r3) / put pointer to user on
 14506                              <1> 			     ; / "last users" link
 14507 00010EEC EB03                <1> 	jmp	short putlu_2
 14508                              <1> 		; br 2f /
 14509                              <1> putlu_1: ; 1:
 14510 00010EEE 8843FF              <1> 	mov	[ebx-1], al
 14511                              <1>        		; movb r1,-1(r2) / user is only user; 
 14512                              <1> 			    ; / put process no. at beginning and at end
 14513                              <1> putlu_2: ; 2: 
 14514 00010EF1 8803                <1> 	mov	[ebx], al
 14515                              <1>        		; movb r1,(r2) / user process in r1 is now the last entry
 14516                              <1> 			     ; / on the queue
 14517 00010EF3 88C2                <1> 	mov	dl, al
 14518 00010EF5 88B2[CF930100]      <1>         mov     [edx+p.link-1], dh ; 0
 14519                              <1> 		; dec r2 / restore r2
 14520 00010EFB C3                  <1>         retn
 14521                              <1> 		; rts r0
 14522                              <1> 
 14523                              <1> sysver:
 14524                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 14525 00010EFC C705[AC940100]0002- <1> 	mov	dword [u.r0], 200h ; AH = major version, AL = minor version 
 14525 00010F04 0000                <1>
 14526 00010F06 E995BFFFFF          <1> 	jmp	sysret
 14527                              <1> 
 14528                              <1> syspri: ; change running priority (of the process)
 14529                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 14530                              <1> 	; 21/05/2016
 14531                              <1> 	; 20/05/2026 - TRDOS 386 (TRDOS v2.0)
 14532                              <1> 	; INPUT ->
 14533                              <1> 	;	BL = priority level
 14534                              <1> 	;	   0 = low running priority (running on background)
 14535                              <1> 	;	   1 = normal/regular priority (running as regular)
 14536                              <1> 	;	   2 = high/event priority (running for event)
 14537                              <1> 	;	   >2 = invalid, it will accepted as 2 (event)
 14538                              <1> 	;	   0FFh = get/return current running priority only
 14539                              <1> 	; OUTPUT ->
 14540                              <1> 	;	* if current [u.pri] < 2
 14541                              <1> 	;	  if BL input < 0FFh ->
 14542                              <1> 	;	     [u.pri] is updated as in BL input (0,1,2)
 14543                              <1> 	;	  if BL input = 0FFh -> AL = [u.pri] (current)
 14544                              <1> 	;
 14545                              <1> 	;	* if current [u.pri] = 2
 14546                              <1> 	;	  if BL input < 0FFh -> cf = 1 & AL = 2
 14547                              <1> 	;	  if BL input = 0FFh -> cf = 0 & AL = 2
 14548                              <1> 	;
 14549                              <1> 	;	NOTE:
 14550                              <1> 	;	If [u.pri] = 2, it can not be changed to 1 or 0;
 14551                              <1> 	;	because, run queue of the running process is unspecified
 14552                              <1> 	;	at this	stage. Process might be started by a timer event
 14553                              <1> 	;	or priority might be changed to high by previous
 14554                              <1> 	;	'syspri' system	call. In both cases, the process is in
 14555                              <1> 	;	'runq_normal' or 'runq_background' queue.
 14556                              <1> 	;	As result of this fact, when the [u.quant] time quantum
 14557                              <1> 	;	of the process is elapsed or 'sysrele' system call is
 14558                              <1> 	;	instructed by the process, 'tswap' ('tswitch') procedure
 14559                              <1> 	;	will be called (to 'swap' or 'switch' out the procedure)
 14560                              <1> 	;	and it will not call 'putlu' to add the (stopping)
 14561                              <1> 	;	process to relevant run queue when [u.pri] = 2.
 14562                              <1> 	;	(Otherwise, it would be possible to add process to
 14563                              <1> 	;	a run queue while it is already in a run queue, wrongly.)
 14564                              <1>   	;
 14565                              <1> 	;	If [u.pri]< 2, 'tswap/tswitch' procedure will call
 14566                              <1> 	;	'putlu' to add process to relevant run queue
 14567                              <1> 	;	according to [u.pri] value. ('runq_normal' for 1,
 14568                              <1> 	;	'runq_background' for 0).
 14569                              <1> 	;
 14570                              <1> 	;	If BL input >= 2 and < 0FFh while [u.pri] < 2,
 14571                              <1> 	;	process will be added to 'runq_normal' queue and
 14572                              <1> 	;	[u.pri] will be set to 2. (in 'syspri' system call)
 14573                              <1> 	;
 14574                              <1> 
 14575 00010F0B 29C0                <1> 	sub	eax, eax ; 0
 14576 00010F0D A3[18950100]        <1> 	mov	[u.error], eax
 14577                              <1> 
 14578 00010F12 A0[F6940100]        <1> 	mov	al, [u.pri]
 14579 00010F17 A3[AC940100]        <1> 	mov	[u.r0], eax
 14580                              <1> 
 14581 00010F1C FEC3                <1> 	inc	bl
 14582                              <1> 	;jz	sysret ; 0FFh -> 0, get priority level
 14583                              <1> 	; 23/07/2022
 14584 00010F1E 742C                <1> 	jz	short syspri_2	; jmp sysret
 14585                              <1> 
 14586 00010F20 3C02                <1> 	cmp	al, 2
 14587                              <1> 	;jnb	error ; CF = 1 & AL = 2 (& last error = 0)
 14588                              <1> 	; 23/07/2022
 14589 00010F22 7205                <1> 	jb	short syspri_0
 14590 00010F24 E957BFFFFF          <1> 	jmp	error
 14591                              <1> syspri_0:
 14592 00010F29 FECB                <1> 	dec	bl
 14593 00010F2B 80FB02              <1> 	cmp	bl, 2
 14594 00010F2E 7602                <1> 	jna	short syspri_1
 14595 00010F30 B302                <1> 	mov	bl, 2
 14596                              <1> syspri_1:
 14597 00010F32 881D[F6940100]      <1> 	mov	[u.pri], bl
 14598 00010F38 80FB02              <1> 	cmp	bl, 2
 14599                              <1> 	;jb	sysret
 14600                              <1> 	; 23/07/2022
 14601 00010F3B 720F                <1> 	jb	short syspri_2	; jmp sysret
 14602                              <1> 
 14603                              <1> 	; here...
 14604                              <1> 	; Priority of current process has been changed to high
 14605                              <1> 	; ('run for event') but current process will be added to
 14606                              <1> 	; 'run as normal' queue. ('run for event' high priority
 14607                              <1> 	; queue is under control of timer -& RTC- interrupt only!)
 14608                              <1> 	;
 14609                              <1> 	; (Otherwise, process can fall into black hole!
 14610                              <1> 	; e.g. if it is not in waiting list and it has not got
 14611                              <1> 	; a timer event and it is not in a run queue!
 14612                              <1> 	; Because, when [u.pri] is 2, 'tswap/tswitch' will not
 14613                              <1> 	; add the stopping process to a run queue.)
 14614                              <1> 
 14615 00010F3D A0[FD940100]        <1> 	mov	al, [u.uno]
 14616 00010F42 BB[9C940100]        <1> 	mov	ebx, runq_normal ; normal priority !
 14617                              <1> 				 ; [u.pri] is set to high
 14618                              <1> 				 ; but 'runq_event' queue is set
 14619                              <1> 				 ; only by the kernel's timer
 14620                              <1> 				 ; event function (timer interrupt). 
 14621 00010F47 E890FFFFFF          <1> 	call	putlu
 14622                              <1> syspri_2:
 14623 00010F4C E94FBFFFFF          <1> 	jmp	sysret
 14624                              <1> 
 14625                              <1> cpass: ; / get next character from user area of core and put it in AL (r1)
 14626                              <1> 	; 30/07/2022 - TRDOS 386 Kernel v2.0.5
 14627                              <1> 	; 02/05/2016 - TRDOS 386 (TRDOS v2.0)
 14628                              <1> 	; 19/05/2015 - 18/10/2015 (Retro UNIX 386 v1)
 14629                              <1> 	; 14/08/2013 - 20/09/2013 (Retro UNIX 8086 v1)
 14630                              <1> 	; INPUTS -> 
 14631                              <1> 	;     [u.base] = virtual address in user area
 14632                              <1> 	;     [u.count] = byte count (max.)
 14633                              <1> 	;     [u.pcount] = byte count in page (0 = reset)
 14634                              <1> 	; OUTPUTS -> 
 14635                              <1> 	;     AL = the character which is pointed by [u.base]
 14636                              <1> 	;     zf = 1 -> transfer count has been completed
 14637                              <1>         ;
 14638                              <1> 	; ((Modified registers: EAX, EDX, ECX))
 14639                              <1> 	
 14640                              <1> 	; 30/07/2022
 14641 00010F51 29C0                <1> 	sub	eax, eax
 14642                              <1> 	
 14643 00010F53 3905[D4940100]      <1> 	cmp	[u.count], eax ; 0
 14644                              <1> 	;cmp 	dword [u.count], 0  ; have all the characters been transferred
 14645                              <1> 			    	    ; i.e., u.count, # of chars. left
 14646 00010F59 763D                <1> 	jna	short cpass_3	    ; to be transferred = 0?) yes, branch
 14647 00010F5B FF0D[D4940100]      <1> 	dec	dword [u.count]	    ; no, decrement u.count
 14648                              <1>         ; 19/05/2015 
 14649                              <1> 	;(Retro UNIX 386 v1 - translation from user's virtual address
 14650                              <1> 	;		      to physical address
 14651                              <1> 	; 30/07/2022
 14652 00010F61 663905[10950100]    <1> 	cmp	[u.pcount], ax ; 0
 14653                              <1> 	;cmp	word [u.pcount], 0 ; byte count in page = 0 (initial value)
 14654                              <1> 			     ; 1-4095 --> use previous physical base address
 14655                              <1> 			     ; in [u.pbase]
 14656 00010F68 770D                <1> 	ja	short cpass_1
 14657                              <1> 	; 30/07/2022
 14658 00010F6A 3905[08950100]      <1> 	cmp	[u.ppgdir], eax ; 0
 14659                              <1> 	;cmp	dword [u.ppgdir], 0 ; is the caller os kernel
 14660 00010F70 7427                <1>         je      short cpass_k       ; (sysexec, '/etc/init') ?  (MainProg)
 14661 00010F72 E861FDFFFF          <1> 	call	trans_addr_r
 14662                              <1> cpass_1:
 14663 00010F77 66FF0D[10950100]    <1> 	dec	word [u.pcount]
 14664                              <1> cpass_2: 
 14665 00010F7E 8B15[0C950100]      <1> 	mov	edx, [u.pbase]
 14666 00010F84 8A02                <1> 	mov	al, [edx]	; take the character pointed to
 14667                              <1> 				; by u.base and put it in r1
 14668 00010F86 FF05[D8940100]      <1> 	inc	dword [u.nread] ; increment no. of bytes transferred
 14669 00010F8C FF05[D0940100]      <1> 	inc	dword [u.base]  ; increment the buffer address to point to the
 14670                              <1> 			        ; next byte
 14671 00010F92 FF05[0C950100]      <1> 	inc	dword [u.pbase]
 14672                              <1> cpass_3:
 14673 00010F98 C3                  <1> 	retn
 14674                              <1> cpass_k:
 14675                              <1> 	; 02/07/2015
 14676                              <1> 	; The caller is os kernel
 14677                              <1> 	; (get sysexec arguments from kernel's memory space)
 14678 00010F99 8B1D[D0940100]      <1> 	mov	ebx, [u.base]
 14679 00010F9F 66C705[10950100]00- <1>         mov     word [u.pcount], PAGE_SIZE ; 4096
 14679 00010FA7 10                  <1>
 14680 00010FA8 891D[0C950100]      <1> 	mov	[u.pbase], ebx
 14681 00010FAE EBCE                <1> 	jmp	short cpass_2
 14682                              <1> 
 14683                              <1> transfer_to_user_buffer: ; fast transfer
 14684                              <1> 	; 27/05/2016
 14685                              <1> 	; 16/05/2016 - TRDOS 386 (TRDOS v2.0)
 14686                              <1> 	;
 14687                              <1> 	; INPUT ->
 14688                              <1> 	;	ESI = source address in system space
 14689                              <1> 	;	EDI = user's buffer address
 14690                              <1> 	;	ECX = transfer (byte) count
 14691                              <1> 	;	[u.pgdir] = user's page directory
 14692                              <1> 	; OUTPUT ->
 14693                              <1> 	;	ECX = actual transfer count
 14694                              <1> 	;	cf = 1 -> error
 14695                              <1> 	;	[u.count] = remain byte count
 14696                              <1> 	;
 14697                              <1> 	; Modified registers: eax, ecx
 14698                              <1> 	;
 14699                              <1> 
 14700 00010FB0 21C9                <1> 	and	ecx, ecx
 14701 00010FB2 743B                <1> 	jz	short ttub_4
 14702                              <1> 
 14703 00010FB4 890D[D4940100]      <1> 	mov	[u.count], ecx
 14704                              <1> 	
 14705 00010FBA 57                  <1> 	push	edi
 14706 00010FBB 56                  <1> 	push	esi
 14707 00010FBC 53                  <1> 	push	ebx
 14708 00010FBD 52                  <1> 	push	edx
 14709 00010FBE 51                  <1> 	push	ecx
 14710                              <1> 
 14711 00010FBF 89FB                <1> 	mov	ebx, edi
 14712 00010FC1 81C300004000        <1> 	add	ebx, CORE ; 27/05/2016
 14713                              <1> ttub_1:
 14714                              <1> 	; ebx = virtual (linear) address
 14715                              <1> 	; [u.pgdir] = user's page directory
 14716 00010FC7 E8F84BFFFF          <1>        	call	get_physical_addr_x ; get physical address
 14717 00010FCC 7222                <1> 	jc	short ttub_5
 14718                              <1> 	; eax = physical address 
 14719                              <1> 	; ecx = remain byte count in page (1-4096)
 14720 00010FCE 89C7                <1> 	mov	edi, eax
 14721 00010FD0 A1[D4940100]        <1> 	mov	eax, [u.count]
 14722 00010FD5 39C1                <1> 	cmp	ecx, eax
 14723 00010FD7 7602                <1> 	jna	short ttub_2
 14724 00010FD9 89C1                <1> 	mov	ecx, eax
 14725                              <1> ttub_2:	
 14726 00010FDB 29C8                <1> 	sub	eax, ecx
 14727 00010FDD 01CB                <1> 	add	ebx, ecx
 14728 00010FDF F3A4                <1> 	rep	movsb
 14729 00010FE1 A3[D4940100]        <1> 	mov	[u.count], eax
 14730 00010FE6 09C0                <1> 	or	eax, eax
 14731 00010FE8 75DD                <1> 	jnz	short ttub_1
 14732                              <1> ttub_retn:
 14733                              <1> tfub_retn:
 14734 00010FEA 59                  <1> 	pop	ecx ; transfer count = actual transfer count
 14735                              <1> ttub_3:
 14736 00010FEB 5A                  <1> 	pop	edx
 14737 00010FEC 5B                  <1> 	pop	ebx
 14738 00010FED 5E                  <1> 	pop	esi
 14739 00010FEE 5F                  <1> 	pop	edi
 14740                              <1> ttub_4:
 14741 00010FEF C3                  <1> 	retn
 14742                              <1> ttub_5:
 14743 00010FF0 59                  <1> 	pop	ecx
 14744 00010FF1 2B0D[D4940100]      <1> 	sub	ecx, [u.count] ; actual transfer count
 14745 00010FF7 F9                  <1> 	stc
 14746 00010FF8 EBF1                <1> 	jmp	short ttub_3
 14747                              <1> 
 14748                              <1> transfer_from_user_buffer: ; fast transfer
 14749                              <1> 	; 27/05/2016
 14750                              <1> 	; 16/05/2016 - TRDOS 386 (TRDOS v2.0)
 14751                              <1> 	;
 14752                              <1> 	; INPUT ->
 14753                              <1> 	;	ESI = user's buffer address
 14754                              <1> 	;	EDI = destination address in system space
 14755                              <1> 	;	ECX = transfer (byte) count
 14756                              <1> 	;	[u.pgdir] = user's page directory
 14757                              <1> 	; OUTPUT ->
 14758                              <1> 	;	ecx = actual transfer count
 14759                              <1> 	;	cf = 1 -> error
 14760                              <1> 	;	[u.count] = remain byte count
 14761                              <1> 	;
 14762                              <1> 	; Modified registers: eax, ecx
 14763                              <1> 	;
 14764                              <1> 
 14765 00010FFA 21C9                <1> 	and	ecx, ecx
 14766                              <1> 	;jz	short tfub_4
 14767 00010FFC 74F1                <1> 	jz	short ttub_4
 14768                              <1> 
 14769 00010FFE 890D[D4940100]      <1> 	mov	[u.count], ecx
 14770                              <1> 
 14771 00011004 57                  <1> 	push	edi
 14772 00011005 56                  <1> 	push	esi
 14773 00011006 53                  <1> 	push	ebx
 14774 00011007 52                  <1> 	push	edx
 14775 00011008 51                  <1> 	push	ecx
 14776                              <1> 
 14777 00011009 89F3                <1> 	mov	ebx, esi
 14778 0001100B 81C300004000        <1> 	add	ebx, CORE ; 27/05/2016
 14779                              <1> tfub_1:
 14780                              <1> 	; ebx = virtual (linear) address
 14781                              <1> 	; [u.pgdir] = user's page directory
 14782 00011011 E8AE4BFFFF          <1>        	call	get_physical_addr_x ; get physical address
 14783                              <1> 	;jc	short tfub_5
 14784 00011016 72D8                <1> 	jc	short ttub_5
 14785                              <1> 	; eax = physical address 
 14786                              <1> 	; ecx = remain byte count in page (1-4096)
 14787 00011018 89C6                <1> 	mov	esi, eax
 14788 0001101A A1[D4940100]        <1> 	mov	eax, [u.count]
 14789 0001101F 39C1                <1> 	cmp	ecx, eax
 14790 00011021 7602                <1> 	jna	short tfub_2
 14791 00011023 89C1                <1> 	mov	ecx, eax
 14792                              <1> tfub_2:	
 14793 00011025 29C8                <1> 	sub	eax, ecx
 14794 00011027 01CB                <1> 	add	ebx, ecx
 14795 00011029 F3A4                <1> 	rep	movsb
 14796 0001102B A3[D4940100]        <1> 	mov	[u.count], eax
 14797 00011030 09C0                <1> 	or	eax, eax
 14798 00011032 75DD                <1> 	jnz	short tfub_1
 14799                              <1> 
 14800 00011034 EBB4                <1> 	jmp	short tfub_retn
 14801                              <1> 
 14802                              <1> ;tfub_retn:
 14803                              <1> ;	pop	ecx ; transfer count = actual transfer count
 14804                              <1> ;tfub_3:
 14805                              <1> ;	pop	edx
 14806                              <1> ;	pop	ebx
 14807                              <1> ;	pop	esi
 14808                              <1> ;	pop	edi
 14809                              <1> ;tfub_4:
 14810                              <1> ;	retn
 14811                              <1> ;tfub_5:
 14812                              <1> ;	pop	ecx
 14813                              <1> ;	sub	ecx, [u.count] ; actual transfer count
 14814                              <1> ;	stc
 14815                              <1> ;	jmp	short tfub_3
 14816                              <1> 
 14817                              <1> sysfff: ; <Find First File>
 14818                              <1> 	; 25/08/2024 (TRDOS 386 Kernel v2.0.9)
 14819                              <1> 	; 08/08/2022
 14820                              <1> 	; 30/07/2022 (TRDOS 386 Kernel v2.0.5)
 14821                              <1> 	; 17/10/2016
 14822                              <1> 	; 16/10/2016
 14823                              <1> 	; 15/10/2016 TRDOS 386 (TRDOS v2.0) feature only !
 14824                              <1> 	;           -derived from TRDOS v1.0, INT_21H.ASM-
 14825                              <1> 	;            ("loc_INT21h_find_first_file")
 14826                              <1> 	; TRDOS 8086 (v1.0)
 14827                              <1>         ; 	07/08/2011 
 14828                              <1>         ;	Find First File
 14829                              <1> 	;	INPUT:
 14830                              <1>         ;	    CX= Attributes
 14831                              <1>         ;	    DS:DX= Pointer to filename
 14832                              <1> 	;	MSDOS OUTPUT:
 14833                              <1> 	;	    DTA: (Default address: PSP offset 80h)
 14834                              <1> 	;	    Offset  Descrription
 14835                              <1> 	;	    0	    Reserved for use find next file
 14836                              <1> 	;	    21	    Attribute of file found
 14837                              <1> 	;	    22	    Time stamp of file
 14838                              <1> 	;	    24	    Date stamp of file
 14839                              <1> 	;	    26	    File size in bytes
 14840                              <1> 	;	    30	    Filename and extension (zero terminated)
 14841                              <1> 	;	If cf = 1:
 14842                              <1> 	;	    Error Codes: (in AX)
 14843                              <1> 	;	    	2 - File not found
 14844                              <1> 	;	       18 - No more files
 14845                              <1>         ;
 14846                              <1> 	; TRDOS 386 (v2.0) 
 14847                              <1> 	; 15/10/2016
 14848                              <1> 	;	
 14849                              <1>         ; INPUT ->
 14850                              <1>         ;	   CL = File attributes
 14851                              <1> 	;     	      bit 0 (1) - Read only file (R)
 14852                              <1> 	;             bit 1 (1) - Hidden file (H)
 14853                              <1>         ;             bit 2 (1) - System file (R)
 14854                              <1> 	;             bit 3 (1) - Volume label/name (V)
 14855                              <1>         ;             bit 4 (1) - Subdirectory (D)
 14856                              <1> 	;	      bit 5 (1) - File has been archived (A)
 14857                              <1> 	;	   CH = 0 -> Return basic parameters (24 bytes)
 14858                              <1> 	;	   CH > 0 -> Return FindFile structure/table (128 bytes)
 14859                              <1>         ;          EBX = Pointer to filename (ASCIIZ) -path-
 14860                              <1> 	;	   EDX = File parameters buffer address
 14861                              <1> 	;		(buffer size = 24 bytes if CH input = 0)
 14862                              <1> 	;		(buffer size = 128 bytes if CH input > 0)
 14863                              <1> 	;
 14864                              <1> 	; OUTPUT ->
 14865                              <1> 	;	   EAX = 0 if CH input > 0
 14866                              <1> 	;	   EAX = First cluster number of file if CH input = 0
 14867                              <1> 	;	   EDX = File parameters table/structure address
 14868                              <1> 	;	   Basic Parameters:
 14869                              <1> 	;		Offset  Description
 14870                              <1> 	;		------	---------------
 14871                              <1> 	;		0	File Attributes
 14872                              <1> 	;		1	Ambiguous filename chars are used sign
 14873                              <1> 	;			(0 = filename fits exactly with request)
 14874                              <1> 	;			(>0 = ambiguous filename chars are used)
 14875                              <1> 	;	      	2	Time stamp of file
 14876                              <1> 	;		4	Date stamp of file
 14877                              <1> 	;		6	File size in bytes
 14878                              <1> 	;		10	Short Filename (ASCIIZ, max. 13 bytes)
 14879                              <1> 	;		23	Longname Length (1-255) if existing
 14880                              <1> 	;
 14881                              <1> 	;          cf = 1 -> Error code in AL
 14882                              <1> 	;
 14883                              <1> 	; Modified Registers: EAX (at the return of system call)
 14884                              <1> 	;  
 14885                              <1> 	; TR-DOS FindFile (FFF) Structure (128 bytes):
 14886                              <1> 	; 09/10/2011 (DIR.ASM) - 10/02/2016 (trdoskx.s)
 14887                              <1> 	;
 14888                              <1> 	; Offset	Parameter		Size
 14889                              <1> 	; ------	------------------	--------
 14890                              <1> 	; 0		FindFile_Drv		1 byte
 14891                              <1> 	; 1		FindFile_Directory	65 bytes
 14892                              <1> 	; 66		FindFile_Name		13 bytes
 14893                              <1> 	; 79		FindFile_LongNameEntryLength 1 byte
 14894                              <1> 	;Above 80 bytes form
 14895                              <1> 	;TR-DOS Source/Destination File FullName Format/Structure
 14896                              <1> 	; 80		FindFile_AttributesMask 1 word
 14897                              <1> 	; 82		FindFile_DirEntry	32 bytes (*)
 14898                              <1> 	; 114		FindFile_DirFirstCluster 1 double word
 14899                              <1> 	; 118		FindFile_DirCluster	1 double word
 14900                              <1> 	; 122		FindFile_DirEntryNumber 1 word
 14901                              <1> 	; 124		FindFile_MatchCounter	1 word
 14902                              <1> 	; 126		FindFile_Reserved	1 word
 14903                              <1>    	; (*) MS-DOS, FAT 12-16-32 classic directory entry (32 bytes)
 14904                              <1> 
 14905                              <1> 	;mov	[u.namep], ebx
 14906                              <1> 	; 16/10/2016
 14907 00011036 8915[AC890100]      <1> 	mov	[FFF_UBuffer], edx
 14908 0001103C 66890D[B1890100]    <1> 	mov	[FFF_Attrib], cx ; [FFF_RType] = ch
 14909                              <1> 		    ; Attributes in CL, return data type in CH
 14910 00011043 89DE                <1> 	mov	esi, ebx
 14911                              <1> 	; file name is forced, change directory as temporary
 14912                              <1> 	;mov	ax, 1
 14913                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset ; 17/10/2016
 14914                              <1> 	;call	set_working_path
 14915 00011045 E8CC120000          <1> 	call	set_working_path_x ; 17/10/2016
 14916 0001104A 731D                <1> 	jnc	short sysfff_0
 14917                              <1> 
 14918 0001104C 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!
 14919 0001104E 7505                <1> 	jnz	short sysfff_err
 14920                              <1> 
 14921                              <1> 	; eax = 0
 14922 00011050 B80C000000          <1> 	mov	eax, ERR_DIR_NOT_FOUND ; Directory not found !
 14923                              <1> sysfff_err:
 14924 00011055 A3[AC940100]        <1> 	mov	[u.r0], eax
 14925 0001105A A3[18950100]        <1> 	mov	[u.error], eax
 14926 0001105F E887130000          <1>         call 	reset_working_path
 14927 00011064 E917BEFFFF          <1> 	jmp	error
 14928                              <1> 
 14929                              <1> sysfff_0:
 14930                              <1> 	;;;
 14931                              <1> 	; 25/08/2024 (bugfix)
 14932                              <1> 	;mov	al, [esp] ; ???
 14933 00011069 A0[B1890100]        <1> 	mov	al, [FFF_Attrib]
 14934                              <1> 	;;;
 14935 0001106E 08C0                <1> 	or	al, al
 14936 00011070 7412                <1> 	jz	short sysfff_2
 14937 00011072 B410                <1> 	mov	ah, 10h
 14938 00011074 A808                <1> 	test	al, 08h
 14939 00011076 7503                <1> 	jnz	short sysfff_1
 14940 00011078 80CC08              <1> 	or	ah, 08h
 14941                              <1> sysfff_1:
 14942 0001107B 2410                <1> 	and	al, 10h ; Directory
 14943 0001107D 7405                <1> 	jz	short sysfff_2
 14944 0001107F 80E408              <1> 	and	ah, 08h
 14945 00011082 30C0                <1> 	xor	al, al ; When a directory is searched,
 14946                              <1> 		       ; filename will be returned even if
 14947                              <1> 		       ; it is not a directory!
 14948                              <1> 		       ; Because: (in order to prevent
 14949                              <1> 		       ; creating a dir with existing file name)
 14950                              <1> 		       ; Dir and file names must not be same!
 14951                              <1> 		       ; (return attribute must be checked)
 14952                              <1> sysfff_2:
 14953                              <1> 	; AX = Attributes mask
 14954                              <1> 		; AL = AND mask (result must be equal to AL)
 14955                              <1> 		; AH = Negative AND mask (result must be ZERO)
 14956                              <1>  	; ESI = FindFile_Name address
 14957                              <1> 
 14958 00011084 E8E17AFFFF          <1> 	call	find_first_file
 14959 00011089 72CA                <1> 	jc	short sysfff_err ; eax = 2 (File not found !)
 14960                              <1> 
 14961                              <1> 	; ESI = Directory Entry (FindFile_DirEntry) Location
 14962                              <1> 	; EDI = Directory Buffer Directory Entry Location
 14963                              <1> 	; EAX = File Size
 14964                              <1> 	;  BL = Attributes of The File/Directory
 14965                              <1> 	;  BH = Long Name Yes/No Status (>0 is YES)
 14966                              <1> 	;  DX > 0 : Ambiguous filename chars are used
 14967                              <1> 
 14968                              <1> sysfff_3:
 14969                              <1> 	; 16/10/2016
 14970 0001108B 668B0D[B1890100]    <1> 	mov	cx, [FFF_Attrib]
 14971                              <1> 	; Attribs in CL, return data type in CH
 14972                              <1> 
 14973                              <1> 	;or	cl, cl
 14974                              <1> 	;jz	short sysfff_4 ; 0 = No filter
 14975 00011092 80F1FF              <1> 	xor	cl, 0FFh
 14976                              <1> 	; cl = negative attributes ; 25/08/2024
 14977 00011095 20D9                <1> 	and	cl, bl
 14978 00011097 7409                <1> 	jz	short sysfff_4
 14979                              <1> 
 14980                              <1> 	;mov	eax, 2 ; 'file not found !' error
 14981                              <1> 	;jmp	short sysfff_err_1
 14982                              <1> 
 14983                              <1> 	; 16/10/2016
 14984 00011099 E8797BFFFF          <1> 	call	find_next_file
 14985 0001109E 72B5                <1> 	jc	short sysfff_err ; eax = 12 (no more files !)
 14986 000110A0 EBE9                <1> 	jmp	short sysfff_3
 14987                              <1> 
 14988                              <1> sysfff_4:
 14989 000110A2 20ED                <1> 	and	ch, ch ; [FFF_RType]
 14990                              <1> 	;jz	short sysfff_5
 14991                              <1> 	; 25/08/2024
 14992 000110A4 755A                <1> 	jnz	short sysfff_7
 14993                              <1> 
 14994                              <1> 	;mov	ecx, 128 ; ; transfer length
 14995                              <1> 	; 30/07/2022
 14996                              <1> 	;sub	ecx, ecx
 14997                              <1> 	;mov	cl, 128
 14998                              <1> 	;mov	[FFF_Valid], cl
 14999                              <1> 	; 25/08/2024
 15000                              <1> 	;mov	byte [FFF_Valid], 128 ; (*)
 15001                              <1> 	;jmp	short sysfff_7 ; sysfnf_11
 15002                              <1> 
 15003                              <1> sysfff_5:
 15004                              <1> 	;;mov	esi, FindFile_DirEntry
 15005                              <1> 	;mov	ecx, 24  ; transfer length
 15006                              <1> 	; 30/07/2022
 15007                              <1> 	;sub	ecx, ecx
 15008                              <1> 	;mov	cl, 24
 15009                              <1> 	;mov	[FFF_Valid], cl
 15010 000110A6 C605[B0890100]18    <1> 	mov	byte [FFF_Valid], 24 ; (*)
 15011                              <1> sysfnf_12:
 15012 000110AD BF[7C8E0100]        <1> 	mov	edi, DTA ; FFF data transfer address
 15013                              <1> 	;mov	al, [esi+DirEntry_Attr] ; 11
 15014 000110B2 88D8                <1> 	mov	al, bl ; File/Dir Attributes
 15015 000110B4 887F17              <1> 	mov	[edi+23], bh ; Longname length (0= none)
 15016 000110B7 AA                  <1> 	stosb
 15017 000110B8 88D0                <1> 	mov	al, dl ; DL is for '?'
 15018 000110BA 00F0                <1> 	add	al, dh ; DH is for '*'
 15019                              <1> 	; AL > 0 if ambiguous file name wildcards are used
 15020 000110BC AA                  <1> 	stosb
 15021 000110BD 8B4616              <1> 	mov	eax, [esi+DirEntry_WrtTime] ; 22
 15022 000110C0 AB                  <1>         stosd	; DirEntry_WrtTime & DirEntry_WrtDate
 15023 000110C1 8B461C              <1>         mov	eax, [esi+DirEntry_FileSize] ; 28
 15024 000110C4 AB                  <1>         stosd
 15025 000110C5 668B4614            <1> 	mov	ax, [esi+DirEntry_FstClusHI] ; 20
 15026                              <1> 	;shl	ax, 16
 15027                              <1> 	; 23/07/2022 (BugFix)
 15028 000110C9 C1E010              <1> 	shl	eax, 16 
 15029 000110CC 668B461A            <1> 	mov	ax, [esi+DirEntry_FstClusLO] ; 26
 15030 000110D0 A3[AC940100]        <1> 	mov	[u.r0], eax ; First Cluster
 15031                              <1> 
 15032                              <1>         ;mov	esi, FindFile_DirEntry
 15033 000110D5 E84E130000          <1> 	call	get_file_name
 15034                              <1> 	
 15035                              <1> 	; 25/08/2024
 15036                              <1> 	; ecx <= 7 (from 'get_file_name')
 15037                              <1> 	;mov	cl, [FFF_Valid] ; (*)
 15038 000110DA BE[7C8E0100]        <1>        	mov	esi, DTA ; FFF data transfer address
 15039                              <1> 
 15040                              <1> sysfff_6:
 15041                              <1> 	; 25/08/2024
 15042                              <1> 	;sub	ecx, ecx
 15043 000110DF 8A0D[B0890100]      <1> 	mov	cl, [FFF_Valid] ; (*) ecx <= 128
 15044                              <1> 
 15045 000110E5 8B3D[AC890100]      <1> 	mov	edi, [FFF_UBuffer] ; user's buffer address (edx)
 15046 000110EB E8C0FEFFFF          <1> 	call	transfer_to_user_buffer
 15047                              <1> 
 15048 000110F0 890D[AC940100]      <1> 	mov	[u.r0], ecx ; actual transfer count
 15049 000110F6 E8F0120000          <1>         call 	reset_working_path
 15050 000110FB E9A0BDFFFF          <1> 	jmp	sysret
 15051                              <1> 
 15052                              <1> sysfff_7:
 15053                              <1> 	; 25/08/2024
 15054 00011100 C605[B0890100]80    <1> 	mov	byte [FFF_Valid], 128 ; (*)
 15055                              <1> sysfnf_11:
 15056                              <1> 	; ecx = 128
 15057                              <1> 	; 25/08/2024 (bugfix)
 15058                              <1> 	; 08/08/2022
 15059 00011107 BE[52860100]        <1> 	mov	esi, FindFile_Drv
 15060                              <1> 	; 25/08/2024
 15061 0001110C 29C9                <1> 	sub	ecx, ecx ; 0
 15062 0001110E EBCF                <1> 	jmp	short sysfff_6
 15063                              <1> 
 15064                              <1> sysfnf: ; <Find Next File>
 15065                              <1> 	; 25/08/2024 (TRDOS 386 Kernel v2.0.9)
 15066                              <1> 	; 29/08/2023 (TRDOS 386 Kernel v2.0.6)
 15067                              <1> 	; 08/08/2022
 15068                              <1> 	; 30/07/2022 (TRDOS 386 Kernel v2.0.5)
 15069                              <1> 	; 16/10/2016 TRDOS 386 (TRDOS v2.0) feature only !
 15070                              <1> 	;           -derived from TRDOS v1.0, INT_21H.ASM-
 15071                              <1> 	;            ("loc_INT21h_find_next_file")
 15072                              <1> 	; TRDOS 8086 (v1.0)
 15073                              <1>         ; 	07/08/2011 
 15074                              <1>         ;	Find First File
 15075                              <1> 	;	INPUT:
 15076                              <1>         ;	    none
 15077                              <1> 	;	MSDOS OUTPUT:
 15078                              <1> 	;	    DTA: (Default address: PSP offset 80h)
 15079                              <1> 	;	    Offset  Descrription
 15080                              <1> 	;	    0	    Reserved for use find next file
 15081                              <1> 	;	    21	    Attribute of file found
 15082                              <1> 	;	    22	    Time stamp of file
 15083                              <1> 	;	    24	    Date stamp of file
 15084                              <1> 	;	    26	    File size in bytes
 15085                              <1> 	;	    30	    Filename and extension (zero terminated)
 15086                              <1> 	;	If cf = 1:
 15087                              <1> 	;	    Error Codes: (in AX)
 15088                              <1> 	;	       18 - No more files
 15089                              <1>         ;
 15090                              <1> 	; TRDOS 386 (v2.0) 
 15091                              <1> 	; 16/10/2016
 15092                              <1> 	;
 15093                              <1>         ; INPUT ->
 15094                              <1>        	; 	   none
 15095                              <1> 	; OUTPUT ->
 15096                              <1> 	;	   EAX = 0 if CH input of 'Find First File' > 0
 15097                              <1> 	;	   EAX = First cluster number of file
 15098                              <1> 	;		 if CH input of 'Find First File' = 0
 15099                              <1> 	;	   EDX = File parameters table/structure address
 15100                              <1> 	;
 15101                              <1> 	;          cf = 1 -> Error code in AL
 15102                              <1> 	;
 15103                              <1>  	; Modified Registers: EAX (at the return of system call)
 15104                              <1> 
 15105                              <1> 	; Note: If byte [FFF_Valid] = 0
 15106                              <1> 	;	'sysfnf' will return with 'no more files' error.
 15107                              <1> 	;	If byte [FFF_Valid] = 24
 15108                              <1> 	;	'sysfnf' will return with 24 bytes basic parameters
 15109                              <1> 	;	at the address which is in EDX.
 15110                              <1> 	;	If byte [FFF_Valid] = 128
 15111                              <1> 	;	'sysfnf' will return with 128 bytes Find File
 15112                              <1> 	;	Structure/Table at the address which is in EDX.
 15113                              <1> 
 15114 00011110 803D[B0890100]00    <1> 	cmp	byte [FFF_Valid], 0
 15115 00011117 7713                <1> 	ja	short stsfnf_0
 15116                              <1>  	; 'no more files !' error
 15117                              <1> 	;mov	eax, ERR_NO_MORE_FILES ; 12
 15118                              <1> 	; 30/07/2022
 15119 00011119 29C0                <1> 	sub	eax, eax
 15120 0001111B B00C                <1> 	mov	al, ERR_NO_MORE_FILES ; 12
 15121 0001111D A3[AC940100]        <1> 	mov	[u.r0], eax
 15122 00011122 A3[18950100]        <1> 	mov	[u.error], eax
 15123 00011127 E954BDFFFF          <1> 	jmp	error
 15124                              <1> 
 15125                              <1> stsfnf_0:
 15126                              <1> 	;cmp	byte [FFF_Valid], 128
 15127                              <1> 	;je	short stsfnf_1
 15128                              <1> 	;cmp	byte [FFF_Valid], 24
 15129                              <1> 	;je	short stsfnf_1
 15130                              <1> 	;mov	[FFF_Valid], 24 ; Default
 15131                              <1> stsfnf_1:
 15132 0001112C 0FB61D[B27D0100]    <1> 	movzx	ebx, byte [Current_Drv]
 15133 00011133 66891D[B6890100]    <1> 	mov	[SWP_DRV], bx
 15134 0001113A 8A15[52860100]      <1> 	mov	dl, [FindFile_Drv]
 15135 00011140 38DA                <1> 	cmp	dl, bl
 15136 00011142 7532                <1> 	jne	short stsfnf_2
 15137 00011144 86FB                <1> 	xchg	bh, bl
 15138 00011146 BE00010900          <1> 	mov	esi, Logical_DOSDisks
 15139 0001114B 01DE                <1> 	add	esi, ebx
 15140 0001114D EB34                <1> 	jmp	short sysfnf_3
 15141                              <1> 
 15142                              <1> sysfnf_8:
 15143 0001114F E8D4B3FFFF          <1> 	call	load_FAT_sub_directory
 15144 00011154 7272                <1> 	jc	short sysfnf_err_1 ; read error (no FNF stop)
 15145                              <1> 
 15146                              <1> sysfnf_9:
 15147 00011156 E8BC7AFFFF          <1> 	call	find_next_file
 15148 0001115B 7260                <1> 	jc	short sysfnf_5
 15149                              <1> 	; 25/08/2024
 15150                              <1> 	; esi = Directory Entry (FindFile_DirEntry) Location
 15151                              <1> 	;; 08/08/2022
 15152                              <1> 	;; esi = FindFile_Drv ; wrong ! ; 25/08/2024
 15153                              <1> 
 15154 0001115D A0[B1890100]        <1> 	mov	al, [FFF_Attrib]
 15155                              <1> 	;or	al, al
 15156                              <1> 	;jz	short sysfnf_10 ; 0 = No filter
 15157 00011162 34FF                <1> 	xor	al, 0FFh
 15158 00011164 20D8                <1> 	and	al, bl
 15159 00011166 75EE                <1> 	jnz	short sysfnf_9 ; search for next file until
 15160                              <1> 			       ; an error return from
 15161                              <1> 			       ; find_next_file procedure
 15162                              <1> sysfnf_10:
 15163                              <1>         ;movzx	ecx, byte [FFF_Valid]
 15164                              <1> 	;cmp	cl, 128 ; complete FindFile structure/table
 15165                              <1> 	;je	sysfnf_11
 15166                              <1> 	;;cmp	cl, 24  ; basic parameters
 15167                              <1> 	;;je	sysfnf_12
 15168                              <1> 	;jmp	sysfnf_12
 15169                              <1> 	; 30/07/2022
 15170                              <1> 	;movzx	ecx, byte [FFF_Valid]
 15171                              <1> 	; 25/08/2024
 15172                              <1> 	;cmp	cl, 128
 15173 00011168 803D[B0890100]80    <1> 	cmp	byte [FFF_Valid], 128 
 15174                              <1> 	;jne	short sysfnf_12
 15175                              <1> 	;jmp	short sysfnf_11 (*)
 15176                              <1> 	;; 08/08/2022
 15177                              <1> 	;;je	short sysfnf_6 ; esi = FindFile_Drv
 15178                              <1> 	; 29/08/2023 (BugFix)
 15179                              <1> 	;je	short sysfff_6 ; esi = FindFile_Drv
 15180                              <1> 	; 25/08/2024 (BugFix of BugFix) (*)
 15181 0001116F 7496                <1> 	je	short sysfnf_11 ; esi <> FindFile_Drv
 15182                              <1> 	
 15183 00011171 E937FFFFFF          <1> 	jmp	sysfnf_12
 15184                              <1> 
 15185                              <1> stsfnf_2:
 15186 00011176 FE05[B7890100]      <1> 	inc	byte [SWP_DRV_chg]
 15187                              <1> 
 15188 0001117C E8FC66FFFF          <1> 	call	change_current_drive
 15189 00011181 7245                <1> 	jc	short sysfnf_err_1 ; read error ! 
 15190                              <1> 				   ; (do not stop, because
 15191                              <1> 				   ; we don't have a
 15192                              <1> 				   ; 'no more files'
 15193                              <1> 				   ; -file not found- error,
 15194                              <1> 				   ; next sysfnf system call
 15195                              <1> 				   ; may solve the problem,
 15196                              <1> 				   ; after re-placing the disk)
 15197                              <1> sysfnf_3:
 15198 00011183 A1[C8860100]        <1> 	mov	eax, [FindFile_DirCluster]
 15199 00011188 21C0                <1> 	and	eax, eax
 15200 0001118A 7550                <1> 	jnz	short sysfnf_6
 15201                              <1>         
 15202 0001118C 803D[B17D0100]02    <1> 	cmp	byte [Current_FATType], 2
 15203 00011193 772C                <1> 	ja	short sysfnf_err_0 ; invalid, we neeed to stop !?
 15204 00011195 803D[B17D0100]01    <1> 	cmp	byte [Current_FATType], 1
 15205 0001119C 7223                <1> 	jb	short sysfnf_err_0 ; invalid, we neeed to stop !?
 15206                              <1> 
 15207 0001119E 3805[D9840100]      <1> 	cmp	byte [DirBuff_ValidData], al ; 0
 15208 000111A4 7608                <1> 	jna	short sysfnf_4 
 15209                              <1> 
 15210 000111A6 3B05[DE840100]      <1> 	cmp	eax, [DirBuff_Cluster] ; 0 ?
 15211 000111AC 74A8                <1> 	je	short sysfnf_9
 15212                              <1> 
 15213                              <1> 	;cmp	byte [Current_Dir_Level], 0
 15214                              <1>         ;ja	short sysfnf_4  
 15215                              <1>         ;jna	short sysfnf_9 
 15216                              <1> 
 15217                              <1> sysfnf_4:
 15218 000111AE FE05[B7890100]      <1> 	inc	byte [SWP_DRV_chg]
 15219 000111B4 E8F1B2FFFF          <1> 	call 	load_FAT_root_directory
 15220 000111B9 739B                <1> 	jnc	short sysfnf_9
 15221                              <1> 	; eax = error code (17, 'drv not ready or read error')
 15222 000111BB EB0B                <1> 	jmp	short sysfnf_err_1 ; read error ! (no FNF stop)
 15223                              <1> 				   ; (if you want, try again,
 15224                              <1> 				   ;  after re-placing the disk)
 15225                              <1> sysfnf_5:
 15226 000111BD 3C0C                <1> 	cmp	al, 12 ; 'no more files' error
 15227 000111BF 7507                <1> 	jne	short sysfnf_err_1 ; (no FNF stop -sysfnf will try
 15228                              <1> 				   ;  to read the directory again,
 15229                              <1> 				   ;  if the user calls sysfnf
 15230                              <1> 				   ;  just after this error return-)
 15231                              <1> 	; (FNF stop -sysfnf will not try
 15232                              <1> 	;  to read the directory again-)
 15233                              <1> 
 15234                              <1> sysfnf_err_0:
 15235 000111C1 C605[B0890100]00    <1> 	mov	byte [FFF_Valid], 0 ; FNF stop sign
 15236                              <1> sysfnf_err_1:
 15237 000111C8 A3[AC940100]        <1> 	mov	[u.r0], eax
 15238 000111CD A3[18950100]        <1> 	mov	[u.error], eax
 15239 000111D2 E814120000          <1> 	call	reset_working_path
 15240 000111D7 E9A4BCFFFF          <1> 	jmp	error
 15241                              <1> 
 15242                              <1> sysfnf_6:
 15243 000111DC 803D[D9840100]00    <1> 	cmp	byte [DirBuff_ValidData], 0
 15244 000111E3 760D                <1> 	jna	short sysfnf_7
 15245                              <1> 
 15246 000111E5 3B05[DE840100]      <1> 	cmp	eax, [DirBuff_Cluster]
 15247                              <1> 	;je	short sysfnf_9
 15248                              <1> 	; 08/08/2022
 15249 000111EB 7505                <1> 	jne	short sysfnf_7
 15250 000111ED E964FFFFFF          <1> 	jmp	sysfnf_9
 15251                              <1> sysfnf_7:
 15252 000111F2 FE05[B7890100]      <1> 	inc	byte [SWP_DRV_chg]
 15253 000111F8 803D[B17D0100]01    <1> 	cmp	byte [Current_FATType], 1
 15254                              <1> 	;jnb	short sysfnf_8
 15255                              <1> 	; 08/08/2022
 15256 000111FF 7205                <1> 	jb	short sysfnf_13
 15257 00011201 E949FFFFFF          <1> 	jmp	sysfnf_8
 15258                              <1> sysfnf_13:
 15259                              <1> 	; Singlix (TRFS) File System 
 15260                              <1> 	; (access via compatibility buffer)
 15261 00011206 E857B3FFFF          <1> 	call	load_FS_sub_directory
 15262                              <1> 	;jnc	short sysfnf_9
 15263                              <1> 	;jmp	short sysfnf_err_1 ; read error (no FNF stop)
 15264                              <1> 	; 08/08/2022
 15265 0001120B 72BB                <1> 	jc	short sysfnf_err_1
 15266 0001120D E944FFFFFF          <1> 	jmp	sysfnf_9
 15267                              <1> 
 15268                              <1> writei:
 15269                              <1> 	; 02/09/2024
 15270                              <1> 	; 27/08/2024 - TRDOS 386 v2.0.9 
 15271                              <1> 	; 08/08/2022
 15272                              <1> 	; 30/07/2022
 15273                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 15274                              <1> 	; 26/10/2016
 15275                              <1> 	; 25/10/2016
 15276                              <1> 	; 23/10/2016
 15277                              <1> 	; 22/10/2016
 15278                              <1> 	; 19/10/2016 - TRDOS 386 (TRDOS v2.0)
 15279                              <1> 	; 19/05/2015 - 20/05/2015 (Retro UNIX 386 v1)
 15280                              <1> 	; 12/03/2013 - 31/07/2013 (Retro UNIX 8086 v1)
 15281                              <1> 	;
 15282                              <1> 	; Write data to file with first cluster number in EAX
 15283                              <1> 	; 
 15284                              <1> 	; INPUTS ->
 15285                              <1> 	;    EAX - First cluster number of the file
 15286                              <1> 	;    EBX - File number (Open file index number)
 15287                              <1> 	;    u.count - byte count to be written
 15288                              <1> 	;    u.base - points to user buffer
 15289                              <1> 	;    u.fofp - points to dword with current file offset
 15290                              <1> 	;    i.size - file size
 15291                              <1> 	;    cdev - logical dos drive number of the file
 15292                              <1> 	; OUTPUTS ->
 15293                              <1> 	;    u.count - cleared
 15294                              <1> 	;    u.nread - accumulates total bytes passed back
 15295                              <1> 	;    i.size - new file size (if file byte offset overs file size)
 15296                              <1> 	;    u.fofp - points to u.off (with new offset value)
 15297                              <1> 	;
 15298                              <1> 	; (Retro UNIX Prototype : 11/11/2012 - 18/11/2012, UNIXCOPY.ASM)
 15299                              <1> 	; ((Modified registers: eax, edx, ebx, ecx, esi, edi, ebp))
 15300                              <1> 
 15301 00011212 31C9                <1> 	xor	ecx, ecx
 15302 00011214 890D[D8940100]      <1> 	mov 	[u.nread], ecx  ; 0
 15303 0001121A 66890D[10950100]    <1> 	mov	[u.pcount], cx ; 19/05/2015
 15304 00011221 390D[D4940100]      <1> 	cmp 	[u.count], ecx
 15305 00011227 7701                <1> 	ja 	short writei_1 ; 08/08/2022
 15306 00011229 C3                  <1> 	retn
 15307                              <1> 	; 23/07/2022
 15308                              <1> 	;jna	short dskw_8 ; retn
 15309                              <1> writei_1:
 15310                              <1> 	; 02/09/2024
 15311 0001122A C705[54890100]FFFF- <1> 	mov	dword [writei.fclust], 0FFFFFFFFh ; -1 ; reset
 15311 00011232 FFFF                <1>
 15312                              <1> dskw:
 15313 00011234 881D[64890100]      <1> 	mov	[writei.ofn], bl ; Open file number
 15314 0001123A 880D[A7890100]      <1> 	mov	[setfmod], cl ; 0 ; reset 'update lm date&time' sign
 15315                              <1> dskw_0: 
 15316                              <1> 	; 26/10/2016
 15317                              <1> 	; 22/10/2016, 23/10/2016, 25/10/2016
 15318                              <1> 	; 19/10/2016 - TRDOS 386 (TRDOS v2.0)
 15319                              <1> 	; 31/05/2015 - 25/07/2015 (Retro UNIX 386 v1)
 15320                              <1> 	; 26/04/2013 - 20/09/2013 (Retro UNIX 8086 v1)
 15321                              <1> 	;
 15322                              <1> 	; 01/08/2013 (mkdir_w check)
 15323 00011240 E8D0000000          <1>  	call	mget_w
 15324                              <1> 	; eax = sector/block number
 15325                              <1> 
 15326 00011245 8B1D[C0940100]      <1> 	mov     ebx, [u.fofp]
 15327 0001124B 8B13                <1> 	mov	edx, [ebx]
 15328 0001124D 81E2FF010000        <1> 	and	edx, 1FFh  ; / test the lower 9 bits of the file offset
 15329 00011253 750C                <1> 	jnz	short dskw_1 ; / if its non-zero, branch
 15330                              <1> 			     ; if zero, file offset = 0,
 15331                              <1> 		       	     ; / 512, 1024,...(i.e., start of new block)
 15332 00011255 813D[D4940100]0002- <1> 	cmp	dword [u.count], 512
 15332 0001125D 0000                <1>
 15333                              <1> 				; / if zero, is there enough data to fill
 15334                              <1> 				; / an entire block? (i.e., no. of
 15335 0001125F 7331                <1> 	jnb	short dskw_2 ; / bytes to be written greater than 512.?
 15336                              <1> 			     ; / Yes, branch. Don't have to read block
 15337                              <1> dskw_1: ; in as no past info. is to be saved 
 15338                              <1> 	; (the entire block will be overwritten).
 15339                              <1> 	; 23/10/2016
 15340                              <1> 
 15341 00011261 BB[DC980100]        <1> 	mov	ebx, writei_buffer
 15342                              <1> 	; esi = logical dos drive description table address
 15343                              <1> 	; eax = sector number
 15344                              <1> 	; ebx = buffer address (in kernel's memory space)
 15345                              <1> 	; ecx = sector count
 15346                              <1> 	; 30/07/2022
 15347                              <1> 	;mov	ecx, 1
 15348 00011266 31C9                <1> 	xor	ecx, ecx
 15349 00011268 FEC1                <1> 	inc	cl
 15350                              <1> 	; ecx = 1
 15351 0001126A E8C50D0000          <1> 	call	disk_read
 15352                              <1> 	;call	dskrd 	; / no, must retain old info.. 
 15353                              <1> 		       	; / Hence, read block 'r1' into an I/O buffer
 15354 0001126F 7321                <1> 	jnc	short dskw_2
 15355                              <1> 
 15356                              <1> 	; disk read error
 15357                              <1> 	; 30/07/2022
 15358                              <1> 	;mov	eax, 17 ; drive not ready or READ ERROR !
 15359 00011271 29C0                <1> 	sub	eax, eax
 15360 00011273 B011                <1> 	mov	al, 17
 15361                              <1> dskw_err: ; jump from disk write error
 15362 00011275 A3[AC940100]        <1> 	mov	[u.r0], eax
 15363 0001127A A3[18950100]        <1> 	mov	[u.error], eax
 15364                              <1> 
 15365 0001127F 803D[A7890100]00    <1> 	cmp	byte [setfmod], 0
 15366                              <1> 	;jna	error
 15367                              <1> 	; 23/07/2022
 15368 00011286 7605                <1> 	jna	short writei_err
 15369                              <1> 
 15370 00011288 E8CD030000          <1> 	call	update_file_lmdt ; update last modif. date&time of the file
 15371                              <1> 	;mov	byte [setfmod], 0
 15372                              <1> writei_err:
 15373 0001128D E9EEBBFFFF          <1> 	jmp	error
 15374                              <1> 
 15375                              <1> dskw_2: ; 3:
 15376                              <1> 	; 23/10/2016
 15377 00011292 C605[40890100]01    <1> 	mov	byte [writei.valid], 1 ; writei buffer contains valid data
 15378 00011299 56                  <1> 	push	esi ; logical dos drive description table address
 15379                              <1> 	; EAX (r1) = block/sector number
 15380                              <1> 	;call	wslot
 15381                              <1> 		; jsr r0,wslot / set write and inhibit bits in I/O queue,
 15382                              <1> 			   ; / proc. status=0, r5 points to 1st word of data
 15383 0001129A 803D[12950100]00    <1> 	cmp	byte [u.kcall], 0
 15384 000112A1 770F                <1> 	ja	short dskw_4 ; zf=0 -> the caller is 'mkdir'
 15385                              <1> 	;
 15386 000112A3 66833D[10950100]00  <1> 	cmp	word [u.pcount], 0
 15387 000112AB 7705                <1> 	ja	short dskw_4
 15388                              <1> dskw_3:
 15389                              <1> 	; [u.base] = virtual address to transfer (as source address)
 15390 000112AD E826FAFFFF          <1> 	call	trans_addr_r ; translate virtual address to physical (r)
 15391                              <1> dskw_4:
 15392 000112B2 BB[DC980100]        <1> 	mov	ebx, writei_buffer
 15393                              <1> 	; EBX (r5) = system (I/O) buffer address
 15394 000112B7 E888FAFFFF          <1> 	call	sioreg
 15395                              <1> 	; ESI = file (user data) offset
 15396                              <1> 	; EDI = sector (I/O) buffer offset
 15397                              <1> 	; ECX = byte count
 15398                              <1> 	;
 15399 000112BC F3A4                <1>   	rep	movsb
 15400                              <1> 	; 25/07/2015
 15401                              <1> 	; eax = remain bytes in buffer
 15402                              <1>         ;       (check if remain bytes in the buffer > [u.pcount])
 15403 000112BE 09C0                <1> 	or	eax, eax
 15404 000112C0 75EB                <1> 	jnz	short dskw_3 ; (page end before system buffer end!)
 15405                              <1> 
 15406                              <1> 	; 23/10/2016
 15407 000112C2 B101                <1> 	mov	cl, 1
 15408 000112C4 5E                  <1> 	pop	esi
 15409 000112C5 A1[44890100]        <1> 	mov	eax, [writei.sector]
 15410                              <1> 	; esi = logical dos drive description table address
 15411                              <1> 	; eax = sector number
 15412                              <1> 	; ebx = writei buffer address
 15413                              <1> 	; ecx = sector count
 15414 000112CA E8560D0000          <1> 	call	disk_write ; / yes, write the block
 15415 000112CF 7313                <1> 	jnc	short dskw_5
 15416                              <1> 
 15417                              <1> 	;mov	eax, 18 ; drive not ready or WRITE ERROR !
 15418                              <1> 	; 30/08/2022
 15419 000112D1 29C0                <1> 	sub	eax, eax
 15420 000112D3 B012                <1> 	mov	al, 18
 15421 000112D5 EB9E                <1> 	jmp	short dskw_err
 15422                              <1> 
 15423                              <1> dskw_7:
 15424                              <1>  	; update last modif. date&time of the file
 15425                              <1> 	; (also updates file size as OF_SIZE)
 15426 000112D7 E87E030000          <1> 	call	update_file_lmdt
 15427                              <1> 	;mov	byte [setfmod], 0
 15428                              <1> 
 15429                              <1> 	; 03/08/2013
 15430 000112DC C605[12950100]00    <1> 	mov	byte [u.kcall], 0
 15431                              <1> 	; 23/10/2016
 15432                              <1> 	;mov	eax, [writei.fclust]
 15433                              <1> dskw_8:		; 23/07/2022
 15434 000112E3 C3                  <1> 	retn
 15435                              <1> 
 15436                              <1> dskw_5:
 15437                              <1> 	; 26/10/2016
 15438 000112E4 0FB61D[64890100]    <1> 	movzx	ebx, byte [writei.ofn] ; open file number
 15439 000112EB C0E302              <1> 	shl	bl, 2 ; *4
 15440 000112EE 8B83[BC8A0100]      <1> 	mov	eax, [ebx+OF_POINTER]
 15441 000112F4 3B83[3C8B0100]      <1> 	cmp	eax, [ebx+OF_SIZE]
 15442 000112FA 7606                <1> 	jna	short dskw_6
 15443 000112FC 8983[3C8B0100]      <1> 	mov	[ebx+OF_SIZE], eax
 15444                              <1> dskw_6:
 15445                              <1> 	;shr	bl, 2
 15446 00011302 833D[D4940100]00    <1>         cmp     dword [u.count], 0 ; / any more data to write?
 15447 00011309 76CC                <1> 	jna	short dskw_7
 15448 0001130B A1[54890100]        <1> 	mov	eax, [writei.fclust]
 15449 00011310 E92BFFFFFF          <1> 	jmp	dskw_0 ; / yes, branch
 15450                              <1> 
 15451                              <1> mget_w:
 15452                              <1> 	; 03/09/2024
 15453                              <1> 	; 02/09/2024
 15454                              <1> 	; 25/08/2024 - TRDOS 386 v2.0.9
 15455                              <1> 	; 08/08/2022
 15456                              <1> 	; 25/07/2022
 15457                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 15458                              <1> 	; 02/11/2016
 15459                              <1> 	; 01/11/2016
 15460                              <1> 	; 23/10/2016, 31/10/2016
 15461                              <1> 	; 22/10/2016 - TRDOS 386 (TRDOS v2.0)
 15462                              <1> 	; 03/06/2015 (Retro UNIX 386 v1, 'mget', u.5s)
 15463                              <1> 	; 22/03/2013 - 31/07/2013 (Retro UNIX 8086 v1)
 15464                              <1> 	;
 15465                              <1> 	; Get existing or (allocate) a new disk block for file
 15466                              <1> 	;
 15467                              <1> 	; INPUTS ->
 15468                              <1> 	;    [u.fofp] = file offset pointer
 15469                              <1> 	;    [i.size] = file size
 15470                              <1> 	;    [u.count] = byte count
 15471                              <1> 	;    EAX = First cluster
 15472                              <1> 	;    [cdev] = Logical dos drive number
 15473                              <1> 	;    [writei.ofn] = File Number
 15474                              <1> 	;		   (Open file index, 0 based)
 15475                              <1> 	;    ([u.off] = file offset)
 15476                              <1> 	; OUTPUTS ->
 15477                              <1> 	;    EAX = logical sector number
 15478                              <1> 	;    ESI = Logical Dos Drive Description Table address
 15479                              <1> 	;
 15480                              <1> 	; Modified registers: EDX, EBX, ECX, ESI, EDI, EBP
 15481                              <1> 
 15482 00011315 8B35[C0940100]      <1>         mov     esi, [u.fofp]
 15483 0001131B 8B2E                <1> 	mov	ebp, [esi] ; u.off (or EBX*4+OF_POINTER)
 15484                              <1> 
 15485 0001131D 29C9                <1> 	sub	ecx, ecx
 15486 0001131F 8A2D[91940100]      <1> 	mov	ch, [cdev]
 15487                              <1> 
 15488 00011325 BE00010900          <1> 	mov	esi, Logical_DOSDisks
 15489 0001132A 01CE                <1> 	add	esi, ecx
 15490                              <1> 
 15491                              <1> 	; 31/10/2016
 15492 0001132C 89C3                <1> 	mov	ebx, eax ; First Cluster or FDT address
 15493                              <1> 
 15494 0001132E 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
 15495                              <1> 	;jna	mget_w_14 ; Singlix FS
 15496                              <1> 	; 23/07/2022
 15497 00011332 7705                <1> 	ja	short mget_w_20
 15498 00011334 E9FC010000          <1> 	jmp	mget_w_14  ; Singlix FS
 15499                              <1> 
 15500                              <1> mget_w_20:
 15501 00011339 0FB74611            <1> 	movzx	eax, word [esi+LD_BPB+BytesPerSec]
 15502 0001133D 0FB65613            <1> 	movzx	edx, byte [esi+LD_BPB+SecPerClust]
 15503 00011341 8815[42890100]      <1> 	mov	[writei.spc], dl  ; sectors per cluster
 15504 00011347 F7E2                <1> 	mul	edx
 15505                              <1> 	; edx = 0
 15506                              <1> 	; eax = bytes per cluster (<= 65536)
 15507                              <1> 
 15508                              <1> 	; 02/11/2016
 15509 00011349 89C1                <1> 	mov	ecx, eax
 15510 0001134B 48                  <1> 	dec	eax
 15511 0001134C 66A3[48890100]      <1> 	mov	[writei.bpc], ax
 15512                              <1> 
 15513 00011352 89E8                <1> 	mov	eax, ebp
 15514 00011354 0305[D4940100]      <1> 	add	eax, [u.count] ; next file position
 15515 0001135A 3B05[B8950100]      <1> 	cmp	eax, [i.size] ; <= file size ?
 15516                              <1> 	;jna	mget_w_4 ; no
 15517                              <1> 	; 23/07/2022
 15518 00011360 7705                <1> 	ja	short mget_w_21
 15519                              <1> 	; 02/09/2024
 15520                              <1> 	; ebx  = first cluster (input)
 15521 00011362 E925010000          <1> 	jmp	mget_w_4
 15522                              <1> mget_w_21:
 15523 00011367 F7F1                <1> 	div	ecx
 15524 00011369 A3[50890100]        <1> 	mov	[writei.c_index], eax ; cluster index
 15525                              <1> 	; edx = byte offset in cluster (<= 65535)
 15526                              <1> 	;mov	[writei.offset], dx
 15527                              <1> 	;shr	dx, 9 ; / 512
 15528                              <1> 	;mov	[writei.s_index], dl ; sector index in cluster (0 to spc -1)
 15529                              <1> 
 15530 0001136E 29D2                <1> 	sub	edx, edx ; 01/11/2016
 15531 00011370 8915[44890100]      <1> 	mov 	[writei.sector], edx ; 0
 15532 00011376 668915[4A890100]    <1> 	mov	[writei.offset], dx  ; byte offset in cluster
 15533 0001137D 8815[43890100]      <1> 	mov	[writei.s_index], dl ; sector index in cluster (0 to spc -1)
 15534                              <1> 
 15535 00011383 89D8                <1> 	mov	eax, ebx ; First Cluster
 15536                              <1> 
 15537                              <1> 	; is this the 1st mget_w or a next mget_w call ? (by 'writei')
 15538 00011385 3815[40890100]      <1> 	cmp	byte [writei.valid], dl ; 0
 15539 0001138B 7624                <1> 	jna	short mget_w_0
 15540                              <1> 
 15541 0001138D 8815[40890100]      <1> 	mov 	byte [writei.valid], dl ; 0 ; reset ('writei' will set it) 
 15542                              <1> 
 15543 00011393 3B05[54890100]      <1> 	cmp	eax, [writei.fclust]
 15544 00011399 7516                <1> 	jne	short mget_w_0
 15545                              <1> 
 15546 0001139B 8A0D[91940100]      <1> 	mov	cl, [cdev]
 15547 000113A1 3A0D[41890100]      <1> 	cmp	cl, [writei.drv]
 15548 000113A7 7508                <1> 	jne	short mget_w_0
 15549                              <1>  	; [writei.l_clust] & [writei.l_index] are valid,
 15550                              <1> 	;  we don't need to get last cluster & last cluster index
 15551 000113A9 8B0D[60890100]      <1> 	mov	ecx, [writei.l_index]
 15552 000113AF EB7F                <1> 	jmp	short mget_w_2
 15553                              <1> mget_w_0:
 15554 000113B1 A3[54890100]        <1> 	mov	[writei.fclust], eax ; first cluster
 15555                              <1> 	; edx = 0
 15556 000113B6 A3[4C890100]        <1> 	mov	[writei.cluster], eax ; first cluster ; 01/11/2016
 15557 000113BB 8915[58890100]      <1> 	mov 	[writei.fs_index], edx ; 0 ; current cluster index
 15558                              <1> 
 15559                              <1> 	;;;
 15560                              <1> 	; 25/08/2024 - TRDOS 386 v2.0.9
 15561 000113C1 09C0                <1> 	or	eax, eax ; is first cluster number = 0 ?
 15562 000113C3 751A                <1> 	jnz	short mget_w_27 ; no
 15563                              <1> 
 15564                              <1> 	; eax = 0 (*)
 15565                              <1> 	; ((a directory entry with zero file size)) (*)
 15566                              <1> 	; (*) ((('syswrite' may be used for writing to an empty file.
 15567                              <1> 	; Before this modification, 'syscreat' and 'syswrite' system calls
 15568                              <1> 	; did wrong things together... 'writetest.s' file, 24/08/2024.)))
 15569                              <1> 
 15570 000113C5 E831B8FFFF          <1> 	call	add_new_cluster ; (*) 2024 (v2.0.9) modification
 15571 000113CA 721A                <1> 	jc	short mget_w_errj ; eax = error code
 15572                              <1> 	; eax = (new) first cluster
 15573                              <1> 	; skip 'get_last_cluster' and set ecx to -1
 15574                              <1> 	;
 15575                              <1> 	; 02/09/2024
 15576 000113CC A3[54890100]        <1> 	mov	[writei.fclust], eax ; first cluster
 15577 000113D1 A3[4C890100]        <1> 	mov	[writei.cluster], eax
 15578                              <1> 	; 03/09/2024
 15579 000113D6 A3[A8890100]        <1> 	mov	[setfclust], eax
 15580                              <1> 	;
 15581 000113DB 31C9                <1> 	xor	ecx, ecx
 15582 000113DD EB12                <1> 	jmp	short mget_w_28
 15583                              <1> 	;;;
 15584                              <1> 
 15585                              <1> mget_w_27:
 15586                              <1> 	; FAT file system (FAT12, FAT16, FAT32)
 15587 000113DF E8FAB6FFFF          <1> 	call	get_last_cluster
 15588                              <1> 	;jc	short mget_w_err ; eax = error code
 15589                              <1> 	; 08/08/2022
 15590 000113E4 7305                <1> 	jnc	short mget_w_25
 15591                              <1> mget_w_errj:	; 25/08/2024
 15592 000113E6 E992000000          <1> 	jmp	mget_w_err
 15593                              <1> 
 15594                              <1> mget_w_25:
 15595                              <1> 	; 25/08/2024
 15596 000113EB 8B0D[80870100]      <1> 	mov	ecx, [glc_index] ; last cluster index
 15597                              <1> mget_w_28:	; 02/09/2024
 15598 000113F1 890D[60890100]      <1> 	mov	[writei.l_index], ecx
 15599 000113F7 A3[5C890100]        <1> 	mov	[writei.lclust], eax ; last cluster
 15600                              <1> 
 15601 000113FC A0[64890100]        <1> 	mov	al, [writei.ofn]
 15602 00011401 FEC0                <1> 	inc	al
 15603 00011403 A2[A7890100]        <1> 	mov	[setfmod], al ; update lm date&time sign
 15604                              <1> 
 15605                              <1> mget_w_1:
 15606 00011408 3B0D[50890100]      <1> 	cmp	ecx, [writei.c_index] ; last cluster index
 15607 0001140E 7320                <1> 	jnb	short mget_w_2 ; 01/11/2016
 15608                              <1> 
 15609 00011410 A1[5C890100]        <1> 	mov	eax, [writei.lclust]
 15610                              <1> 	; EAX = Last cluster
 15611 00011415 E8E1B7FFFF          <1> 	call	add_new_cluster
 15612 0001141A 7261                <1> 	jc	short mget_w_err ; eax = error code
 15613                              <1> 	; edx = 0
 15614 0001141C A3[5C890100]        <1> 	mov	[writei.lclust], eax ; (new) last cluster
 15615 00011421 8B0D[60890100]      <1> 	mov	ecx, [writei.l_index]
 15616 00011427 41                  <1> 	inc	ecx ; add 1 to last cluster index
 15617 00011428 890D[60890100]      <1> 	mov	[writei.l_index], ecx ; current last cluster index
 15618                              <1> 
 15619 0001142E EBD8                <1> 	jmp	short mget_w_1
 15620                              <1> 
 15621                              <1> mget_w_2:
 15622 00011430 89E9                <1> 	mov	ecx, ebp
 15623 00011432 030D[D4940100]      <1> 	add	ecx, [u.count]
 15624 00011438 890D[B8950100]      <1> 	mov	[i.size], ecx ; save new file size
 15625                              <1> 	;sub	edx, edx ; 0
 15626                              <1> 
 15627 0001143E A0[91940100]        <1> 	mov	al, [cdev]
 15628 00011443 A2[41890100]        <1> 	mov	[writei.drv], al ; physical drive number
 15629                              <1> 	; edx = 0
 15630 00011448 89E8                <1> 	mov	eax, ebp ; file offset
 15631 0001144A 0FB70D[48890100]    <1> 	movzx	ecx, word [writei.bpc] ; bytes per cluster - 1
 15632 00011451 41                  <1> 	inc	ecx ; bytes per cluster
 15633 00011452 F7F1                <1> 	div	ecx
 15634                              <1> 	; edx = byte offset in cluster (<= 65535)
 15635                              <1> 	; eax = cluster index
 15636 00011454 A3[50890100]        <1> 	mov	[writei.c_index], eax
 15637 00011459 668915[4A890100]    <1> 	mov	[writei.offset], dx
 15638                              <1> 	;shr	dx, 9 ; / 512
 15639                              <1> 	; 23/07/2022
 15640 00011460 C1EA09              <1> 	shr	edx, 9
 15641 00011463 8815[43890100]      <1> 	mov	[writei.s_index], dl ; sector index in cluster (0 to spc -1)
 15642                              <1> 
 15643                              <1> mget_w_3:
 15644 00011469 3B05[60890100]      <1> 	cmp	eax, [writei.l_index] ; last cluster index
 15645 0001146F 753E                <1> 	jne	short mget_w_5
 15646                              <1> 
 15647 00011471 A3[58890100]        <1> 	mov	[writei.fs_index], eax ; cluster index (for next check)
 15648 00011476 A1[5C890100]        <1> 	mov	eax, [writei.lclust] ; last cluster
 15649 0001147B EB74                <1> 	jmp	short mget_w_10
 15650                              <1> 
 15651                              <1> mget_w_err:
 15652 0001147D A3[18950100]        <1> 	mov	[u.error], eax
 15653 00011482 A3[AC940100]        <1> 	mov	[u.r0], eax
 15654 00011487 E9F4B9FFFF          <1> 	jmp	error
 15655                              <1> 
 15656                              <1> mget_w_4: ; 02/11/2016
 15657                              <1> 	; eax = next file position
 15658 0001148C 2B05[D4940100]      <1> 	sub	eax, [u.count] ; current file position
 15659                              <1> 	; edx = 0
 15660                              <1> 	; ecx = bytes per cluster
 15661 00011492 F7F1                <1> 	div	ecx
 15662 00011494 A3[50890100]        <1> 	mov	[writei.c_index], eax ; cluster index
 15663 00011499 668915[4A890100]    <1> 	mov	[writei.offset], dx
 15664                              <1> 	;shr	dx, 9 ; / 512
 15665                              <1> 	; 23/07/2022
 15666 000114A0 C1EA09              <1> 	shr	edx, 9
 15667 000114A3 8815[43890100]      <1> 	mov	[writei.s_index], dl ; sector index in cluster (0 to spc -1)
 15668                              <1> 
 15669                              <1> 	; 02/09/2024
 15670 000114A9 891D[54890100]      <1> 	mov	 [writei.fclust], ebx
 15671                              <1> 
 15672                              <1> mget_w_5:
 15673 000114AF 21C0                <1> 	and	eax, eax ; 0 = First Cluster's index number
 15674 000114B1 750C                <1> 	jnz	short mget_w_6
 15675                              <1> 
 15676 000114B3 A3[58890100]        <1> 	mov	[writei.fs_index], eax ; cluster index (for next check)
 15677 000114B8 A1[54890100]        <1> 	mov	eax, [writei.fclust] ; first cluster
 15678 000114BD EB32                <1> 	jmp	short mget_w_10
 15679                              <1> 
 15680                              <1> mget_w_6:
 15681 000114BF 3B05[58890100]      <1> 	cmp	eax, [writei.fs_index] ; current cluster index (>0)
 15682 000114C5 7507                <1> 	jne	short mget_w_7
 15683 000114C7 A1[4C890100]        <1> 	mov	eax, [writei.cluster] ; current cluster
 15684 000114CC EB3A                <1> 	jmp	short mget_w_11
 15685                              <1> 
 15686                              <1> mget_w_7:
 15687 000114CE 89C1                <1> 	mov	ecx, eax
 15688 000114D0 2B0D[58890100]      <1> 	sub	ecx, [writei.fs_index]
 15689 000114D6 730D                <1> 	jnc	short mget_w_8
 15690                              <1> 	; get cluster by index from the first cluster
 15691 000114D8 A1[54890100]        <1> 	mov	eax, [writei.fclust]
 15692 000114DD 8B0D[50890100]      <1> 	mov	ecx, [writei.c_index]
 15693 000114E3 EB05                <1> 	jmp	short mget_w_9
 15694                              <1> 
 15695                              <1> mget_w_8:
 15696 000114E5 A1[4C890100]        <1> 	mov	eax, [writei.cluster] ; beginning cluster
 15697                              <1> 	; ecx = cluster sequence number after the beginning cluster
 15698                              <1> 	; sub	edx, edx ; 0
 15699                              <1> 
 15700                              <1> mget_w_9:
 15701                              <1> 	; EAX = Beginning cluster
 15702                              <1> 	; EDX = Sector index in disk/file section
 15703                              <1> 	;	(Only for SINGLIX file system!)
 15704                              <1> 	; ECX = Cluster sequence number after the beginning cluster
 15705                              <1> 	; ESI = Logical DOS Drive Description Table address
 15706 000114EA E8C5B7FFFF          <1> 	call	get_cluster_by_index
 15707 000114EF 728C                <1> 	jc	short mget_w_err ; error code in EAX
 15708                              <1> 
 15709                              <1> 	; EAX = Cluster number
 15710                              <1> mget_w_10:
 15711 000114F1 A3[4C890100]        <1> 	mov	[writei.cluster], eax ; FDT number for Singlix File System
 15712                              <1> 
 15713 000114F6 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
 15714 000114FA 7628                <1> 	jna	short mget_w_13
 15715                              <1> 	; 01/11/2016
 15716 000114FC 8B15[50890100]      <1> 	mov	edx, [writei.c_index]
 15717 00011502 8915[58890100]      <1> 	mov	[writei.fs_index], edx
 15718                              <1> mget_w_11:
 15719                              <1> 	;sub	eax, 2
 15720                              <1> 	; 23/07/2022
 15721 00011508 48                  <1> 	dec	eax
 15722 00011509 48                  <1> 	dec	eax
 15723 0001150A 0FB615[42890100]    <1> 	movzx	edx, byte [writei.spc]
 15724 00011511 F7E2                <1> 	mul	edx
 15725                              <1> 
 15726 00011513 034668              <1> 	add	eax, [esi+LD_DATABegin]
 15727 00011516 8A15[43890100]      <1> 	mov	dl, [writei.s_index]
 15728 0001151C 01D0                <1> 	add	eax, edx
 15729                              <1> mget_w_12:
 15730 0001151E A3[44890100]        <1> 	mov	[writei.sector], eax
 15731                              <1> 	;; buffer validation must be done in writei
 15732                              <1> 	;;mov	byte [writei.valid], 1
 15733 00011523 C3                  <1> 	retn
 15734                              <1> 
 15735                              <1> mget_w_13:
 15736                              <1> 	; EAX = FDT number (Current Section)
 15737                              <1> 	; EDX = Sector index from the first section (0,1,2,3,4...)
 15738 00011524 2B15[58890100]      <1> 	sub	edx, [writei.fs_index]
 15739                              <1> 	; EDX = Sector index from current section
 15740 0001152A 8915[58890100]      <1> 	mov	[writei.fs_index], edx
 15741 00011530 40                  <1> 	inc	eax ; the first data sector in FS disk section
 15742 00011531 01D0                <1> 	add	eax, edx
 15743 00011533 EBE9                <1> 	jmp	short mget_w_12
 15744                              <1> 
 15745                              <1> mget_w_14:
 15746 00011535 8A4E12              <1> 	mov	cl, [esi+LD_FS_BytesPerSec+1]
 15747 00011538 D0E9                <1> 	shr	cl, 1 ;  ; 1 for 512 bytes, 4 for 2048 bytes
 15748 0001153A 880D[42890100]      <1> 	mov	[writei.spc], cl  ; sectors per cluster
 15749                              <1> 	; NOTE: writei bytes per sector value is always 512 !
 15750 00011540 66C705[48890100]00- <1> 	mov	word [writei.bpc], 512
 15750 00011548 02                  <1>
 15751                              <1> 
 15752 00011549 89E9                <1> 	mov	ecx, ebp
 15753 0001154B 030D[D4940100]      <1> 	add	ecx, [u.count] ; next file position
 15754 00011551 3B0D[B8950100]      <1> 	cmp	ecx, [i.size] ; <= file size ?
 15755                              <1> 	;jna	mget_w_19 ; no
 15756 00011557 7705                <1> 	ja	short mget_w_22
 15757                              <1> 	; 23/07/2022
 15758 00011559 E9C6000000          <1> 	jmp	mget_w_19
 15759                              <1> 
 15760                              <1> mget_w_22:
 15761 0001155E 29D2                <1> 	sub	edx, edx ; 0
 15762 00011560 8915[44890100]      <1> 	mov 	[writei.sector], edx ; 0
 15763 00011566 668915[4A890100]    <1> 	mov	[writei.offset], dx  ; byte offset in cluster 
 15764 0001156D 8815[43890100]      <1> 	mov	[writei.s_index], dl ; sector index in cluster (0 to spc -1)
 15765                              <1> 
 15766 00011573 C1E909              <1> 	shr	ecx, 9 ; 1 cluster = 512 bytes
 15767 00011576 890D[50890100]      <1> 	mov	[writei.c_index], ecx ; section/cluster index
 15768                              <1> 	
 15769 0001157C 89D8                <1> 	mov	eax, ebx ; FDT number (First FDT address)
 15770                              <1> 
 15771                              <1> 	; is this the 1st mget_w or a next mget_w call ? (by 'writei')
 15772 0001157E 3815[40890100]      <1> 	cmp	byte [writei.valid], dl ; 0
 15773 00011584 7624                <1> 	jna	short mget_w_15
 15774                              <1> 
 15775 00011586 8815[40890100]      <1> 	mov 	byte [writei.valid], dl ; 0 ; reset ('writei' will set it)
 15776                              <1> 
 15777 0001158C 3B05[54890100]      <1> 	cmp	eax, [writei.fclust]
 15778 00011592 7516                <1> 	jne	short mget_w_15
 15779                              <1> 
 15780 00011594 8A0D[91940100]      <1> 	mov	cl, [cdev]
 15781 0001159A 3A0D[41890100]      <1> 	cmp	cl, [writei.drv]
 15782 000115A0 7508                <1> 	jne	short mget_w_15
 15783                              <1>  	; [writei.l_clust] & [writei.l_index] are valid, 
 15784                              <1> 	;  we don't need to get last cluster & last cluster index
 15785 000115A2 8B0D[60890100]      <1> 	mov	ecx, [writei.l_index]
 15786 000115A8 EB4A                <1> 	jmp	short mget_w_17
 15787                              <1> mget_w_15:
 15788 000115AA A3[54890100]        <1> 	mov	[writei.fclust], eax ; first section (FDT number)
 15789                              <1> 	; edx = 0
 15790 000115AF 8915[4C890100]      <1> 	mov	[writei.cluster], edx ; 0 ; current section
 15791 000115B5 8915[58890100]      <1> 	mov 	[writei.fs_index], edx ; 0 ; curret section index
 15792                              <1> 
 15793                              <1> 	; eax = FDT number (section 0 header address)
 15794 000115BB E81DB7FFFF          <1> 	call	get_last_section
 15795                              <1> 	;jc	short mget_w_err ; eax = error code
 15796                              <1> 	; 08/08/2022
 15797 000115C0 7305                <1> 	jnc	short mget_w_26
 15798 000115C2 E9B6FEFFFF          <1> 	jmp	mget_w_err
 15799                              <1> mget_w_26:
 15800 000115C7 8915[58890100]      <1> 	mov 	[writei.fs_index], edx ; sector index in last section
 15801                              <1> 
 15802 000115CD A3[5C890100]        <1> 	mov	[writei.lclust], eax ; last section address
 15803                              <1> 
 15804 000115D2 8B0D[80870100]      <1> 	mov	ecx, [glc_index] ; last section index
 15805 000115D8 890D[60890100]      <1> 	mov	[writei.l_index], ecx
 15806                              <1> 
 15807 000115DE A0[64890100]        <1> 	mov	al, [writei.ofn]
 15808 000115E3 FEC0                <1> 	inc	al
 15809 000115E5 A2[A7890100]        <1> 	mov	[setfmod], al ; update lm date&time sign
 15810                              <1> 
 15811                              <1> mget_w_16:
 15812                              <1> 	; edx = (existing) last section (sector) index
 15813 000115EA 8B0D[50890100]      <1> 	mov	ecx, [writei.c_index] ; final section (sector) index
 15814 000115F0 29D1                <1> 	sub	ecx, edx
 15815 000115F2 7630                <1> 	jna	short mget_w_19
 15816                              <1> 	; ecx = sector count
 15817                              <1> mget_w_17:
 15818 000115F4 A1[5C890100]        <1> 	mov	eax, [writei.lclust]
 15819                              <1> 	; ESI = Logical dos drv desc. table address
 15820                              <1>         ; EAX = Last section
 15821                              <1>         ; (ECX = 0 for directory)
 15822                              <1>         ; ECX = sector count (except FDT)
 15823 000115F9 E86DADFFFF          <1> 	call	add_new_fs_section
 15824 000115FE 730F                <1> 	jnc	short mget_w_18
 15825                              <1> 
 15826                              <1> 	; If error number = 27h (insufficient disk space)
 15827                              <1> 	; it is needed to check free consequent sectors
 15828                              <1> 	; (1 data sector at least and +1 section header sector)
 15829                              <1> 
 15830 00011600 83F827              <1> 	cmp	eax, 27h
 15831                              <1> 	;jne	mget_w_err ; eax = error code
 15832                              <1> 	; 25/07/2022
 15833 00011603 7405                <1> 	je	short mget_w_24
 15834                              <1> mget_w_23:
 15835 00011605 E973FEFFFF          <1> 	jmp	mget_w_err
 15836                              <1> mget_w_24:
 15837                              <1> 	; ecx = count of free consequent sectors
 15838                              <1> 	; ecx must be > 1 (1 data + 1 header sector)
 15839 0001160A 49                  <1> 	dec	ecx
 15840                              <1> 	;jz	short mget_w_err
 15841                              <1> 	;jmp	short mget_w_17
 15842                              <1> 	; 23/07/2022
 15843 0001160B 75E7                <1> 	jnz	short mget_w_17
 15844                              <1> 	;jmp	mget_w_err
 15845                              <1> 	; 25/07/2022
 15846 0001160D EBF6                <1> 	jmp	short mget_w_23
 15847                              <1> 
 15848                              <1> mget_w_18:
 15849 0001160F A3[5C890100]        <1> 	mov	[writei.lclust], eax ; (new) last section
 15850                              <1> 	; ecx = sector count (except section header)
 15851 00011614 8B15[60890100]      <1> 	mov	edx, [writei.l_index]
 15852 0001161A 01CA                <1> 	add	edx, ecx ; add sector count to index
 15853 0001161C 8915[60890100]      <1> 	mov	[writei.l_index], edx
 15854 00011622 EBC6                <1> 	jmp	short mget_w_16
 15855                              <1> 
 15856                              <1> mget_w_19:
 15857 00011624 89E9                <1> 	mov	ecx, ebp
 15858 00011626 030D[D4940100]      <1> 	add	ecx, [u.count]
 15859 0001162C 890D[B8950100]      <1> 	mov	[i.size], ecx ; save new file size
 15860                              <1> 	;sub	edx, edx ; 0
 15861                              <1> 
 15862 00011632 A0[91940100]        <1> 	mov	al, [cdev]
 15863 00011637 A2[41890100]        <1> 	mov	[writei.drv], al ; physical drive number
 15864                              <1> 	; edx = 0
 15865 0001163C 89E8                <1> 	mov	eax, ebp ; file offset
 15866 0001163E 89C2                <1> 	mov	edx, eax
 15867                              <1> 	; 1 cluster = 512 bytes (for Singlix FS)
 15868 00011640 C1E809              <1> 	shr	eax, 9  ; / 512
 15869 00011643 81E2FF010000        <1> 	and	edx, 1FFh
 15870                              <1> 	; edx = byte offset in cluster/sector (<= 511)
 15871                              <1> 	; eax = section (sector/cluster) index
 15872 00011649 A3[50890100]        <1> 	mov	[writei.c_index], eax
 15873 0001164E 668915[4A890100]    <1> 	mov	[writei.offset], dx
 15874                              <1> 	;mov	byte [writei.s_index], 0 ; sector index in cluster
 15875 00011655 E90FFEFFFF          <1> 	jmp	mget_w_3
 15876                              <1> 
 15877                              <1> update_file_lmdt: ; & update file size
 15878                              <1> 	; 03/09/2024
 15879                              <1> 	; 27/08/2024 - TRDOS 386 v2.0.9
 15880                              <1> 	; 30/07/2022
 15881                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 15882                              <1> 	; 26/10/2016
 15883                              <1> 	; 24/10/2016
 15884                              <1> 	; 23/10/2016
 15885                              <1> 	; 22/10/2016 - TRDOS 386 (TRDOS v2.0)
 15886                              <1> 	;
 15887                              <1> 	; Update last modification date&time of file
 15888                              <1> 	; (call from syswrite -> writei)
 15889                              <1> 	; ((also updates file size)) // 26/10/2016
 15890                              <1> 	;
 15891                              <1> 	; INPUT:
 15892                              <1> 	;      byte [setfmod] = open file number
 15893                              <1> 	; OUTPUT:
 15894                              <1> 	;      cf = 0 -> success !
 15895                              <1> 	;      cf = 1 -> lmdt update has been failed!
 15896                              <1> 	;
 15897                              <1> 	; Modified registers: eax, ebx, ecx, edx, esi, edi
 15898                              <1> 	;
 15899                              <1> 
 15900                              <1> 	;cmp	byte [setfmod], 0
 15901                              <1> 	;jna	short uflmdt_2 ; nothing to do
 15902                              <1> 
 15903                              <1> 	; 27/08/2024
 15904                              <1> 	; if [ebx+OF_FCLUSTER] = 0 and [setfclust] > 0
 15905                              <1> 	; [setfclust] will be copied to Directory entry's
 15906                              <1> 	; first cluster fields (LO/HI).
 15907                              <1> 	; (and [setfclust] will be cleared.)
 15908                              <1> 
 15909 0001165A 31C0                <1> 	xor	eax, eax
 15910                              <1> 
 15911 0001165C 0FB61D[A7890100]    <1> 	movzx	ebx, byte [setfmod]
 15912 00011663 FECB                <1> 	dec	bl ; open file index number (0 based)
 15913                              <1> 
 15914 00011665 8AA3[3C8A0100]      <1> 	mov	ah, [ebx+OF_DRIVE]
 15915 0001166B BE00010900          <1> 	mov	esi, Logical_DOSDisks
 15916 00011670 01C6                <1> 	add	esi, eax
 15917 00011672 C0E302              <1> 	shl	bl, 2 ; *4
 15918 00011675 8B8B[BC890100]      <1> 	mov	ecx, [ebx+OF_FCLUSTER] ; first cluster
 15919 0001167B 8B93[3C8C0100]      <1> 	mov	edx, [ebx+OF_DIRCLUSTER] ; dir cluster
 15920                              <1> 
 15921 00011681 D0EB                <1> 	shr	bl, 1 ; /2
 15922 00011683 0FB7BB[3C8E0100]    <1> 	movzx	edi, word [ebx+OF_DIRENTRY]
 15923                              <1> 
 15924                              <1> 	; 03/09/2024
 15925 0001168A 80C441              <1> 	add	ah, 'A'
 15926 0001168D 8A4603              <1> 	mov	al, [esi+LD_FATType]
 15927                              <1> 	
 15928 00011690 803D[D9840100]01    <1> 	cmp	byte [DirBuff_ValidData], 1
 15929 00011697 727E                <1> 	jb	short uflmdt_4
 15930                              <1> 
 15931                              <1> 	;mov	al, [DirBuff_DRV]
 15932                              <1> 	;sub	al, 'A'	
 15933                              <1> 	;cmp	al, ah
 15934                              <1> 	; 03/09/2024
 15935                              <1> 	; 27/08/2024
 15936                              <1> 	;add	ah, 'A'
 15937                              <1> 	;mov	al, [esi+LD_FATType]
 15938 00011699 3A25[D7840100]      <1> 	cmp	ah, [DirBuff_DRV]
 15939 0001169F 7576                <1> 	jne	short uflmdt_4 ; different drive
 15940                              <1> 	;mov	al, [esi+LD_FATType]
 15941 000116A1 3A05[D8840100]      <1> 	cmp	al, [DirBuff_FATType]
 15942 000116A7 756E                <1> 	jne	short uflmdt_5 ; different FS type
 15943 000116A9 3B15[DE840100]      <1> 	cmp	edx, [DirBuff_Cluster]
 15944 000116AF 7566                <1> 	jne	short uflmdt_5 ; different cluster
 15945                              <1> 
 15946                              <1> uflmdt_1:
 15947                              <1> 	; Directory buffer is ready here!
 15948                              <1> 	; OF_FCLUSTER must be compared/verified
 15949 000116B1 BE00000800          <1> 	mov	esi, Directory_Buffer
 15950                              <1> 	;shl	di, 5 ; dir entry index * 32
 15951                              <1> 	; 23/07/2022
 15952 000116B6 C1E705              <1> 	shl	edi, 5
 15953 000116B9 01FE                <1> 	add	esi, edi ; offset
 15954                              <1> 	;
 15955                              <1> 	; 03/09/2024
 15956                              <1> 	;test	byte [esi+DirEntry_Attr], 18h ; Vol & Dir
 15957                              <1> 	;jnz	short uflmdt_2 ; not a valid file !
 15958 000116BB 668B4614            <1> 	mov	ax, [esi+DirEntry_FstClusHI]
 15959 000116BF C1E010              <1> 	shl	eax, 16
 15960 000116C2 668B461A            <1> 	mov	ax, [esi+DirEntry_FstClusLO]
 15961                              <1> 
 15962                              <1> 	; 03/09/2024 (short jump)
 15963 000116C6 F6460B18            <1> 	test	byte [esi+DirEntry_Attr], 18h ; Vol & Dir
 15964 000116CA 7575                <1> 	jnz	short uflmdt_2 ; not a valid file !
 15965                              <1> 
 15966 000116CC 39C8                <1> 	cmp	eax, ecx ; same first cluster ?
 15967                              <1> 	;je	short uflmdt_3 ; yes, it is OK !!!
 15968                              <1> 	; 23/07/2022
 15969 000116CE 7571                <1> 	jne	short uflmdt_2
 15970                              <1> 
 15971                              <1> 	;;;
 15972                              <1> 	; 03/09/2024
 15973 000116D0 D0E3                <1> 	shl	bl, 1 ; *2
 15974                              <1> 	; 27/08/2024 
 15975 000116D2 21C0                <1> 	and	eax, eax
 15976 000116D4 751B                <1> 	jnz	short uflmdt_3 ; not empty file
 15977 000116D6 8705[A8890100]      <1> 	xchg	eax, [setfclust]
 15978 000116DC 09C0                <1> 	or	eax, eax
 15979 000116DE 7411                <1> 	jz	short uflmdt_3
 15980                              <1> 	; 03/09/2024
 15981 000116E0 8983[BC890100]      <1> 	mov	[ebx+OF_FCLUSTER], eax
 15982                              <1> 	;
 15983 000116E6 6689461A            <1> 	mov	[esi+DirEntry_FstClusLO], ax
 15984 000116EA C1E810              <1> 	shr	eax, 16
 15985 000116ED 66894614            <1> 	mov	[esi+DirEntry_FstClusHI], ax
 15986                              <1> 	;;;
 15987                              <1> 
 15988                              <1> uflmdt_3:
 15989                              <1> 	; Update directory entry
 15990                              <1> 	; 03/09/2024
 15991                              <1> 	; 26/10/2016
 15992                              <1> 	;shl	bl, 1 ; *2
 15993 000116F1 8B83[3C8B0100]      <1> 	mov	eax, [ebx+OF_SIZE] ; file size
 15994 000116F7 89461C              <1> 	mov	[esi+DirEntry_FileSize], eax
 15995                              <1> 	;
 15996 000116FA E80899FFFF          <1> 	call	convert_current_date_time
 15997                              <1> 	; OUTPUT -> DX = Date in dos dir entry format
 15998                              <1>         ; 	    AX = Time in dos dir entry format
 15999 000116FF 66894616            <1> 	mov	[esi+DirEntry_WrtTime], ax
 16000 00011703 66895618            <1> 	mov	[esi+DirEntry_WrtDate], dx
 16001 00011707 66895612            <1> 	mov	[esi+DirEntry_LastAccDate], dx
 16002 0001170B C605[D9840100]02    <1> 	mov	byte [DirBuff_ValidData], 2
 16003                              <1> 	;call	save_directory_buffer
 16004                              <1> 	;retn
 16005                              <1> 	; 23/07/2022
 16006 00011712 E98599FFFF          <1> 	jmp	save_directory_buffer
 16007                              <1> 
 16008                              <1> uflmdt_4:
 16009                              <1> 	; Directory buffer sector read&write
 16010                              <1> 	; 23/10/2016
 16011                              <1> 	; 27/08/2024
 16012                              <1> 	;mov	al, [esi+LD_FATType]
 16013                              <1> uflmdt_5:
 16014 00011717 BB[E49A0100]        <1> 	mov	ebx, rw_buffer ; Common r/w sector buffer addr
 16015                              <1> 
 16016 0001171C 20C0                <1> 	and	al, al ; 0 = Singlix FS
 16017 0001171E 7428                <1> 	jz	short uflmdt_11
 16018                              <1> 
 16019                              <1> ;uflmdt_12:
 16020 00011720 21D2                <1> 	and	edx, edx
 16021 00011722 752B                <1> 	jnz	short uflmdt_9
 16022                              <1> 
 16023 00011724 3C02                <1> 	cmp	al, 2  ; 3 = FAT32
 16024 00011726 7724                <1> 	ja	short uflmdt_8
 16025                              <1> 
 16026 00011728 89F8                <1> 	mov	eax, edi ; directory entry index number
 16027                              <1> 	;shr	ax, 4 ; 16 entries per sector
 16028                              <1> 	; 23/07/2022
 16029 0001172A C1E804              <1> 	shr	eax, 4
 16030 0001172D 034664              <1> 	add	eax, [esi+LD_ROOTBegin]
 16031                              <1> 	; eax = root directory sector
 16032                              <1> uflmdt_6:
 16033 00011730 50                  <1> 	push	eax ; * ; disk sector address
 16034 00011731 51                  <1> 	push	ecx ; first cluster
 16035 00011732 B901000000          <1> 	mov	ecx, 1
 16036                              <1> 	; ecx = sector count
 16037 00011737 E8F8080000          <1> 	call	disk_read
 16038 0001173C 59                  <1> 	pop	ecx
 16039 0001173D 7324                <1> 	jnc	short uflmdt_10
 16040 0001173F 58                  <1> 	pop	eax ; *
 16041                              <1> uflmdt_7:
 16042 00011740 C3                  <1> 	retn
 16043                              <1> 
 16044                              <1> uflmdt_2:
 16045                              <1> 	; save directory buffer if has modified/changed sign
 16046                              <1> 	; (It is good to save dir buff even if the searched
 16047                              <1> 	; directory entry is not found !?)
 16048 00011741 E85699FFFF          <1> 	call	save_directory_buffer
 16049 00011746 F9                  <1> 	stc	; update failed
 16050 00011747 C3                  <1> 	retn
 16051                              <1> 
 16052                              <1> uflmdt_11:
 16053                              <1> 	; 24/10/2016
 16054                              <1> 	; Update last modification date & time of a file
 16055                              <1> 	; on a disk with Singlix File System.
 16056                              <1> 	;
 16057                              <1> 	; (Method: Read the FDT -File Description Table-
 16058                              <1> 	; sector of the file and update the lmdt data fields,
 16059                              <1> 	; then write FDT sector to the disk.
 16060                              <1> 	; /// It is easy but there is compatibility buffer
 16061                              <1> 	; method also for changing directory entry data and
 16062                              <1> 	; also there are some programming issues for Singlix
 16063                              <1> 	; file system (TRFS), which are not completed yet!)
 16064                              <1> 	;
 16065                              <1> 	; Not ready yet ! (24/10/2016)
 16066                              <1> 	; /// Temporary code for error return ! ///
 16067 00011748 31C0                <1> 	xor	eax, eax
 16068 0001174A F9                  <1> 	stc
 16069 0001174B C3                  <1> 	retn
 16070                              <1> 
 16071                              <1> uflmdt_8:
 16072 0001174C 8B5632              <1> 	mov	edx, [esi+LD_BPB+FAT32_RootFClust]
 16073                              <1> uflmdt_9:
 16074 0001174F 83FA02              <1> 	cmp	edx, 2
 16075 00011752 72EC                <1> 	jb	short uflmdt_7 ; invalid, nothing to do
 16076                              <1> 
 16077                              <1> 	;sub	edx, 2
 16078                              <1> 	; 30/07/2022
 16079 00011754 4A                  <1> 	dec	edx
 16080 00011755 4A                  <1> 	dec	edx
 16081 00011756 89D0                <1> 	mov	eax, edx
 16082 00011758 0FB65613            <1> 	movzx	edx, byte [esi+LD_BPB+SecPerClust]
 16083 0001175C F7E2                <1> 	mul	edx
 16084 0001175E 034668              <1> 	add	eax, [esi+LD_DATABegin]
 16085                              <1> 	; eax = sub directory (data) sector
 16086 00011761 EBCD                <1> 	jmp	short uflmdt_6
 16087                              <1> 
 16088                              <1> uflmdt_10:
 16089                              <1> 	; Directory sector buffer is ready here!
 16090                              <1> 	; OF_FCLUSTER must be compared/verified
 16091                              <1> 	; edi = dir entry index number (<= 2047)
 16092 00011763 6683E70F            <1> 	and	di, 0Fh ; 16 entries per sector
 16093                              <1> 	;shl	di, 5 ; dir entry index * 32
 16094                              <1> 	; 23/07/2022
 16095 00011767 C1E705              <1> 	shl	edi, 5
 16096 0001176A 81C7[E49A0100]      <1> 	add	edi, rw_buffer
 16097                              <1> 	;
 16098 00011770 F6470B18            <1> 	test	byte [edi+DirEntry_Attr], 18h ; Vol & Dir
 16099 00011774 75CB                <1> 	jnz	short uflmdt_2 ; not a valid file !
 16100 00011776 668B5714            <1> 	mov	dx, [edi+DirEntry_FstClusHI]
 16101 0001177A C1E210              <1> 	shl	edx, 16
 16102 0001177D 668B571A            <1> 	mov	dx, [edi+DirEntry_FstClusLO]
 16103 00011781 39CA                <1> 	cmp	edx, ecx ; same first cluster ?
 16104 00011783 75BC                <1> 	jne	short uflmdt_2 ; no !?
 16105                              <1> 
 16106                              <1> 	;;;
 16107                              <1> 	; 27/08/2024 
 16108 00011785 21D2                <1> 	and	edx, edx
 16109 00011787 7515                <1> 	jnz	short uflmdt_12 ; not empty file
 16110 00011789 8715[A8890100]      <1> 	xchg	edx, [setfclust]
 16111 0001178F 09D2                <1> 	or	edx, edx
 16112 00011791 740B                <1> 	jz	short uflmdt_12
 16113 00011793 6689571A            <1> 	mov	[edi+DirEntry_FstClusLO], dx
 16114 00011797 C1EA10              <1> 	shr	edx, 16
 16115 0001179A 66895714            <1> 	mov	[edi+DirEntry_FstClusHI], dx
 16116                              <1> uflmdt_12:
 16117                              <1> 	;;;
 16118                              <1> 
 16119                              <1> 	; Update directory entry
 16120 0001179E E86498FFFF          <1> 	call	convert_current_date_time
 16121                              <1> 	; OUTPUT -> DX = Date in dos dir entry format
 16122                              <1>         ; 	    AX = Time in dos dir entry format
 16123 000117A3 66894716            <1> 	mov	[edi+DirEntry_WrtTime], ax
 16124 000117A7 66895718            <1> 	mov	[edi+DirEntry_WrtDate], dx
 16125 000117AB 66895712            <1> 	mov	[edi+DirEntry_LastAccDate], dx
 16126                              <1> 
 16127 000117AF 58                  <1> 	pop	eax ; *
 16128                              <1> 
 16129 000117B0 BB[E49A0100]        <1> 	mov	ebx, rw_buffer ; Common r/w sector buffer addr
 16130 000117B5 B901000000          <1> 	mov	ecx, 1
 16131                              <1> 	; esi = logical dos description table address
 16132                              <1> 	; eax = disk sector number/address (LBA)
 16133                              <1> 	; ecx = sector count
 16134                              <1> 	; ebx = buffer address
 16135 000117BA E866080000          <1> 	call	disk_write
 16136 000117BF 7280                <1> 	jc	short uflmdt_2
 16137                              <1> ;uflmdt_12:
 16138                              <1> 	; save directory buffer if has modified/changed sign
 16139                              <1> 	;call	save_directory_buffer
 16140                              <1> 	;retn
 16141                              <1> 	; 23/07/2022
 16142 000117C1 E9D698FFFF          <1> 	jmp	save_directory_buffer
 16143                              <1> 
 16144                              <1> sysalloc:
 16145                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 16146                              <1> 	; 14/10/2017
 16147                              <1> 	; 20/08/2017 - 01/09/2017
 16148                              <1> 	; 20/02/2017 - 04/03/2017 - 15/05/2017
 16149                              <1> 	; 19/02/2017 - TRDOS 386 (TRDOS v2.0)
 16150                              <1> 	; (TRDOS 386 feature only!)
 16151                              <1> 	;
 16152                              <1> 	; Allocate Contiguous Memory Block/Pages (for user)
 16153                              <1> 	; (System call for DMA Buffer allocation etc.)
 16154                              <1> 	;
 16155                              <1> 	; INPUT ->
 16156                              <1> 	;	EBX = Virtual address (for user)
 16157                              <1> 	;	     (Physical memory block/aperture
 16158                              <1> 	;	     will be mapped to this virtual address)
 16159                              <1> 	;	ECX = Byte Count
 16160                              <1> 	;	     (will be rounded up to page border)
 16161                              <1> 	;	If ECX = 0
 16162                              <1> 	;	    System call will return with an error (cf=1)
 16163                              <1> 	;	    but ECX will contain maximum size of
 16164                              <1> 	;	    available memory aperture and physical
 16165                              <1> 	;	    (beginning) address of that aperture
 16166                              <1> 	;	    (which have maximum size) will be in EAX.
 16167                              <1> 	;	EDX = Upper limit of the requested physical memory
 16168                              <1> 	;	      block/pages.
 16169                              <1> 	;	     (The last byte address of the memory aperture
 16170                              <1> 	;	      must not be equal to or above this limit.)
 16171                              <1> 	;	If EDX = 0
 16172                              <1> 	; 	   there is NOLIMIT !
 16173                              <1> 	;	If EDX = 0FFFFFFFFh (-1)
 16174                              <1> 	;	   ESI = Lower Limit !
 16175                              <1> 	;		(Beginning of the block must not be 'less'
 16176                              <1> 	;		than this.) (Must be equal to or above...)
 16177                              <1> 	;	   EDI = Upper Limit !
 16178                              <1> 	;		(End of the block must be !less! than this)
 16179                              <1> 	;		(The last byte addr of the memory aperture
 16180                              <1> 	;		must not be equal to or above this limit.)
 16181                              <1> 	;
 16182                              <1> 	; OUTPUT ->
 16183                              <1> 	;	If CF = 0
 16184                              <1> 	;	EAX = Physical address of the allocated memory block
 16185                              <1> 	;	ECX = Allocated bytes (as rounded up to page borders)
 16186                              <1> 	;	EBX = Virtual address (as rounded up)
 16187                              <1> 	;	IF CF = 1
 16188                              <1> 	;	    Requested (size of) Memory block could not be
 16189                              <1> 	;	    allocated to the user!
 16190                              <1> 	;	IF CF = 1 & EAX = 0 (Insufficient memory error!)
 16191                              <1> 	;	   ECX = Total number of free bytes
 16192                              <1> 	;	         (not size of available contiguous bytes!)
 16193                              <1> 	;	If CF = 1 & EAX > 0
 16194                              <1> 	;	   there is not a memory aperture with requested size
 16195                              <1> 	;	   but total free mem is not less than requested size.
 16196                              <1> 	;	   EAX = Physical addr of available memory aperture
 16197                              <1> 	;	   	 with max size 
 16198                              <1> 	;	        (but it doesn't fit to the conditions!)
 16199                              <1> 	;	   ECX = Size of available memory aperture in bytes.
 16200                              <1> 	;	If CF = 1 -> EAX = 0FFFFFFFFh
 16201                              <1> 	;	   Conditions/Parameters are wrong !
 16202                              <1> 	;	   ECX is same with input value.
 16203                              <1> 	;
 16204                              <1> 	; Note:	Previously allocated pages will be deallocated if
 16205                              <1> 	;       new allocation conditions are met.
 16206                              <1> 	;
 16207                              <1> 	; Note: u.break control may be included in future versions
 16208                              <1> 	;
 16209                              <1> 
 16210 000117C6 31C0                <1> 	xor	eax, eax ; 0
 16211                              <1> 	; 14/10/2017
 16212 000117C8 4A                  <1> 	dec	edx ; is there a limit ?
 16213 000117C9 7810                <1> 	js	short sysalloc_1 ;  0 -> 0FFFFFFFFh -> NO LIMIT
 16214 000117CB 42                  <1> 	inc	edx ; > 0
 16215                              <1> 	; Check upper address limit
 16216                              <1> 	;(round up to page borders)
 16217 000117CC 81C1FF0F0000        <1> 	add	ecx, PAGE_SIZE-1 ; 4095
 16218 000117D2 6681E100F0          <1> 	and	cx, ~PAGE_OFF ; not 4095
 16219 000117D7 39CA                <1> 	cmp	edx, ecx ; upper limit - block size
 16220 000117D9 7224                <1> 	jb	short sysalloc_err
 16221                              <1> sysalloc_1:
 16222                              <1> 	; EAX = Beginning address (physical)
 16223                              <1> 	; EAX = 0 -> Allocate mem block from the 1st proper aperture
 16224                              <1> 	; ECX = Number of bytes to be allocated
 16225 000117DB E81345FFFF          <1> 	call	allocate_memory_block
 16226 000117E0 721D                <1> 	jc	short sysalloc_err
 16227                              <1> 	; 01/09/2017
 16228 000117E2 29C2                <1> 	sub	edx, eax ; upper limit address - beginning address
 16229 000117E4 760F                <1> 	jna	short sysalloc_3 ; begin addr not less than the limit
 16230 000117E6 39CA                <1> 	cmp	edx, ecx
 16231 000117E8 720B                <1> 	jb	short sysalloc_3 ; end address overs the limit
 16232                              <1> sysalloc_2:	
 16233                              <1> 	; EAX = Beginning (physical) addr of the allocated mem block
 16234                              <1> 	; ECX = Num of allocated bytes (rounded up to page borders) 
 16235 000117EA 50                  <1> 	push	eax ; * ; 04/03/2017
 16236                              <1> 	; Here, requested contiquous memory pages have been allocated
 16237                              <1> 	; on Memory Allocation Table but user's page directory
 16238                              <1> 	; and page tables have not been updated yet!
 16239 000117EB 51                  <1> 	push	ecx ; **
 16240                              <1> 	; ebx = virtual address (will be rounded up to page border)
 16241                              <1> 	; ecx = number of bytes to be deallocated
 16242                              <1> 	;	will be adjusted to ebx+ecx round down - ebx round up
 16243 000117EC E85A48FFFF          <1> 	call	deallocate_user_pages
 16244 000117F1 731F                <1> 	jnc	short sysalloc_4 ; EAX = Deallocated memory bytes
 16245 000117F3 59                  <1> 	pop	ecx ; **
 16246 000117F4 58                  <1> 	pop	eax ; *
 16247                              <1> sysalloc_3:
 16248                              <1> 	; error !
 16249                              <1> 	; restore Memory Allocation Table Content
 16250 000117F5 E81347FFFF          <1> 	call	deallocate_memory_block
 16251 000117FA 31C0                <1> 	xor	eax, eax ; 0
 16252 000117FC 48                  <1> 	dec	eax ; 0FFFFFFFFh ; 15/05/2017
 16253 000117FD EB09                <1> 	jmp	short sysalloc_wrong
 16254                              <1> sysalloc_err:
 16255 000117FF 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
 16256 00011805 894D18              <1> 	mov	[ebp+24], ecx ; return to user with ecx value
 16257                              <1> sysalloc_wrong:
 16258                              <1> 	; eax = 0FFFFFFFFh
 16259 00011808 A3[AC940100]        <1> 	mov	[u.r0], eax
 16260 0001180D E96EB6FFFF          <1> 	jmp	error
 16261                              <1> sysalloc_4:
 16262 00011812 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
 16263 00011818 894518              <1> 	mov	[ebp+24], eax ; return to user with ecx value
 16264 0001181B 895D10              <1> 	mov	[ebp+16], ebx ; new value of ebx (rounded up)
 16265 0001181E 89C1                <1> 	mov	ecx, eax ; byte count (from 'deallocate_user_pages')
 16266 00011820 5A                  <1> 	pop	edx ; ** ; discard (another) byte count
 16267 00011821 58                  <1> 	pop	eax ; *
 16268 00011822 A3[AC940100]        <1> 	mov	[u.r0], eax ; physical address
 16269                              <1> 
 16270 00011827 51                  <1> 	push	ecx ; 20/08/2017
 16271                              <1> 	;
 16272                              <1> 	; Write newly allocated contiguous (physical) pages
 16273                              <1> 	; on page dir and page tables of current user/process
 16274                              <1> 	; as PRESENT, USER, WRITABLE
 16275                              <1> 	; (then clear allocated pages)
 16276 00011828 E80649FFFF          <1> 	call	allocate_user_pages
 16277                              <1> 	;jnc	sysret ; OK! return to process with success...
 16278                              <1> 
 16279                              <1> 	; 20/08/2017 ('sysdma' modification)
 16280 0001182D 59                  <1> 	pop	ecx
 16281 0001182E A1[AC940100]        <1> 	mov	eax, [u.r0]   ; physical address (of the block)
 16282                              <1> 
 16283 00011833 7219                <1> 	jc	short sysalloc_6
 16284                              <1> 
 16285 00011835 833D[70930100]FF    <1> 	cmp	dword [dma_addr], 0FFFFFFFFh ; -1
 16286                              <1> 	;jb	sysret
 16287                              <1> 	; 23/07/2022
 16288 0001183C 720B                <1> 	jb	short sysalloc_5 ; jmp sysret
 16289                              <1> 
 16290 0001183E A3[70930100]        <1> 	mov	[dma_addr], eax ; save dma address for sysdma
 16291 00011843 890D[74930100]      <1> 	mov	[dma_size], ecx ; save dma buff size for sysdma
 16292                              <1> sysalloc_5:
 16293 00011849 E952B6FFFF          <1> 	jmp	sysret
 16294                              <1> 
 16295                              <1> sysalloc_6:
 16296                              <1> 	;
 16297                              <1> 	; unexpected error ! insufficient memory !? conflict !?
 16298                              <1> 	; (!!?there is not a free page for a new page table?!!)
 16299                              <1> 	; We need to terminate process with error message !!!
 16300                              <1> 	;
 16301 0001184E 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
 16302 00011854 8B4D18              <1> 	mov	ecx, [ebp+24] ; byte count
 16303                              <1> 
 16304                              <1> 	; 20/08/2017
 16305                              <1> 	;mov	eax, [u.r0]   ; physical address (of the block)
 16306                              <1> 
 16307                              <1> 	;
 16308                              <1> 	; restore Memory Allocation Table Content
 16309 00011857 E8B146FFFF          <1> 	call	deallocate_memory_block
 16310                              <1> 	;
 16311 0001185C 803D[DE670000]03    <1> 	cmp	byte [CRT_MODE], 3 ; 80x25 text mode?
 16312 00011863 7407                <1> 	je	short sysalloc_7 ; yes
 16313                              <1> 	; Current mode is VGA (or CGA graphics) mode,
 16314                              <1> 	; We need to return to text mode for displaying
 16315                              <1> 	; error message just before 'sysexit'.
 16316 00011865 B003                <1> 	mov	al, 3
 16317 00011867 E8D702FFFF          <1> 	call	_set_mode
 16318                              <1> sysalloc_7:
 16319 0001186C BE[39380100]        <1> 	mov	esi, beep_Insufficient_Memory ; error message
 16320 00011871 E8F454FFFF          <1> 	call	print_msg ; print/display the message
 16321 00011876 B801000000          <1> 	mov	eax, 1 ; ax=1 is needed for 'sysexit' procedure
 16322 0001187B E95EB7FFFF          <1> 	jmp	sysexit ; and terminate the process !
 16323                              <1> 
 16324                              <1> sysdalloc:
 16325                              <1> 	; 19/02/2017 - TRDOS 386 (TRDOS v2.0)
 16326                              <1> 	; (TRDOS 386 feature only!)
 16327                              <1> 	;
 16328                              <1> 	; Deallocate Memory Block/Pages (for user)
 16329                              <1> 	; (Complementary call for sysalloc.)
 16330                              <1> 	;
 16331                              <1> 	; INPUT ->
 16332                              <1> 	;	EBX = Virtual address (for user)
 16333                              <1> 	;	      (will be rounded up to page border)
 16334                              <1> 	;	ECX = Byte Count
 16335                              <1> 	;	     (will be adjusted to page borders)
 16336                              <1> 	;	If ICX = 0
 16337                              <1> 	;	   nothing to do
 16338                              <1> 	;	If EBX + ECX > User's ESP
 16339                              <1> 	;	   nothing to do
 16340                              <1> 	;
 16341                              <1> 	; Note: u.break control may be included in future versions
 16342                              <1> 	;
 16343                              <1> 	; OUTPUT ->
 16344                              <1> 	;	If CF = 0
 16345                              <1> 	;	   EAX = Deallocated memory bytes
 16346                              <1> 	;	   EBX = Virtual address (as rounded up)
 16347                              <1> 	;	IF CF = 1
 16348                              <1> 	;	   EAX = 0
 16349                              <1> 	;
 16350                              <1> 	; Note:	Main purpose of this call is to deallocate/release
 16351                              <1> 	;	previously allocated (physically) contiguous memory
 16352                              <1> 	;	pages but beginning (virtual) address may not be
 16353                              <1> 	;	followed by physically contiguous pages. So, this
 16354                              <1> 	;	system call will deallocate user's virtually
 16355                              <1> 	;	contiguous memory pages. Also, there is not any
 16356                              <1> 	;	objections to use this system call without sysalloc
 16357                              <1> 	;	system call; only possible objection is to lost data
 16358                              <1> 	;	within user's memory space, if the beginning address
 16359                              <1> 	;	and size is not proper.
 16360                              <1> 	;
 16361                              <1> 	; Note: Empty page tables will not be deallocated!!!
 16362                              <1> 	;       (they will be deallocated at process termination)
 16363                              <1> 	;
 16364                              <1> 	; Note: When the program terminates itself or when it is 
 16365                              <1> 	;	terminated by operating system kernel, all allocated
 16366                              <1> 	;	memory pages will be deallocated during termination
 16367                              <1> 	;	stage. So, 'sysdalloc' is not necessary except 
 16368                              <1> 	;	forgiving memory block to other programs/processes.
 16369                              <1> 	;
 16370 00011880 8B15[A4940100]      <1> 	mov	edx, [u.sp]
 16371 00011886 8B420C              <1> 	mov	eax, [edx+12] ; user's stack pointer
 16372 00011889 29C8                <1> 	sub	eax, ecx ; esp - byte count
 16373 0001188B 24FC                <1> 	and	al, 0FCh ; dword alignment
 16374 0001188D 39D8                <1> 	cmp	eax, ebx
 16375 0001188F 7220                <1> 	jb	short sysdalloc_err ; deallocation overlaps with stack
 16376                              <1> 
 16377 00011891 31C0                <1> 	xor	eax, eax
 16378 00011893 21C9                <1> 	and	ecx, ecx
 16379 00011895 7407                <1> 	jz	short sysdalloc_2
 16380                              <1> 	
 16381 00011897 E8AF47FFFF          <1> 	call	deallocate_user_pages
 16382 0001189C 7213                <1> 	jc	short sysdalloc_err
 16383                              <1> 
 16384                              <1> sysdalloc_2:
 16385 0001189E A3[AC940100]        <1> 	mov	[u.r0], eax
 16386 000118A3 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]
 16387 000118A9 895D10              <1> 	mov	[ebp+16], ebx ; new value of ebx
 16388 000118AC E9EFB5FFFF          <1> 	jmp	sysret
 16389                              <1> 
 16390                              <1> sysdalloc_err:
 16391 000118B1 A3[AC940100]        <1> 	mov	[u.r0], eax ; 0
 16392 000118B6 E9C5B5FFFF          <1> 	jmp	error
 16393                              <1> 
 16394                              <1> syscalbac:
 16395                              <1> 	; SYS CALLBACK
 16396                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 16397                              <1> 	; 03/08/2020
 16398                              <1> 	; 16/04/2017
 16399                              <1> 	; 14/04/2017
 16400                              <1> 	; 13/04/2017
 16401                              <1> 	; 28/02/2017
 16402                              <1> 	; 26/02/2017
 16403                              <1> 	; 24/02/2017
 16404                              <1> 	; 21/02/2017 - TRDOS 386 (TRDOS v2.0)
 16405                              <1> 	; (TRDOS 386 feature only!)
 16406                              <1> 	;
 16407                              <1> 	; Link or unlink IRQ callback service to/from user (ring 3)
 16408                              <1> 	;
 16409                              <1> 	; INPUT ->
 16410                              <1> 	;	BL = IRQ number (Hardware interrupt request number)
 16411                              <1> 	;	     (0 t0 15 but IRQ 0,1,2,6,8,14,15 are prohibited)
 16412                              <1> 	;	     IRQ numbers 3,4,5,7,9,10,11,12,13 are valid
 16413                              <1> 	;	     (numbers >15 are invalid)
 16414                              <1> 	;
 16415                              <1> 	;	BH = 0 = Unlink IRQ (in BL) from user (ring 3) service
 16416                              <1> 	;	     1 = Link IRQ by using Signal Response Byte method
 16417                              <1> 	;	     2 = Link IRQ by using Callback service method
 16418                              <1> 	;	     3 = Link IRQ by using Auto Increment S.R.B. method
 16419                              <1> 	;	    >3 = invalid 
 16420                              <1> 	;
 16421                              <1> 	;	CL = Signal Return/Response Byte value
 16422                              <1> 	;
 16423                              <1> 	;	If BH = 3, kernel will put a counter value  ; 03/08/2020
 16424                              <1> 	;	          (into the S.R.B. addr)
 16425                              <1> 	;		  between 0 to 255. (start value = CL+1)
 16426                              <1> 	;
 16427                              <1> 	;	NOTE: counter value, for example: even and odd numbers
 16428                              <1> 	;	      may be used for -audio- DMA buffer switch
 16429                              <1> 	;	      within double buffer method, etc.
 16430                              <1> 	;
 16431                              <1> 	;	EDX = Signal return (Response) byte address
 16432                              <1> 	;	       		  - or -
 16433                              <1> 	;	      Interrupt/Callback service/routine address
 16434                              <1> 	;
 16435                              <1> 	;	      (virtual address in user's memory space)
 16436                              <1> 	;
 16437                              <1> 	; OUTPUT ->
 16438                              <1> 	;	CF = 0 & EAX = 0 -> Successful setting
 16439                              <1> 	;	CF = 1 & EAX > 0 -> IRQ is prohibited or locked
 16440                              <1> 	;			by another process
 16441                              <1> 	;		 eax = ERR_PERM_DENIED -> prohibited or locked
 16442                              <1> 	;		 eax = ERR_INV_PARAMETER -> 
 16443                              <1> 	;		       invalid parameter/option or bad address
 16444                              <1> 	;
 16445                              <1> 	;	NOTE: Timer callbacks are set by using 'systimer'
 16446                              <1> 	;	      system call (IRQ 0, PIT and IRQ 8, RTC)
 16447                              <1> 	;
 16448                              <1> 	;	      Direct keyboard access is performed by using
 16449                              <1> 	;	      Keyboard Interrupt (INT 32h)
 16450                              <1> 	;
 16451                              <1> 	;	      It is prohibited here because:
 16452                              <1> 	;		1) Signal Response Byte method has not advantage
 16453                              <1> 	;		   against INT 32h, function AH = 1. Also,
 16454                              <1> 	;		   keyboard service interrupt will return with
 16455                              <1> 	;		   ascii and scan codes (AL, AH) while
 16456                              <1> 	;		   SRB method has only 1 byte space for ascii code
 16457                              <1> 	;		   or scan code. One byte signal response is used
 16458                              <1> 	;		   for ensuring very simple and very fast
 16459                              <1> 	;		   virtual to physical memory address conversion
 16460                              <1> 	;		   without any memory page crossover risk.
 16461                              <1> 	;		   (Otherwise double page conversion or word
 16462                              <1> 	;		   alignment would be needed.)
 16463                              <1> 	;		2) Badly written user code (callback code)
 16464                              <1> 	;		   can prevent keyboard and timesharing functions
 16465                              <1> 	;		   of the operating system via continuous and long
 16466                              <1> 	;		   keyboard event handling by callback service.
 16467                              <1> 	;		   (It can cause to lose immediate keystroke
 16468                              <1> 	;		   response from hardware to user.)
 16469                              <1> 	;		3) If user will check any keyboard events, 'getkey'
 16470                              <1> 	;		   (or 'getchar') must have more priority than other
 16471                              <1> 	;		   (video etc.) events because only control ability
 16472                              <1> 	;		   on a procedural infinite loop is a keyboard or
 16473                              <1> 	;		   mouse event. So user can use keyboard function
 16474                              <1> 	;		   at the end or at the beginning of a loop.
 16475                              <1> 	;		   In this case, INT 32h is used for that purpose
 16476                              <1> 	;		   and timer interrupt etc. callbacks can be used
 16477                              <1> 	;		   for dynamic and synchronized data refresh/transfer
 16478                              <1> 	;		   while cpu is in a static loop (without polling).
 16479                              <1> 	;		   Keyboard Int callback is not more useful because
 16480                              <1> 	;		   already a manual check (a key is pressed or not)
 16481                              <1> 	;		   can be performed (via INT 32h, AH = 1) efficiently
 16482                              <1> 	;		   in a loop to prevent a locked infinitive loop.
 16483                              <1> 	;
 16484                              <1> 	;	    Disk IRQs (6,14,15) have been phohibited from ring 3 
 16485                              <1> 	;	    callback because, disk operations (file system services
 16486                              <1> 	;	    etc.) are independent from user program, for fast disk r/w.
 16487                              <1> 	;	    They are not more useful at ring 3 while they are in use
 16488                              <1> 	;	    by standard diskio functions which are mandatory part of
 16489                              <1> 	;	    (monolithic) OS kernel and mainprog command interpreter.
 16490                              <1> 	;	    INT 33h diskio functions are enough for user level disk
 16491                              <1> 	;	    r/w.
 16492                              <1> 	;
 16493                              <1> 	; TRDOS 386 - IRQ CALLBACK structures (parameters):
 16494                              <1> 	;	
 16495                              <1> 	;	   [u.irqlock] = 1 word, IRQ flags (0-15) that indicates
 16496                              <1> 	;			which IRQs are locked by (that) user.
 16497                              <1> 	;		        Lock and unlock (by user) will change
 16498                              <1> 	;			these flags or 'terminate process' (sysexit)
 16499                              <1> 	;			will clear these flags and unlock those IRQs.
 16500                              <1> 	;			               
 16501                              <1> 	;		   	Bit 0 is for IRQ 0 and Bit 15 is for IRQ 15
 16502                              <1> 	;
 16503                              <1> 	;	   IRQ(x).owner	 : 1 byte, user, [u.uno], 0 = free (unlocked)
 16504                              <1> 	;
 16505                              <1> 	;	   IRQ(x).method : 1 byte for callback method & status
 16506                              <1> 	;			   0 = Signal Response Byte method
 16507                              <1> 	;			   1 = Callback service method
 16508                              <1> 	;			   >1 = invalid for current 'syscalback'.
 16509                              <1> 	;			or(+) 80h = IRQ is in use by system (ring 0)
 16510                              <1> 	;			            function (audio etc.) or
 16511                              <1> 	;			   	    a device driver.
 16512                              <1> 	;			(system function will ignore the lock/owner)
 16513                              <1> 	;
 16514                              <1> 	;	   IRQ(x).srb	: 1 byte, Signal Return/Response byte value
 16515                              <1> 	;			  (a fixed value by user or a counter value
 16516                              <1> 	;			 from 0 to 255, which is increased by every
 16517                              <1> 	;			 interrupt just before putting it into
 16518                              <1> 	;			 the Signal Response byte address
 16519                              <1> 	;			 (This is not used in callback serv method)
 16520                              <1> 	;
 16521                              <1> 	;	   IRQ(x).addr	: 1 dword
 16522                              <1> 	;			  Signal Response Byte address (physical)
 16523                              <1> 	;			  		-or-
 16524                              <1> 	;			  Callback service address (virtual)
 16525                              <1> 	;
 16526                              <1> 	;	   IRQ(x).dev	: 1 byte
 16527                              <1> 	;			  0 = Default device or kernel function
 16528                              <1> 	;			  		-or-
 16529                              <1> 	;			  1-255 = Assigned device driver number
 16530                              <1> 	;
 16531                              <1> 	;	   (x) = 3,4,5,7,9,10,11,12,13
 16532                              <1> 	;
 16533                              <1> 	;
 16534                              <1> 	;	NOTE: If user's process/program calls the kernel (INT 40h)
 16535                              <1> 	;	      while it is already running in a (ring 3) callback
 16536                              <1> 	;	      service, kernel will force (convert) system call to
 16537                              <1> 	;	      'sysrele' (sys release). So, this feature provides
 16538                              <1> 	;	      easy and simple usage of callback services without
 16539                              <1> 	;	      falling into deepless <please 'callback me' then 
 16540                              <1> 	;	      let me 'callback you'> cycles! (User must return
 16541                              <1> 	;	      from callback service by using 'sysrele' system
 16542                              <1> 	;	      call, without a significant delay. Otherwise user
 16543                              <1> 	;	      process/program may be late to catch the next event
 16544                              <1> 	;	      within same callback purpose.
 16545                              <1> 	;
 16546                              <1> 
 16547 000118BB 30C0                <1> 	xor	al, al ; the caller is 'syscalbac' sign/flag
 16548 000118BD E801160000          <1>  	call	set_irq_callback_service
 16549                              <1> 	; 16/04/2017
 16550 000118C2 A3[AC940100]        <1> 	mov	[u.r0], eax
 16551                              <1> 	;jnc	sysret
 16552                              <1> 	; 23/07/2022
 16553 000118C7 7205                <1> 	jc	short syscalbac_err
 16554 000118C9 E9D2B5FFFF          <1> 	jmp	sysret
 16555                              <1> syscalbac_err:
 16556 000118CE A3[18950100]        <1> 	mov	dword [u.error], eax
 16557 000118D3 E9A8B5FFFF          <1> 	jmp	error
 16558                              <1> 
 16559                              <1> sysfpstat:
 16560                              <1> 	; 28/02/2017 - TRDOS 386 (TRDOS v2.0)
 16561                              <1> 	; (TRDOS 386 feature only!)
 16562                              <1> 	;
 16563                              <1> 	; Set or reset FPU registers save/restore option (for user)
 16564                              <1> 	;	       (during software task switching, wswap-rswap)
 16565                              <1> 	;
 16566                              <1> 	; INPUT ->
 16567                              <1> 	;	BL = 0 -> reset
 16568                              <1> 	;	BL = 1 -> set (FPU register will be saved and restored)
 16569                              <1> 	;	
 16570                              <1> 	; OUTPUT ->
 16571                              <1> 	;	cf = 0 -> no error, FPU is ready...
 16572                              <1> 	;		  (EAX = 0)
 16573                              <1> 	;	Cf = 1 -> error, 80387 FPU is not ready !
 16574                              <1> 	;		  (EAX = 0FFFFFFFFh)
 16575                              <1> 
 16576 000118D8 31C0                <1> 	xor	eax, eax
 16577 000118DA 803D[B8890100]00    <1> 	cmp	byte [fpready], 0
 16578 000118E1 7613                <1> 	jna	short sysfpstat_err
 16579                              <1> 
 16580 000118E3 80E301              <1> 	and	bl, 1 ; use BIT 0 only !
 16581 000118E6 881D[2B950100]      <1> 	mov	[u.fpsave], bl
 16582 000118EC A3[AC940100]        <1> 	mov	[u.r0], eax ; 0
 16583 000118F1 E9AAB5FFFF          <1> 	jmp	sysret
 16584                              <1> 
 16585                              <1> sysfpstat_err:
 16586 000118F6 48                  <1> 	dec 	eax ; 0FFFFFFFFh
 16587 000118F7 A3[AC940100]        <1> 	mov 	[u.r0], eax ; -1
 16588 000118FC E97FB5FFFF          <1> 	jmp 	error
 16589                              <1> 
 16590                              <1> sysdelete: ; Delete (Remove, Unlink) File
 16591                              <1> 	; 29/12/2017 (TRDOS 386 = TRDOS v2.0) 
 16592                              <1> 	;	
 16593                              <1>         ; INPUT ->
 16594                              <1>         ;          EBX = File name (ASCIIZ string) address
 16595                              <1> 	; OUTPUT ->
 16596                              <1> 	;          cf = 0 -> eax = 0
 16597                              <1> 	;          cf = 1 -> Error code in AL
 16598                              <1> 	;
 16599                              <1> 	; Modified Registers: EAX (at the return of system call)
 16600                              <1> 	;
 16601                              <1> 
 16602 00011901 89DE                <1> 	mov	esi, ebx
 16603                              <1> 	; file name is forced, change directory as temporary
 16604                              <1> 	;mov	ax, 1
 16605                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset
 16606                              <1> 	;call	set_working_path 
 16607 00011903 E80E0A0000          <1> 	call	set_working_path_x
 16608 00011908 731D                <1> 	jnc	short sysdelete_1
 16609                              <1> 
 16610 0001190A 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!
 16611 0001190C 7505                <1> 	jnz	short sysdelete_err
 16612                              <1> 	; eax = 0
 16613                              <1> sysdelete_path_err:
 16614 0001190E B813000000          <1> 	mov	eax, ERR_INV_PATH_NAME ; 'bad path name !'
 16615                              <1> sysdelete_err:
 16616 00011913 A3[AC940100]        <1> 	mov	[u.r0], eax
 16617 00011918 A3[18950100]        <1> 	mov	[u.error], eax
 16618 0001191D E8C90A0000          <1> 	call 	reset_working_path
 16619 00011922 E959B5FFFF          <1> 	jmp	error
 16620                              <1> sysdelete_1:
 16621                              <1> 	;mov	esi, FindFile_Name
 16622 00011927 66B80018            <1> 	mov	ax, 1800h ; Only files
 16623 0001192B E83A72FFFF          <1> 	call	find_first_file
 16624 00011930 72E1                <1> 	jc	short sysdelete_err
 16625                              <1> sysdelete_2:
 16626                              <1> 	; check file attributes
 16627                              <1> 
 16628                              <1> 	;test	bl, 17 ; system, hidden, readonly, directory
 16629 00011932 F6C307              <1>         test	bl, 7 ; system, hidden, readonly 
 16630 00011935 7407                <1>         jz	short sysdelete_3
 16631                              <1> 
 16632 00011937 B80B000000          <1>         mov	eax, ERR_FILE_ACCESS ; 11 = 'permission denied !'
 16633 0001193C EBD5                <1>         jmp	short sysdelete_err
 16634                              <1> sysdelete_3:
 16635 0001193E 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
 16636 00011941 7407                <1> 	jz	short sysdelete_4
 16637 00011943 B81A000000          <1> 	mov	eax, ERR_INV_FILE_NAME ; 26 = 'invalid file name !'
 16638 00011948 EBC9                <1>         jmp	short sysdelete_err
 16639                              <1> sysdelete_4:
 16640                              <1> 	;mov	bh, [LongName_EntryLength]
 16641 0001194A 883D[1A870100]      <1> 	mov	[DelFile_LNEL], bh ; Long name entry length (if > 0)
 16642                              <1> 	; edi = Directory Entry Offset (DirBuff)
 16643                              <1> 	; esi = Directory Entry (FFF Structure)
 16644 00011950 E8799AFFFF          <1> 	call	remove_file
 16645 00011955 72BC                <1> 	jc	short sysdelete_err
 16646                              <1> sysrmdir_5:
 16647 00011957 31C0                <1> 	xor	eax, eax ; 0
 16648 00011959 A3[AC940100]        <1> 	mov	[u.r0], eax
 16649                              <1> 	;mov	[u.error], eax
 16650 0001195E E8880A0000          <1> 	call 	reset_working_path
 16651 00011963 E938B5FFFF          <1> 	jmp	sysret
 16652                              <1> 
 16653                              <1> sysrmdir: ; Remove (Unlink) Directory
 16654                              <1> 	; 17/07/2025 - TRDOS 386 v2.0.10
 16655                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 16656                              <1> 	; 19/01/2021
 16657                              <1> 	; 29/12/2017 (TRDOS 386 = TRDOS v2.0)
 16658                              <1> 	;
 16659                              <1>         ; INPUT ->
 16660                              <1>         ;          EBX = Pointer to directory name
 16661                              <1> 	; OUTPUT ->
 16662                              <1> 	;          cf = 0 -> eax = 0
 16663                              <1> 	;          cf = 1 -> Error code in AL
 16664                              <1> 	;
 16665                              <1> 	; Modified Registers: EAX (at the return of system call)
 16666                              <1> 	;
 16667                              <1> 
 16668                              <1> 	; 19/01/2021
 16669 00011968 803D[FE940100]00    <1> 	cmp	byte [u.uid], 0  ; root (super user) ?
 16670 0001196F 7614                <1> 	jna	short sysrmdir_0
 16671                              <1> 
 16672                              <1> 	;mov	dword [u.r0], ERR_PERM_DENIED
 16673 00011971 B80B000000          <1> 	mov	eax, ERR_PERM_DENIED ; ERR_NOT_SUPERUSER
 16674 00011976 A3[AC940100]        <1> 	mov	[u.r0], eax
 16675 0001197B A3[18950100]        <1> 	mov	[u.error], eax
 16676 00011980 E9FBB4FFFF          <1> 	jmp	error
 16677                              <1> 
 16678                              <1> sysrmdir_0:
 16679 00011985 89DE                <1> 	mov	esi, ebx
 16680                              <1> 
 16681                              <1> 	;;;;
 16682                              <1> 	; 17/07/2025 - TRDOS 386 v2.0.10
 16683 00011987 A0[B27D0100]        <1> 	mov	al, [Current_Drv]
 16684 0001198C A2[58870100]        <1> 	mov	[rmdir_drv], al
 16685 00011991 A1[AC7D0100]        <1> 	mov	eax, [Current_Dir_FCluster]
 16686 00011996 A3[54870100]        <1> 	mov	[rmdir_dir_fcluster], eax
 16687                              <1> 	;;;;
 16688                              <1> 
 16689                              <1> 	; file name is forced, change directory as temporary
 16690                              <1> 	;mov	ax, 1
 16691                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset
 16692                              <1> 	;call	set_working_path 
 16693 0001199B E876090000          <1> 	call	set_working_path_x
 16694 000119A0 7308                <1> 	jnc	short sysrmdir_1
 16695                              <1> 
 16696 000119A2 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!
 16697 000119A4 7513                <1> 	jnz	short sysrmdir_err
 16698                              <1> 	; eax = 0
 16699                              <1> sysrmdir_not_found:
 16700                              <1> 	;mov	eax, ERR_DIR_NOT_FOUND ; Directory not found !
 16701                              <1> 	; 23/07/2022
 16702 000119A6 B00C                <1> 	mov	al, ERR_DIR_NOT_FOUND
 16703 000119A8 EB0F                <1> 	jmp	short sysrmdir_err
 16704                              <1> ;sysrmdir_err:
 16705                              <1> ;	mov	[u.r0], eax
 16706                              <1> ;	mov	[u.error], eax
 16707                              <1> ;	call 	reset_working_path
 16708                              <1> ;	jmp	error
 16709                              <1> sysrmdir_1:
 16710                              <1> 	;mov	esi, FindFile_Name
 16711 000119AA 66B81008            <1> 	mov	ax, 0810h ; Only directories
 16712 000119AE E8B771FFFF          <1> 	call	find_first_file
 16713 000119B3 7318                <1> 	jnc	short sysrmdir_2
 16714                              <1> 
 16715                              <1> 	; eax = 2 (File not found !)
 16716 000119B5 3C02                <1> 	cmp	al, 2 ; ERR_NOT_FOUND
 16717 000119B7 74ED                <1> 	je	short sysrmdir_not_found
 16718                              <1> 	;jmp	short sysrmdir_err
 16719                              <1> 	; 23/07/2022
 16720                              <1> sysrmdir_err:
 16721 000119B9 A3[AC940100]        <1> 	mov	[u.r0], eax
 16722 000119BE A3[18950100]        <1> 	mov	[u.error], eax
 16723                              <1> sysrmdir_8:	; 23/07/2022
 16724 000119C3 E8230A0000          <1> 	call 	reset_working_path
 16725 000119C8 E9B3B4FFFF          <1> 	jmp	error
 16726                              <1> sysrmdir_2:
 16727                              <1> 	; check directory attributes
 16728                              <1> 
 16729 000119CD F6C307              <1>         test	bl, 7 ; system, hidden, readonly
 16730 000119D0 7407                <1>         jz	short sysrmdir_3
 16731                              <1> 
 16732 000119D2 B80B000000          <1>         mov	eax, ERR_DIR_ACCESS ; 11 = 'permission denied !'
 16733 000119D7 EBE0                <1>         jmp	short sysrmdir_err
 16734                              <1> sysrmdir_3:
 16735 000119D9 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
 16736 000119DC 7407                <1> 	jz	short sysrmdir_4
 16737                              <1> 	;mov	eax, ERR_NOT_DIR ; 'not a valid directory !'
 16738 000119DE B813000000          <1> 	mov	eax, ERR_INV_PATH_NAME ; 'bad path name !'
 16739 000119E3 EBD4                <1>         jmp	short sysrmdir_err
 16740                              <1> sysrmdir_4:
 16741                              <1> 	;mov	bh, [LongName_EntryLength]
 16742 000119E5 883D[1A870100]      <1> 	mov	[DelFile_LNEL], bh ; Long name entry length (if > 0)
 16743                              <1> 	; edi = Directory Entry Offset (DirBuff)
 16744                              <1> 	; esi = Directory Entry (FFF Structure)
 16745 000119EB E82C78FFFF          <1> 	call	delete_sub_directory
 16746                              <1> 	;jnc	sysrmdir_5
 16747                              <1> 	; 23/07/2022
 16748 000119F0 7205                <1> 	jc	short sysrmdir_6
 16749 000119F2 E960FFFFFF          <1> 	jmp	sysrmdir_5
 16750                              <1> 
 16751                              <1> ;	jc	short sysrmdir_6
 16752                              <1> ;
 16753                              <1> ;	xor	eax, eax ; 0
 16754                              <1> ;sysrmdir_5:
 16755                              <1> ;	mov	[u.r0], eax
 16756                              <1> ;	;mov	[u.error], eax
 16757                              <1> ;	call 	reset_working_path
 16758                              <1> ;	jmp	sysret
 16759                              <1> 
 16760                              <1> sysrmdir_6:
 16761 000119F7 A3[AC940100]        <1> 	mov	[u.r0], eax
 16762 000119FC A3[18950100]        <1> 	mov	[u.error], eax
 16763                              <1> 
 16764 00011A01 09C0                <1> 	or	eax, eax ; EAX = 0 -> Directory not empty!
 16765 00011A03 7414                <1> 	jz	short sysrmdir_9
 16766                              <1> 
 16767                              <1> 	; EAX > 0 -> Error code in AL (or AX or EAX)
 16768                              <1> 
 16769 00011A05 833D[CE840100]01    <1> 	cmp	dword [FAT_ClusterCounter], 1
 16770 00011A0C 72B5                <1> 	jb	short sysrmdir_8
 16771                              <1> sysrmdir_7:
 16772                              <1> 	; ESI = Logical DOS Drive Description Table address
 16773 00011A0E 66BB00FF            <1> 	mov	bx, 0FF00h ; BH = FFh -> use ESI for Drive parameters
 16774                              <1> 	           ; BL = 0 -> Recalculate free cluster count
 16775 00011A12 E849AFFFFF          <1> 	call	calculate_fat_freespace	
 16776                              <1> 	; 23/07/2022
 16777 00011A17 EBAA                <1> 	jmp	short sysrmdir_8
 16778                              <1> ;sysrmdir_8:
 16779                              <1> ;	call 	reset_working_path
 16780                              <1> ;	jmp	error
 16781                              <1> 
 16782                              <1> sysrmdir_9:
 16783 00011A19 A1[CE840100]        <1> 	mov	eax, [FAT_ClusterCounter]
 16784 00011A1E 09C0                <1> 	or	eax, eax ; 0 ?
 16785                              <1> 	;jz	short sysrmdir_err
 16786                              <1> 	; 23/07/2022
 16787 00011A20 74A1                <1> 	jz	short sysrmdir_8
 16788                              <1> 
 16789                              <1> 	; ESI = Logical DOS Drive Description Table address
 16790 00011A22 66BB01FF            <1> 	mov	bx, 0FF01h ; BH = FFh -> use ESI for Drive parameters
 16791                              <1> 	           ; BL = 1 -> add free clusters
 16792 00011A26 E835AFFFFF          <1> 	call	calculate_fat_freespace
 16793 00011A2B 09C9                <1> 	or	ecx, ecx
 16794 00011A2D 7494                <1>         jz	short sysrmdir_8 ; ecx = 0 -> OK
 16795                              <1> 	; ecx > 0 -> Error (Recalculation is needed)
 16796 00011A2F EBDD                <1> 	jmp	short sysrmdir_7
 16797                              <1> 
 16798                              <1> syschdir: ; Change Current (Working) Drive & Directory (for user)
 16799                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0) 
 16800                              <1> 	;
 16801                              <1>         ; INPUT ->
 16802                              <1>         ;          EBX = Directory name (ASCIIZ string) address
 16803                              <1> 	; OUTPUT ->
 16804                              <1> 	;          cf = 0 -> eax = 0
 16805                              <1> 	;          cf = 1 -> Error code in AL
 16806                              <1> 	;
 16807                              <1> 	; Modified Registers: EAX (at the return of system call)
 16808                              <1> 	;
 16809                              <1> 	; NOTE: If drive name is not included, only the working
 16810                              <1> 	; directory (for user, not for drive/OS) will be chanded.
 16811                              <1> 	; If there is a drive name (as A:, B:, C:, D: etc.)
 16812                              <1> 	; at the beginning of the ASCIIZ (directory) string,
 16813                              <1> 	; working drive and working directory (for user) 
 16814                              <1> 	; will be changed together.
 16815                              <1> 	; (When the program is terminated, MainProg -internal
 16816                              <1> 	; shell- will reset working directory to the previous
 16817                              <1> 	; -current- logical drive's current directory again.)
 16818                              <1> 
 16819 00011A31 89DE                <1> 	mov	esi, ebx
 16820                              <1> 	; file name is not forced, change directory as temporary
 16821 00011A33 31C0                <1> 	xor	eax, eax
 16822                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset
 16823                              <1> 	;call	set_working_path 
 16824 00011A35 E8E0080000          <1> 	call	set_working_path_xx
 16825 00011A3A 731D                <1> 	jnc	short syschdir_ok
 16826 00011A3C 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!
 16827 00011A3E 7505                <1> 	jnz	short syschdir_err
 16828                              <1> 	; eax = 0
 16829                              <1> syschdir_not_found:
 16830 00011A40 B80C000000          <1> 	mov	eax, ERR_DIR_NOT_FOUND ; Directory not found !
 16831                              <1> syschdir_err:
 16832 00011A45 A3[AC940100]        <1> 	mov	[u.r0], eax
 16833 00011A4A A3[18950100]        <1> 	mov	[u.error], eax
 16834 00011A4F E897090000          <1> 	call 	reset_working_path
 16835 00011A54 E927B4FFFF          <1> 	jmp	error
 16836                              <1> syschdir_ok:
 16837 00011A59 31C0                <1> 	xor	eax, eax ; 0
 16838 00011A5B A3[AC940100]        <1> 	mov	[u.r0], eax
 16839                              <1> 	;mov	[u.error], eax
 16840 00011A60 E93BB4FFFF          <1> 	jmp	sysret
 16841                              <1> 
 16842                              <1> 
 16843                              <1> syschmod: ; Get & Change File (or Directory) Attributes
 16844                              <1> 	; 26/09/2024 - TRDOS 386 v2.0.9
 16845                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 16846                              <1> 	; 19/01/2021
 16847                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0) 
 16848                              <1> 	;
 16849                              <1>         ; INPUT ->
 16850                              <1>         ;          EBX = File/Directory (ASCIIZ) name address
 16851                              <1> 	;	    CL = New attributes (if CL < 40h)
 16852                              <1> 	;	    CL >= 40h -> Get File Attributes
 16853                              <1> 	; OUTPUT ->
 16854                              <1> 	;          cf = 0 -> EAX = File attributes (in AL)
 16855                              <1> 	;          cf = 1 -> Error code in AL
 16856                              <1> 	;
 16857                              <1> 	; Modified Registers: EAX (at the return of system call)
 16858                              <1> 	;
 16859                              <1> 	; MSDOS File Attributes:    (bit value of attrib byte)
 16860                              <1> 	;	ATTR_READ_ONLY	=	01h  (bit 0, 'R')
 16861                              <1> 	;	ATTR_HIDDEN	=	02h  (bit 1, 'H')
 16862                              <1> 	;	ATTR_SYSTEM	=	04h  (bit 2, 'S')
 16863                              <1> 	;	ATTR_VOLUME_ID	=	08h  (bit 3)
 16864                              <1> 	;	ATTR_DIRECTORY	=	10h  (bit 4)
 16865                              <1> 	;	ATTR_ARCHIVE	=	20h  (bit 5, 'A')
 16866                              <1> 	;	ATTR_LONG_NAME	=	ATTR_READONLY |
 16867                              <1> 	;				ATTR_HIDDEN |
 16868                              <1> 	;				ATTR_SYSTEM |
 16869                              <1> 	;				ATTR_VOLUME_ID
 16870                              <1> 	;	The upper two bits of attributes must be 0.
 16871                              <1> 
 16872                              <1> 	; Note:	* If ATTR_DIRECTORY is set, only directory names
 16873                              <1> 	;	  will be searched (and S,H,R,A attributeds of
 16874                              <1> 	;	  the directory will be changed.)
 16875                              <1> 	;	* If ATTR_VOLUME_ID is set, 'syschmod' system call
 16876                              <1> 	;	  will return with 'permission denied' error.
 16877                              <1> 	;	* If ATTR_DIRECTORY is not set, only file names
 16878                              <1> 	;	  will be searched (and S,H,R,A attributes of the
 16879                              <1> 	;	  file will be changed.)
 16880                              <1> 	;
 16881                              <1> 	; (Ony Super User can change S,H,R attributes.)
 16882                              <1> 
 16883 00011A65 80F940              <1> 	cmp	cl, 40h
 16884 00011A68 7327                <1> 	jnb	short syschmod_0
 16885                              <1> 
 16886 00011A6A F6C108              <1> 	test	cl, 08h ; ATTR_VOLUME_ID
 16887 00011A6D 750E                <1> 	jnz	short syschmod_perm_err
 16888                              <1> 
 16889                              <1> 	; 19/01/2021
 16890 00011A6F 803D[FE940100]00    <1> 	cmp	byte [u.uid], 0  ; root (super user) ?
 16891 00011A76 7619                <1> 	jna	short syschmod_0
 16892                              <1> 
 16893                              <1> 	; Not super user..
 16894 00011A78 F6C107              <1> 	test	cl, 07h	; S,H,R attributes
 16895 00011A7B 7414                <1> 	jz	short syschmod_0
 16896                              <1> 
 16897                              <1> syschmod_perm_err:
 16898                              <1> 	;mov	dword [u.r0], ERR_PERM_DENIED
 16899 00011A7D B80B000000          <1> 	mov	eax, ERR_PERM_DENIED ; 'permission denied !'
 16900 00011A82 A3[AC940100]        <1> 	mov	[u.r0], eax
 16901 00011A87 A3[18950100]        <1> 	mov	[u.error], eax
 16902 00011A8C E9EFB3FFFF          <1> 	jmp	error
 16903                              <1> 
 16904                              <1> syschmod_0:
 16905 00011A91 880D[6C870100]      <1> 	mov	[Attributes], cl
 16906 00011A97 89DE                <1> 	mov	esi, ebx
 16907                              <1> 	; file name is forced, change directory as temporary
 16908                              <1> 	;mov	ax, 1
 16909                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset
 16910                              <1> 	;call	set_working_path 
 16911 00011A99 E878080000          <1> 	call	set_working_path_x
 16912 00011A9E 7308                <1> 	jnc	short syschmod_1
 16913 00011AA0 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!
 16914 00011AA2 751E                <1> 	jnz	short syschmod_err
 16915                              <1> 	; eax = 0
 16916                              <1> syschmod_path_not_found:
 16917                              <1> 	;mov	eax, ERR_INV_PATH_NAME ; 'Bad path name !'
 16918                              <1> 	; 23/07/2022
 16919 00011AA4 B013                <1> 	mov	al, ERR_INV_PATH_NAME
 16920                              <1> ;syschmod_err:
 16921                              <1> 	;mov	[u.r0], eax
 16922                              <1> 	;mov	[u.error], eax
 16923                              <1> 	;call 	reset_working_path
 16924                              <1> 	;jmp	error
 16925                              <1> 	; 23/07/2022
 16926 00011AA6 EB1A                <1> 	jmp	short syschmod_err
 16927                              <1> syschmod_1:
 16928 00011AA8 B008                <1> 	mov	al, 08h ; Except volume labels (& long names)
 16929 00011AAA A0[6C870100]        <1> 	mov	al, [Attributes]
 16930 00011AAF 2410                <1> 	and	al, 10h ;
 16931                              <1> 	;mov	esi, FindFile_Name
 16932                              <1> 	;mov	ax, 1800h ; Only files
 16933                              <1> 	;mov	ax, 0810h ; Only directories
 16934 00011AB1 E8B470FFFF          <1> 	call	find_first_file
 16935                              <1> 	;jnc	short syschmod_2
 16936 00011AB6 720A                <1> 	jc	short syschmod_err
 16937                              <1> 
 16938                              <1> 	;; eax = 2 (File not found !)
 16939                              <1> 	;cmp	al, 2 ; ERR_NOT_FOUND
 16940                              <1> 	;jne	short syschmod_err
 16941                              <1> 
 16942                              <1> 	;and	byte [Attributes], 10h
 16943                              <1> 	;jz	short syschmod_err
 16944                              <1> 
 16945                              <1> 	;; Directory not found !
 16946                              <1> 	;mov	al, 3 ; ERR_PATH_NOT_FOUND
 16947                              <1> 	;jmp	short syschmod_err
 16948                              <1> 
 16949                              <1> syschmod_2:
 16950 00011AB8 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
 16951 00011ABB 7419                <1> 	jz	short syschmod_3
 16952 00011ABD B81A000000          <1> 	mov	eax, ERR_INV_FILE_NAME ; 'invalid file name !'
 16953                              <1>         ;jmp	short syschmod_err
 16954                              <1> syschmod_err:
 16955 00011AC2 A3[AC940100]        <1> 	mov	[u.r0], eax
 16956 00011AC7 A3[18950100]        <1> 	mov	[u.error], eax
 16957 00011ACC E81A090000          <1> 	call 	reset_working_path
 16958 00011AD1 E9AAB3FFFF          <1> 	jmp	error
 16959                              <1> syschmod_3:
 16960                              <1> 	; EDI = Directory buffer entry offset/address
 16961                              <1> 	; BL = File (or Directory) Attributes
 16962                              <1> 	; mov	bl, [EDI+0Bh]
 16963                              <1> 
 16964                              <1> 	; check directory attributes
 16965 00011AD6 8A3D[6C870100]      <1> 	mov	bh, [Attributes] ; new attributes
 16966 00011ADC 80FF40              <1> 	cmp	bh, 40h  ;>=40 -> get file/directory attributes
 16967 00011ADF 732D                <1> 	jnb	short syschmod_6
 16968                              <1> 
 16969                              <1> 	; set file/directory attributes
 16970 00011AE1 F6C307              <1> 	test	bl, 7 ; system, hidden, readonly
 16971 00011AE4 7409                <1>         jz	short syschmod_4
 16972                              <1> 
 16973                              <1> 	; 19/01/2021
 16974 00011AE6 803D[FE940100]00    <1> 	cmp	byte [u.uid], 0  ; root (super user) ?
 16975 00011AED 778E                <1> 	ja	short syschmod_perm_err
 16976                              <1> syschmod_4:
 16977 00011AEF 66817F0CA101        <1> 	cmp	word [edi+DirEntry_NTRes], 01A1h ; Singlix FS
 16978 00011AF5 7424                <1> 	je	short syschmod_7
 16979                              <1> 
 16980 00011AF7 887F0B              <1> 	mov	[edi+0Bh], bh    ; Attributes (New!)
 16981                              <1> 
 16982 00011AFA C605[D9840100]02    <1> 	mov	byte [DirBuff_ValidData], 2 ; modified sign
 16983                              <1> 					    ; to force write
 16984 00011B01 E89695FFFF          <1> 	call 	save_directory_buffer
 16985 00011B06 72BA                <1> 	jc	short syschmod_err
 16986                              <1> 
 16987                              <1> syschmod_5:
 16988 00011B08 8A1D[6C870100]      <1> 	mov	bl, [Attributes]
 16989                              <1> syschmod_6:
 16990 00011B0E 0FB6C3              <1> 	movzx	eax, bl
 16991 00011B11 A3[AC940100]        <1> 	mov	[u.r0], eax
 16992                              <1> 	;mov	dword [u.error], 0
 16993 00011B16 E985B3FFFF          <1> 	jmp	sysret
 16994                              <1> 
 16995                              <1> syschmod_7:
 16996 00011B1B 29C0                <1> 	sub	eax, eax
 16997 00011B1D 8A25[D7840100]      <1>         mov     ah, [DirBuff_DRV]
 16998                              <1> 	; 26/09/2024 (BugFix)
 16999 00011B23 80EC41              <1> 	sub	ah, 'A'
 17000 00011B26 BE00010900          <1> 	mov	esi, Logical_DOSDisks
 17001 00011B2B 01C6                <1>         add     esi, eax
 17002 00011B2D 807E04A1            <1>         cmp     byte [esi+LD_FSType], 0A1h
 17003 00011B31 7304                <1> 	jnc	short syschmod_8
 17004 00011B33 B01D                <1> 	mov	al, ERR_INV_DATA ; 29 = Invalid Data
 17005 00011B35 EB8B                <1> 	jmp	short syschmod_err
 17006                              <1> 
 17007                              <1> syschmod_8:
 17008                              <1> 	; BH = New MS-DOS File Attributes
 17009 00011B37 88F8                <1> 	mov	al, bh ; File/Directory Attributes
 17010 00011B39 30E4                <1> 	xor	ah, ah ; Attributes in MS-DOS format sign
 17011 00011B3B E83781FFFF          <1> 	call	change_fs_file_attributes
 17012                              <1> 	;jc	syschmod_err
 17013                              <1> 	;jmp	short syschmod_5
 17014                              <1> 	; 23/07/2022
 17015 00011B40 73C6                <1> 	jnc	short syschmod_5
 17016 00011B42 E97BFFFFFF          <1> 	jmp	syschmod_err ; 26/09/2024 
 17017                              <1> 
 17018                              <1> 
 17019                              <1> sysdrive: ; Get/Set Current (Working) Drive (for user)
 17020                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0) 
 17021                              <1> 	;	
 17022                              <1>         ; INPUT ->
 17023                              <1>         ;          BL = Logical DOS Drive number (0=A: ... 2=C:)
 17024                              <1> 	;	   If BL = 0FFh -> Get Current Drive
 17025                              <1> 	; OUTPUT ->
 17026                              <1> 	;          cf = 0 -> 
 17027                              <1> 	;		   AL = Current Drive number
 17028                              <1> 	;		   AH = The Last Logical DOS Drive no.
 17029                              <1> 	;          cf = 1 -> Error code in AL
 17030                              <1> 	;
 17031                              <1> 	; Modified Registers: EAX (at the return of system call)
 17032                              <1> 	;
 17033                              <1> 	; NOTE: If the requested logical dos drive is ready, 
 17034                              <1> 	;	it's current current directory will be the user's
 17035                              <1> 	;	(program's) current directory.
 17036                              <1> 	;	(When the program is terminated, MainProg -internal
 17037                              <1> 	;	shell- will reset the previous -current- logical drive
 17038                              <1> 	;       as current drive again).
 17039                              <1> 
 17040 00011B47 80FBFF              <1> 	cmp	bl, 0FFh
 17041 00011B4A 7435                <1> 	je	short sysdrive_ok
 17042 00011B4C 3A1D[CE340100]      <1> 	cmp	bl, [Last_DOS_DiskNo]
 17043 00011B52 771E                <1> 	ja	short sysdrive_err
 17044                              <1> 
 17045                              <1> 	; Save current drive and reset mode
 17046                              <1> 	; for 'reset_working_path' procedure (for MainProg)
 17047 00011B54 30C0                <1> 	xor	al, al
 17048 00011B56 66A3[B4890100]      <1> 	mov	[SWP_Mode], ax ; ah = 0
 17049 00011B5C A0[B27D0100]        <1> 	mov	al, [Current_Drv]
 17050 00011B61 FEC4                <1> 	inc	ah ; mov ah, 1
 17051 00011B63 66A3[B6890100]      <1> 	mov	[SWP_DRV], ax 
 17052                              <1> 
 17053 00011B69 88DA                <1> 	mov	dl, bl
 17054 00011B6B E80D5DFFFF          <1> 	call	change_current_drive
 17055 00011B70 730F                <1> 	jnc	short sysdrive_ok
 17056                              <1> sysdrive_err:
 17057 00011B72 C705[AC940100]0F00- <1> 	mov	dword [u.r0], ERR_DRV_NOT_RDY ; 'drive not ready !'
 17057 00011B7A 0000                <1>
 17058 00011B7C E9FFB2FFFF          <1> 	jmp	error
 17059                              <1> sysdrive_ok:
 17060 00011B81 A0[B27D0100]        <1> 	mov	al, [Current_Drv]
 17061 00011B86 8A25[CE340100]      <1> 	mov	ah, [Last_DOS_DiskNo]
 17062 00011B8C A3[AC940100]        <1> 	mov	[u.r0], eax
 17063 00011B91 E90AB3FFFF          <1> 	jmp	sysret
 17064                              <1> 
 17065                              <1> sysdir: ; Get Current (Working) Drive & Directory (for user)
 17066                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0)
 17067                              <1> 	;
 17068                              <1>         ; INPUT ->
 17069                              <1>         ;          EBX = Current directory name buffer address
 17070                              <1> 	;		(Buffer length = 92 bytes)
 17071                              <1> 	; OUTPUT ->
 17072                              <1> 	;          AL = Current drive (0=A: .. 2=C:)
 17073                              <1> 	;	   If CF = 1 -> AL = error code
 17074                              <1> 	;
 17075                              <1> 	; Modified Registers: EAX (at the return of system call)
 17076                              <1> 	;
 17077                              <1> 	; Note: Required directory name buffer length may be
 17078                              <1> 	;	<= 92 bytes for current TRDOS 386 version.
 17079                              <1> 	;	(7*12 name chars + 7 slash + 0)
 17080                              <1> 
 17081 00011B96 89E5                <1> 	mov	ebp, esp
 17082 00011B98 83EC60              <1> 	sub	esp, 96
 17083 00011B9B 53                  <1> 	push	ebx ; User's buffer address
 17084 00011B9C 30D2                <1> 	xor	dl, dl ; 0 = current drive
 17085 00011B9E E87E8AFFFF          <1>   	call	get_current_directory
 17086 00011BA3 72CD                <1> 	jc	short sysdrive_err ; 'drive not ready !' error
 17087 00011BA5 89E6                <1> 	mov	esi, esp ; System's buffer address
 17088 00011BA7 5F                  <1> 	pop	edi  ; User's buffer address
 17089                              <1> 	; ecx = transfer (byte) count (<=92)
 17090 00011BA8 E803F4FFFF          <1> 	call	transfer_to_user_buffer
 17091 00011BAD 89EC                <1> 	mov	esp, ebp
 17092 00011BAF 730F                <1> 	jnc	short sysdir_ok
 17093                              <1> sysdir_err:
 17094 00011BB1 C705[AC940100]2E00- <1> 	mov	dword [u.r0], ERR_BUFFER  ; 'buffer error !'
 17094 00011BB9 0000                <1>
 17095 00011BBB E9C0B2FFFF          <1> 	jmp	error
 17096                              <1> sysdir_ok:
 17097 00011BC0 8A0D[B27D0100]      <1> 	mov	cl, [Current_Drv]
 17098 00011BC6 890D[AC940100]      <1> 	mov	[u.r0], ecx
 17099 00011BCC E9CFB2FFFF          <1> 	jmp	sysret
 17100                              <1> 
 17101                              <1> sysldrvt: ; Get copy of Logical DOS Drive Description Table
 17102                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0) 
 17103                              <1> 	;
 17104                              <1>         ; INPUT ->
 17105                              <1> 	;	    BL = Logical DOS drive number (zero based)
 17106                              <1>         ;          ECX = Logical DOS drv desc table buffer addr
 17107                              <1> 	;		(Buffer length = 256 bytes)
 17108                              <1> 	; OUTPUT ->
 17109                              <1> 	;          cf = 0 -> 
 17110                              <1> 	;		   AL = Current Drive number
 17111                              <1> 	;		   AH = The Last Logical DOS Drive no.
 17112                              <1> 	;          cf = 1 -> Error code in AL
 17113                              <1> 	;		   AH = The Last Logical DOS Drive no.
 17114                              <1> 	;
 17115                              <1> 	; Modified Registers: EAX (at the return of system call)
 17116                              <1> 	;
 17117                              <1> 	; Note: Required description table buffer length is
 17118                              <1> 	;	256 bytes for current TRDOS 386 version.
 17119                              <1> 
 17120 00011BD1 89CF                <1> 	mov	edi, ecx ; Destination address (user space)
 17121 00011BD3 88DC                <1> 	mov	ah, bl
 17122 00011BD5 30C0                <1> 	xor	al, al
 17123 00011BD7 BE00010900          <1> 	mov	esi, Logical_DOSDisks
 17124 00011BDC 01C6                <1> 	add	esi, eax ; Source address (system space)
 17125 00011BDE B900010000          <1> 	mov	ecx, 256 ; Byte count 
 17126                              <1> 			 ; Logical Dos Drv Desc Table size
 17127 00011BE3 E8C8F3FFFF          <1> 	call	transfer_to_user_buffer
 17128 00011BE8 72C7                <1> 	jc	short sysdir_err
 17129 00011BEA 8A2D[CE340100]      <1> 	mov	ch, [Last_DOS_DiskNo]
 17130 00011BF0 EBCE                <1> 	jmp	short sysdir_ok
 17131                              <1> 
 17132                              <1> systime: ; Get System Date&Time
 17133                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0)
 17134                              <1> 	;	
 17135                              <1>         ; INPUT -> BL =
 17136                              <1> 	;	    0 = Get Date&Time in Unix/Epoch format
 17137                              <1> 	;	    1 = Get Time in MSDOS format
 17138                              <1> 	;	    2 = Get Date in MSDOS format
 17139                              <1> 	;	    3 = Get Date&Time in MSDOS format
 17140                              <1> 	;	    4 & other values =
 17141                              <1> 	;		System timer ticks will be returned
 17142                              <1> 	;		in EAX and Carry Flag will be set.
 17143                              <1> 	;		(CF will not be set if BL = 4)
 17144                              <1> 	; OUTPUT ->
 17145                              <1> 	;	For BL input = 3
 17146                              <1> 	;          EAX = Current Time (RTC)
 17147                              <1> 	;		AL = Second (DL in MSDOS)
 17148                              <1> 	;		AH = Minute (CL in MSDOS)
 17149                              <1> 	;	   	HW of EAX = Hour (CH in MSDOS)
 17150                              <1> 	;	   EDX = Current System Date (RTC)
 17151                              <1> 	;		DL = Day (DL in MSDOS)
 17152                              <1> 	;		DH = Month (DH in MSDOS)
 17153                              <1> 	;		HW of EDX = Year (CX in MSDOS)
 17154                              <1> 	;
 17155                              <1> 	;	For BL input = 2
 17156                              <1> 	;	   EAX = Current System Date (RTC)
 17157                              <1> 	;		DL = Day (DL in MSDOS)
 17158                              <1> 	;		DH = Month (DH in MSDOS)
 17159                              <1> 	;		HW of EDX = Year (CX in MSDOS)
 17160                              <1> 	;
 17161                              <1> 	;	For BL input = 1
 17162                              <1> 	;          EAX = Current Time (RTC)
 17163                              <1> 	;		AL = Second (DL in MSDOS)
 17164                              <1> 	;		AH = Minute (CL in MSDOS)
 17165                              <1> 	;	   	HW of EAX = Hour (CH in MSDOS)
 17166                              <1> 	;
 17167                              <1> 	;	For BL input = 0
 17168                              <1> 	;          EAX = Unix (Epoch) Time Ticks/Seconds
 17169                              <1> 	;
 17170                              <1> 	;	For BL input  = 4
 17171                              <1> 	;	   EAX = System timer ticks
 17172                              <1> 	;
 17173                              <1> 	;	If CF = 1 (for other values of BL input)
 17174                              <1> 	;	   EAX = System timer ticks (no error code!)
 17175                              <1> 	;
 17176                              <1> 	; Modified Registers: EAX, (EDX)
 17177                              <1> 	;		 (at the return of system call)
 17178                              <1> 	;
 17179                              <1> 
 17180 00011BF2 20DB                <1> 	and	bl, bl
 17181 00011BF4 750F                <1> 	jnz	short systime_1
 17182 00011BF6 E89652FFFF          <1> 	call	epoch
 17183                              <1> systime_0:
 17184 00011BFB A3[AC940100]        <1> 	mov	[u.r0], eax
 17185 00011C00 E99BB2FFFF          <1> 	jmp	sysret
 17186                              <1> systime_1:
 17187 00011C05 80FB04              <1> 	cmp	bl, 4
 17188 00011C08 7211                <1> 	jb	short systime_2
 17189 00011C0A A1[707D0100]        <1> 	mov	eax, [TIMER_LH] ; 18.2 Hz timer ticks
 17190                              <1> 				; Note: [TIMER_LH] may be set
 17191                              <1> 				; to wrong timer value due to
 17192                              <1> 				; program functions.
 17193                              <1> 				; (This value must not be
 17194                              <1> 				; accepted as [TIMER_LH]/18.2
 17195                              <1> 				; seconds since the midnight.)
 17196 00011C0F 76EA                <1> 	jna	short systime_0
 17197 00011C11 A3[AC940100]        <1> 	mov	[u.r0], eax	
 17198 00011C16 E965B2FFFF          <1> 	jmp	error ; cf = 1 & [u.r0] = eax = timer ticks
 17199                              <1> 
 17200                              <1> systime_2:
 17201                              <1> 	;push	ebx
 17202 00011C1B E8EB51FFFF          <1> 	call	get_rtc_date_time
 17203                              <1> 	;pop	ebx
 17204 00011C20 F6C301              <1> 	test	bl, 1
 17205 00011C23 7429                <1> 	jz	short systime_4
 17206 00011C25 30E4                <1> 	xor	ah, ah
 17207 00011C27 A0[BE790100]        <1> 	mov	al, [hour]
 17208 00011C2C 88C2                <1> 	mov	dl, al
 17209 00011C2E C1E010              <1> 	shl	eax, 16
 17210 00011C31 A0[C2790100]        <1> 	mov	al, [second]
 17211 00011C36 8A25[C0790100]      <1> 	mov	ah, [minute]
 17212 00011C3C F6C302              <1> 	test	bl, 2
 17213 00011C3F 74BA                <1> 	jz	short systime_0
 17214                              <1> 	; Check time & date match risk
 17215                              <1> 	; (23:59:59 may cause to wrong
 17216                              <1> 	; date -new day with previous date-...)
 17217 00011C41 80FA17              <1> 	cmp	dl, 23
 17218 00011C44 7206                <1> 	jb	short systime_3
 17219 00011C46 663D3B3B            <1> 	cmp	ax, (59*256)+59 ; if hour is 23:59:59
 17220 00011C4A 73CF                <1> 	jnb	short systime_2 ; wait for 1 second
 17221                              <1> systime_3:
 17222                              <1> 	; eax = time
 17223 00011C4C 89C6                <1> 	mov	esi, eax
 17224                              <1> systime_4:	
 17225 00011C4E 66A1[B8790100]      <1> 	mov	ax, [year]
 17226 00011C54 C1E010              <1> 	shl	eax, 16
 17227 00011C57 A0[BC790100]        <1> 	mov	al, [day]
 17228 00011C5C 8A25[BA790100]      <1> 	mov	ah, [month]
 17229                              <1> 	; eax = date
 17230 00011C62 80E301              <1> 	and	bl, 1
 17231 00011C65 7494                <1> 	jz	short systime_0
 17232 00011C67 96                  <1> 	xchg	esi, eax
 17233                              <1> 	; eax = time, esi = date
 17234 00011C68 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]  ; EBP points to user's registers
 17235                              <1> 	; (user) edx <-- (system) esi
 17236 00011C6E 897514              <1> 	mov	[ebp+20], esi ; return to user with EDX value
 17237 00011C71 EB88                <1> 	jmp	short systime_0
 17238                              <1> 
 17239                              <1> sysstime: ; Set System Date&Time
 17240                              <1> 	; 31/12/2017
 17241                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0)
 17242                              <1> 	;
 17243                              <1>         ; INPUT -> BL =
 17244                              <1> 	;	    0 = Set Date&Time in Unix/Epoch format
 17245                              <1> 	;	    1 = Set Time in MSDOS format
 17246                              <1> 	;	    2 = Set Date in MSDOS format
 17247                              <1> 	;	    3 = Set Date&Time in MSDOS format
 17248                              <1> 	;	    4 = Set System Timer (Ticks)
 17249                              <1> 	;	    5 = Convert/Save current time to/as
 17250                              <1> 	;		18.2 Hz system timer ticks
 17251                              <1> 	;	    6 = Convert MSDOS Date&Time to UNIX format
 17252                              <1> 	;		without setting system date&time ; (test)
 17253                              <1> 	;	    7 = Convert UNIX Date&Time to MSDOS format
 17254                              <1> 	;		without setting system date&time ; (test)
 17255                              <1> 	;	   8-0FFh = invalid !
 17256                              <1> 	;	  ECX = Time (or Timer) value in selected format
 17257                              <1> 	;	  EDX = Date value in MSDOS format if BL=2,3,6
 17258                              <1> 	;
 17259                              <1> 	; OUTPUT ->
 17260                              <1> 	;	If CF = 0 ->
 17261                              <1> 	;          EAX = Set value
 17262                              <1> 	;	If CF = 1 -> (invalid BL input)
 17263                              <1> 	;	   EAX = Ticks count [TIMER_LH]
 17264                              <1> 	;
 17265                              <1> 
 17266 00011C73 20DB                <1> 	and	bl, bl ; 0
 17267 00011C75 7511                <1> 	jnz	short sysstime_0
 17268 00011C77 89C8                <1> 	mov	eax, ecx
 17269 00011C79 E89852FFFF          <1> 	call	convert_from_epoch
 17270 00011C7E E83853FFFF          <1> 	call	set_rtc_date_time
 17271 00011C83 E918B2FFFF          <1> 	jmp	sysret
 17272                              <1> sysstime_0:
 17273 00011C88 80FB08              <1> 	cmp	bl, 8
 17274 00011C8B 722D                <1> 	jb	short sysstime_1
 17275                              <1> 	; invalid input (>7)
 17276 00011C8D A1[707D0100]        <1> 	mov	eax, [TIMER_LH] ; 18.2 Hz timer ticks
 17277                              <1> 				; Note: [TIMER_LH] may be set
 17278                              <1> 				; to wrong timer value due to
 17279                              <1> 				; program functions.
 17280                              <1> 				; (This value must not be
 17281                              <1> 				; accepted as [TIMER_LH]/18.2
 17282                              <1> 				; seconds since the midnight.)
 17283 00011C92 A3[AC940100]        <1> 	mov	[u.r0], eax	
 17284 00011C97 E9E4B1FFFF          <1> 	jmp	error ; cf = 1 & [u.r0] = eax = timer ticks
 17285                              <1> 
 17286                              <1> sysstime_8:
 17287                              <1> 	; BL = 7
 17288 00011C9C 89C8                <1> 	mov	eax, ecx ; seconds since 1/1/1970 00:00:00
 17289 00011C9E E87352FFFF          <1> 	call	convert_from_epoch
 17290 00011CA3 30E4                <1> 	xor	ah, ah
 17291 00011CA5 A0[BE790100]        <1> 	mov	al, [hour]
 17292 00011CAA C1E010              <1> 	shl	eax, 16
 17293 00011CAD A0[C2790100]        <1> 	mov	al, [second]
 17294 00011CB2 8A25[C0790100]      <1> 	mov	ah, [minute]
 17295 00011CB8 EB92                <1> 	jmp	short systime_3
 17296                              <1> 
 17297                              <1> sysstime_1:
 17298 00011CBA 80FB04              <1> 	cmp	bl, 4
 17299 00011CBD 743F                <1> 	je	short sysstime_2 ; set system timer ticks
 17300 00011CBF 80FB05              <1> 	cmp	bl, 5
 17301 00011CC2 754B                <1> 	jne	short sysstime_4
 17302                              <1> 	; convert current time to system timer ticks (18.2Hz)
 17303 00011CC4 E84251FFFF          <1> 	call	get_rtc_date_time
 17304 00011CC9 0FB60D[BE790100]    <1> 	movzx	ecx, byte [hour]
 17305 00011CD0 B8100E0000          <1> 	mov	eax, 60*60 ; 1 hour = 3600 seconds
 17306 00011CD5 F7E1                <1> 	mul	ecx
 17307 00011CD7 89C3                <1> 	mov	ebx, eax
 17308 00011CD9 B13C                <1> 	mov	cl, 60  ; 1 minute = 60 seconds
 17309 00011CDB 0FB605[C0790100]    <1> 	movzx	eax, byte [minute]
 17310 00011CE2 F7E1                <1> 	mul	ecx
 17311 00011CE4 01D8                <1> 	add	eax, ebx
 17312 00011CE6 8A0D[C2790100]      <1> 	mov	cl, [second]
 17313 00011CEC 01C8                <1> 	add	eax, ecx
 17314 00011CEE B1B6                <1> 	mov	cl, 182
 17315 00011CF0 F7E1                <1> 	mul	ecx
 17316 00011CF2 83C009              <1> 	add	eax, 9
 17317 00011CF5 83D200              <1> 	adc	edx, 0
 17318 00011CF8 B10A                <1> 	mov	cl, 10
 17319 00011CFA F7F1                <1> 	div	ecx
 17320                              <1> 	; eax = ((182*seconds)+9)/10
 17321 00011CFC 89C1                <1> 	mov	ecx, eax
 17322                              <1> sysstime_2:
 17323 00011CFE 890D[707D0100]      <1> 	mov	[TIMER_LH], ecx ; 18.2 * seconds
 17324                              <1> sysstime_3:
 17325 00011D04 890D[AC940100]      <1> 	mov	[u.r0], ecx
 17326 00011D0A E991B1FFFF          <1> 	jmp	sysret
 17327                              <1> sysstime_4:
 17328 00011D0F 80FB06              <1> 	cmp	bl, 6
 17329 00011D12 7788                <1> 	ja	short sysstime_8
 17330                              <1> 
 17331 00011D14 890D[AC940100]      <1> 	mov	[u.r0], ecx
 17332                              <1> 
 17333 00011D1A 880D[C2790100]      <1> 	mov	[second], cl
 17334 00011D20 882D[C0790100]      <1> 	mov	[minute], ch
 17335 00011D26 C1E910              <1> 	shr	ecx, 16
 17336 00011D29 880D[BE790100]      <1> 	mov	[hour], cl
 17337                              <1> 	; BL = 1,2,3,6
 17338 00011D2F 80FB01              <1> 	cmp	bl, 1
 17339 00011D32 762A                <1> 	jna	short sysstime_5
 17340                              <1> 	; BL = 2,3,6
 17341 00011D34 8815[BC790100]      <1> 	mov	[day], dl
 17342 00011D3A 8835[BA790100]      <1> 	mov	[month], dh
 17343 00011D40 C1EA10              <1> 	shr	edx, 16
 17344 00011D43 668915[B8790100]    <1> 	mov	[year], dx
 17345 00011D4A 80E303              <1> 	and	bl, 3
 17346 00011D4D 742D                <1> 	jz	short sysstime_7 ; 6
 17347                              <1> 	; BL = 2,3
 17348 00011D4F F6C301              <1> 	test	bl, 1
 17349 00011D52 7419                <1> 	jz	short sysstime_6 ; 2
 17350                              <1> 	; BL = 3
 17351 00011D54 E86252FFFF          <1> 	call	set_rtc_date_time
 17352 00011D59 E942B1FFFF          <1> 	jmp	sysret
 17353                              <1> sysstime_5:
 17354                              <1> 	; BL = 1
 17355 00011D5E E89952FFFF          <1> 	call	set_time_bcd
 17356 00011D63 E8D145FFFF          <1> 	call	set_rtc_time
 17357 00011D68 E933B1FFFF          <1> 	jmp	sysret
 17358                              <1> sysstime_6:
 17359                              <1> 	; BL = 2
 17360 00011D6D E85D52FFFF          <1> 	call	set_date_bcd
 17361 00011D72 E82546FFFF          <1> 	call	set_rtc_date
 17362 00011D77 E924B1FFFF          <1> 	jmp	sysret
 17363                              <1> sysstime_7:
 17364                              <1> 	; BL = 6
 17365                              <1> 	; [year], [month], [day],
 17366                              <1> 	; [hour], [minute], [second]
 17367 00011D7C E81551FFFF          <1> 	call	convert_to_epoch
 17368 00011D81 89C1                <1> 	mov	ecx, eax ; seconds since 1/1/1970 00:00:00
 17369 00011D83 E97CFFFFFF          <1> 	jmp	sysstime_3
 17370                              <1> 
 17371                              <1> sysrename: ; Rename File (or Directory)
 17372                              <1> 	; 08/08/2022
 17373                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 17374                              <1> 	; 19/01/2021
 17375                              <1> 	; 31/12/2017 (TRDOS 386 = TRDOS v2.0)
 17376                              <1> 	;
 17377                              <1>         ; INPUT ->
 17378                              <1>         ;          EBX = File/Directory (ASCIIZ) name address
 17379                              <1> 	;	   ECX = New name (in same dir, no path name)
 17380                              <1> 	; OUTPUT ->
 17381                              <1> 	;          cf = 0 -> EAX = 0
 17382                              <1> 	;          cf = 1 -> Error code in AL
 17383                              <1> 
 17384                              <1> 	; 19/01/2021
 17385 00011D88 803D[FE940100]00    <1> 	cmp	byte [u.uid], 0  ; root (super user) ?
 17386                              <1> 	;jna	short sysrename_0
 17387                              <1> 	; 23/07/2022
 17388 00011D8F 7717                <1> 	ja	short sysrename_perm_err
 17389                              <1> 
 17390                              <1> ;sysrename_perm_err:
 17391                              <1> ;	;mov	dword [u.r0], ERR_PERM_DENIED
 17392                              <1> ;	mov	eax, ERR_PERM_DENIED ; 'permission denied !'
 17393                              <1> ;	mov	[u.r0], eax
 17394                              <1> ;	mov	[u.error], eax
 17395                              <1> ;	jmp	error
 17396                              <1> 
 17397                              <1> sysrename_0:
 17398 00011D91 51                  <1> 	push	ecx ; new file name address (in user space)
 17399 00011D92 89DE                <1> 	mov	esi, ebx
 17400                              <1> 	; file name is forced, change directory as temporary
 17401                              <1> 	;mov	ax, 1
 17402                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset
 17403                              <1> 	;call	set_working_path
 17404 00011D94 E87D050000          <1> 	call	set_working_path_x
 17405 00011D99 7321                <1> 	jnc	short sysrename_1
 17406 00011D9B 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!
 17407 00011D9D 753B                <1> 	jnz	short sysrename_err
 17408                              <1> 	; eax = 0
 17409                              <1> sysrename_path_not_found:
 17410 00011D9F B813000000          <1> 	mov	eax, ERR_INV_PATH_NAME ; 'Bad path name !'
 17411                              <1> 	; 23/07/2022
 17412 00011DA4 B013                <1> 	mov	al, ERR_INV_PATH_NAME
 17413 00011DA6 EB32                <1> 	jmp	short sysrename_err
 17414                              <1> ;sysrename_err:
 17415                              <1> ;	pop	ecx ; new file name address (in user space)
 17416                              <1> ;sysrename_error:
 17417                              <1> ;	mov	[u.r0], eax
 17418                              <1> ;	mov	[u.error], eax
 17419                              <1> ;	call 	reset_working_path
 17420                              <1> ;	jmp	error
 17421                              <1> 
 17422                              <1> 	; 23/07/2022
 17423                              <1> sysrename_perm_err:
 17424                              <1> 	;mov	dword [u.r0], ERR_PERM_DENIED
 17425 00011DA8 B80B000000          <1> 	mov	eax, ERR_PERM_DENIED ; 'permission denied !'
 17426 00011DAD A3[AC940100]        <1> 	mov	[u.r0], eax
 17427 00011DB2 A3[18950100]        <1> 	mov	[u.error], eax
 17428 00011DB7 E9C4B0FFFF          <1> 	jmp	error
 17429                              <1> 
 17430                              <1> sysrename_1:
 17431 00011DBC B008                <1> 	mov	al, 08h ; Except volume labels (& long names)
 17432 00011DBE A0[6C870100]        <1> 	mov	al, [Attributes]
 17433 00011DC3 2410                <1> 	and	al, 10h ;
 17434                              <1> 	;mov	esi, FindFile_Name
 17435                              <1> 	;mov	ax, 1800h ; Only files
 17436                              <1> 	;mov	ax, 0810h ; Only directories
 17437 00011DC5 66B80008            <1> 	mov	ax, 0800h ; Find File or Directory
 17438 00011DC9 E89C6DFFFF          <1> 	call	find_first_file
 17439                              <1> 	;jnc	short sysrename_2
 17440 00011DCE 720A                <1> 	jc	short sysrename_err
 17441                              <1> sysrename_2:
 17442                              <1> 	; ESI = Directory Entry (FindFile_DirEntry) Location
 17443                              <1> 	; EDI = Directory Buffer Directory Entry Location
 17444                              <1> 	; EAX = File Size
 17445                              <1> 	;  BL = Attributes of The File/Directory
 17446                              <1> 	;  BH = Long Name Yes/No Status (>0 is YES)
 17447                              <1> 	;  DX > 0 : Ambiguous filename chars are used
 17448                              <1> 
 17449 00011DD0 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
 17450 00011DD3 741A                <1> 	jz	short sysrename_3
 17451 00011DD5 B81A000000          <1> 	mov	eax, ERR_INV_FILE_NAME ; 'invalid file name !'
 17452                              <1> 	;jmp	short sysrename_err
 17453                              <1> 	; 23/07/2022
 17454                              <1> sysrename_err:
 17455 00011DDA 59                  <1> 	pop	ecx ; new file name address (in user space)
 17456                              <1> sysrename_error:
 17457 00011DDB A3[AC940100]        <1> 	mov	[u.r0], eax
 17458 00011DE0 A3[18950100]        <1> 	mov	[u.error], eax
 17459 00011DE5 E801060000          <1> 	call 	reset_working_path
 17460 00011DEA E991B0FFFF          <1> 	jmp	error
 17461                              <1> sysrename_3:
 17462                              <1> 	; EDI = Directory buffer entry offset/address
 17463                              <1> 	; BL = File (or Directory) Attributes 
 17464                              <1> 	; mov	bl, [EDI+0Bh]
 17465                              <1> 
 17466 00011DEF 5A                  <1> 	pop	edx ; new file name address (in user space)
 17467                              <1> 
 17468                              <1> 	; check file/directory attributes
 17469 00011DF0 F6C307              <1> 	test	bl, 7 ; system, hidden, readonly
 17470 00011DF3 75B3                <1>         jnz	short sysrename_perm_err
 17471                              <1> sysrename_4:
 17472 00011DF5 66817F0CA101        <1> 	cmp	word [edi+DirEntry_NTRes], 01A1h ; Singlix FS
 17473 00011DFB 74AB                <1> 	je	short sysrename_perm_err ; -temporary!-
 17474                              <1> 
 17475                              <1> 	; save old file name & file info (FFF structure)
 17476 00011DFD BE[52860100]        <1> 	mov	esi, FindFile_Drv
 17477 00011E02 BF[9C870100]        <1> 	mov	edi, SourceFile_Drv
 17478                              <1> 	;mov	ecx, 128/4
 17479                              <1> 	; 23/07/2022
 17480 00011E07 29C9                <1> 	sub	ecx, ecx
 17481 00011E09 B120                <1> 	mov	cl, 128/4
 17482 00011E0B F3A5                <1> 	rep	movsd
 17483                              <1> 
 17484 00011E0D 89D6                <1> 	mov	esi, edx ; new file name address (in user space)
 17485 00011E0F BF[1C880100]        <1> 	mov	edi, DestinationFile_Drv
 17486 00011E14 E84C8EFFFF          <1> 	call	parse_path_name
 17487 00011E19 72C0                <1> 	jc	short sysrename_error ; eax = 1 (Bad file name)
 17488                              <1> 
 17489                              <1> 	; same drive ?
 17490 00011E1B A0[52860100]        <1> 	mov	al, [FindFile_Drv]
 17491 00011E20 3A05[1C880100]      <1> 	cmp	al, [DestinationFile_Drv]
 17492                              <1> 	;jne	short sysrename_perm_err ; Permission denied
 17493 00011E26 7509                <1> 	jne	short sysrename_5 ; Bad file name
 17494                              <1> 
 17495                              <1> 	; no path name !? (rename file in same directory)
 17496 00011E28 803D[1D880100]20    <1> 	cmp	byte [DestinationFile_Directory], 20h
 17497 00011E2F 7607                <1> 	jna	short sysrename_6
 17498                              <1> sysrename_5:
 17499 00011E31 B801000000          <1> 	mov	eax, ERR_BAD_CMD_ARG ; 1 = Bad file name
 17500                              <1> 				     ; (Bad argument)
 17501 00011E36 EBA3                <1> 	jmp	short sysrename_error
 17502                              <1> sysrename_6:
 17503 00011E38 803D[5E880100]20    <1> 	cmp	byte [DestinationFile_Name], 20h
 17504 00011E3F 76F0                <1> 	jna	short sysrename_5
 17505                              <1> 
 17506 00011E41 BE[5E880100]        <1> 	mov	esi, DestinationFile_Name
 17507 00011E46 E8C470FFFF          <1> 	call	check_filename ; is it a valid msdos file name?
 17508 00011E4B 728E                <1> 	jc	short sysrename_error ; 26 = ERR_INV_FILE_NAME
 17509                              <1> 
 17510                              <1> 	;mov	esi, DestinationFile_Name
 17511 00011E4D 66B80008            <1> 	mov	ax, 0800h ; Find File or Directory
 17512 00011E51 E8146DFFFF          <1> 	call	find_first_file
 17513 00011E56 720A                <1> 	jc	short sysrename_7
 17514                              <1> 
 17515 00011E58 B80E000000          <1> 	mov	eax, ERR_FILE_EXISTS  ; file already exists !
 17516                              <1> jmp_sysrename_err:	; 08/08/2022
 17517 00011E5D E979FFFFFF          <1> 	jmp	sysrename_error
 17518                              <1> sysrename_7:
 17519                              <1> 	; eax = 2 (File not found !)
 17520 00011E62 3C02                <1> 	cmp	al, 2 ; ERR_NOT_FOUND
 17521                              <1> 	;jne	short sysrename_error
 17522                              <1> 	; 08/08/2022
 17523 00011E64 75F7                <1> 	jne	short jmp_sysrename_err
 17524                              <1> 
 17525                              <1> 	; 31/12/2017
 17526                              <1> 	; Following code is also part of 'rename_file' in
 17527                              <1> 	; 'trdosk3.s' (MainProg's 'rename' command) ; 13/11/2017
 17528 00011E66 BE[5E880100]        <1> 	mov	esi, DestinationFile_Name ; (Rename_NewName)
 17529 00011E6B 668B0D[16880100]    <1> 	mov	cx, [SourceFile_DirEntryNumber] 
 17530 00011E72 66A1[02880100]      <1> 	mov	ax, [SourceFile_DirEntry+20] ; First Cluster, HW 
 17531 00011E78 C1E010              <1> 	shl	eax, 16
 17532 00011E7B 66A1[08880100]      <1> 	mov	ax, [SourceFile_DirEntry+26] ; First Cluster, LW 
 17533 00011E81 0FB61D[EB870100]    <1>   	movzx	ebx, byte [SourceFile_LongNameEntryLength]
 17534 00011E88 E8DC95FFFF          <1>    	call	rename_directory_entry
 17535                              <1> 	;jc	short sysrename_error
 17536                              <1> 	; 08/08/2022
 17537 00011E8D 72CE                <1> 	jc	short jmp_sysrename_err
 17538                              <1> 	;xor	eax, eax
 17539 00011E8F A3[AC940100]        <1> 	mov	[u.r0], eax ; 0
 17540                              <1> 	;mov	[u.error], eax
 17541 00011E94 E852050000          <1> 	call 	reset_working_path
 17542 00011E99 E902B0FFFF          <1> 	jmp	sysret
 17543                              <1> 
 17544                              <1> sysmem: ; Get Total&Free Memory amount 
 17545                              <1> 	; 31/12/2017 (TRDOS 386 = TRDOS v2.0)
 17546                              <1> 	;
 17547                              <1>         ; INPUT ->
 17548                              <1> 	;	none
 17549                              <1> 	; OUTPUT ->
 17550                              <1> 	;	EAX = Total memory count (in bytes)
 17551                              <1> 	;	EBX = Virtually available memory amount (in bytes)
 17552                              <1> 	;	      = 4GB - CORE (4MB)
 17553                              <1> 	;	ECX = Free memory count (in bytes)
 17554                              <1> 	;	EDX = Calculated free memory count (in bytes)
 17555                              <1> 	
 17556 00011E9E A1[F47C0100]        <1> 	mov	eax, [memory_size] ; in pages
 17557 00011EA3 C1E00C              <1> 	shl	eax, 12		   ; in bytes
 17558 00011EA6 A3[AC940100]        <1> 	mov	[u.r0], eax
 17559 00011EAB E84123FFFF          <1> 	call	calc_free_mem
 17560                              <1> 	; edx = calculated free pages
 17561                              <1> 	; ecx = 0
 17562 00011EB0 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]  ; EBP points to user's registers
 17563 00011EB6 C745100000C0FF      <1> 	mov	dword [ebp+16], ECORE ; EBX (for user)
 17564                              <1> 				; 0FFC00000h ; 4GB - 4MB
 17565 00011EBD C1E20C              <1> 	shl	edx, 12
 17566 00011EC0 895514              <1> 	mov	[ebp+20], edx ; EDX (for user)
 17567 00011EC3 8B0D[F87C0100]      <1> 	mov 	ecx, [free_pages]
 17568 00011EC9 C1E10C              <1> 	shl	ecx, 12	; free bytes
 17569 00011ECC 894D18              <1> 	mov	[ebp+24], ecx ; ECX (for user)
 17570                              <1> 	;mov	[free_pages], edx
 17571 00011ECF E9CCAFFFFF          <1> 	jmp	sysret
 17572                              <1> 
 17573                              <1> sysprompt:
 17574                              <1> 	; Set TRDOS 386 Command Interpreter (MainProg) prompt
 17575                              <1> 	; 30/07/2022 (TRDOS 386 Kernel v2.0.5)
 17576                              <1> 	; 31/12/2017 (TRDOS 386 = TRDOS v2.0) 
 17577                              <1> 	;
 17578                              <1>         ; INPUT -> 
 17579                              <1> 	;	EBX = 0 -> use default prompt
 17580                              <1> 	;	EBX > 0 -> prompt string (ASCIIZ) address
 17581                              <1> 	;		  (Max. 11 characters except ZERO tail)
 17582                              <1> 	; OUTPUT ->
 17583                              <1> 	;	(EAX = 0)
 17584                              <1> 	;	CF = 0 -> Successful
 17585                              <1> 	;	CF = 1 -> Failed
 17586                              <1> 
 17587 00011ED4 21DB                <1> 	and	ebx, ebx
 17588 00011ED6 750A                <1> 	jnz	short sysprompt_0
 17589                              <1> 
 17590 00011ED8 E87466FFFF          <1> 	call	default_command_prompt ; '['+'TRDOS'+']'
 17591 00011EDD E9BEAFFFFF          <1> 	jmp	sysret
 17592                              <1> 
 17593                              <1> sysprompt_0:
 17594 00011EE2 31C0                <1> 	xor	eax, eax
 17595 00011EE4 A3[AC940100]        <1> 	mov	[u.r0], eax
 17596 00011EE9 89DE                <1> 	mov	esi, ebx
 17597                              <1> 	;mov	ecx, 12
 17598                              <1> 	; 30/07/2022
 17599 00011EEB 31C9                <1> 	xor	ecx, ecx
 17600 00011EED B10C                <1> 	mov	cl, 12
 17601 00011EEF 89E5                <1> 	mov	ebp, esp
 17602 00011EF1 29CC                <1> 	sub	esp, ecx
 17603 00011EF3 49                  <1> 	dec	ecx ; 11
 17604 00011EF4 89E7                <1> 	mov	edi, esp
 17605 00011EF6 E8FFF0FFFF          <1> 	call	transfer_from_user_buffer
 17606 00011EFB 7211                <1> 	jc	short sysprompt_err
 17607 00011EFD 803E20              <1> 	cmp	byte [esi], 20h
 17608 00011F00 760C                <1> 	jna	short sysprompt_err
 17609 00011F02 E85C66FFFF          <1> 	call	set_command_prompt
 17610 00011F07 89EC                <1> 	mov	esp, ebp
 17611 00011F09 E992AFFFFF          <1> 	jmp	sysret
 17612                              <1> sysprompt_err:
 17613                              <1> syspath_err:
 17614 00011F0E 89EC                <1> 	mov	esp, ebp
 17615 00011F10 E96BAFFFFF          <1> 	jmp	error
 17616                              <1> 
 17617                              <1> syspath:
 17618                              <1> 	; Get/Set Run Path
 17619                              <1> 	;
 17620                              <1> 	; 30/07/2022 (TRDOS 386 Kernel v2.0.5)
 17621                              <1> 	; 31/12/2017 (TRDOS 386 = TRDOS v2.0)
 17622                              <1> 	;
 17623                              <1>         ; INPUT ->
 17624                              <1> 	;	EBX = 0 -> get path (to buffer address in ECX)
 17625                              <1> 	;	EBX > 0 -> set path
 17626                              <1> 	;	    EBX = Path string buffer address (ASCIIZ)
 17627                              <1> 	;	    	  (Path description except 'PATH=')
 17628                              <1> 	;	ECX = Buffer address (if EBX = 0)
 17629                              <1> 	;	      (ECX will not be used if EBX > 0)
 17630                              <1> 	;	DL = Buffer size (0 = 256 byte)	
 17631                              <1> 	;
 17632                              <1> 	; OUTPUT ->
 17633                              <1> 	;	CF = 0 -> Successful (EAX = String length)
 17634                              <1> 	;	CF = 1 -> Failed (EAX = 0)
 17635                              <1> 	;
 17636                              <1> 	; NOTE: 'PATH=' or 'PATH' must be excluded
 17637                              <1> 	;  (It must not be at the beginning of the string.)
 17638                              <1> 
 17639 00011F15 89E5                <1> 	mov	ebp, esp
 17640 00011F17 81EC00010000        <1> 	sub	esp, 256
 17641 00011F1D 89E7                <1> 	mov	edi, esp
 17642                              <1> 
 17643 00011F1F 31C0                <1> 	xor	eax, eax
 17644 00011F21 A3[AC940100]        <1> 	mov	[u.r0], eax
 17645                              <1> 
 17646 00011F26 21DB                <1> 	and	ebx, ebx
 17647 00011F28 752A                <1> 	jnz	short syspath_0
 17648                              <1> 
 17649                              <1> 	; EBX = 0 -> get run path
 17650 00011F2A 89CB                <1> 	mov	ebx, ecx ; buffer addr (in user's mem space)
 17651 00011F2C BE[A4350100]        <1> 	mov	esi, Cmd_Path  ; 'PATH' address
 17652 00011F31 0FB6CA              <1> 	movzx	ecx, dl
 17653                              <1> 	;sub	cl, 1 ; 0 -> 255, 1 -> 0
 17654                              <1> 	;adc	cx, 1 ; 255 -> 256, 0 -> 1
 17655                              <1> 	; 30/07/2022
 17656 00011F34 FEC9                <1> 	dec	cl ; 0 -> 255, 1 -> 0
 17657 00011F36 41                  <1> 	inc	ecx ; 255 -> 256, 0 -> 1 
 17658                              <1> 	; EDI = Output buffer
 17659                              <1> 	; CX = Buffer length
 17660                              <1> 	; AL = 0 -> use ASCIIZ word in [ESI]
 17661                              <1> 	; ESI = 'PATH' address (with zero tail)
 17662 00011F37 E8017EFFFF          <1> 	call	get_environment_string
 17663 00011F3C 72D0                <1> 	jc	short syspath_err
 17664 00011F3E 89DF                <1> 	mov	edi, ebx ; User's buffer address
 17665 00011F40 89E6                <1> 	mov	esi, esp
 17666                              <1> 	; EDI = User's buffer address
 17667                              <1> 	; ECX = transfer (byte) count
 17668 00011F42 E869F0FFFF          <1> 	call	transfer_to_user_buffer
 17669 00011F47 72C5                <1> 	jc	short syspath_err
 17670 00011F49 890D[AC940100]      <1> 	mov	[u.r0], ecx 
 17671 00011F4F E94CAFFFFF          <1> 	jmp	sysret
 17672                              <1> 
 17673                              <1> syspath_0:
 17674 00011F54 89DE                <1> 	mov	esi, ebx
 17675 00011F56 0FB6CA              <1> 	movzx	ecx, dl
 17676                              <1> 	;sub	cl, 1 ; 0 -> 255, 1 -> 0
 17677                              <1> 	;adc	cx, 1 ; 255 -> 256, 0 -> 1
 17678                              <1> 	; 30/07/2022
 17679 00011F59 FEC9                <1> 	dec	cl ; 0 -> 255, 1 -> 0
 17680 00011F5B 41                  <1> 	inc	ecx ; 255 -> 256, 0 -> 1
 17681 00011F5C E899F0FFFF          <1> 	call	transfer_from_user_buffer
 17682 00011F61 72AB                <1> 	jc	short syspath_err
 17683                              <1> 	;(*) 'PATH=' will be added to
 17684                              <1> 	;         the head of the string
 17685 00011F63 83EC08              <1> 	sub	esp, 8 ;(*)
 17686 00011F66 89FE                <1> 	mov	esi, edi ;(*)
 17687 00011F68 E8B47DFFFF          <1> 	call	set_path_x ;(*)
 17688 00011F6D 729F                <1> 	jc	short syspath_err
 17689 00011F6F 8915[AC940100]      <1> 	mov	[u.r0], edx ; run path string length
 17690 00011F75 E926AFFFFF          <1> 	jmp	sysret
 17691                              <1> 
 17692                              <1> sysenv:
 17693                              <1> 	; Get/Set Environment Variables
 17694                              <1> 	;
 17695                              <1> 	; 30/07/2022
 17696                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 17697                              <1> 	; 31/12/2017 (TRDOS 386 = TRDOS v2.0)
 17698                              <1> 	;
 17699                              <1>         ; INPUT ->
 17700                              <1> 	;	EBX = 0 -> get (all) environment variables
 17701                              <1> 	;	      (Required Buffer length = 512 bytes)
 17702                              <1> 	;	EBX > 0 -> set (one) environment variable
 17703                              <1> 	;	      (If there is not a '=' after
 17704                              <1> 	;	      the environment variable name, it will
 17705                              <1> 	;	      accepted as 'get environment variable'.)
 17706                              <1> 	;	       EBX = Buffer address
 17707                              <1> 	;	ECX = Buffer address (if EBX = 0)
 17708                              <1> 	;	      (ECX will not be used if EBX > 0)
 17709                              <1> 	;	      (Note: Buffer size is 512 bytes.)
 17710                              <1> 	;	DL = Buffer size (0 = 256 byte)
 17711                              <1> 	;	     (For one envrionment variable)
 17712                              <1> 	;
 17713                              <1> 	; OUTPUT ->
 17714                              <1> 	;	(EAX = 0)
 17715                              <1> 	;	CF = 0 -> Successful (EAX = String length)
 17716                              <1> 	;	CF = 1 -> Failed (EAX = 0)
 17717                              <1> 	;
 17718                              <1> 	; Note: Environment variable name, for example,
 17719                              <1> 	;	'PATH=' must be included at the beginning
 17720                              <1> 	;	of the environment string. If the variable
 17721                              <1> 	;	name is as 'PATH' but it is not as 'PATH='
 17722                              <1> 	;	the variable string (row) will be returned.
 17723                              <1> 	;	If variable name is as 'PATH=' but there is
 17724                              <1> 	;	not a following text after the variable name,
 17725                              <1> 	;	the environment variable will be reset/deleted.
 17726                              <1> 
 17727 00011F7A 89E5                <1> 	mov	ebp, esp
 17728 00011F7C 81EC00020000        <1> 	sub	esp, 512
 17729 00011F82 89E7                <1> 	mov	edi, esp
 17730                              <1> 
 17731 00011F84 31C0                <1> 	xor	eax, eax
 17732 00011F86 A3[AC940100]        <1> 	mov	[u.r0], eax
 17733                              <1> 
 17734 00011F8B 21DB                <1> 	and	ebx, ebx
 17735 00011F8D 751F                <1> 	jnz	short sysenv_0
 17736                              <1> 
 17737                              <1> 	; EBX = 0 -> get (all) environment variables
 17738 00011F8F 89EC                <1> 	mov	esp, ebp
 17739 00011F91 BE00300900          <1> 	mov	esi, Env_Page  ; Environment page
 17740 00011F96 89CF                <1> 	mov	edi, ecx ; buffer addr (in user's mem space)
 17741                              <1> 	;mov	ecx, 512
 17742                              <1> 	; 30/07/2022
 17743 00011F98 29C9                <1> 	sub	ecx, ecx
 17744 00011F9A B502                <1> 	mov	ch, 2
 17745                              <1> 	; ecx = 512
 17746 00011F9C E80FF0FFFF          <1> 	call	transfer_to_user_buffer
 17747                              <1> 	;jc	error
 17748                              <1> 	; 23/07/2022
 17749 00011FA1 725B                <1> 	jc	short sysenv_error
 17750 00011FA3 890D[AC940100]      <1> 	mov	[u.r0], ecx
 17751 00011FA9 E9F2AEFFFF          <1> 	jmp	sysret
 17752                              <1> 
 17753                              <1> sysenv_0:
 17754 00011FAE 89DE                <1> 	mov	esi, ebx ; * ; user's buffer address
 17755 00011FB0 0FB6CA              <1> 	movzx	ecx, dl
 17756                              <1> 	;sub	cl, 1 ; 0 -> 255, 1 -> 0
 17757                              <1> 	;adc	cx, 1 ; 255 -> 256, 0 -> 1
 17758                              <1> 	; 30/07/2022
 17759 00011FB3 FEC9                <1> 	dec	cl ; 0 -> 255, 1 -> 0
 17760 00011FB5 41                  <1> 	inc	ecx ; 255 -> 256, 0 -> 1
 17761 00011FB6 E83FF0FFFF          <1> 	call	transfer_from_user_buffer
 17762 00011FBB 723F                <1> 	jc	short sysenv_err
 17763 00011FBD 89FE                <1> 	mov	esi, edi
 17764 00011FBF 8A06                <1> 	mov	al, [esi]
 17765 00011FC1 3C20                <1> 	cmp	al, 20h
 17766 00011FC3 7637                <1> 	jna	short sysenv_err
 17767 00011FC5 3C3D                <1> 	cmp	al, '='
 17768 00011FC7 7433                <1> 	je	short sysenv_err
 17769 00011FC9 56                  <1> 	push	esi
 17770                              <1> sysenv_1:
 17771 00011FCA 46                  <1> 	inc	esi
 17772 00011FCB 803E3D              <1> 	cmp	byte [esi], '='
 17773 00011FCE 7433                <1> 	je	short sysenv_3
 17774 00011FD0 803E20              <1> 	cmp	byte [esi], 20h
 17775 00011FD3 73F5                <1> 	jnb	short sysenv_1
 17776 00011FD5 C60600              <1> 	mov	byte [esi], 0
 17777 00011FD8 5E                  <1> 	pop	esi
 17778                              <1> 	; EDI = Output buffer
 17779                              <1> 	; CX = Buffer length
 17780 00011FD9 30C0                <1> 	xor	al, al
 17781                              <1> 	; AL = 0 -> use ASCIIZ word in [ESI]
 17782                              <1> 	; ESI = Environment variable name address
 17783 00011FDB E85D7DFFFF          <1> 	call	get_environment_string
 17784 00011FE0 721A                <1> 	jc	short sysenv_err
 17785 00011FE2 89DF                <1> 	mov	edi, ebx ; * ; user's buffer address
 17786 00011FE4 89C1                <1> 	mov	ecx, eax ; String length
 17787 00011FE6 89E6                <1> 	mov	esi, esp 
 17788                              <1> 	; ESI = system buffer address
 17789                              <1> 	; EDI = User's buffer address
 17790                              <1> 	; ECX = transfer (byte) count
 17791 00011FE8 E8C3EFFFFF          <1> 	call	transfer_to_user_buffer
 17792 00011FED 720D                <1> 	jc	short sysenv_err
 17793 00011FEF 890D[AC940100]      <1> 	mov	[u.r0], ecx ; transfer (byte) count
 17794                              <1> sysenv_2:
 17795 00011FF5 89EC                <1> 	mov	esp, ebp
 17796 00011FF7 E9A4AEFFFF          <1> 	jmp	sysret
 17797                              <1> sysenv_err:
 17798 00011FFC 89EC                <1> 	mov	esp, ebp
 17799                              <1> sysenv_error:	; 23/07/2022
 17800 00011FFE E97DAEFFFF          <1> 	jmp	error
 17801                              <1> sysenv_3:
 17802 00012003 46                  <1> 	inc	esi
 17803 00012004 803E20              <1> 	cmp	byte [esi], 20h
 17804 00012007 73FA                <1> 	jnb	short sysenv_3
 17805 00012009 C60600              <1> 	mov	byte [esi], 0
 17806 0001200C 5E                  <1> 	pop	esi
 17807 0001200D E8EE7DFFFF          <1> 	call	set_environment_string
 17808 00012012 72E8                <1> 	jc	short sysenv_err
 17809 00012014 8915[AC940100]      <1> 	mov	[u.r0], edx
 17810 0001201A EBD9                <1> 	jmp	short sysenv_2
 17811                              <1> 
 17812                              <1> isintr:
 17813                              <1> 	; 21/08/2024 - TRDOS 386 v2.0.9
 17814                              <1> 	; check terminate (CTRL+BREAK)
 17815                              <1> 	;	interrupt is enabled or disabled
 17816                              <1> 	;test	word [u.intr], 0FFFFh
 17817 0001201C F605[F8940100]FF    <1> 	test	byte [u.intr], 0FFh
 17818                              <1> 	; zf = 1 -> terminate interrupt disabled
 17819                              <1> 	; zf = 0 -> terminate interrupt enabled
 17820 00012023 C3                  <1> 	retn
 17821                              <1> 
 17822                              <1> ; 23/07/2022 - TRDOS 386 v2.0.5
 17823                              <1> 
 17824                              <1> ; 22/01/2021
 17825                              <1> ; temporary - 24/01/2016
 17826                              <1> 
 17827                              <1> iget:
 17828                              <1> 	;retn
 17829                              <1> ;iopen:
 17830                              <1> ;	;retn
 17831                              <1> ;iclose:
 17832                              <1> ;	;retn
 17833                              <1> sndc:
 17834                              <1> 	;retn
 17835                              <1> access:
 17836                              <1> 	;retn
 17837                              <1> sleep:
 17838 00012024 C3                  <1> 	retn
  3436                                  %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 00012025 807E0500            <1> 	cmp	byte [esi+LD_LBAYes], 0
    20 00012029 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 0001202B C605[A1850100]03    <1> 	mov	byte [disk_rw_op], 3 ; CHS write
    27 00012032 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 00012034 807E0500            <1> 	cmp	byte [esi+LD_LBAYes], 0
    48 00012038 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 0001203A C605[A1850100]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 00012041 C605[A2850100]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 00012048 50                  <1> 	push	eax			; Linear sector #
    83 00012049 51                  <1> 	push	ecx			; # of FAT/FILE/DIR sectors
    84                              <1> 
    85 0001204A 0FB74E1E            <1> 	movzx	ecx, word [esi+LD_BPB+SecPerTrack]
    86                              <1> 	;movzx	ecx, byte [disk_rw_spt] ; 23/02/2016
    87 0001204E 29D2                <1> 	sub	edx, edx
    88 00012050 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 00012052 42                  <1> 	inc	edx
   101 00012053 52                  <1> 	push	edx ; dl = sector number (on track)
   102                              <1> 	;
   103 00012054 668B4E20            <1> 	mov	cx, [esi+LD_BPB+Heads]
   104                              <1> 	;sub	dx, dx
   105                              <1> 	; 25/07/2022
   106 00012058 29D2                <1> 	sub	edx, edx
   107 0001205A F7F1                <1> 	div	ecx			; Convert track to head & cyl
   108                              <1> 	; eax (ax) = cylinder, dx (dl) = head (max. FFh)
   109 0001205C 88D6                <1> 	mov	dh, dl
   110                              <1> 	;pop	cx			; AX=Cyl, DH=Head, CX=Sector
   111                              <1> 	; 25/07/2022
   112 0001205E 59                  <1> 	pop	ecx ; sector number (on track)
   113 0001205F 8A5602              <1> 	mov	dl, [esi+LD_PhyDrvNo]
   114                              <1> 
   115 00012062 88C5                <1> 	mov	ch, al			; NOTE: max. 1023 cylinders !
   116 00012064 C0CC02              <1> 	ror	ah, 2			; Rotate 2 bits right
   117 00012067 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 00012069 B001                <1> 	mov	al, 1 ; 25/02/2016
   128 0001206B 8A25[A1850100]      <1> 	mov	ah, [disk_rw_op]  ; 02h = chs read, 03h = chs write 
   129                              <1> 	;
   130 00012071 E84F2FFFFF          <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 00012076 8825[A3850100]      <1> 	mov	[disk_rw_err], ah
   137                              <1> 
   138 0001207C 59                  <1> 	pop	ecx
   139 0001207D 58                  <1> 	pop	eax
   140 0001207E 7314                <1> 	jnc	short chs_read_ok
   141                              <1> 
   142 00012080 803D[A3850100]09    <1> 	cmp	byte [disk_rw_err], 09h ; DMA crossed 64K segment boundary
   143 00012087 7408                <1> 	je	short chs_read_error_retn
   144                              <1> 
   145 00012089 FE0D[A2850100]      <1> 	dec	byte [retry_count]
   146 0001208F 75B7                <1> 	jnz	short chs_read_retry
   147                              <1> 
   148                              <1> chs_read_error_retn:
   149 00012091 F9                  <1> 	stc
   150                              <1> 	;retn
   151 00012092 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 00012094 40                  <1> 	inc	eax ; next sector
   169 00012095 81C300020000        <1> 	add	ebx, 512
   170 0001209B E2A4                <1> 	loop	chs_read_next_sector
   171 0001209D EB5C                <1> 	jmp	short update_drv_error_byte
   172                              <1> 
   173                              <1> lba_write:
   174                              <1> 	; 23/02/2016
   175 0001209F C605[A1850100]1C    <1> 	mov	byte [disk_rw_op], 1Ch ; LBA write
   176 000120A6 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 000120A8 C605[A1850100]1B    <1> 	mov	byte [disk_rw_op], 1Bh ; LBA read
   200                              <1> 
   201                              <1> lba_rw:
   202                              <1> 	; 17/02/2016
   203 000120AF 57                  <1> 	push	edi
   204                              <1> 
   205 000120B0 890D[A4850100]      <1> 	mov	[sector_count], ecx ; total sector (read) count
   206                              <1> 
   207 000120B6 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 000120B9 BF00010000          <1> 	mov	edi, 256
   213 000120BE 39F9                <1> 	cmp	ecx, edi
   214                              <1> 	;cmp	ecx, 256
   215 000120C0 7602                <1> 	jna	short lba_read_rsc
   216                              <1> 	;mov	ecx, 256 ; 17/02/2016
   217 000120C2 89F9                <1> 	mov	ecx, edi
   218                              <1> lba_read_rsc:
   219 000120C4 290D[A4850100]      <1> 	sub	[sector_count], ecx ; remain sectors
   220                              <1> 
   221 000120CA 89CF                <1> 	mov	edi, ecx 
   222 000120CC 89C1                <1> 	mov	ecx, eax ; sector number/address
   223                              <1> 
   224 000120CE C605[A2850100]04    <1> 	mov	byte [retry_count], 4
   225                              <1> lba_read_retry:
   226 000120D5 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 000120D7 8A25[A1850100]      <1> 	mov	ah, [disk_rw_op] ; 1Bh = LBA read, 1Ch = LBA write
   236 000120DD E8E32EFFFF          <1> 	call	int13h
   237                              <1> 	; al = ? (changed)
   238                              <1> 	; ah = error code
   239 000120E2 8825[A3850100]      <1> 	mov	[disk_rw_err], ah
   240 000120E8 7332                <1> 	jnc	short lba_read_ok
   241 000120EA 80FC80              <1> 	cmp	ah, 80h ; time out?
   242 000120ED 740A                <1>         je      short lba_read_stc_retn
   243 000120EF FE0D[A2850100]      <1> 	dec	byte [retry_count]
   244 000120F5 7FDE                <1> 	jg	short lba_read_retry
   245 000120F7 7438                <1> 	jz	short lba_read_reset
   246                              <1> 	; sf = 1
   247                              <1> 
   248                              <1> lba_read_stc_retn:
   249 000120F9 F9                  <1> 	stc
   250                              <1> lba_read_retn:
   251 000120FA 5F                  <1> 	pop	edi
   252                              <1> 
   253                              <1> update_drv_error_byte:
   254 000120FB 9C                  <1> 	pushf
   255 000120FC 53                  <1> 	push	ebx
   256                              <1> 	;push	cx
   257 000120FD 51                  <1> 	push	ecx ; 14/07/2022
   258                              <1> 	;or	ecx, ecx
   259                              <1> 	;jz	short udrv_errb0
   260 000120FE 8A0D[A3850100]      <1> 	mov	cl, [disk_rw_err]
   261                              <1> udrv_errb0:
   262 00012104 0FB65E02            <1> 	movzx	ebx, byte [esi+LD_PhyDrvNo]
   263 00012108 80FB02              <1> 	cmp	bl, 2
   264 0001210B 7203                <1>         jb      short udrv_errb1
   265 0001210D 80EB7E              <1> 	sub	bl, 7Eh
   266                              <1> 	;cmp	bl, 5
   267                              <1> 	;ja	short udrv_errb2
   268                              <1> udrv_errb1:
   269 00012110 81C3[65660000]      <1>         add     ebx, drv.error ; 13/02/2016
   270 00012116 880B                <1> 	mov	[ebx], cl ; error code
   271                              <1> udrv_errb2:
   272                              <1> 	;pop	cx
   273 00012118 59                  <1> 	pop	ecx  ; 14/07/2022
   274 00012119 5B                  <1> 	pop	ebx
   275 0001211A 9D                  <1> 	popf
   276 0001211B C3                  <1> 	retn
   277                              <1> 
   278                              <1> lba_read_ok:
   279 0001211C 89C8                <1> 	mov	eax, ecx ; sector number
   280 0001211E 01F8                <1> 	add	eax, edi ; sector number (next)
   281 00012120 C1E709              <1> 	shl	edi, 9 ; sector count * 512
   282 00012123 01FB                <1> 	add	ebx, edi ; next buffer offset
   283                              <1> 
   284 00012125 8B0D[A4850100]      <1> 	mov	ecx, [sector_count] ; remaining sectors
   285 0001212B 09C9                <1> 	or	ecx, ecx
   286 0001212D 758A                <1> 	jnz	short lba_read_next
   287 0001212F EBC9                <1> 	jmp	short lba_read_retn
   288                              <1> 
   289                              <1> lba_read_reset:
   290 00012131 B40D                <1> 	mov	ah, 0Dh ; Alternate reset
   291 00012133 E88D2EFFFF          <1>         call	int13h
   292                              <1> 	; al = ? (changed)
   293                              <1> 	; ah = error code
   294 00012138 739B                <1> 	jnc	short lba_read_retry
   295 0001213A EBBE                <1> 	jmp	short lba_read_retn
  3437                                  %include 'trdosk8.s' ; 24/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.10) - MAIN PROGRAM : trdosk8.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 28/01/2025  (Previous: 29/12/2024)
     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 0001213C 3A05[FD940100]      <1>         cmp     al, [u.uno]     ; same process ?
   115 00012142 750C                <1> 	jne	short srunseq_2 ; no
   116                              <1> 
   117 00012144 8A25[F6940100]      <1> 	mov	ah, [u.pri] 	; present/current priority
   118 0001214A 80FC02              <1> 	cmp	ah, 2       	; 'run for event' priority level
   119 0001214D 7220                <1> 	jb	short srunseq_6 ; no
   120                              <1> 
   121                              <1> srunseq_1:
   122                              <1> 	; there is nothing to do!
   123 0001214F 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 00012150 80FA02              <1> 	cmp	dl, 2 		; event queue
   132 00012153 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 00012155 3A15[F6940100]      <1> 	cmp	dl, [u.pri] 	; priority of present process
   140 0001215B 7606                <1> 	jna	short srunseq_3 ; is high, also
   141                              <1> 	;
   142                              <1> 	; present process will be swapped/switched out
   143 0001215D FE05[89890100]      <1> 	inc	byte [p_change] ; 1
   144                              <1> 
   145                              <1> srunseq_3:
   146                              <1> 	; add process to 'runq_event' queue for new event
   147 00012163 BB[9A940100]        <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 00012168 E96FEDFFFF          <1> 	jmp	putlu
   156                              <1> 
   157                              <1> srunseq_5:
   158 0001216D F5                  <1> 	cmc
   159 0001216E C3                  <1> 	retn
   160                              <1> 
   161                              <1> srunseq_6:
   162                              <1> 	; present priority of the process is not high
   163                              <1> 	
   164 0001216F 8815[F6940100]      <1> 	mov	[u.pri], dl ; new priority 
   165                              <1> 			    ; (will be used by 'tswap')
   166                              <1> 
   167 00012175 80FA02              <1> 	cmp	dl, 2 		; high priority ?
   168 00012178 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 0001217A BB[9C940100]        <1> 	mov	ebx, runq_normal ; 'run as regular' queue
   176                              <1> 
   177 0001217F 20E4                <1> 	and	ah, ah  ;  previous value of [u.pri]
   178 00012181 75E5                <1> 	jnz	short srunseq_4
   179                              <1> 
   180 00012183 43                  <1> 	inc	ebx
   181 00012184 43                  <1> 	inc	ebx
   182                              <1> 	; ebx = runq_background ; 'run on backgroud' queue
   183                              <1> 
   184 00012185 EBE1                <1> 	jmp	short srunseq_4
   185                              <1> clock:
   186                              <1> 	; 21/08/2024 - TRDOS 386 v2.0.9
   187                              <1> 	; 23/05/2016
   188                              <1> 	; 22/05/2016
   189                              <1> 	; 20/05/2016
   190                              <1> 	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
   191                              <1> 	; 14/05/2015 - 14/10/2015 (Retro UNIX 386 v1)
   192                              <1> 	; 07/12/2013 - 10/04/2014 (Retro UNIX 8086 v1)
   193                              <1> 
   194                              <1> 	;;;
   195                              <1> 	; 21/08/2024
   196                              <1> 	;cmp	word [u.quit], 0FFFFh
   197 00012187 803D[FA940100]FF    <1> 	cmp	byte [u.quit], 0FFh
   198 0001218E 721A                <1> 	jb	short clk_0
   199                              <1> 	; CTRL+BRK keys pressed
   200                              <1> 	;cmp	word [u.intr], 0
   201 00012190 803D[F8940100]00    <1> 	cmp	byte [u.intr], 0
   202 00012197 7611                <1> 	jna	short clk_0
   203 00012199 C605[89890100]FF    <1> 	mov	byte [p_change], 0FFh ; -1 ; CTRL+BREAK sign
   204 000121A0 F605[F4940100]FF    <1> 	test	byte [u.quant], 0FFh  ; if [u.quant] number > 0
   205 000121A7 752D                <1> 	jnz	short clk_1 ; decrease [u.quant] number
   206                              <1> 	; [u.quant] = 0
   207 000121A9 C3                  <1> 	retn
   208                              <1> 	;;;
   209                              <1> clk_0:
   210 000121AA 803D[F4940100]00    <1> 	cmp	byte [u.quant], 0
   211 000121B1 7723                <1> 	ja	short clk_1
   212                              <1> 	;
   213 000121B3 803D[FD940100]01    <1> 	cmp     byte [u.uno], 1 ; /etc/init ? (for Retro UNIX 8086 & 386 v1)
   214                              <1> 				; MainProg (Kernel's Command Interpreter)
   215                              <1> 				; for TRDOS 386.
   216 000121BA 761A                <1> 	jna	short clk_1 ; yes, do not swap out
   217                              <1> 	;
   218 000121BC 803D[A0940100]FF    <1> 	cmp     byte [sysflg], 0FFh ; user or system space ?
   219 000121C3 7517                <1> 	jne	short clk_2 	    ; system space (sysflg <> 0FFh)
   220                              <1> 	;
   221                              <1> 	; 21/08/2024
   222                              <1> 	;cmp	word [u.intr], 0
   223                              <1> 	;jna	short clk_2
   224                              <1> 	;
   225                              <1> 	; 23/05/2016
   226 000121C5 803D[8A890100]00    <1> 	cmp	byte [multi_tasking], 0
   227 000121CC 760E                <1> 	jna	short clk_2
   228                              <1> 
   229                              <1> 	; 21/08/2024
   230                              <1> 	;inc	byte [p_change] ; it is time to change running process
   231 000121CE C605[89890100]01    <1> 	mov	byte [p_change], 1
   232 000121D5 C3                  <1> 	retn
   233                              <1> clk_1:
   234 000121D6 FE0D[F4940100]      <1> 	dec	byte [u.quant]
   235                              <1> clk_2:
   236 000121DC C3                  <1> 	retn   ; return to (hardware) timer interrupt routine
   237                              <1> 
   238                              <1> ; 12/10/2017
   239                              <1> ; 15/01/2017
   240                              <1> ; 14/01/2017
   241                              <1> ; 07/01/2017
   242                              <1> ; 02/01/2017
   243                              <1> ; 17/08/2016
   244                              <1> ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   245                              <1> int34h: ; #IOCTL# (I/O port access support for ring 3)
   246                              <1> 	;
   247                              <1> 	; 23/05/2016
   248                              <1> 	; 20/06/2016
   249                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   250                              <1> 	;
   251                              <1> 	; INPUT ->
   252                              <1> 	;	AH = 0 -> read port  (physical IO port) -byte-
   253                              <1> 	;	AH = 1 -> write port (physical IO port) -byte-
   254                              <1> 	;		AL = data byte
   255                              <1> 	;	AH = 2 -> read port  (physical IO port) -word-
   256                              <1> 	;	AH = 3 -> write port (physical IO port) -word-
   257                              <1> 	;		BX = data word
   258                              <1> 	;	AH = 4 -> read port  (physical IO port) -dword-
   259                              <1> 	;	AH = 5 -> write port (physical IO port) -dword-
   260                              <1> 	;		EBX = data dword
   261                              <1> 	;	; 12/10/2017
   262                              <1> 	;	AH = 6 -> read port (physical IO port) twice -byte-
   263                              <1> 	;	AH = 7 -> write port (physical IO port) twice -byte-
   264                              <1> 	;		BX = data word	
   265                              <1> 	;
   266                              <1> 	;	DX = Port number (<= 0FFFFh)
   267                              <1> 	;
   268                              <1> 	; OUTPUT ->
   269                              <1> 	;	AL = data byte (in al, dx)
   270                              <1> 	;	AX = data word (in ax, dx)
   271                              <1> 	;	EAX = data dword (in eax, dx)
   272                              <1> 	;
   273                              <1> 	;	(ECX = actual TRANSFER COUNT for string functions)
   274                              <1> 	;
   275                              <1> 	;
   276                              <1> 	; Modified registers: EAX
   277                              <1> 	;
   278                              <1> 
   279                              <1> 	;cmp	ah, 5
   280                              <1> 	;ja	short int34h_5 ; invalid function !
   281                              <1> 
   282                              <1> 	; 12/10/2017
   283 000121DD 80FC07              <1> 	cmp	ah, 7
   284 000121E0 7743                <1> 	ja	short int34h_5 ; invalid function !
   285                              <1> 
   286                              <1> 	;; 15/01/2017
   287                              <1> 	; 14/01/2017
   288                              <1> 	; 02/01/2017
   289                              <1> 	;;mov	byte [ss:intflg], 34h	; IOCTL interrupt
   290 000121E2 FB                  <1> 	sti
   291                              <1> 	
   292                              <1> 	;sti	; enable interrupts
   293 000121E3 80642408FE          <1> 	and	byte [esp+8], 11111110b	; clear carry bit of eflags register
   294                              <1> 
   295 000121E8 80FC01              <1> 	cmp	ah, 1
   296 000121EB 7205                <1> 	jb	short int34h_0
   297 000121ED 7705                <1> 	ja	short int34h_1
   298                              <1> 
   299 000121EF EE                  <1> 	out	dx, al
   300                              <1> 	;iretd
   301 000121F0 EB01                <1> 	jmp	short int34h_iret
   302                              <1> 
   303                              <1> int34h_0:
   304 000121F2 EC                  <1> 	in	al, dx
   305                              <1> 	;iretd
   306                              <1> int34h_iret:
   307                              <1> 	;cli	; 07/01/2017
   308                              <1> 	;; 15/01/2017
   309                              <1> 	;;mov	byte [ss:intflg], 0 ; reset
   310 000121F3 CF                  <1> 	iretd 
   311                              <1> 
   312                              <1> int34h_1:
   313 000121F4 F6C401              <1> 	test	ah, 1
   314 000121F7 7516                <1> 	jnz	short int34h_3 ; out
   315                              <1> 
   316                              <1> 	; in
   317 000121F9 80FC02              <1> 	cmp	ah, 2
   318 000121FC 7707                <1> 	ja	short int34h_2
   319                              <1> 
   320 000121FE 6689D8              <1> 	mov	ax, bx
   321 00012201 66ED                <1> 	in	ax, dx
   322                              <1> 	;iretd
   323 00012203 EBEE                <1> 	jmp	short int34h_iret
   324                              <1> 
   325                              <1> int34h_2:
   326 00012205 80FC04              <1> 	cmp	ah, 4
   327 00012208 772C                <1> 	ja	short int34h_7	; 12/10/2017
   328                              <1> 	; ah = 4
   329 0001220A 89D8                <1> 	mov	eax, ebx
   330 0001220C ED                  <1> 	in	eax, dx
   331                              <1> 	;iretd
   332 0001220D EBE4                <1> 	jmp	short int34h_iret
   333                              <1> 
   334                              <1> int34h_3:
   335 0001220F 80FC03              <1> 	cmp	ah, 3
   336 00012212 7707                <1> 	ja	short int34h_4
   337                              <1> 
   338 00012214 6689D8              <1> 	mov	ax, bx
   339 00012217 66EF                <1> 	out	dx, ax
   340                              <1> 	;iretd
   341 00012219 EBD8                <1> 	jmp	short int34h_iret
   342                              <1> 
   343                              <1> int34h_4:
   344 0001221B 80FC05              <1> 	cmp	ah, 5
   345 0001221E 770B                <1> 	ja	short int34h_6	; 12/10/2017
   346                              <1> 	; ah = 5
   347 00012220 89D8                <1> 	mov	eax, ebx
   348 00012222 EF                  <1> 	out	dx, eax
   349                              <1> 	;iretd
   350 00012223 EBCE                <1> 	jmp	short int34h_iret
   351                              <1> 
   352                              <1> int34h_5:
   353 00012225 804C240801          <1> 	or	byte [esp+8], 1	; set carry bit of eflags register
   354 0001222A CF                  <1> 	iretd
   355                              <1> 
   356                              <1> 	; 12/10/2017
   357                              <1> int34h_6:
   358 0001222B 6689D8              <1> 	mov	ax, bx
   359 0001222E EE                  <1> 	out	dx, al
   360 0001222F EB00                <1> 	jmp	short $+2
   361 00012231 86E0                <1> 	xchg	ah, al
   362 00012233 EE                  <1> 	out	dx, al
   363                              <1> 	;xchg	al, ah
   364                              <1> 	;iretd
   365 00012234 EB06                <1> 	jmp	short int34h_8
   366                              <1> int34h_7:
   367 00012236 EC                  <1> 	in	al, dx
   368 00012237 EB00                <1> 	jmp	short $+2
   369 00012239 88C4                <1> 	mov	ah, al
   370 0001223B EC                  <1> 	in	al, dx
   371                              <1> int34h_8:
   372 0001223C 86C4                <1> 	xchg	al, ah
   373 0001223E CF                  <1> 	iretd
   374                              <1> 
   375                              <1> INT4Ah:
   376                              <1> 	; 24/01/2016
   377                              <1> 	; this procedure will be called by 'RTC_INT' (in 'timer.s')
   378 0001223F C3                  <1> 	retn
   379                              <1> 
   380                              <1> ; u0.s
   381                              <1> ; Retro UNIX 386 v1 Kernel (v0.2) - SYS0.INC
   382                              <1> ; Last Modification: 20/11/2015
   383                              <1> 
   384                              <1> com2_int:
   385                              <1> 	; 07/11/2015 
   386                              <1> 	; 24/10/2015
   387                              <1> 	; 23/10/2015
   388                              <1> 	; 14/03/2015 (Retro UNIX 386 v1 - Beginning)
   389                              <1> 	; 28/07/2014 (Retro UNIX 8086 v1)
   390                              <1> 	; < serial port 2 interrupt handler >
   391                              <1> 	;
   392 00012240 890424              <1> 	mov 	[esp], eax ; overwrite call return address
   393                              <1> 	;push	eax
   394 00012243 66B80900            <1> 	mov	ax, 9
   395 00012247 EB07                <1> 	jmp	short comm_int
   396                              <1> com1_int:
   397                              <1> 	; 07/11/2015
   398                              <1> 	; 24/10/2015
   399 00012249 890424              <1> 	mov 	[esp], eax ; overwrite call return address
   400                              <1> 	; 23/10/2015
   401                              <1> 	;push	eax
   402 0001224C 66B80800            <1> 	mov	ax, 8
   403                              <1> comm_int:
   404                              <1> 	; 20/11/2015
   405                              <1> 	; 18/11/2015
   406                              <1> 	; 17/11/2015
   407                              <1> 	; 16/11/2015
   408                              <1> 	; 09/11/2015
   409                              <1> 	; 08/11/2015
   410                              <1> 	; 07/11/2015
   411                              <1> 	; 06/11/2015 (serial4.asm, 'serial')
   412                              <1> 	; 01/11/2015
   413                              <1> 	; 26/10/2015
   414                              <1> 	; 23/10/2015
   415 00012250 53                  <1> 	push	ebx
   416 00012251 56                  <1> 	push	esi
   417 00012252 57                  <1> 	push	edi
   418 00012253 1E                  <1> 	push 	ds
   419 00012254 06                  <1> 	push 	es
   420                              <1> 	; 18/11/2015
   421 00012255 0F20DB              <1> 	mov	ebx, cr3
   422 00012258 53                  <1> 	push	ebx ; ****
   423                              <1> 	;
   424 00012259 51                  <1> 	push	ecx ; ***
   425 0001225A 52                  <1> 	push	edx ; **
   426                              <1> 	;
   427 0001225B BB10000000          <1> 	mov	ebx, KDATA
   428 00012260 8EDB                <1> 	mov	ds, bx
   429 00012262 8EC3                <1> 	mov	es, bx
   430                              <1> 	;
   431 00012264 8B0D[F07C0100]      <1> 	mov	ecx, [k_page_dir]
   432 0001226A 0F22D9              <1> 	mov	cr3, ecx
   433                              <1> 	; 20/11/2015
   434                              <1> 	; Interrupt identification register
   435 0001226D 66BAFA02            <1> 	mov	dx, 2FAh ; COM2
   436                              <1> 	;
   437 00012271 3C08                <1> 	cmp 	al, 8 
   438 00012273 7702                <1> 	ja 	short com_i0
   439                              <1> 	;
   440                              <1> 	; 20/11/2015
   441                              <1> 	; 17/11/2015
   442                              <1> 	; 16/11/2015
   443                              <1> 	; 15/11/2015
   444                              <1> 	; 24/10/2015
   445                              <1> 	; 14/03/2015 (Retro UNIX 386 v1 - Beginning)
   446                              <1> 	; 28/07/2014 (Retro UNIX 8086 v1)
   447                              <1> 	; < serial port 1 interrupt handler >
   448                              <1> 	;
   449 00012275 FEC6                <1> 	inc	dh ; 3FAh ; COM1 Interrupt id. register
   450                              <1> com_i0:
   451                              <1> 	;push	eax ; *
   452                              <1> 	; 07/11/2015
   453 00012277 A2[5A7D0100]        <1> 	mov 	byte [ccomport], al
   454                              <1> 	; 09/11/2015
   455 0001227C 0FB7D8              <1> 	movzx	ebx, ax ; 8 or 9
   456                              <1> 	; 17/11/2015
   457                              <1>  	; reset request for response status
   458 0001227F 88A3[507D0100]      <1> 	mov	[ebx+req_resp-8], ah ; 0
   459                              <1> 	;
   460                              <1> 	; 20/11/2015
   461 00012285 EC                  <1> 	in	al, dx		; read interrupt id. register
   462 00012286 EB00                <1> 	JMP	$+2	   	; I/O DELAY
   463 00012288 2404                <1> 	and	al, 4		; received data available?
   464 0001228A 7470                <1> 	jz	short com_eoi	; (transmit. holding reg. empty)
   465                              <1> 	;
   466                              <1> 	; 20/11/2015
   467 0001228C 80EA02              <1> 	sub	dl, 3FAh-3F8h	; data register (3F8h, 2F8h)
   468 0001228F EC                  <1> 	in	al, dx     	; read character
   469                              <1> 	;JMP	$+2	   	; I/O DELAY
   470                              <1> 	; 08/11/2015
   471                              <1> 	; 07/11/2015
   472 00012290 89DE                <1> 	mov	esi, ebx 
   473 00012292 89DF                <1> 	mov	edi, ebx
   474 00012294 81C6[547D0100]      <1> 	add 	esi, rchar - 8 ; points to last received char
   475 0001229A 81C7[567D0100]      <1> 	add	edi, schar - 8 ; points to last sent char
   476 000122A0 8806                <1> 	mov	[esi], al ; received char (current char)
   477                              <1> 	; query
   478 000122A2 20C0                <1> 	and	al, al
   479 000122A4 7527                <1> 	jnz	short com_i2
   480                              <1>    	; response
   481                              <1> 	; 17/11/2015
   482                              <1> 	; set request for response status
   483 000122A6 FE83[507D0100]      <1>         inc     byte [ebx+req_resp-8] ; 1
   484                              <1> 	;
   485 000122AC 6683C205            <1> 	add	dx, 3FDh-3F8h	; (3FDh, 2FDh)
   486 000122B0 EC                  <1> 	in	al, dx	   	; read line status register
   487 000122B1 EB00                <1> 	JMP	$+2	   	; I/O DELAY
   488 000122B3 2420                <1> 	and	al, 20h	   	; transmitter holding reg. empty?
   489 000122B5 7445                <1> 	jz	short com_eoi 	; no
   490 000122B7 B0FF                <1> 	mov 	al, 0FFh   	; response
   491 000122B9 6683EA05            <1> 	sub	dx, 3FDh-3F8h 	; data port (3F8h, 2F8h)
   492 000122BD EE                  <1> 	out	dx, al	   	; send on serial port
   493                              <1> 	; 17/11/2015
   494 000122BE 803F00              <1> 	cmp 	byte [edi], 0   ; query ? (schar)
   495 000122C1 7502                <1> 	jne 	short com_i1    ; no
   496 000122C3 8807                <1> 	mov	[edi], al 	; 0FFh (responded)
   497                              <1> com_i1:
   498                              <1> 	; 17/11/2015
   499                              <1> 	; reset request for response status (again)
   500 000122C5 FE8B[507D0100]      <1>         dec     byte [ebx+req_resp-8] ; 0 
   501 000122CB EB2F                <1> 	jmp	short com_eoi
   502                              <1> com_i2:	
   503                              <1> 	; 08/11/2015
   504 000122CD 3CFF                <1> 	cmp 	al, 0FFh	; (response ?)
   505 000122CF 7417                <1> 	je	short com_i3	; (check for response signal)
   506                              <1> 	; 07/11/2015
   507 000122D1 3C04                <1> 	cmp	al, 04h	; EOT
   508 000122D3 751C                <1> 	jne	short com_i4	
   509                              <1> 	; EOT = 04h (End of Transmit) - 'CTRL + D'
   510                              <1> 	;(an EOT char is supposed as a ctrl+brk from the terminal)
   511                              <1> 	; 08/11/2015
   512                              <1> 		; ptty -> tty 0 to 7 (pseudo screens)
   513 000122D5 861D[1E7D0100]      <1> 	xchg	bl, [ptty]  ; tty number (8 or 9)
   514 000122DB E80E4BFFFF          <1> 	call 	ctrlbrk
   515 000122E0 861D[1E7D0100]      <1> 	xchg	[ptty], bl ; (restore ptty value and BL value)
   516                              <1> 	;mov	al, 04h ; EOT
   517                              <1> 	; 08/11/2015
   518 000122E6 EB09                <1> 	jmp	short com_i4	
   519                              <1> com_i3:
   520                              <1> 	; 08/11/2015
   521                              <1> 	; If 0FFh has been received just after a query
   522                              <1> 	; (schar, ZERO), it is a response signal.
   523                              <1> 	; 17/11/2015
   524 000122E8 803F00              <1>         cmp     byte [edi], 0 ; query ? (schar)
   525 000122EB 7704                <1> 	ja	short com_i4 ; no
   526                              <1> 	; reset query status (schar)
   527 000122ED 8807                <1> 	mov	[edi], al ; 0FFh
   528 000122EF FEC0                <1> 	inc	al ; 0
   529                              <1> com_i4:
   530                              <1> 	; 27/07/2014
   531                              <1> 	; 09/07/2014
   532 000122F1 D0E3                <1> 	shl	bl, 1
   533 000122F3 81C3[207D0100]      <1> 	add	ebx, ttychr
   534                              <1> 	; 23/07/2014 (always overwrite)
   535                              <1> 	;;cmp	word [ebx], 0
   536                              <1> 	;;ja	short com_eoi
   537                              <1> 	;
   538 000122F9 668903              <1> 	mov	[ebx], ax   ; Save ascii code
   539                              <1> 			    ; scan code = 0
   540                              <1> com_eoi:
   541                              <1> 	;mov	al, 20h
   542                              <1> 	;out	20h, al	   ; end of interrupt
   543                              <1> 	;
   544                              <1> 	; 07/11/2015
   545                              <1>       	;pop	eax ; *
   546 000122FC A0[5A7D0100]        <1> 	mov	al, byte [ccomport] ; current COM port
   547                              <1> 	 ; al = tty number (8 or 9)
   548 00012301 E80F000000          <1>         call	wakeup
   549                              <1> com_iret:
   550                              <1> 	; 23/10/2015
   551 00012306 5A                  <1> 	pop	edx ; **
   552 00012307 59                  <1> 	pop	ecx ; ***
   553                              <1> 	; 18/11/2015
   554                              <1> 	;pop	eax ; ****
   555                              <1> 	;mov	cr3, eax
   556                              <1> 	;jmp	iiret
   557 00012308 E9D7EAFEFF          <1> 	jmp	iiretp
   558                              <1> 
   559                              <1> ;iiretp: ; 01/09/2015
   560                              <1> ;	; 28/08/2015
   561                              <1> ;	pop	eax ; (*) page directory
   562                              <1> ;	mov	cr3, eax
   563                              <1> ;iiret:
   564                              <1> ;	; 22/08/2014
   565                              <1> ;	mov	al, 20h ; END OF INTERRUPT COMMAND TO 8259
   566                              <1> ;	out	20h, al	; 8259 PORT
   567                              <1> ;	;
   568                              <1> ;	pop	es
   569                              <1> ;	pop	ds
   570                              <1> ;	pop	edi
   571                              <1> ;	pop	esi
   572                              <1> ;	pop	ebx ; 29/08/2014
   573                              <1> ;	pop 	eax
   574                              <1> ;	iretd
   575                              <1> 
   576                              <1> ; 21/11/2023
   577                              <1> %if 0
   578                              <1> 
   579                              <1> sp_init:
   580                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
   581                              <1> 	; 07/11/2015
   582                              <1> 	; 29/10/2015
   583                              <1> 	; 26/10/2015
   584                              <1> 	; 23/10/2015
   585                              <1> 	; 29/06/2015
   586                              <1> 	; 14/03/2015 (Retro UNIX 386 v1 - 115200 baud)
   587                              <1> 	; 28/07/2014 (Retro UNIX 8086 v1 - 9600 baud)
   588                              <1> 	; Initialization of Serial Port Communication Parameters
   589                              <1> 	; (COM1 base port address = 3F8h, COM1 Interrupt = IRQ 4)
   590                              <1> 	; (COM2 base port address = 2F8h, COM1 Interrupt = IRQ 3)
   591                              <1> 	;
   592                              <1> 	; ((Modified registers: EAX, ECX, EDX, EBX))
   593                              <1> 	;
   594                              <1> 	; INPUT:  (29/06/2015)
   595                              <1> 	;	AL = 0 for COM1
   596                              <1> 	;	     1 for COM2
   597                              <1> 	;	AH = Communication parameters	
   598                              <1> 	;
   599                              <1> 	;  (*) Communication parameters (except BAUD RATE):
   600                              <1> 	;	Bit	4	3	2	1	0
   601                              <1> 	;		-PARITY--   STOP BIT  -WORD LENGTH-
   602                              <1> 	;  this one -->	00 = none    0 = 1 bit  11 = 8 bits
   603                              <1> 	;		01 = odd     1 = 2 bits	10 = 7 bits
   604                              <1> 	;		11 = even
   605                              <1> 	;  Baud rate setting bits: (29/06/2015)
   606                              <1> 	;		Retro UNIX 386 v1 feature only !
   607                              <1> 	;	Bit	7    6    5  | Baud rate
   608                              <1> 	;		------------------------
   609                              <1> 	;	value	0    0    0  | Default (Divisor = 1)
   610                              <1> 	;		0    0    1  | 9600 (12)
   611                              <1> 	;		0    1    0  | 19200 (6)
   612                              <1> 	;		0    1	  1  | 38400 (3)
   613                              <1> 	;		1    0	  0  | 14400 (8)
   614                              <1> 	;		1    0	  1  | 28800 (4)
   615                              <1> 	;		1    1    0  | 57600 (2)
   616                              <1> 	;		1    1    1  | 115200 (1)
   617                              <1> 	
   618                              <1> 	; References:	
   619                              <1> 	; (1) IBM PC-XT Model 286 BIOS Source Code
   620                              <1> 	;     RS232.ASM --- 10/06/1985 COMMUNICATIONS BIOS (RS232)
   621                              <1> 	; (2) Award BIOS 1999 - ATORGS.ASM
   622                              <1> 	; (3) http://wiki.osdev.org/Serial_Ports
   623                              <1> 	;
   624                              <1> 	; Set communication parameters for COM1 (= 03h)
   625                              <1> 	;
   626                              <1> 	mov	ebx, com1p		; COM1 parameters
   627                              <1> 	mov	dx, 3F8h		; COM1
   628                              <1> 	 ; 29/10/2015
   629                              <1> 	mov	cx, 301h  ; divisor = 1 (115200 baud)
   630                              <1> 	call	sp_i3	; call A4
   631                              <1> 	test	al, 80h
   632                              <1> 	jz	short sp_i0 ; OK..
   633                              <1> 		; Error !
   634                              <1> 	;mov	dx, 3F8h
   635                              <1> 	sub	dl, 5 ; 3FDh -> 3F8h
   636                              <1> 	mov	cx, 30Eh  ; divisor = 12 (9600 baud)
   637                              <1> 	call	sp_i3	; call A4
   638                              <1> 	test	al, 80h
   639                              <1> 	jnz	short sp_i1
   640                              <1> sp_i0:
   641                              <1>         ; (Note: Serial port interrupts will be disabled here...)
   642                              <1>         ; (INT 14h initialization code disables interrupts.)
   643                              <1> 	;
   644                              <1> 	mov	byte [ebx], 0E3h ; 11100011b
   645                              <1> 	call	sp_i5 ; 29/06/2015
   646                              <1> sp_i1:
   647                              <1> 	inc	ebx
   648                              <1> 	mov	dx, 2F8h		; COM2
   649                              <1> 	 ; 29/10/2015
   650                              <1> 	mov	cx, 301h  ; divisor = 1 (115200 baud)
   651                              <1> 	call	sp_i3	; call A4
   652                              <1> 	test	al, 80h
   653                              <1> 	jz	short sp_i2 ; OK..
   654                              <1> 		; Error !
   655                              <1> 	;mov	dx, 2F8h
   656                              <1> 	sub	dl, 5 ; 2FDh -> 2F8h
   657                              <1> 	mov	cx, 30Eh  ; divisor = 12 (9600 baud)
   658                              <1> 	call	sp_i3	; call A4
   659                              <1> 	test	al, 80h
   660                              <1> 	jnz	short sp_i7
   661                              <1> sp_i2:
   662                              <1> 	mov	byte [ebx], 0E3h ; 11100011b
   663                              <1> sp_i6:
   664                              <1> 	;; COM2 - enabling IRQ 3
   665                              <1> 	; 29/07/2022
   666                              <1> 	; 07/11/2015
   667                              <1> 	; 26/10/2015
   668                              <1> 	pushf
   669                              <1> 	cli
   670                              <1> 	;
   671                              <1> 	mov	dx, 2FCh   		; modem control register
   672                              <1> 	in	al, dx 	   		; read register
   673                              <1> 	JMP	$+2	   		; I/O DELAY
   674                              <1> 	or	al, 8      		; enable bit 3 (OUT2)
   675                              <1> 	out	dx, al     		; write back to register
   676                              <1> 	JMP	$+2	   		; I/O DELAY
   677                              <1> 	;mov	dx, 2F9h   		; interrupt enable register
   678                              <1> 	; 29/07/2022
   679                              <1> 	mov	dl, 0F9h
   680                              <1> 	in	al, dx     		; read register
   681                              <1> 	JMP	$+2	   		; I/O DELAY
   682                              <1> 	;or	al, 1      		; receiver data interrupt enable and
   683                              <1> 	or	al, 3	   		; transmitter empty interrupt enable
   684                              <1> 	out	dx, al 	   		; write back to register
   685                              <1> 	JMP	$+2        		; I/O DELAY
   686                              <1> 	in	al, 21h    		; read interrupt mask register
   687                              <1> 	JMP	$+2	   		; I/O DELAY
   688                              <1> 	and	al, 0F7h   		; enable IRQ 3 (COM2)
   689                              <1> 	out	21h, al    		; write back to register
   690                              <1> 	;
   691                              <1> 	; 23/10/2015
   692                              <1> 	mov 	eax, com2_int
   693                              <1> 	mov	[com2_irq3], eax
   694                              <1> 	; 26/10/2015
   695                              <1> 	popf	
   696                              <1> sp_i7:
   697                              <1> 	retn
   698                              <1> 
   699                              <1> sp_i3:
   700                              <1> ;A4:  	;-----	INITIALIZE THE COMMUNICATIONS PORT
   701                              <1> 	; 28/10/2015
   702                              <1> 	inc	dl	; 3F9h (2F9h)	; 3F9h, COM1 Interrupt enable register 
   703                              <1> 	mov	al, 0
   704                              <1> 	out	dx, al			; disable serial port interrupt
   705                              <1> 	JMP	$+2			; I/O DELAY
   706                              <1> 	add	dl, 2 	; 3FBh (2FBh)	; COM1 Line control register (3FBh)
   707                              <1> 	mov	al, 80h			
   708                              <1> 	out	dx, al			; SET DLAB=1 ; divisor latch access bit
   709                              <1> 	;-----	SET BAUD RATE DIVISOR
   710                              <1> 	; 26/10/2015
   711                              <1> 	sub 	dl, 3   ; 3F8h (2F8h)	; register for least significant byte
   712                              <1> 					; of the divisor value
   713                              <1> 	mov	al, cl	; 1
   714                              <1> 	out	dx, al			; 1 = 115200 baud (Retro UNIX 386 v1)
   715                              <1> 					; 2 = 57600 baud
   716                              <1> 					; 3 = 38400 baud
   717                              <1> 					; 6 = 19200 baud
   718                              <1> 					; 12 = 9600 baud (Retro UNIX 8086 v1)
   719                              <1> 	JMP	$+2			; I/O DELAY
   720                              <1> 	sub	al, al
   721                              <1> 	inc	dl      ; 3F9h (2F9h)	; register for most significant byte
   722                              <1> 					; of the divisor value
   723                              <1> 	out	dx, al ; 0
   724                              <1> 	JMP	$+2			; I/O DELAY
   725                              <1> 	;	
   726                              <1> 	mov	al, ch ; 3		; 8 data bits, 1 stop bit, no parity
   727                              <1> 	;and	al, 1Fh ; Bits 0,1,2,3,4	
   728                              <1> 	add	dl, 2	; 3FBh (2FBh)	; Line control register
   729                              <1> 	out	dx, al
   730                              <1> 	JMP	$+2			; I/O DELAY
   731                              <1> 	; 29/10/2015
   732                              <1> 	dec 	dl 	; 3FAh (2FAh)	; FIFO Control register (16550/16750)
   733                              <1> 	xor	al, al			; 0
   734                              <1> 	out	dx, al			; Disable FIFOs (reset to 8250 mode)
   735                              <1> 	JMP	$+2	
   736                              <1> sp_i4:
   737                              <1> ;A18:	;-----	COMM PORT STATUS ROUTINE
   738                              <1> 	; 29/06/2015 (line status after modem status)
   739                              <1> 	add	dl, 4	; 3FEh (2FEh)	; Modem status register
   740                              <1> sp_i4s:
   741                              <1> 	in	al, dx			; GET MODEM CONTROL STATUS
   742                              <1> 	JMP	$+2			; I/O DELAY
   743                              <1> 	mov	ah, al			; PUT IN (AH) FOR RETURN
   744                              <1> 	dec	dl	; 3FDh (2FDh)	; POINT TO LINE STATUS REGISTER
   745                              <1> 					; dx = 3FDh for COM1, 2FDh for COM2
   746                              <1> 	in	al, dx			; GET LINE CONTROL STATUS
   747                              <1> 	; AL = Line status, AH = Modem status
   748                              <1> 	retn
   749                              <1> 
   750                              <1> sp_status:
   751                              <1> 	; 29/06/2015
   752                              <1> 	; 27/06/2015 (Retro UNIX 386 v1)
   753                              <1> 	; Get serial port status
   754                              <1> 	mov	dx, 3FEh		; Modem status register (COM1)
   755                              <1> 	sub	dh, al			; dh = 2 for COM2 (al = 1)
   756                              <1> 					; dx = 2FEh for COM2
   757                              <1> 	jmp	short sp_i4s
   758                              <1> 
   759                              <1> sp_setp: ; Set serial port communication parameters
   760                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
   761                              <1> 	; 07/11/2015
   762                              <1> 	; 29/10/2015
   763                              <1> 	; 29/06/2015
   764                              <1> 	; Retro UNIX 386 v1 feature only !
   765                              <1> 	;
   766                              <1> 	; INPUT:
   767                              <1> 	;	AL = 0 for COM1
   768                              <1> 	;	     1 for COM2
   769                              <1> 	;	AH = Communication parameters (*)
   770                              <1> 	; OUTPUT:
   771                              <1> 	;	CL = Line status
   772                              <1> 	;	CH = Modem status
   773                              <1> 	;   If cf = 1 -> Error code in [u.error]
   774                              <1> 	;		 'invalid parameter !'
   775                              <1> 	;		 	 or
   776                              <1> 	;		 'device not ready !' error
   777                              <1> 	;	
   778                              <1> 	;  (*) Communication parameters (except BAUD RATE):
   779                              <1> 	;	Bit	4	3	2	1	0
   780                              <1> 	;		-PARITY--   STOP BIT  -WORD LENGTH-
   781                              <1> 	;  this one -->	00 = none    0 = 1 bit  11 = 8 bits
   782                              <1> 	;		01 = odd     1 = 2 bits	10 = 7 bits
   783                              <1> 	;		11 = even
   784                              <1> 	;  Baud rate setting bits: (29/06/2015)
   785                              <1> 	;		Retro UNIX 386 v1 feature only !
   786                              <1> 	;	Bit	7    6    5  | Baud rate
   787                              <1> 	;		------------------------
   788                              <1> 	;	value	0    0    0  | Default (Divisor = 1)
   789                              <1> 	;		0    0    1  | 9600 (12)
   790                              <1> 	;		0    1    0  | 19200 (6) 
   791                              <1> 	;		0    1	  1  | 38400 (3) 
   792                              <1> 	;		1    0	  0  | 14400 (8)
   793                              <1> 	;		1    0	  1  | 28800 (4)
   794                              <1> 	;		1    1    0  | 57600 (2)
   795                              <1> 	;		1    1    1  | 115200 (1) 
   796                              <1> 	;
   797                              <1> 	; (COM1 base port address = 3F8h, COM1 Interrupt = IRQ 4)
   798                              <1> 	; (COM2 base port address = 2F8h, COM1 Interrupt = IRQ 3)
   799                              <1> 	;
   800                              <1> 	; ((Modified registers: EAX, ECX, EDX, EBX))
   801                              <1> 	;
   802                              <1> 	mov	dx, 3F8h
   803                              <1> 	mov	ebx, com1p ; COM1 control byte offset
   804                              <1> 	cmp	al, 1
   805                              <1> 	ja 	short sp_invp_err
   806                              <1> 	jb	short sp_setp1 ;  COM1 (AL = 0)
   807                              <1> 	dec	dh ; 2F8h
   808                              <1> 	inc	ebx ; COM2 control byte offset
   809                              <1> sp_setp1:
   810                              <1> 	; 29/10/2015
   811                              <1> 	mov	[ebx], ah
   812                              <1> 	movzx 	ecx, ah
   813                              <1> 	shr	cl, 5 ; -> baud rate index
   814                              <1> 	and	ah, 1Fh ; communication parameters except baud rate
   815                              <1> 	mov	al, [ecx+b_div_tbl]
   816                              <1> 	mov	cx, ax
   817                              <1> 	call	sp_i3
   818                              <1> 	mov	cx, ax ; CL = Line status, CH = Modem status
   819                              <1> 	test	al, 80h
   820                              <1> 	jz	short sp_setp2
   821                              <1>         mov     byte [ebx], 0E3h ; Reset to initial value (11100011b)
   822                              <1> stp_dnr_err:
   823                              <1> 	mov	dword [u.error], ERR_DEV_NOT_RDY ; 'device not ready !'
   824                              <1> 	; CL = Line status, CH = Modem status
   825                              <1> 	stc
   826                              <1> 	retn
   827                              <1> sp_setp2:
   828                              <1> 	cmp	dh, 2 ; COM2 (2F?h)
   829                              <1> 	;jna	sp_i6
   830                              <1> 		      ; COM1 (3F?h)
   831                              <1> 	; 29/07/2022
   832                              <1> 	ja	short sp_i5
   833                              <1> 	jmp	sp_i6
   834                              <1> sp_i5: 
   835                              <1> 	; 29/07/2022
   836                              <1> 	; 07/11/2015
   837                              <1> 	; 26/10/2015
   838                              <1> 	; 29/06/2015
   839                              <1> 	;
   840                              <1> 	;; COM1 - enabling IRQ 4
   841                              <1> 	pushf
   842                              <1> 	cli
   843                              <1> 	mov	dx, 3FCh   		; modem control register
   844                              <1> 	in	al, dx 	   		; read register
   845                              <1> 	JMP	$+2			; I/O DELAY
   846                              <1> 	or	al, 8      		; enable bit 3 (OUT2)
   847                              <1> 	out	dx, al     		; write back to register
   848                              <1> 	JMP	$+2			; I/O DELAY
   849                              <1> 	;mov	dx, 3F9h   		; interrupt enable register
   850                              <1> 	; 29/07/2022
   851                              <1> 	mov	dl, 0F9h
   852                              <1> 	in	al, dx     		; read register
   853                              <1> 	JMP	$+2			; I/O DELAY
   854                              <1> 	;or	al, 1      		; receiver data interrupt enable and
   855                              <1> 	or	al, 3	   		; transmitter empty interrupt enable
   856                              <1> 	out	dx, al 	   		; write back to register
   857                              <1> 	JMP	$+2        		; I/O DELAY
   858                              <1> 	in	al, 21h    		; read interrupt mask register
   859                              <1> 	JMP	$+2			; I/O DELAY
   860                              <1> 	and	al, 0EFh   		; enable IRQ 4 (COM1)
   861                              <1> 	out	21h, al    		; write back to register
   862                              <1> 	;
   863                              <1> 	; 23/10/2015
   864                              <1> 	mov 	eax, com1_int
   865                              <1> 	mov	[com1_irq4], eax
   866                              <1> 	; 26/10/2015
   867                              <1> 	popf
   868                              <1> 	retn
   869                              <1> 
   870                              <1> sp_invp_err:
   871                              <1> 	mov	dword [u.error], ERR_INV_PARAMETER ; 'invalid parameter !'
   872                              <1> 	xor	ecx, ecx
   873                              <1> 	dec	ecx ; 0FFFFh
   874                              <1> 	stc
   875                              <1> 	retn
   876                              <1> 
   877                              <1> ; 29/10/2015
   878                              <1> b_div_tbl: ; Baud rate divisor table (115200/divisor)
   879                              <1> 	db 1, 12, 6, 3, 8, 4, 1
   880                              <1> 
   881                              <1> %endif
   882                              <1> 
   883                              <1> ; 23/10/2015
   884                              <1> com1_irq4:
   885 0001230D [15230100]          <1> 	dd dummy_retn
   886                              <1> com2_irq3:
   887 00012311 [15230100]          <1> 	dd dummy_retn
   888                              <1> 
   889                              <1> ; 21/11/2023
   890                              <1> dummy_retn:
   891                              <1> 	;retn
   892                              <1> wakeup:
   893                              <1> 	; 24/01/2016
   894 00012315 C3                  <1> 	retn
   895                              <1> 
   896                              <1> set_working_path_x:
   897                              <1> 		; 17/10/2016 (TRDOS 386 - FFF & FNF)
   898                              <1> 		;mov	ax, 1 
   899                              <1> 			; File name is needed/forced (AL=1)
   900                              <1> 			; Change directory as temporary (AH=0)
   901                              <1> 		; 29/07/2022
   902 00012316 31C0                <1> 		xor	eax, eax
   903 00012318 FEC0                <1> 		inc	al
   904                              <1> 		; eax = 1
   905                              <1> set_working_path_xx: ; 30/12/2017 (syschdir)
   906                              <1> 		; This is needed for preventing wrong Find Next File
   907                              <1> 		; system call after sysopen, syscreate, sysmkdir etc.
   908                              <1> 		; Find Next File must immediate follow Find First File)
   909                              <1> 
   910 0001231A 8825[B0890100]      <1> 		mov	[FFF_Valid], ah ; 0 ; reset ; 17/10/2016
   911                              <1> 
   912                              <1> set_working_path:
   913                              <1> 		; 08/08/2022
   914                              <1> 		; 29/07/2022 - TRDOS 386 Kernel v2.0.5
   915                              <1> 		; 16/10/2016
   916                              <1> 		; 12/10/2016
   917                              <1> 		; 10/10/2016
   918                              <1> 		; 05/10/2016 - TRDOS 386 (TRDOS v2.0)
   919                              <1> 		;
   920                              <1> 		; TRDOS v1.0 (DIR.ASM, "proc_set_working_path")
   921                              <1>                 ; 27/01/2011 - 08/02/2011 
   922                              <1> 		; Set/Changes current drive, directory and file
   923                              <1> 		; depending on command tail
   924                              <1> 		; (procedure is derivated from CMD_INTR.ASM 
   925                              <1> 		; file or dir locating code of internal commands)
   926                              <1> 		; (This procedure is prepared for INT 21H file/dir 
   927                              <1> 		; functions and also to get compact code for 
   928                              <1> 		; internal mainprog -command interpreter- commands)
   929                              <1> 		; 
   930                              <1> 		; INPUT: DS:SI -> Command tail (ASCIIZ string)
   931                              <1> 		; AL = 0 -> any, AL > 0 -> file name is forced
   932                              <1> 		; AH = CD -> Change directory permanently 
   933                              <1> 		; AH <> CD -> Change directory as temporary    
   934                              <1> 		; 
   935                              <1> 		; OUTPUT: ES=DS, FindFile structure has been set
   936                              <1> 		;        RUN_CDRV points previous current drive  
   937                              <1> 		;        DS:SI = FindFile structure address
   938                              <1> 		;        (DS=CS)       
   939                              <1> 		;        AX, BX, CX, DX, DI will be changed
   940                              <1> 		;   cf = 1 -> Error code in AX (AL)
   941                              <1> 		;        stc & AX = 0 -> Bad command or path name
   942                              <1> 		; -----------------------------------------------
   943                              <1> 		;
   944                              <1> 		; TRDOS 386 (05/10/2016)
   945                              <1> 		; INPUT:
   946                              <1> 		;	ESI = File/Directory Path (ASCIIZ string)
   947                              <1> 		;             address in user's memory space
   948                              <1> 		;       AL = 0 -> any
   949                              <1> 		;       AL > 0 -> file name is forced
   950                              <1> 		;       AH = CD -> change directory as permanent
   951                              <1> 		;       AH <> CD -> change directory as temporary
   952                              <1> 		; 
   953                              <1> 		; OUTPUT:
   954                              <1> 		;	FindFile structure has been set
   955                              <1> 		;       RUN_CDRV points previous current drive
   956                              <1> 		;       ESI = FindFile_Name address ; 12/10/2016
   957                              <1> 		;
   958                              <1> 		;       cf = 1 -> Error code in EAX (AL)
   959                              <1> 		;       stc & EAX = 0 -> Bad command or path name
   960                              <1> 		;  
   961                              <1> 		; Modified registers: EAX, EBX, ECX, EDX, ESI, EDI
   962                              <1> 
   963 00012320 66A3[B4890100]      <1> 		mov	[SWP_Mode], ax
   964 00012326 A0[B27D0100]        <1> 		mov	al, [Current_Drv]
   965 0001232B 30E4                <1> 		xor	ah, ah
   966 0001232D 66A3[B6890100]      <1> 		mov	[SWP_DRV], ax
   967                              <1> 
   968                              <1> 		; TRDOS 386 ring 3 (user's page directory)
   969                              <1> 		; to ring 0 (kernel's page directory)
   970                              <1> 		; transfer modifications (05/10/2016).
   971                              <1> 
   972 00012333 55                  <1> 		push	ebp
   973 00012334 89E5                <1> 		mov	ebp, esp
   974                              <1> 		
   975                              <1> 		;mov	ecx, 128 ; maximum path length = 128 bytes
   976                              <1> 		; 29/07/2022
   977 00012336 31C9                <1> 		xor	ecx, ecx
   978 00012338 B180                <1> 		mov	cl, 128
   979 0001233A 29CC                <1> 		sub	esp, ecx ; reserve 128 bytes (buffer) on stack
   980 0001233C 89E7                <1> 		mov	edi, esp ; destination address (kernel space)
   981                              <1> 		; esi = source address (virtual, in user's memory space)
   982 0001233E E8B7ECFFFF          <1> 		call	transfer_from_user_buffer
   983 00012343 720D                <1> 		jc	short loc_swp_xor_retn 
   984                              <1> 		
   985 00012345 89E6                <1> 		mov	esi, esp ; temporary buffer (the path) on stack
   986                              <1> loc_swp_fchar:
   987 00012347 8A06                <1> 		mov	al, [esi]
   988 00012349 3C20                <1> 		cmp	al, 20h
   989 0001234B 7711                <1> 		ja	short loc_swp_parse_path_name
   990                              <1> 		;je	short loc_swp_fchar_next
   991                              <1> 		; 29/07/2022
   992 0001234D 7203                <1> 		jb	short loc_swp_xor_retn
   993                              <1> 
   994                              <1> loc_swp_fchar_next:
   995 0001234F 46                  <1> 		inc	esi
   996 00012350 EBF5                <1> 		jmp	short loc_swp_fchar
   997                              <1> 
   998                              <1> loc_swp_xor_retn:
   999 00012352 31C0                <1> 		xor	eax, eax
  1000 00012354 F9                  <1> 		stc
  1001                              <1> loc_swp_retn:
  1002 00012355 89EC                <1> 		mov	esp, ebp
  1003 00012357 5D                  <1> 		pop	ebp
  1004                              <1> 
  1005                              <1> 		;mov	esi, FindFile_Drv
  1006 00012358 BE[94860100]        <1> 		mov	esi, FindFile_Name ; 12/10/2016
  1007 0001235D C3                  <1> 		retn 
  1008                              <1> 
  1009                              <1> ;loc_swp_fchar_next:
  1010                              <1> ;		inc	esi
  1011                              <1> ;		jmp	short loc_swp_fchar  
  1012                              <1> 
  1013                              <1> loc_swp_parse_path_name:
  1014 0001235E BF[52860100]        <1> 		mov	edi, FindFile_Drv
  1015 00012363 E8FD88FFFF          <1> 		call	parse_path_name
  1016 00012368 72EB                <1> 		jc	short loc_swp_retn
  1017                              <1> 
  1018                              <1> loc_swp_checkfile_name:
  1019 0001236A 803D[B4890100]00    <1> 		cmp	byte [SWP_Mode], 0
  1020 00012371 761E                <1> 		jna	short loc_swp_drv
  1021                              <1> 
  1022                              <1> 		; 10/10/2016 (valid file name checking)
  1023 00012373 BE[94860100]        <1> 		mov	esi, FindFile_Name
  1024 00012378 803E20              <1> 		cmp	byte [esi], 20h
  1025 0001237B 76D5                <1> 		jna	short loc_swp_xor_retn
  1026                              <1> 
  1027                              <1> 		; 16/10/2016
  1028 0001237D C605[B3890100]00    <1> 		mov	byte [SWP_inv_fname], 0 ; reset 
  1029                              <1> 		; esi = file name address (ASCIIZ)
  1030 00012384 E8866BFFFF          <1> 		call	check_filename
  1031 00012389 7306                <1> 		jnc	short loc_swp_drv
  1032                              <1> 
  1033 0001238B FE05[B3890100]      <1> 		inc	byte [SWP_inv_fname] ; set
  1034                              <1> loc_swp_drv:
  1035 00012391 8A35[B27D0100]      <1> 		mov	dh, [Current_Drv]
  1036                              <1>                ;mov	[RUN_CDRV], dh
  1037                              <1> 
  1038 00012397 8A15[52860100]      <1> 		mov	dl, [FindFile_Drv]
  1039                              <1>                ;cmp	dl, dh
  1040 0001239D 3A15[B27D0100]      <1> 		cmp	dl, [Current_Drv]
  1041 000123A3 740D                <1> 		je	short loc_swp_change_directory
  1042                              <1> 
  1043 000123A5 FE05[B7890100]      <1> 		inc	byte [SWP_DRV_chg]
  1044 000123AB E8CD54FFFF          <1> 		call	change_current_drive
  1045 000123B0 72A3                <1> 		jc	short loc_swp_retn ; eax = error code
  1046                              <1> 		; eax = 0
  1047                              <1> 
  1048                              <1> loc_swp_change_directory:
  1049 000123B2 803D[53860100]21    <1> 		cmp	byte [FindFile_Directory], 21h
  1050 000123B9 F5                  <1> 		cmc
  1051 000123BA 7399                <1> 		jnc	short loc_swp_retn
  1052                              <1> 
  1053 000123BC FE05[B7890100]      <1> 		inc	byte [SWP_DRV_chg]
  1054 000123C2 FE05[CF340100]      <1> 		inc	byte [Restore_CDIR]
  1055 000123C8 BE[53860100]        <1> 		mov	esi, FindFile_Directory
  1056 000123CD 8A25[B5890100]      <1> 		mov	ah, [SWP_Mode+1] 
  1057 000123D3 E8A382FFFF          <1> 		call	change_current_directory
  1058                              <1> 		;jc	short loc_swp_retn ; eax = error code
  1059                              <1> 		; 08/08/2022
  1060 000123D8 7305                <1> 		jnc	short loc_swp_change_prompt_dir_string
  1061 000123DA E976FFFFFF          <1> 		jmp	loc_swp_retn	
  1062                              <1> 
  1063                              <1> loc_swp_change_prompt_dir_string:
  1064                              <1> 		; esi = PATH_Array
  1065                              <1> 		; eax = Current Directory First Cluster
  1066                              <1> 		; edi = Logical DOS Drive Description Table
  1067 000123DF E8C581FFFF          <1> 		call	change_prompt_dir_str 
  1068 000123E4 29C0                <1> 		sub	eax, eax ; 0
  1069 000123E6 E96AFFFFFF          <1> 		jmp	loc_swp_retn 
  1070                              <1> 
  1071                              <1> reset_working_path:
  1072                              <1> 		; 06/10/2016 - TRDOS 386 (TRDOS v2.0)
  1073                              <1> 		;
  1074                              <1> 		; TRDOS v1.0 (DIR.ASM, "proc_reset_working_path")
  1075                              <1> 		; 05/02/2011 - 08/02/2011
  1076                              <1> 		;
  1077                              <1> 		; Restores current drive and directory
  1078                              <1> 		; 
  1079                              <1> 		; INPUT: none
  1080                              <1> 		; OUTPUT: DL = SWP_DRV, EAX = 0 -> OK
  1081                              <1> 		;
  1082                              <1> 		;    AX = 0 -> ESI = Logical Dos Drv Desc. Table
  1083                              <1> 		;
  1084                              <1> 		;    EAX, EBX, ECX, EDX, ESI, EDI will be changed
  1085                              <1> 		;
  1086                              <1> 
  1087                              <1>   
  1088 000123EB 31C0                <1> 		xor	eax, eax
  1089 000123ED 48                  <1> 		dec	eax 
  1090                              <1> 
  1091 000123EE 668B15[B6890100]    <1> 		mov	dx, [SWP_DRV]
  1092 000123F5 08F6                <1> 		or	dh, dh
  1093 000123F7 742E                <1> 		jz	short loc_rwp_return
  1094                              <1> 
  1095 000123F9 3A15[B27D0100]      <1> 		cmp	dl, [Current_Drv]
  1096 000123FF 7407                <1> 		je	short loc_rwp_restore_cdir
  1097                              <1> loc_rwp_restore_cdrv:
  1098 00012401 E87754FFFF          <1> 		call	change_current_drive 
  1099 00012406 EB10                <1> 		jmp	short loc_rwp_restore_ok
  1100                              <1> loc_rwp_restore_cdir:
  1101 00012408 31DB                <1> 		xor	ebx, ebx
  1102 0001240A 88D7                <1> 		mov	bh, dl
  1103 0001240C BE00010900          <1> 		mov	esi, Logical_DOSDisks
  1104 00012411 01DE                <1> 		add	esi, ebx
  1105                              <1> 
  1106 00012413 E81B55FFFF          <1> 		call	restore_current_directory
  1107                              <1> 
  1108                              <1> loc_rwp_restore_ok:
  1109 00012418 668B15[B6890100]    <1> 		mov	dx, [SWP_DRV]
  1110 0001241F 31C0                <1> 		xor	eax, eax  
  1111 00012421 66A3[B7890100]      <1> 		mov	[SWP_DRV_chg], ax
  1112                              <1> loc_rwp_return:
  1113 00012427 C3                  <1> 		retn
  1114                              <1> 
  1115                              <1> get_file_name:
  1116                              <1> 		; 25/08/2024 (TRDOS 386 Kernel v2.0.9)
  1117                              <1> 		; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1118                              <1> 		; 15/10/2016 - TRDOS 386 (TRDOS v2.0)
  1119                              <1> 		; Convert file name 
  1120                              <1> 		;	from directory entry format
  1121                              <1>                 ; 	to (8.3) dot file name format
  1122                              <1> 		;
  1123                              <1> 		; TRDOS v1.0 (DIR.ASM, "get_file_name")
  1124                              <1>                 ; 2005 - 09/10/2011
  1125                              <1> 		; INPUT: 
  1126                              <1> 		;	DS:SI -> Directory Entry Format File Name
  1127                              <1> 		;       ES:DI -> DOS Dot File Name Address
  1128                              <1> 		; OUTPUT:
  1129                              <1> 		;	DS:SI -> DOS Dot File Name Address
  1130                              <1>                 ;	ES:DI -> Directory Entry Format File Name
  1131                              <1> 		;	
  1132                              <1> 		; TRDOS 386 (15/10/2016)
  1133                              <1> 		; INPUT:
  1134                              <1> 		;	ESI = File name addr in dir entry format
  1135                              <1> 		;	EDI = Dot file name address (destination)
  1136                              <1> 		; OUTPUT: 
  1137                              <1> 		;	File name is converted and moved
  1138                              <1> 		;	to destination (as 8.3 dot filename)
  1139                              <1> 		;  
  1140                              <1> 		; Modified registers: EAX, ECX
  1141                              <1> 
  1142                              <1>                 ; 2005 (TRDOS 8086) - 2016 (TRDOS 386)
  1143                              <1> 
  1144 00012428 57                  <1> 		push	edi
  1145 00012429 56                  <1> 		push	esi
  1146 0001242A AC                  <1> 		lodsb
  1147                              <1> 		; 25/08/2024
  1148 0001242B 31C9                <1> 		xor	ecx, ecx ; 0
  1149 0001242D 3C20                <1> 		cmp	al, 20h
  1150 0001242F 7626                <1> 		jna	short pass_gfn_ext
  1151                              <1> 		; 25/08/2024
  1152                              <1> 		;push	esi
  1153 00012431 AA                  <1> 		stosb
  1154                              <1> 		; 25/08/2024
  1155                              <1> 		; 29/07/2022
  1156                              <1> 		;xor	ecx, ecx
  1157                              <1> 		; ecx <= 128 ; 25/08/2024
  1158 00012432 B107                <1> 		mov	cl, 7
  1159                              <1> 		; 25/08/2024
  1160 00012434 01CE                <1> 		add	esi, ecx ; add esi, 7
  1161 00012436 56                  <1> 		push	esi ; (*)
  1162                              <1> loc_gfn_next_char:
  1163 00012437 AC                  <1> 		lodsb
  1164 00012438 3C20                <1> 		cmp	al, 20h
  1165 0001243A 7603                <1> 		jna	short pass_gfn_fn
  1166 0001243C AA                  <1> 		stosb
  1167 0001243D E2F8                <1> 		loop	loc_gfn_next_char
  1168                              <1> pass_gfn_fn:
  1169                              <1> 		;pop	esi
  1170                              <1> 		;add	esi, 7
  1171                              <1> 		; 25/08/2024
  1172 0001243F 5E                  <1> 		pop	esi ; (*)
  1173                              <1> 
  1174 00012440 AC                  <1> 		lodsb
  1175 00012441 3C20                <1> 		cmp	al, 20h
  1176 00012443 7612                <1> 		jna	short pass_gfn_ext
  1177 00012445 B42E                <1> 		mov	ah, '.'
  1178 00012447 86E0                <1> 		xchg	ah, al
  1179 00012449 66AB                <1> 		stosw
  1180 0001244B AC                  <1> 		lodsb
  1181 0001244C 3C20                <1> 		cmp	al, 20h
  1182 0001244E 7607                <1> 		jna	short pass_gfn_ext
  1183 00012450 AA                  <1> 		stosb
  1184 00012451 AC                  <1> 		lodsb
  1185 00012452 3C20                <1> 		cmp	al, 20h
  1186 00012454 7601                <1> 		jna	short pass_gfn_ext
  1187 00012456 AA                  <1> 		stosb
  1188                              <1> pass_gfn_ext:
  1189 00012457 30C0                <1> 		xor	al, al
  1190 00012459 AA                  <1> 		stosb
  1191 0001245A 5E                  <1> 		pop	esi
  1192 0001245B 5F                  <1> 		pop	edi
  1193                              <1> 		; 25/08/2024
  1194                              <1> 		; ecx <= 7
  1195 0001245C C3                  <1> 		retn
  1196                              <1> 
  1197                              <1> set_hardware_int_vector:
  1198                              <1> 		; 18/03/2017
  1199                              <1> 		; 03/03/2017
  1200                              <1> 		; 28/02/2017 - TRDOS 386 (TRDOS v2.0)
  1201                              <1> 		;
  1202                              <1> 		; SET/RESET HARDWARE INTERRUPT GATE
  1203                              <1> 		;
  1204                              <1> 		; Changes interrupt gate descriptor table
  1205                              <1> 		; (without changing default interrupt list)
  1206                              <1> 		;
  1207                              <1> 		; INPUT:
  1208                              <1> 		;	AL = IRQ number (0 to 15)
  1209                              <1> 		;	AH > 0 -> set
  1210                              <1> 		;	AH = 0 -> reset
  1211                              <1> 		;	
  1212                              <1> 		; Modified registers: eax, ebx, edx, edi
  1213                              <1> 		;
  1214                              <1> 		
  1215 0001245D C0E002              <1> 		shl	al, 2 ; IRQ number * 4
  1216 00012460 0FB6D8              <1> 		movzx	ebx, al
  1217                              <1> 
  1218 00012463 08E4                <1> 		or	ah, ah
  1219 00012465 7508                <1> 		jnz	short shintv_1 ; set (for user call service)
  1220                              <1> 		
  1221                              <1> 		; 18/03/2017
  1222 00012467 81C3[BC3C0100]      <1> 		add	ebx, IRQ_list ; reset to default interrupt list
  1223 0001246D EB06                <1> 		jmp	short shintv_2
  1224                              <1> shintv_1:
  1225 0001246F 81C3[96240100]      <1> 		add	ebx, IRQ_u_list
  1226                              <1> shintv_2:	
  1227 00012475 8B13                <1> 		mov	edx, [ebx] ; IRQ handler address
  1228                              <1> 		
  1229                              <1> 		; 03/03/2017
  1230 00012477 D0E0                <1> 		shl	al, 1 ; IRQ number * 8 
  1231                              <1> 		; 18/03/2017
  1232 00012479 0FB6F8              <1> 		movzx	edi, al 
  1233 0001247C 81C7[087B0100]      <1> 		add	edi, idt + (8*32) ; IRQ 0 offset = idt + 256
  1234                              <1> 		
  1235 00012482 89D0                <1> 		mov	eax, edx ; IRQ handler address
  1236 00012484 BB00000800          <1> 		mov	ebx, 80000h
  1237                              <1> 
  1238                              <1> 		;mov	edx, eax
  1239 00012489 66BA008E            <1> 		mov	dx, 8E00h
  1240 0001248D 6689C3              <1> 		mov	bx, ax
  1241 00012490 89D8                <1> 		mov	eax, ebx ; /* selector = 0x0008 = cs */
  1242                              <1>        			         ; /* interrupt gate - dpl=0, present */
  1243 00012492 AB                  <1> 		stosd	; selector & offset bits 0-15 	
  1244 00012493 8917                <1> 		mov	[edi], edx ; attributes & offset bits 16-23
  1245                              <1> 
  1246 00012495 C3                  <1> 		retn
  1247                              <1> IRQ_u_list:
  1248                              <1> 		; 28/02/2017
  1249 00012496 [88090000]          <1> 		dd	timer_int
  1250 0001249A [ED100000]          <1> 		dd	kb_int
  1251 0001249E [740B0000]          <1> 		dd	irq2
  1252 000124A2 [D6240100]          <1> 		dd	IRQ_service3
  1253 000124A6 [E0240100]          <1> 		dd	IRQ_service4
  1254 000124AA [EA240100]          <1> 		dd	IRQ_service5
  1255 000124AE [5A4E0000]          <1> 		dd	fdc_int	
  1256 000124B2 [F4240100]          <1> 		dd	IRQ_service7
  1257 000124B6 [FC0A0000]          <1> 		dd	rtc_int
  1258 000124BA [FE240100]          <1> 		dd	IRQ_service9
  1259 000124BE [08250100]          <1> 		dd	IRQ_service10
  1260 000124C2 [12250100]          <1> 		dd	IRQ_service11
  1261 000124C6 [1C250100]          <1> 		dd	IRQ_service12
  1262 000124CA [26250100]          <1> 		dd	IRQ_service13
  1263 000124CE [99570000]          <1> 		dd	hdc1_int
  1264 000124D2 [BC570000]          <1> 		dd	hdc2_int
  1265                              <1> 
  1266                              <1> 		; 03/03/2017
  1267                              <1> 		; 27/02/2017
  1268                              <1> IRQ_service3:
  1269 000124D6 36C605[248F0100]03  <1> 		mov	byte [ss:IRQnum], 3
  1270 000124DE EB4E                <1> 		jmp	short IRQ_service
  1271                              <1> IRQ_service4:
  1272 000124E0 36C605[248F0100]04  <1> 		mov	byte [ss:IRQnum], 4
  1273 000124E8 EB44                <1> 		jmp	short IRQ_service
  1274                              <1> IRQ_service5:
  1275 000124EA 36C605[248F0100]05  <1> 		mov	byte [ss:IRQnum], 5
  1276 000124F2 EB3A                <1> 		jmp	short IRQ_service
  1277                              <1> IRQ_service7:
  1278 000124F4 36C605[248F0100]07  <1> 		mov	byte [ss:IRQnum], 7
  1279 000124FC EB30                <1> 		jmp	short IRQ_service
  1280                              <1> IRQ_service9:
  1281 000124FE 36C605[248F0100]09  <1> 		mov	byte [ss:IRQnum], 9
  1282 00012506 EB26                <1> 		jmp	short IRQ_service
  1283                              <1> IRQ_service10:
  1284 00012508 36C605[248F0100]0A  <1> 		mov	byte [ss:IRQnum], 10
  1285 00012510 EB1C                <1> 		jmp	short IRQ_service
  1286                              <1> IRQ_service11:
  1287 00012512 36C605[248F0100]0B  <1> 		mov	byte [ss:IRQnum], 11
  1288 0001251A EB12                <1> 		jmp	short IRQ_service
  1289                              <1> IRQ_service12:
  1290 0001251C 36C605[248F0100]0C  <1> 		mov	byte [ss:IRQnum], 12
  1291 00012524 EB08                <1> 		jmp	short IRQ_service
  1292                              <1> IRQ_service13:
  1293 00012526 36C605[248F0100]0D  <1> 		mov	byte [ss:IRQnum], 13
  1294                              <1> 		;jmp	short IRQ_service
  1295                              <1> IRQ_service:
  1296                              <1> 		; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1297                              <1> 		; 13/06/2017
  1298                              <1> 		; 11/06/2017
  1299                              <1> 		; 10/06/2017
  1300                              <1> 		; 01/03/2017, 04/03/2017
  1301                              <1> 		; 27/02/2017, 28/02/2017
  1302 0001252E 1E                  <1> 		push	ds
  1303 0001252F 06                  <1> 		push	es
  1304 00012530 0FA0                <1> 		push	fs
  1305 00012532 0FA8                <1> 		push	gs
  1306                              <1> 
  1307 00012534 60                  <1> 		pushad	; eax,ecx,edx,ebx,esp,ebp,esi,edi
  1308 00012535 66B91000            <1> 		mov     cx, KDATA
  1309 00012539 8ED9                <1>         	mov     ds, cx
  1310 0001253B 8EC1                <1>         	mov     es, cx
  1311 0001253D 8EE1                <1>         	mov     fs, cx
  1312 0001253F 8EE9                <1>         	mov     gs, cx
  1313                              <1> 
  1314 00012541 0F20D8              <1> 		mov	eax, cr3
  1315 00012544 A3[208F0100]        <1> 		mov	[IRQ_cr3], eax
  1316                              <1> 
  1317 00012549 A1[F07C0100]        <1> 		mov	eax, [k_page_dir]
  1318 0001254E 0F22D8              <1> 		mov	cr3, eax 
  1319                              <1> 
  1320 00012551 A0[248F0100]        <1> 		mov	al, [IRQnum]
  1321                              <1> 
  1322                              <1> 		;mov	cl, [sysflg]
  1323                              <1> 		;mov	[u.r_mode], cl  ; system (0) or user mode (FFh) 
  1324                              <1> IRQsrv_0:
  1325 00012556 0FB6D8              <1> 		movzx	ebx, al
  1326 00012559 8A9B[F23B0100]      <1> 		mov	bl, [ebx+IRQenum] ; IRQ (available) index number + 1
  1327                              <1> 		; 01/03/2017
  1328 0001255F FECB                <1> 		dec	bl  ; IRQ index number, 0 to 8
  1329                              <1> 		;js	IRQsrv_5 ; not available to use here!?
  1330                              <1> 		; 29/07/2022
  1331 00012561 785E                <1> 		js	short IRQsrv_j5  ; (jump to IRQsrv_5)
  1332                              <1> 		;		 
  1333 00012563 80BB[EA8E0100]80    <1> 		cmp	byte [ebx+IRQ.method], 80h ; using by a dev or kernel? 
  1334 0001256A 7205                <1> 		jb	short IRQsrv_1 ; no
  1335                              <1> 
  1336                              <1> 		; If the IRQ service is already owned by TRDOS 386 kernel
  1337                              <1> 		;	 or a Device driver
  1338                              <1> 		; we need to call 'dev_IRQ_service'
  1339                              <1> 
  1340                              <1> 		; IRQ number in AL
  1341 0001256C E80E010000          <1> 		call	dev_IRQ_service	 ; IRQ service for device drivers
  1342                              <1> 		; IRQ number in AL
  1343                              <1> IRQsrv_1:		
  1344                              <1> 		; check user callback service status
  1345                              <1> 		; AL = IRQ number
  1346                              <1> 		; EBX = IRQ (Available) Index number
  1347                              <1> 
  1348 00012571 A2[27950100]        <1> 		mov	[u.irqwait], al ; set waiting IRQ flag
  1349                              <1> 
  1350 00012576 8A83[D88E0100]      <1> 		mov	al, [ebx+IRQ.owner]
  1351 0001257C 20C0                <1> 		and	al, al
  1352                              <1> 		;jz	IRQsrv_5 ; it is not owned by a user/proc
  1353                              <1> 		; 29/07/2022
  1354 0001257E 7441                <1> 		jz	short IRQsrv_j5  ; (jump to IRQsrv_5)
  1355                              <1> 
  1356                              <1> 		; 03/03/2017
  1357 00012580 89DA                <1> 		mov	edx, ebx
  1358 00012582 C0E202              <1> 		shl	dl, 2
  1359 00012585 8B92[FC8E0100]      <1> 		mov	edx, [edx+IRQ.addr] ; S.R.B. or Callback service addr
  1360                              <1> 		
  1361 0001258B 8AA3[EA8E0100]      <1> 		mov	ah, [ebx+IRQ.method]
  1362 00012591 F6C401              <1> 		test	ah, 1
  1363 00012594 7530                <1> 		jnz	short IRQsrv_4 ; Callback service method
  1364                              <1> 
  1365                              <1> 		; Signal Response Byte method
  1366                              <1> 		;mov	edx, [edx+IRQ.addr] ; Signal Response Byte address
  1367                              <1> 		;			    ; (Physical address, non-swappable)
  1368 00012596 80E402              <1> 		and	ah, 2 ; bit 1, (S.R.B.) counter (auto increment) method
  1369 00012599 8AA3[F38E0100]      <1> 		mov	ah, [ebx+IRQ.srb] ; Signal Response Byte value
  1370 0001259F 7408                <1> 		jz	short IRQsrv_2 ; fixed S.R.B. value
  1371                              <1> 		; counter method (auto increment)
  1372 000125A1 FEC4                <1> 		inc	ah
  1373 000125A3 88A3[F38E0100]      <1> 		mov	[ebx+IRQ.srb], ah ; next (count) number
  1374                              <1> IRQsrv_2:
  1375 000125A9 8822                <1> 		mov	[edx], ah ; put S.R.B. val to the user's S.R.B. addr
  1376 000125AB C605[27950100]00    <1> 		mov	byte [u.irqwait], 0 ; clear waiting IRQ flag
  1377                              <1> 
  1378 000125B2 3A05[FD940100]      <1> 		cmp	al, [u.uno]
  1379                              <1> 		;je	IRQsrv_5 ; the owner is current user/process
  1380                              <1> 		; 29/07/2022
  1381 000125B8 7407                <1> 		je	short IRQsrv_j5  ; (jump to IRQsrv_5)
  1382                              <1> IRQsrv_3:
  1383                              <1> 		; the owner is not current user/process
  1384                              <1> 		; AL = process number
  1385 000125BA B202                <1> 		mov	dl, 2 ; priority, 2 = event (high)
  1386 000125BC E87BFBFFFF          <1> 		call	set_run_sequence
  1387                              <1> 
  1388                              <1> 		; [u.irqwait] = waiting IRQ number for callback service
  1389                              <1> IRQsrv_j5:		; 29/07/2022
  1390 000125C1 E998000000          <1> 		jmp	IRQsrv_5
  1391                              <1> IRQsrv_4:
  1392 000125C6 3A05[FD940100]      <1> 		cmp	al, [u.uno]  ; is the owner is current user/process?
  1393 000125CC 75EC                <1> 		jne	short IRQsrv_3 ; no !
  1394                              <1> 
  1395                              <1> 		; Check if an IRQ callback service already in progress
  1396 000125CE 803D[28950100]00    <1> 		cmp	byte [u.r_lock], 0
  1397                              <1> 		;ja	IRQsrv_5 ; nothing to do !  
  1398                              <1> 				     ; (we need to complete prev callback)
  1399                              <1> 		; 29/07/2022
  1400 000125D5 77EA                <1> 		ja	short IRQsrv_j5  ; (jump to IRQsrv_5)
  1401                              <1> 
  1402 000125D7 803D[24950100]00    <1> 		cmp	byte [u.t_lock], 0
  1403 000125DE 777E                <1> 		ja	short IRQsrv_5 ; nothing to do !  
  1404                              <1> 				     ; (we need to complete timer callback)
  1405                              <1> 
  1406                              <1> 		; 04/03/2017
  1407 000125E0 C605[27950100]00    <1> 		mov	byte [u.irqwait], 0 ; reset/clear waiting IRQ flag
  1408                              <1> 
  1409 000125E7 FE05[28950100]      <1> 		inc	byte [u.r_lock] ; 'IRQ callback service in progress' flag
  1410                              <1> 
  1411 000125ED 8A0D[A0940100]      <1> 		mov	cl, [sysflg]   ; (system call) mode flag (kernel/user)
  1412 000125F3 880D[29950100]      <1> 		mov	[u.r_mode], cl ; system mode (0) or user mode (FFh)
  1413                              <1> 
  1414                              <1> 		; 
  1415 000125F9 8B2D[8C7C0100]      <1> 		mov	ebp, [tss.esp0] ; kernel stack address (for ring 0)
  1416 000125FF 83ED14              <1> 		sub	ebp, 20		; eip, cs, eflags, esp, ss
  1417 00012602 892D[A4940100]      <1> 	 	mov	[u.sp], ebp
  1418 00012608 8925[A8940100]      <1> 		mov	[u.usp], esp
  1419                              <1> 
  1420                              <1> 		;or	word [ebp+8], 200h ; 22/01/2017, force enabling interrupts
  1421                              <1> 
  1422 0001260E 8B44241C            <1> 		mov	eax, [esp+28] ; pushed eax
  1423 00012612 A3[AC940100]        <1> 		mov	[u.r0], eax
  1424                              <1> 
  1425 00012617 E850E8FFFF          <1> 		call	wswap ; save user's registers & status
  1426                              <1> 
  1427                              <1> 		; software int is in ring 0 but IRQ handler must return to ring 3
  1428                              <1> 		; so, ring 3 return address and stack registers
  1429                              <1> 		; (eip, cs, eflags, esp, ss) 
  1430                              <1> 		; must be copied to IRQ handler return
  1431                              <1> 		; eip will be replaced by callback service routine address
  1432                              <1> 
  1433 0001261C C605[A0940100]FF    <1> 		mov	byte [sysflg], 0FFh ; user mode
  1434                              <1> 
  1435                              <1> 		; system mode (system call)
  1436                              <1> 		;mov	ebp, [u.sp] ; EIP (u), CS (UCODE), EFLAGS (u),
  1437                              <1> 				    ; ESP (u), SS (UDATA)
  1438                              <1> 
  1439 00012623 8B4510              <1> 		mov	eax, [ebp+16]	; SS (UDATA)
  1440 00012626 89E6                <1> 		mov	esi, esp
  1441 00012628 50                  <1> 		push	eax
  1442 00012629 50                  <1> 		push	eax
  1443 0001262A 89E7                <1> 		mov	edi, esp
  1444 0001262C 893D[A8940100]      <1> 		mov	[u.usp], edi
  1445 00012632 B908000000          <1> 		mov	ecx, ((ESPACE/4) - 4) ; except DS, ES, FS, GS
  1446 00012637 F3A5                <1> 		rep	movsd
  1447 00012639 B104                <1> 		mov	cl, 4	
  1448 0001263B F3AB                <1> 		rep	stosd
  1449 0001263D 893D[A4940100]      <1> 		mov	[u.sp], edi
  1450 00012643 89EE                <1> 		mov	esi, ebp
  1451 00012645 B105                <1> 		mov	cl, 5 ; EIP (u), CS (UCODE), EFLAGS (u), ESP (u), SS (UDATA)
  1452 00012647 F3A5                <1> 		rep	movsd
  1453                              <1> 		;
  1454                              <1> 
  1455 00012649 8B0D[04950100]      <1> 		mov	ecx, [u.pgdir]
  1456 0001264F 890D[208F0100]      <1> 		mov	[IRQ_cr3], ecx
  1457                              <1> 
  1458                              <1> set_IRQ_callback_addr:
  1459                              <1> 		;
  1460                              <1> 		; This routine sets return address
  1461                              <1> 		; to start of user's interrupt
  1462                              <1> 		; service (callback) address
  1463                              <1> 		;
  1464                              <1> 		; INPUT:
  1465                              <1> 		;	EDX = callback routine/service address
  1466                              <1> 		;	      (virtual, not physical address!)
  1467                              <1> 		;	[u.sp] = kernel stack, points to
  1468                              <1> 		;		 user's EIP,CS,EFLAGS,ESP,SS
  1469                              <1> 		;		 registers.
  1470                              <1> 		; OUTPUT:
  1471                              <1> 		;	EIP (user) = callback (service) address
  1472                              <1> 		;	CS (user) = UCODE
  1473                              <1> 		;	EFLAGS (user) = flags before callback
  1474                              <1> 		;       ESP (user) = ESP-4 (user, before callback)
  1475                              <1> 		;	[ESP](user) = EIP (user) before callback
  1476                              <1> 		;
  1477                              <1> 		; Note: If CPU was in user mode while entering 
  1478                              <1> 		;	the timer interrupt service routine,
  1479                              <1> 		;	'IRET' will get return to callback routine
  1480                              <1> 		;	immediately. If CPU was in system/kernel mode
  1481                              <1> 		;	'iret' will get return to system call and
  1482                              <1> 		;	then, callback routine will be return address
  1483                              <1> 		;	from system call. (User's callback/service code
  1484                              <1> 		;	will be able to return to normal return address
  1485                              <1> 		;	via a 'sysrele' system call at the end.) 
  1486                              <1> 		;
  1487                              <1> 		; Note: User's IRQ callback service code must be ended
  1488                              <1> 		;	with a 'sysrele' system call !
  1489                              <1> 		;
  1490                              <1> 		;	For example:
  1491                              <1> 		;
  1492                              <1> 		;	audio_IRQ_callback:
  1493                              <1> 		;	    ...	 
  1494                              <1> 		;	    <load DMA buffer with audio data>
  1495                              <1> 		;	    ...
  1496                              <1> 		;	    mov eax, 39 ; 'sysrele'
  1497                              <1> 		;	    int 40h ; TRDOS 386 system call (interrupt)
  1498                              <1> 		;
  1499                              <1> 		
  1500                              <1> 		;mov	edx, [edx+IRQ.addr] ; Callback service address
  1501                              <1> 		;			    ; (Virtual address)
  1502                              <1> 		
  1503 00012655 8B2D[A4940100]      <1> 		mov	ebp, [u.sp]; kernel's stack, points to EIP (user)
  1504 0001265B 895500              <1> 		mov	[ebp], edx
  1505                              <1> IRQsrv_5:
  1506                              <1> 		; EOI & return
  1507                              <1> 		; 01/08/2020
  1508                              <1> 		; 11/06/2017
  1509                              <1> 		; 10/06/2017 
  1510                              <1> 		;mov	al, [IRQnum]
  1511 0001265E B020                <1> 		mov	al, 20h ; 01/08/2020
  1512 00012660 FA                  <1> 		cli
  1513                              <1> 		;cmp	al, 7
  1514 00012661 803D[248F0100]07    <1> 		cmp	byte [IRQnum], 7 ; 01/08/2020
  1515 00012668 7602                <1> 		jna	short IRQsrv_6
  1516                              <1> 		;
  1517                              <1> 		;;mov	al, EOI	; end of interrupt
  1518                              <1> 		;mov	al, 20h ; 01/08/2020
  1519                              <1> 		;cli		; disable interrupts till stack cleared
  1520                              <1> 		;out	INTB00, al ; For controll2 #2
  1521 0001266A E6A0                <1> 		out	0A0h, al
  1522                              <1> IRQsrv_6:
  1523                              <1> 		;mov	byte [IRQnum], 0 ; reset
  1524                              <1> 		;;mov	al, EOI	; end of interrupt
  1525                              <1> 		;mov	al, 20h ; 01/08/2020
  1526                              <1> 		;cli		; disable interrupts till stack cleared
  1527                              <1> 		;out	INTA00, al ; end of interrupt to 8259 - 1
  1528 0001266C E620                <1> 		out	20h, al	
  1529                              <1> IRQsrv_7:	
  1530                              <1> 		;; 13/06/2017
  1531                              <1> 		;or	word [ebp+8], 200h ; force enabling interrupts
  1532                              <1> 		;
  1533 0001266E 8B0D[208F0100]      <1> 		mov 	ecx, [IRQ_cr3]	; previous content of cr3 register
  1534 00012674 0F22D9              <1>  		mov	cr3, ecx	; restore cr3 register content
  1535                              <1> 		;
  1536 00012677 61                  <1> 		popad ; edi,esi,ebp,(icrement esp by 4),ebx,edx,ecx,eax
  1537                              <1> 		;
  1538 00012678 0FA9                <1> 		pop	gs
  1539 0001267A 0FA1                <1> 		pop	fs
  1540 0001267C 07                  <1> 		pop	es
  1541 0001267D 1F                  <1> 		pop	ds
  1542                              <1> 		;
  1543 0001267E CF                  <1> 		iretd	; return from interrupt
  1544                              <1> 
  1545                              <1> ; 17/04/2021
  1546                              <1> ; ('get_device_number' procedure is disabled as temporary)
  1547                              <1> 
  1548                              <1> ;get_device_number:
  1549                              <1> ;		; 08/10/2016
  1550                              <1> ;		; 07/10/2016 - TRDOS 386 (TRDOS v2.0)
  1551                              <1> ;		;
  1552                              <1> ;		; This procedure compares name of requested
  1553                              <1> ;		; device with kernel device names and
  1554                              <1> ;		; installable device names. If names match, 
  1555                              <1> ;		; the relevant device index (entry) number 
  1556                              <1> ;		; will be returned the caller (sysopen) 
  1557                              <1> ;		; for the requested device.
  1558                              <1> ;		;
  1559                              <1> ;		; NOTE: Installable device drivers must
  1560                              <1> ;		; be loaded before using 'sysopen'
  1561                              <1> ;		; (opendev) system call.
  1562                              <1> ;		;
  1563                              <1> ;		; INPUT:
  1564                              <1> ;		;    ESI = device name address (ASCIIZ)
  1565                              <1> ;		;         (in kernel's memory space)  
  1566                              <1> ;  		;    max name length = 8 without '/dev/')
  1567                              <1> ;		;    Device name will be capitalized 
  1568                              <1> ;		;    and if there is, '/dev/' will be
  1569                              <1> ;		;    removed from name before comparising)
  1570                              <1> ;		;
  1571                              <1> ;		; OUTPUT:
  1572                              <1> ;		;    cf = 0 -> 
  1573                              <1> ;		;      EAX (AL) = device entry/index number
  1574                              <1> ;		;    cf = 1 -> device not found (installed)
  1575                              <1> ;		;	       or invalid device name
  1576                              <1> ;		;	       (AL=0)
  1577                              <1> ;		;    device_name = device name address (asciiz)
  1578                              <1> ;			;
  1579                              <1> ;		; Modified registers: EAX, EBX, ESI, EDI
  1580                              <1> ;
  1581                              <1> ;		mov	edi, device_name
  1582                              <1> ;		call 	lodsb_capitalize
  1583                              <1> ;		mov	ah, al
  1584                              <1> ;		cmp	al, '/'
  1585                              <1> ;		jne	short gdn_1
  1586                              <1> ;		mov	edi, device_name
  1587                              <1> ;		call 	lodsb_capitalize
  1588                              <1> ;gdn_0:
  1589                              <1> ;		and	al, al ; 0 ?
  1590                              <1> ;		jz	short gdn_err ; null name after '/'
  1591                              <1> ;gdn_1:
  1592                              <1> ;		cmp	al, 'D'
  1593                              <1> ;		jne	short gdn_2
  1594                              <1> ;		call 	lodsb_capitalize
  1595                              <1> ;		cmp	al, 'E'
  1596                              <1> ;		jne	short gdn_2
  1597                              <1> ;		call 	lodsb_capitalize
  1598                              <1> ;		cmp	al, 'V'
  1599                              <1> ;		jne	short gdn_2
  1600                              <1> ;		lodsb
  1601                              <1> ;		cmp	al, '/'
  1602                              <1> ;		je	short gdn_4
  1603                              <1> ;gdn_2:
  1604                              <1> ;		cmp	ah, '/'
  1605                              <1> ;		jne	short gdn_5
  1606                              <1> ;gdn_err:		
  1607                              <1> ;		; invalid device name or device not found
  1608                              <1> ;		xor	eax, eax ; 0
  1609                              <1> ;		stc
  1610                              <1> ;		retn
  1611                              <1> ;gdn_3:
  1612                              <1> ;		cmp	al, '/'
  1613                              <1> ;		jne	short gdn_5
  1614                              <1> ;gdn_4:
  1615                              <1> ;		mov	edi, device_name
  1616                              <1> ;		jmp	short gdn_6
  1617                              <1> ;gdn_5:
  1618                              <1> ;		cmp	al, 0
  1619                              <1> ;		je	short gdn_7
  1620                              <1> ;gdn_6:
  1621                              <1> ;		call	lodsb_capitalize
  1622                              <1> ;		cmp	edi, device_name + 8
  1623                              <1> ;		jb	short gdn_3
  1624                              <1> ;		cmp	al, 0
  1625                              <1> ;		jne	short gdn_err
  1626                              <1> ;		cmp	edi, device_name + 1
  1627                              <1> ;		jna	short gdn_err ; null name after '/'
  1628                              <1> ;gdn_7:
  1629                              <1> ;		stosb
  1630                              <1> ;		; zero padding ("NAME",0,0,0,0)
  1631                              <1> ;		cmp	edi, device_name + 8
  1632                              <1> ;		jb	short gdn_7
  1633                              <1> ;gdn_8:
  1634                              <1> ;		; search for kernel device names
  1635                              <1> ;		mov	esi, device_name 
  1636                              <1> ;		mov	edi, KDEV_NAME
  1637                              <1> ;		xor	eax, eax
  1638                              <1> ;gdn_9:
  1639                              <1> ;		cmpsd	
  1640                              <1> ;		jne	short gdn_10
  1641                              <1> ;		cmpsd
  1642                              <1> ;		jne	short gdn_11
  1643                              <1> ;		jmp	short gdn_17 ; match
  1644                              <1> ;gdn_10:
  1645                              <1> ;		cmpsd  ; add esi, 4 & add edi, 4
  1646                              <1> ;gdn_11:
  1647                              <1> ;		mov	esi, device_name
  1648                              <1> ;		inc	al
  1649                              <1> ;		cmp	al, NumOfKernelDevNames
  1650                              <1> ;		jb	short gdn_9
  1651                              <1> ;gdn_12:
  1652                              <1> ;		; search for installable device names
  1653                              <1> ;		; esi = offset device_name 
  1654                              <1> ;		mov	edi, IDEV_NAME
  1655                              <1> ;		sub	al, al ; 0
  1656                              <1> ;gdn_13:
  1657                              <1> ;		cmpsd	
  1658                              <1> ;		jne	short gdn_14
  1659                              <1> ;		cmpsd
  1660                              <1> ;		jne	short gdn_15
  1661                              <1> ;		jmp	short gdn_19 ; match
  1662                              <1> ;gdn_14:
  1663                              <1> ;		cmpsd  ; add esi, 4 & add edi, 4
  1664                              <1> ;gdn_15:
  1665                              <1> ;		mov	esi, device_name
  1666                              <1> ;		inc	al
  1667                              <1> ;		cmp	al, NumOfInstallableDevices
  1668                              <1> ;		jb	short gdn_13
  1669                              <1> ;
  1670                              <1> ;gdn_16: 	; error: invalid device name (not found) !
  1671                              <1> ;		xor	al, al
  1672                              <1> ;		stc
  1673                              <1> ;		retn
  1674                              <1> ;
  1675                              <1> ;gdn_17:	; name match (with one of kernel device names)
  1676                              <1> ;		;
  1677                              <1> ;		; convert KDEV_NAME index to 
  1678                              <1> ;		; KDEV_NUMBER index
  1679                              <1> ;		; (different names are used for same devices)
  1680                              <1> ;		; (example: "COM1" & "TTY8" = device number 18)
  1681                              <1> ;		mov	ebx, eax ; < 256
  1682                              <1> ;		mov	al, [KDEV_NUMBER+ebx]
  1683                              <1> ;
  1684                              <1> ;		; check if empty dev entry in the list
  1685                              <1> ;		cmp	byte [DEV_OPENMODE+eax], 0
  1686                              <1> ;		ja	short gdn_18 ; it must be already set
  1687                              <1> ;
  1688                              <1> ;		; (re)set device name and access flags
  1689                              <1> ;		; (remain open work will be easy after that)
  1690                              <1> ;		; (NOTE: here, data will be copied to bss section)
  1691                              <1> ;		mov	bl, al
  1692                              <1> ;		sub	edi, 8 ; kernel device name address (data)
  1693                              <1> ;		shl	bx, 2 
  1694                              <1> ;		mov	[DEV_NAME_PTR+ebx], edi ; (all) device names
  1695                              <1> ;		mov	bl, [KDEV_ACCESS+eax] ; kernel dev list (data)
  1696                              <1> ;		mov	[DEV_ACCESS+eax], bl ; (all) device list (bss)
  1697                              <1> ;gdn_18:
  1698                              <1> ;		inc	al ; 1 to NumOfKernelDevNames (<=7Fh)
  1699                              <1> ;		; eax = device index/entry number
  1700                              <1> ;		retn		
  1701                              <1> ;
  1702                              <1> ;gdn_19:	; name match (with one of installable device names)
  1703                              <1> ;		;
  1704                              <1> ;		; al = 0 to NumOfInstallableDevices - 1 (<=7Fh)
  1705                              <1> ;
  1706                              <1> ;		mov	ebx, eax
  1707                              <1> ;		add	bl, NumOfKernelDevices 	; < NUMOFDEVICES
  1708                              <1> ;
  1709                              <1> ;		; check if empty dev entry in the list
  1710                              <1> ;		cmp	byte [DEV_OPENMODE+ebx], 0
  1711                              <1> ;		ja	short gdn_20 ; it must be already set
  1712                              <1> ;
  1713                              <1> ;		; (re)set device name and access flags
  1714                              <1> ;		; (remain open work will be easy after that)
  1715                              <1> ;		sub	edi, 8 ; installable device name address
  1716                              <1> ;		shl	bx, 2 ;*4
  1717                              <1> ;		mov	[DEV_NAME_PTR+ebx], edi ; (all) device names
  1718                              <1> ;		shr	bx, 2
  1719                              <1> ;		mov	al, [IDEV_FLAGS+eax] ; installable dev list
  1720                              <1> ;		mov	[DEV_ACCESS+ebx], al ; (all) device list
  1721                              <1> ;gdn_20:	
  1722                              <1> ;		mov	al, bl
  1723                              <1> ;		; eax = device index/entry number ; < NUMOFDEVICES
  1724                              <1> ;		retn
  1725                              <1> 
  1726                              <1> ;lodsb_capitalize:
  1727                              <1> ;	; 07/10/2016 - TRDOS 386 (TRDOS v2.0)
  1728                              <1> ;	; INPUT -> [esi] = character
  1729                              <1> ;	;          edi = destination
  1730                              <1> ;	; OUTPUT -> AL contains capitalized character
  1731                              <1> ;	;	   esi = esi+1
  1732                              <1> ;	;	   edi = edi+1	
  1733                              <1> ;	; 
  1734                              <1> ;	lodsb	
  1735                              <1> ;	cmp	al, 61h
  1736                              <1> ;    	jb	short lodsb_cap_retn
  1737                              <1> ;     	cmp	al, 7Ah
  1738                              <1> ;     	ja	short lodsb_cap_retn
  1739                              <1> ;     	and	al, 0DFh
  1740                              <1> ;lodsb_cap_retn:
  1741                              <1> ;	stosb
  1742                              <1> ;	retn
  1743                              <1> 
  1744                              <1> ; 17/04/2021
  1745                              <1> ; ('device_open' procedure is disabled as temporary)
  1746                              <1> 
  1747                              <1> ;device_open:
  1748                              <1> ;	; 08/10/2016 - TRDOS 386 (TRDOS v2.0)
  1749                              <1> ;	; Complete device opening work for sysopen (device)
  1750                              <1> ;	;
  1751                              <1> ;	; INPUT -> 
  1752                              <1> ;	;	EAX = Device Number (AL)
  1753                              <1> ;	;        CL = Open mode (1 = read, 2 = write)
  1754                              <1> ;	;	 CH = Device access byte (bit 0 = 0)
  1755                              <1> ;	; OUTPUT ->
  1756                              <1> ;	;	EAX = Device Number
  1757                              <1> ;	;	CF = 0 -> device has been opened
  1758                              <1> ;	;	CF = 1 -> device could not be opened
  1759                              <1> ;	;
  1760                              <1> ;	;  Modified registers: ebx, (edx, ecx, esi, edi, ebp)
  1761                              <1> ;	;
  1762                              <1> ;
  1763                              <1> ;	mov	ebx, eax
  1764                              <1> ;	shl	bx, 2 ; *4
  1765                              <1> ;
  1766                              <1> ;	test	ch, 80h ; bit 7, installable device driver flag
  1767                              <1> ;	jz	short d_open_2 ; Kernel device
  1768                              <1> ;	; installable device
  1769                              <1> ;d_open_1:
  1770                              <1> ;       jmp	dword [ebx+IDEV_OADDR-4]
  1771                              <1> ;d_open_2:
  1772                              <1> ;	jmp	dword [ebx+KDEV_OADDR-4]
  1773                              <1> 
  1774                              <1> ; 17/04/2021
  1775                              <1> ; ('device_close' procedure is disabled as temporary)
  1776                              <1> 
  1777                              <1> ;device_close:
  1778                              <1> ;	; 08/10/2016 - TRDOS 386 (TRDOS v2.0)
  1779                              <1> ;	; Complete device closing work for sysclose (device)
  1780                              <1> ;	;
  1781                              <1> ;	; INPUT -> 
  1782                              <1> ;	;	EAX = Device Number (AL)
  1783                              <1> ;	;        CL = Open mode (1 = read, 2 = write)
  1784                              <1> ;	;	 CH = Device access byte (bit 0 = 0)
  1785                              <1> ;	; OUTPUT ->
  1786                              <1> ;	;	EAX = Device Number	
  1787                              <1> ;	;	CF = 0 -> device has been closed
  1788                              <1> ;	;	CF = 1 -> device could not be closed
  1789                              <1> ;	;
  1790                              <1> ;	; Modified registers: ebx, (edx, ecx, esi, edi, ebp)
  1791                              <1> ;	;
  1792                              <1> ;
  1793                              <1> ;	mov	ebx, eax
  1794                              <1> ;	shl	bx, 2 ; *4
  1795                              <1> ;
  1796                              <1> ;	test	ch, 80h ; bit 7, installable device driver flag
  1797                              <1> ;	jz	short d_close_2 ; Kernel device
  1798                              <1> ;	; installable device
  1799                              <1> ;d_close_1:
  1800                              <1> ;       jmp	dword [ebx+IDEV_CADDR-4]
  1801                              <1> ;d_close_2:
  1802                              <1> ;	jmp	dword [ebx+KDEV_CADDR-4]
  1803                              <1> 
  1804                              <1> ;rnull:
  1805                              <1> ;	; 07/10/2016 - TRDOS 386 (TRDOS v2.0)
  1806                              <1> ;	; read null (read from null device)
  1807                              <1> ;	retn
  1808                              <1> 
  1809                              <1> ;wnull:
  1810                              <1> ;	; 07/10/2016 - TRDOS 386 (TRDOS v2.0)
  1811                              <1> ;	; write null (write to null device)
  1812                              <1> ;	retn
  1813                              <1> 
  1814                              <1> dev_IRQ_service:
  1815                              <1> 	; 12/05/2017
  1816                              <1> 	; 13/04/2017
  1817                              <1> 	; 27/02/2017 - TRDOS 386 (TRDOS v2.0)
  1818                              <1> 	; INPUT ->
  1819                              <1> 	;	AL = IRQ Number (0 to 15)
  1820                              <1> 	;	
  1821 0001267F 53                  <1> 	push	ebx
  1822 00012680 0FB6D8              <1> 	movzx	ebx, al
  1823 00012683 C0E302              <1> 	shl	bl, 2 ; * 4
  1824 00012686 8B9B[988E0100]      <1> 	mov	ebx, [ebx+DEV_INT_HNDLR]
  1825 0001268C 21DB                <1> 	and 	ebx, ebx
  1826 0001268E 7404                <1>         jz	short dIRQ_s_retn
  1827 00012690 50                  <1> 	push	eax
  1828                              <1> 
  1829 00012691 FFD3                <1> 	call	ebx
  1830                              <1> 
  1831 00012693 58                  <1> 	pop	eax
  1832                              <1> dIRQ_s_retn:
  1833 00012694 5B                  <1> 	pop	ebx
  1834 00012695 C3                  <1> 	retn
  1835                              <1> 
  1836                              <1> set_dev_IRQ_service:
  1837                              <1> 	; 09/08/2022
  1838                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1839                              <1> 	; 13/04/2017 - TRDOS 386 (TRDOS v2.0)
  1840                              <1> 	;
  1841                              <1> 	; Set Device Interrupt Service
  1842                              <1> 	;
  1843                              <1> 	; INPUT ->
  1844                              <1> 	;	AL = IRQ Number
  1845                              <1> 	;	EBX = Hardware Interrupt Service Address
  1846                              <1> 	;
  1847                              <1> 	; Note: There is not a validation check here
  1848                              <1> 	;	because this procedure is called by
  1849                              <1> 	;	TRDOS 386 kernel !
  1850                              <1> 	;       (Even if a device driver does not exist
  1851                              <1> 	;	this setting may be used by sysaudio
  1852                              <1> 	;	and other system calls for hardware
  1853                              <1> 	;	components which use IRQ method for I/O.)
  1854                              <1> 	;
  1855                              <1> 	;push	esi
  1856 00012696 0FB6F0              <1> 	movzx	esi, al
  1857                              <1> 	;shl	si, 2 ; * 4
  1858                              <1> 	; 09/08/2022
  1859 00012699 C1E602              <1> 	shl	esi, 2 ; * 4
  1860 0001269C 899E[988E0100]      <1> 	mov	[esi+DEV_INT_HNDLR], ebx
  1861                              <1> 	;pop	esi
  1862 000126A2 C3                  <1> 	retn
  1863                              <1> 
  1864                              <1> sysaudio: ; AUDIO FUNCTIONS
  1865                              <1> 	; 28/01/2025
  1866                              <1> 	; 27/01/2025
  1867                              <1> 	; 15/01/2025
  1868                              <1> 	; 12/01/2025
  1869                              <1> 	; 11/01/2025 (TRDOS 386 v2.0.10)
  1870                              <1> 	; 29/12/2024
  1871                              <1> 	; 19/12/2024
  1872                              <1> 	; 23/08/2024 (TRDOS 386 v2.0.9)
  1873                              <1> 	; 05/06/2024
  1874                              <1> 	; 04/06/2024
  1875                              <1> 	; 23/05/2024 (TRDOS 386 v2.0.8)
  1876                              <1>  	; 19/11/2023 (TRDOS 386 v2.0.7)
  1877                              <1> 	; 29/07/2022 (TRDOS 386 v2.0.5)
  1878                              <1> 	; 12/02/2021 (TRDOS 386 v2.0.3)
  1879                              <1> 	; 28/07/2020
  1880                              <1> 	; 27/07/2020
  1881                              <1> 	; 10/10/2017
  1882                              <1> 	; 22/06/2017
  1883                              <1> 	; 28/05/2017, 04/06/2017, 05/06/2017, 10/06/2017
  1884                              <1> 	; 01/05/2017, 12/05/2017, 15/05/2017, 20/05/2017
  1885                              <1> 	; 21/04/2017, 22/04/2017, 23/04/2017, 24/04/2017
  1886                              <1> 	; 10/04/2017, 13/04/2017, 14/04/2017, 16/04/2017
  1887                              <1> 	; 03/04/2017 (VIA VT8237R)
  1888                              <1> 	; 01/04/2016 (trdosk6.s -> tdosk8.s)
  1889                              <1> 	; 16/05/2016 - TRDOS 386 (TRDOS v2.0)
  1890                              <1> 	;
  1891                              <1> 	; Inputs:
  1892                              <1> 	;
  1893                              <1> 	;	BH = 0 -> Beep (PC Speaker)
  1894                              <1> 	;	     BL = Duration Counter (1 for 1/64 second)
  1895                              <1> 	;	     CX = Frequency Divisor (1193180/Frequency)
  1896                              <1> 	;		 (1331 for 886 Hz)
  1897                              <1> 	;
  1898                              <1> 	;	01/04/2017
  1899                              <1> 	;
  1900                              <1> 	; 	BH = 1 -> DETECT (& ENABLE) AUDIO DEVICE
  1901                              <1> 	;	     BL = 0 : PC SPEAKER
  1902                              <1> 	;		  1 : SOUND BLASTER 16
  1903                              <1> 	;		  2 : INTEL AC'97
  1904                              <1> 	;		  3 : VIA VT8237R (VT8233)
  1905                              <1> 	;		  4 : INTEL HDA
  1906                              <1> 	;	      5-FEh : unknown/invalid
  1907                              <1> 	;	        ; 04/06/2017
  1908                              <1> 	;		FFh : Get current audio device id
  1909                              <1> 	;
  1910                              <1> 	; 	BH = 2 -> ALLOCATE AUDIO BUFFER (for user)
  1911                              <1> 	;		ECX = Audio Buffer Size (must be equal to
  1912                              <1> 	;		      the half of DMA buffer size) 
  1913                              <1> 	;		EDX = Virtual Address of the buffer
  1914                              <1> 	;		      (This is not DMA buffer!)
  1915                              <1> 	;
  1916                              <1> 	;	BH = 3 -> INITIALIZE AUDIO DEVICE
  1917                              <1> 	;	     BL = 0,2 -> for Signal Response Byte
  1918                              <1> 	;	     	CL = Signal Response Byte Value (fixed)
  1919                              <1> 	;				if BL = 0
  1920                              <1> 	;	             auto increment of S.R.B. value
  1921                              <1> 	;			 	if BL = 2
  1922                              <1> 	;	        EDX = Signal Response (Return) Byte Address
  1923                              <1> 	;
  1924                              <1> 	;	     BL = 1 for CallBack Method
  1925                              <1> 	;	    	EDX = CallBack Service Address (Virtual)
  1926                              <1> 	;
  1927                              <1> 	;	     BL > 2 -> invalid function
  1928                              <1> 	;
  1929                              <1> 	;	    (Audio buffer must be allocated before
  1930                              <1> 	;	     initialization.)
  1931                              <1> 	;
  1932                              <1> 	;	BH = 4 -> START TO PLAY
  1933                              <1> 	;	     BL = Mode
  1934                              <1> 	;		  Bit 0 = mono/stereo (1 = stereo)
  1935                              <1> 	;		  Bit 1 = 8 bit / 16 bit (1 = 16 bit)
  1936                              <1> 	;	     CX = Sampling Rate (Hz)
  1937                              <1> 	;
  1938                              <1> 	;	BH = 5 -> PAUSE
  1939                              <1> 	;	     BL = Any
  1940                              <1> 	;
  1941                              <1> 	;	BH = 6 -> CONTINUE TO PLAY
  1942                              <1> 	;	     BL = Any
  1943                              <1> 	;
  1944                              <1> 	;	BH = 7 -> STOP
  1945                              <1> 	;	     BL = Any
  1946                              <1> 	;
  1947                              <1> 	;	BH = 8 -> RESET
  1948                              <1> 	;	     BL = Any
  1949                              <1> 	;
  1950                              <1> 	;	BH = 9 -> CANCEL (CALLBACK or S.R.B. SERVICE)
  1951                              <1> 	;	     BL = Any
  1952                              <1> 	;
  1953                              <1> 	;	BH = 10 -> DEALLOCATE AUDIO BUFFER (for user)
  1954                              <1> 	;	     BL = Any
  1955                              <1> 	;
  1956                              <1> 	;	BH = 11 -> SET VOLUME LEVEL
  1957                              <1> 	;	     BL: (Bit 0 to 6)
  1958                              <1> 	;		  0 = Master (Playback, Lineout) volume
  1959                              <1> 	;		  1 = PCM out volume ; 23/05/2024
  1960                              <1> 	;	     CL = Left Channel Volume (0 to 31 max)
  1961                              <1> 	;	     CH = Right Channel Volume (0 to 31 max)
  1962                              <1> 	;
  1963                              <1> 	;	     Note: If BL >= 80h (Bit 7 of BL is set),
  1964                              <1> 	;	     volume level will be set for next playing
  1965                              <1> 	;	     (actual volume level will not be changed
  1966                              <1> 	;	     immediately)
  1967                              <1> 	;
  1968                              <1> 	;	BH = 12 -> DISABLE AUDIO DEVICE
  1969                              <1> 	;	     (reset audio device and unlink dma buffer)
  1970                              <1> 	;	     BL = Any
  1971                              <1> 	;
  1972                              <1> 	;    	12/05/2017
  1973                              <1> 	;	BH = 13 -> MAP DMA BUFFER TO USER
  1974                              <1> 	;	    (for direct access to system's dma buffer)
  1975                              <1> 	;
  1976                              <1> 	;	     ECX = map size in bytes 
  1977                              <1> 	;		  (will be rounded up to page borders)
  1978                              <1> 	;	     EDX = Virtual Address of the buffer
  1979                              <1> 	;		  (Will be rounded up to page borders)
  1980                              <1> 	;
  1981                              <1> 	;	05/06/2017
  1982                              <1> 	;    	04/06/2017
  1983                              <1> 	;	BH = 14 -> GET AUDIO DEVICE INFO
  1984                              <1> 	;	     BL: 0 = Audio Controller Info
  1985                              <1> 	;	     ; 19/11/2023
  1986                              <1> 	;	     BL: 1 = Audio (AC'97) Codec Info
  1987                              <1> 	;	     BL > 1 = Invalid for now!
  1988                              <1> 	;
  1989                              <1> 	;	22/06/2017
  1990                              <1> 	;	BH = 15 -> GET CURRENT SOUND DATA (for graphics)
  1991                              <1> 	;	     BL: 0 -> PCM OUT data
  1992                              <1> 	;	       > 0 -> Invalid for now!
  1993                              <1> 	;	     ECX = 0 -> Get DMA Buffer Pointer
  1994                              <1> 	;		 EDX = Not Used
  1995                              <1> 	;	     ECX > 0 -> Byte count for buffer (EDX)
  1996                              <1> 	;	         EDX = Buffer Address (Virtual)
  1997                              <1> 	;
  1998                              <1> 	;	10/10/2017
  1999                              <1> 	;	BH = 16 -> UPDATE DMA BUFFER DATA
  2000                              <1> 	;		   (by using the Audio Buffer content)
  2001                              <1> 	;	     BL = 0 : Update dma half buffer in sequence
  2002                              <1> 	;		      (automatic destination)	
  2003                              <1> 	;		  1 : Update 1st half of the dma buffer
  2004                              <1> 	;		  2 : Update 2nd half of the dma buffer
  2005                              <1> 	;		  3-FEh: Invalid!
  2006                              <1> 	;		  FFh = Get current flag value
  2007                              <1> 	;			(Half buffer number -1)
  2008                              <1> 	;
  2009                              <1> 	;	24/05/2024
  2010                              <1> 	;	BH = 17 -> GET VOLUME LEVEL
  2011                              <1> 	;	     BL:  0 = Master (Playback, Lineout) volume
  2012                              <1> 	;		  1 = PCM out volume
  2013                              <1> 	;
  2014                              <1> 	; Outputs:
  2015                              <1> 	;
  2016                              <1> 	;	For BH = 0 -> Beep
  2017                              <1> 	;	    None
  2018                              <1> 	;
  2019                              <1> 	;	01/04/2017
  2020                              <1> 	;
  2021                              <1> 	; 	For BH = 1 -> DETECT (& ENABLE) AUDIO DEVICE
  2022                              <1> 	;	    AH = 0 : PC SPEAKER
  2023                              <1> 	;		 1 : SOUND BLASTER 16
  2024                              <1> 	;		 2 : INTEL AC'97
  2025                              <1> 	;		 3 : VIA VT8237R (VT8233)
  2026                              <1> 	;		 4 : INTEL HDA
  2027                              <1> 	;	      5-FFh : unknown/invalid
  2028                              <1> 	;	    AL = mode status
  2029                              <1> 	;		 bit 0 = mono /stereo (1 = stereo)
  2030                              <1> 	;		 bit 1 = 8 bit / 16 bit (1 = 16 bit)
  2031                              <1> 	;	    04/06/2017
  2032                              <1> 	;	    EBX = PCI DEVICE/VENDOR ID (if >0)
  2033                              <1> 	;		 (BX = VENDOR ID) 
  2034                              <1> 	;	    (if CF = 1 -> Error code in EAX)
  2035                              <1> 	;
  2036                              <1> 	; 	For BH = 2 -> ALLOCATE AUDIO BUFFER (for user)
  2037                              <1> 	;	    EAX = Physical Address of the buffer
  2038                              <1> 	;	    (if CF = 1 -> Error code in EAX)
  2039                              <1> 	;
  2040                              <1> 	;	For BH = 3 -> INITIALIZE AUDIO DEVICE
  2041                              <1> 	;	    (if CF = 1 -> Error code in EAX)
  2042                              <1> 	;
  2043                              <1> 	;	For BH = 4 -> START TO PLAY
  2044                              <1> 	;	    none (if CF = 1 -> Error code in EAX)
  2045                              <1> 	;
  2046                              <1> 	;	For BH = 5 -> PAUSE
  2047                              <1> 	;	    none (if CF = 1 -> Error code in EAX)
  2048                              <1> 	;
  2049                              <1> 	;	For BH = 6 -> CONTINUE TO PLAY
  2050                              <1> 	;	    none (if CF = 1 -> Error code in EAX)
  2051                              <1> 	;
  2052                              <1> 	;	For BH = 7 -> STOP
  2053                              <1> 	;	    none (if CF = 1 -> Error code in EAX)
  2054                              <1> 	;
  2055                              <1> 	;	For BH = 8 -> RESET 
  2056                              <1> 	;	    none (if CF = 1 -> Error code in EAX)
  2057                              <1> 	;
  2058                              <1> 	;	For BH = 9 -> CANCEL (CALLBACK or S.R.B. SERVICE)
  2059                              <1> 	;	    none (if CF = 1 -> Error code in EAX)
  2060                              <1> 	;
  2061                              <1> 	;	For BH = 10 -> DEALLOCATE AUDIO BUFFER (for user)
  2062                              <1> 	;	    none (if CF = 1 -> Error code in EAX)
  2063                              <1> 	;
  2064                              <1> 	;	For BH = 11 -> SET VOLUME LEVEL
  2065                              <1> 	;	    none (if CF = 1 -> Error code in EAX)
  2066                              <1> 	;
  2067                              <1> 	;	For BH = 12 -> DISABLE AUDIO DEVICE
  2068                              <1> 	;	    none (if CF = 1 -> Error code in EAX)
  2069                              <1> 	; 
  2070                              <1> 	;    	12/05/2017
  2071                              <1> 	;	For BH = 13 -> MAP DMA BUFFER TO USER
  2072                              <1> 	;	    EAX = Physical Address of the buffer
  2073                              <1> 	;	    (if CF = 1 -> Error code in EAX)
  2074                              <1> 	;
  2075                              <1> 	;    	04/06/2017
  2076                              <1> 	;	For BH = 14 -> GET AUDIO DEVICE INFO
  2077                              <1> 	;	(for BL = 0) ; 05/06/2017
  2078                              <1> 	;	    EAX = IRQ Number in AL
  2079                              <1> 	;		  Audio Device Number in AH
  2080                              <1> 	;	    EBX = DEV/VENDOR ID
  2081                              <1> 	;		 (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
  2082                              <1> 	;	    ECX = BUS/DEV/FN 
  2083                              <1> 	;		 (00000000BBBBBBBBDDDDDFFF00000000)
  2084                              <1> 	;	    EDX = NABMBAR/NAMBAR (for AC97)
  2085                              <1> 	;		  (Low word, DX = NAMBAR address)
  2086                              <1> 	;	    EDX = Base IO Addr (DX) for SB16 & VT8233
  2087                              <1> 	;	    (if CF = 1 -> Error code in EAX)
  2088                              <1> 	;	                 (ERR_DEV_NOT_RDY = 15)
  2089                              <1> 	;	(for BL = 1) -for AC97- ; 19/11/2023
  2090                              <1> 	;	    EAX = Extended Audio ID (MX28) in AX
  2091                              <1> 	;	     AX bit 0 - VRA bit
  2092                              <1> 	;	     HW of EAX = PCM output sample rate (HZ)
  2093                              <1> 	;	    EBX = VENDOR ID 1 (BX), VENDOR ID 2 (HW)
  2094                              <1> 	;	    (if CF = 1 -> Error code in EAX)	
  2095                              <1> 	;	                 (ERR_DEV_NOT_RDY = 15)
  2096                              <1> 	;	    Note: EAX & EBX = 0 (for SB16,VIA,HDA)
  2097                              <1>  	;
  2098                              <1> 	;	22/06/2017
  2099                              <1> 	;	For BH = 15 -> GET CURRENT SOUND DATA
  2100                              <1> 	;			 (for graphics)
  2101                              <1> 	;	(for BL = 0)
  2102                              <1> 	;	 If ECX input is 0
  2103                              <1> 	;	    EAX = DMA Buffer Current Position (Offset)
  2104                              <1> 	;	 If ECX input >  0
  2105                              <1> 	;	    EAX = Actual transfer count
  2106                              <1> 	;	    (Sound samples will be copied from 
  2107                              <1> 	;	     Current DMA Buffer Position to EDX
  2108                              <1> 	;	     virtual address as EAX bytes.)
  2109                              <1> 	;	 ((If CF = 1 ->  Error code in EAX))
  2110                              <1> 	;
  2111                              <1> 	;	10/10/2017
  2112                              <1> 	;	For BH = 16 -> UPDATE DMA BUFFER DATA
  2113                              <1> 	;	    EAX = 0, if the updated (or current)
  2114                              <1> 	;		     half buffer is DMA half buffer 1
  2115                              <1> 	;	    EAX = 1, if the updated (or current)
  2116                              <1> 	; 		     half buffer is DMA half buffer 2
  2117                              <1> 	;	    (If CF = 1 -> Error code in EAX)
  2118                              <1> 	;
  2119                              <1> 	;	24/05/2024
  2120                              <1> 	;	For BH = 17 -> GET VOLUME LEVEL
  2121                              <1> 	;	    IF BL input is 0
  2122                              <1> 	;		Master (Playback, Lineout) volume
  2123                              <1> 	;	    If BL input is 1
  2124                              <1> 	;		PCM out volume
  2125                              <1> 	;	    If BL input > 1
  2126                              <1> 	;		Invalid for now ; 24/05/2024
  2127                              <1> 	;
  2128                              <1> 	;	    CL = Left Channel Volume (0 to 31 max)
  2129                              <1> 	;	    CH = Right Channel Volume (0 to 31 max)
  2130                              <1> 	;
  2131                              <1> 
  2132 000126A3 80FF12              <1> 	cmp	bh, AUDIO1L/4
  2133 000126A6 0F83F4A7FFFF        <1> 	jnb	sysret
  2134                              <1> 
  2135 000126AC C0E702              <1> 	shl	bh, 2 ; *4
  2136 000126AF 0FB6F7              <1> 	movzx	esi, bh
  2137                              <1> 
  2138                              <1> 	; 22/04/2017
  2139 000126B2 31C0                <1> 	xor	eax, eax
  2140 000126B4 A3[AC940100]        <1> 	mov	[u.r0], eax  ; 0
  2141                              <1> 		
  2142 000126B9 FF96[C4260100]      <1> 	call	dword [esi+AUDIO1]
  2143                              <1> 	;jc	error
  2144 000126BF E9DCA7FFFF          <1> 	jmp	sysret	
  2145                              <1> 
  2146 000126C4 [77230000]          <1> AUDIO1:	dd	_beep ; 12/02/2021
  2147                              <1> 	;dd	beep ; FUNCTION = 0 (bl = Duration Counter
  2148                              <1> 		     ; 		     cx = Frequency Divisor
  2149 000126C8 [0C270100]          <1> 	dd	soundc_detect
  2150 000126CC [A1270100]          <1> 	dd	sound_alloc
  2151 000126D0 [64280100]          <1> 	dd	soundc_init
  2152 000126D4 [482A0100]          <1> 	dd	sound_play
  2153 000126D8 [D52A0100]          <1> 	dd	sound_pause
  2154 000126DC [FF2A0100]          <1> 	dd	sound_continue
  2155 000126E0 [292B0100]          <1> 	dd	sound_stop
  2156 000126E4 [542B0100]          <1> 	dd	soundc_reset
  2157 000126E8 [872B0100]          <1> 	dd	soundc_cancel
  2158 000126EC [AD2B0100]          <1> 	dd	sound_dalloc
  2159 000126F0 [D82B0100]          <1> 	dd	sound_volume
  2160 000126F4 [182C0100]          <1> 	dd	soundc_disable
  2161 000126F8 [962C0100]          <1> 	dd	sound_dma_map
  2162 000126FC [042D0100]          <1> 	dd	soundc_info
  2163 00012700 [882D0100]          <1> 	dd	sound_data
  2164 00012704 [2A2E0100]          <1> 	dd	sound_update
  2165 00012708 [AC2E0100]          <1> 	dd	sound_getvol ; 24/05/2024
  2166                              <1> %if 0
  2167                              <1> 	dd	sound_dmaclear ; 29/12/2024
  2168                              <1> %endif
  2169                              <1> 	
  2170                              <1> AUDIO1L	EQU	$ - AUDIO1
  2171                              <1> 
  2172                              <1> soundc_detect:
  2173                              <1> 	; FUNCTION = 1
  2174                              <1> 	; bl = Audio device type number
  2175                              <1> 	; (0 = pc speaker, 1 = sound blaster 16, 2 = intel ac97
  2176                              <1> 	;  3 = via vt823x, 4 = intel HDA, 0FFh = any)
  2177                              <1> 	
  2178                              <1> 	; 04/06/2017
  2179                              <1> 	;mov	ah, [audio_device]
  2180                              <1> 	; 11/01/2025
  2181 0001270C A0[298F0100]        <1> 	mov	al, [audio_device]
  2182 00012711 80FBFF              <1> 	cmp	bl, 0FFh ; get current audio device id
  2183 00012714 7408                <1> 	je	short sysaudio0
  2184                              <1> 
  2185                              <1> 	;and	ah, ah
  2186                              <1> 	; 11/01/2025
  2187 00012716 20C0                <1> 	and	al, al
  2188 00012718 741F                <1> 	jz	short soundc_get_dev
  2189                              <1> 
  2190                              <1> 	;cmp	ah, bl
  2191                              <1> 	; 11/01/2025
  2192 0001271A 38D8                <1> 	cmp	al, bl
  2193 0001271C 7568                <1> 	jne	short soundc_dev_err
  2194                              <1> 
  2195                              <1> sysaudio0:
  2196                              <1> 	;mov	al, [audio_mode]
  2197                              <1> 	; 11/01/2025
  2198 0001271E 8A25[618F0100]      <1> 	mov	ah, [audio_mode]
  2199                              <1> sysaudio1:
  2200 00012724 A3[AC940100]        <1> 	mov	[u.r0], eax
  2201 00012729 8B1D[348F0100]      <1> 	mov	ebx, [audio_vendor] ; (DEVICE/VENDOR ID)
  2202 0001272F 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]
  2203 00012735 895D10              <1> 	mov	[ebp+16], ebx  ; ebx
  2204 00012738 C3                  <1> 	retn
  2205                              <1> 
  2206                              <1> soundc_get_dev:
  2207                              <1> 	; 28/05/2017
  2208                              <1> 	; 03/04/2017, 24/04/2017
  2209 00012739 C605[288F0100]00    <1> 	mov	byte [audio_pci], 0
  2210 00012740 80FB03              <1> 	cmp	bl, 3 ; VIA VT8233 (VT8237R) Audio Controller & AC97 Codec
  2211                              <1> 	;jne	short soundc_get_dev_sb
  2212                              <1> 	; 28/05/2017
  2213 00012743 7220                <1> 	jb	short soundc_get_dev_sb
  2214 00012745 773F                <1> 	ja	short soundc_dev_err  ; temporary (28/05/2017)
  2215                              <1> 	;
  2216 00012747 E895180000          <1> 	call	DetectVT8233
  2217 0001274C 7238                <1> 	jc	short soundc_dev_err
  2218                              <1> 	; eax = 0
  2219                              <1> 
  2220                              <1> 	;mov	ebx, [audio_vendor]
  2221                              <1> 	; ebx = DEVICE/VENDOR ID
  2222                              <1> 	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  2223                              <1> 
  2224 0001274E B003                <1> 	mov	al, 3  ; VIA VT8237R (VT3233) Audio Controller
  2225 00012750 88C4                <1> 	mov	ah, al
  2226                              <1> 
  2227                              <1> soundc_get_pci_dev_ok: ; 28/05/2017
  2228 00012752 FE05[288F0100]      <1> 	inc	byte [audio_pci] ; = 1
  2229                              <1> soundc_get_dev_ok:
  2230                              <1> 
  2231                              <1> soundc_get_dev_sb16_ok:
  2232 00012758 A2[298F0100]        <1> 	mov	[audio_device], al
  2233 0001275D 8825[618F0100]      <1> 	mov	[audio_mode], ah ; stereo (bit0), 16 bit (bit1) capability
  2234 00012763 EBBF                <1> 	jmp	short sysaudio1
  2235                              <1> 
  2236                              <1> soundc_get_dev_sb:
  2237                              <1> 	; 24/04/2017
  2238 00012765 80FB01              <1> 	cmp	bl, 1 ; Sound Blaster 16
  2239 00012768 750E                <1> 	jne	short soundc_get_dev_ich ; 28/05/2017
  2240                              <1> 	;
  2241 0001276A E8461D0000          <1> 	call	DetectSB
  2242 0001276F 7215                <1> 	jc	short soundc_dev_err
  2243 00012771 B801030000          <1> 	mov	eax, 0301h ; Sound Blaster 16
  2244 00012776 EBE0                <1> 	jmp	short soundc_get_dev_sb16_ok
  2245                              <1> 
  2246                              <1> soundc_get_dev_ich:
  2247                              <1> 	; 28/05/2017
  2248                              <1> 	;cmp	bl, 2 ; Intel AC'97 Audio Controller (ICH)
  2249                              <1> 	;jne	short soundc_dev_err ; Temporary  (28/05/2017)
  2250                              <1> 	;			     ; (Here will be modified just after
  2251                              <1> 	;			     ; new sound card code will be ready!)
  2252 00012778 E84F180000          <1> 	call	DetectICH
  2253 0001277D 7207                <1> 	jc	short soundc_dev_err
  2254                              <1> 	;
  2255 0001277F B802030000          <1> 	mov	eax, 0302h ; AC'97 (ICH)
  2256 00012784 EBCC                <1> 	jmp	short soundc_get_pci_dev_ok
  2257                              <1> 
  2258                              <1> soundc_dev_err:
  2259 00012786 B80F000000          <1> 	mov	eax, ERR_DEV_NOT_RDY ; Device not ready !
  2260                              <1> 	; 29/07/2022
  2261                              <1> 	;sub	eax, eax
  2262                              <1> 	;mov	al, ERR_DEV_NOT_RDY
  2263 0001278B EB05                <1> 	jmp	short sysaudio_err
  2264                              <1> 
  2265                              <1> soundc_respond_err:
  2266                              <1> 	; ERR_TIME_OUT ; 'time out !' error
  2267 0001278D B819000000          <1> 	mov	eax, ERR_DEV_NOT_RESP ; 'device not responding !' error
  2268                              <1> 	; 29/07/2022
  2269                              <1> 	;sub	eax, eax
  2270                              <1> 	;mov	al, ERR_DEV_NOT_RESP
  2271                              <1> sysaudio_err:
  2272 00012792 A3[AC940100]        <1> 	mov	[u.r0], eax
  2273 00012797 A3[18950100]        <1> 	mov	[u.error], eax
  2274 0001279C E9DFA6FFFF          <1> 	jmp	error
  2275                              <1> 
  2276                              <1> sound_alloc:
  2277                              <1> 	; FUNCTION = 2
  2278                              <1> 	; ecx = audio buffer size (in bytes)
  2279                              <1> 	; edx = audio buffer address (virtual)
  2280                              <1> 	; 28/01/2025
  2281                              <1> 	; 27/01/2025 (BugFix)
  2282                              <1> 	; 15/01/2025
  2283                              <1> 	; 12/01/2025	
  2284                              <1> 	; 25/11/2023
  2285                              <1> 	; 27/07/2020
  2286                              <1> 	; 28/05/2027
  2287                              <1> 	; 01/05/2017, 15/05/2017
  2288                              <1> 	; 21/04/2017, 24/04/2017
  2289 000127A1 803D[288F0100]00    <1> 	cmp	byte [audio_pci], 0
  2290 000127A8 770F                <1> 	ja	short snd_alloc_0
  2291                              <1> 	; Max. 64KB DMA buffer !!!
  2292 000127AA 81F900800000        <1> 	cmp	ecx, 32768
  2293 000127B0 760F                <1> 	jna	short snd_alloc_6
  2294                              <1> 	; 25/11/2023
  2295                              <1> sound_buff_error:
  2296 000127B2 B82E000000          <1> 	mov	eax, ERR_BUFFER ; Buffer error !
  2297                              <1> 	; 29/07/2022
  2298                              <1> 	;sub	eax, eax
  2299                              <1> 	;mov	al, ERR_BUFFER
  2300 000127B7 EBD9                <1> 	jmp	short sysaudio_err
  2301                              <1> snd_alloc_0:	
  2302                              <1> 	; 25/11/2023
  2303                              <1> 	; Max 128KB DMA buffer size (2 half buffers)
  2304 000127B9 81F900000100        <1> 	cmp	ecx, 65536
  2305 000127BF 77F1                <1> 	ja	short sound_buff_error
  2306                              <1> snd_alloc_6:
  2307                              <1> 	; 15/05/2017
  2308                              <1> 	;cmp	ecx, 4096 ; PAGE_SIZE
  2309                              <1> 	;jb	short sound_buff_error
  2310                              <1> 	; 15/01/2025
  2311 000127C1 81F940010000        <1> 	cmp	ecx, 320
  2312 000127C7 72E9                <1> 	jb	short sound_buff_error
  2313                              <1> 	;
  2314                              <1> 	; 28/01/2025
  2315                              <1> 	; 12/01/2025
  2316                              <1> 	;mov	ebx, edx ; (new) virtual address of audio_buffer
  2317                              <1> 	;
  2318 000127C9 A1[3C8F0100]        <1> 	mov	eax, [audio_buffer] ; audio buffer address (current)
  2319 000127CE 09C0                <1> 	or	eax, eax
  2320                              <1> 	;jz	short snd_alloc_2
  2321                              <1> 	; 12/01/2025
  2322 000127D0 743E                <1> 	jz	short snd_alloc_1 ; first time
  2323                              <1> 	; audio buffer exists !
  2324 000127D2 8A1D[FD940100]      <1> 	mov	bl, [u.uno]
  2325 000127D8 3A1D[558F0100]      <1> 	cmp	bl, [audio_user]
  2326                              <1> 	;jne	sndc_owner_error ; not owner !
  2327                              <1> 	; 25/11/2023
  2328                              <1> 	;je	short snd_alloc_7
  2329                              <1> 	; 12/01/2025
  2330 000127DE 7405                <1> 	je	short snd_alloc_2 
  2331 000127E0 E9F3000000          <1> 	jmp	sndc_owner_error ; not owner !
  2332                              <1> 
  2333                              <1> 	; 12/01/2025 - TRDOS 386 v2.0.10
  2334                              <1> 	; Important modification:
  2335                              <1> 	;; Always deallocate user's audio_buffer address with
  2336                              <1> 	;; buffer size and then allocate a new one
  2337                              <1> 	;; (address range may be used before)
  2338                              <1> snd_alloc_2:
  2339                              <1> 	;mov	ecx, [audio_buff_size]
  2340                              <1> 	; 28/01/2025
  2341 000127E5 870D[448F0100]      <1> 	xchg	ecx, [audio_buff_size] ; *	
  2342 000127EB 89C3                <1> 	mov	ebx, eax ; audio buffer address (current)
  2343                              <1> ;snd_alloc_7:
  2344                              <1> 	; 12/01/2025	
  2345                              <1> 	;cmp	eax, edx ; same virtual buffer address ?
  2346                              <1> 	;jne	short snd_alloc_1
  2347                              <1> 	;cmp	ecx, [audio_buff_size]
  2348                              <1> 	;je	short snd_alloc_3 ; Nothing to do !
  2349                              <1> 	;			  ; Buffer has been set already!
  2350                              <1> ;snd_alloc_1:
  2351                              <1> 	; 28/01/2025
  2352                              <1> 	;push	ecx
  2353 000127ED 52                  <1> 	push	edx
  2354                              <1> 	; 12/01/2025
  2355                              <1> 	;mov	ebx, eax ; audio buffer address (current)
  2356                              <1> 	;mov	ecx, [audio_buff_size]
  2357                              <1> 	; ebx = audio buffer address (virtual)
  2358                              <1> 	; ecx = audio buffer size in bytes
  2359 000127EE E85838FFFF          <1> 	call	deallocate_user_pages
  2360 000127F3 5A                  <1> 	pop	edx
  2361                              <1> 	;pop	ecx
  2362                              <1> 	; 28/01/2025
  2363 000127F4 8B0D[448F0100]      <1> 	mov	ecx, [audio_buff_size] ; * ; requested size
  2364 000127FA 31C0                <1> 	xor	eax, eax ; 0
  2365 000127FC A3[3C8F0100]        <1> 	mov	[audio_buffer], eax  ; 0
  2366 00012801 A3[408F0100]        <1>  	mov	[audio_p_buffer], eax  ; 0
  2367 00012806 A3[448F0100]        <1>  	mov	[audio_buff_size], eax
  2368 0001280B A2[558F0100]        <1> 	mov	[audio_user], al ; 0
  2369                              <1> 
  2370                              <1> 	; 27/01/2025 (BugFix)
  2371                              <1> snd_alloc_1:
  2372                              <1> 	; 12/01/2025
  2373                              <1> ;snd_alloc_2:
  2374 00012810 89D3                <1> 	mov	ebx, edx
  2375                              <1> 	; 01/05/2017
  2376                              <1> 	;mov	edx, ~PAGE_OFF ; truncating page offsets
  2377                              <1> 	;		       ; for aligning to page borders
  2378                              <1> 	;;and	eax, edx
  2379                              <1> 	;and	ebx, edx
  2380                              <1> 	; 26/11/2023
  2381                              <1> 	;and	ecx, edx
  2382 00012812 81E300F0FFFF        <1> 	and	ebx, ~PAGE_OFF
  2383 00012818 89CA                <1> 	mov	edx, ecx
  2384                              <1> 	; 15/05/2017
  2385                              <1> 	; EAX = Beginning address (physical)
  2386                              <1> 	; EAX = 0 -> Allocate mem block from the 1st proper aperture	
  2387                              <1> 	; ECX = Number of bytes to be allocated
  2388 0001281A E8D434FFFF          <1> 	call	allocate_memory_block
  2389 0001281F 7291                <1> 	jc	short sound_buff_error
  2390                              <1> 
  2391                              <1> 	; EAX = Physical address of the allocated memory block
  2392                              <1> 	; ECX = Allocated bytes (as rounded up to page border)
  2393                              <1> 	; EBX = Virtual address (as truncated to page border)
  2394 00012821 52                  <1> 	push	edx ; 26/11/2023
  2395 00012822 50                  <1> 	push	eax
  2396 00012823 53                  <1> 	push	ebx
  2397 00012824 51                  <1> 	push	ecx
  2398 00012825 E80939FFFF          <1> 	call	allocate_user_pages
  2399 0001282A 59                  <1> 	pop	ecx
  2400 0001282B 5B                  <1> 	pop	ebx
  2401 0001282C 58                  <1> 	pop	eax
  2402 0001282D 5A                  <1> 	pop	edx ; 26/11/2023
  2403 0001282E 722A                <1> 	jc	short snd_alloc_4 ; insufficient memory, buff error
  2404                              <1> 	; eax = physical address of the user's audio buffer
  2405                              <1> 	; ebx = virtual address of the user's audio buffer
  2406                              <1> 	; 26/11/2023
  2407                              <1> 	; ecx = allocated buffer size (in bytes)
  2408                              <1> 	;		 -rounded up to page boundary-
  2409                              <1> 	; edx = requested buffer size (in bytes)
  2410 00012830 A3[408F0100]        <1> 	mov	[audio_p_buffer], eax
  2411 00012835 891D[3C8F0100]      <1> 	mov	[audio_buffer], ebx
  2412                              <1> 	; 26/11/2023
  2413                              <1> 	;mov	ecx, edx
  2414                              <1> 	;; 25/11/2023
  2415                              <1> 	;cmp	ecx, 65536
  2416                              <1> 	;jb	short snd_alloc_5
  2417                              <1> 	;dec	ecx
  2418                              <1> 	;; ecx = 65535
  2419                              <1> 	;; (DMA half buffer's sample count must be < 65536)
  2420                              <1> ;snd_alloc_5:
  2421                              <1>  	;mov	[audio_buff_size], ecx
  2422                              <1> 	; 26/11/2023
  2423 0001283B 8915[448F0100]      <1> 	mov	[audio_buff_size], edx
  2424                              <1> 	;
  2425 00012841 8A15[FD940100]      <1> 	mov	dl, [u.uno]
  2426 00012847 8815[558F0100]      <1> 	mov	[audio_user], dl
  2427 0001284D A3[AC940100]        <1> 	mov	[u.r0], eax
  2428                              <1> snd_alloc_3:
  2429                              <1> 	; 27/07/2020
  2430 00012852 C605[548F0100]00    <1> 	mov	byte [audio_flag], 0 ; clear dma half buffer flag
  2431                              <1> 	;	
  2432 00012859 C3                  <1> 	retn
  2433                              <1> snd_alloc_4:
  2434                              <1> 	; 15/05/2017
  2435                              <1> 	; EAX = Beginning address (physical)
  2436                              <1> 	; ECX = Number of bytes to be deallocated
  2437 0001285A E8AE36FFFF          <1> 	call	deallocate_memory_block
  2438 0001285F E94EFFFFFF          <1> 	jmp	sound_buff_error ; insufficient memory, buff error
  2439                              <1> 
  2440                              <1> soundc_init:
  2441                              <1> 	; FUNCTION = 3 
  2442                              <1> 	; bl = method (0= s.r.b., 1= callback, 2= auto incr s.r.b.)
  2443                              <1> 	; cl = signal response byte (initial or fixed) value
  2444                              <1> 	; edx = signal response byte or callback address
  2445                              <1> 
  2446                              <1> 	; 11/01/2025
  2447                              <1> 	; 05/06/2024
  2448                              <1> 	; 04/06/2024
  2449                              <1> 	; 02/12/2023, 04/12/2022
  2450                              <1> 	; 29/07/2022, 07/08/2022
  2451                              <1> 	; 27/07/2020
  2452                              <1> 	; 12/05/2017, 20/05/2017, 28/05/2027
  2453                              <1> 	; 22/04/2017, 23/04/2017, 24/04/2017
  2454                              <1> 	; 13/04/2017, 14/04/2017, 16/04/2017, 21/04/2017
  2455                              <1> 	; 03/04/2017, 10/04/2017
  2456                              <1> 
  2457 00012864 A0[298F0100]        <1> 	mov	al, [audio_device]
  2458 00012869 20C0                <1> 	and	al, al
  2459 0001286B 754A                <1> 	jnz	short sndc_init6
  2460                              <1> 	;
  2461 0001286D C605[288F0100]00    <1> 	mov	byte [audio_pci], 0
  2462 00012874 52                  <1> 	push	edx
  2463 00012875 53                  <1> 	push	ebx
  2464 00012876 51                  <1> 	push	ecx
  2465 00012877 E8391C0000          <1> 	call	DetectSB
  2466 0001287C 7213                <1> 	jc	short sndc_init8
  2467 0001287E 66B80103            <1> 	mov	ax, 0301h ; Sound Blaster 16
  2468 00012882 EB1E                <1> 	jmp	short sndc_init7
  2469                              <1> 
  2470                              <1> sndc_init11:
  2471                              <1> 	; 28/05/2017
  2472 00012884 E843170000          <1> 	call	DetectICH ; Detect AC'97 (ICH) Audio Controller
  2473 00012889 7217                <1> 	jc	short sndc_init7
  2474 0001288B 66B80203            <1> 	mov	ax, 0302h ; Intel AC'97 Audio Device
  2475 0001288F EB0B                <1> 	jmp	short sndc_init12 ; (PCI device)
  2476                              <1> 
  2477                              <1> sndc_init8:
  2478 00012891 E84B170000          <1> 	call	DetectVT8233
  2479                              <1> 	;jc	short sndc_init7
  2480                              <1> 	; 29/07/2022
  2481 00012896 72EC                <1> 	jc	short sndc_init11 ; 28/05/2017
  2482                              <1> 
  2483                              <1> 	; eax = 0
  2484 00012898 B003                <1> 	mov	al, 3	; VIA VT8237R (VT8233) Audio Controller
  2485 0001289A 88C4                <1> 	mov	ah, al
  2486                              <1> 
  2487                              <1> sndc_init12:
  2488 0001289C FE05[288F0100]      <1> 	inc	byte [audio_pci] ; = 1
  2489                              <1> sndc_init7:
  2490 000128A2 59                  <1> 	pop	ecx
  2491 000128A3 5B                  <1> 	pop	ebx
  2492 000128A4 5A                  <1> 	pop	edx
  2493                              <1> 	;jc	soundc_dev_err
  2494                              <1> 	; 29/07/2022
  2495 000128A5 7305                <1> 	jnc	short sndc_init14
  2496 000128A7 E9DAFEFFFF          <1> 	jmp	soundc_dev_err
  2497                              <1> sndc_init14:
  2498 000128AC A2[298F0100]        <1> 	mov	[audio_device], al
  2499 000128B1 8825[618F0100]      <1> 	mov	[audio_mode], ah ; stereo (bit0), 16 bit (bit1) capability
  2500                              <1> 
  2501                              <1> sndc_init6:
  2502 000128B7 833D[3C8F0100]00    <1> 	cmp	dword [audio_buffer], 0
  2503                              <1> 	;jna	sound_buff_error
  2504                              <1> 	; 29/07/2022
  2505 000128BE 7705                <1> 	ja	short sndc_init19
  2506 000128C0 E9EDFEFFFF          <1> 	jmp	sound_buff_error ; 07/08/2022
  2507                              <1> sndc_init19:
  2508 000128C5 A0[FD940100]        <1> 	mov	al, [u.uno]
  2509 000128CA 8A25[558F0100]      <1> 	mov	ah, [audio_user]
  2510 000128D0 08E4                <1> 	or	ah, ah
  2511 000128D2 7418                <1> 	jz	short sndc_init0
  2512 000128D4 38E0                <1> 	cmp	al, ah
  2513 000128D6 7419                <1> 	je	short sndc_init1
  2514                              <1> 
  2515                              <1> sndc_owner_error:
  2516 000128D8 B80B000000          <1> 	mov	eax, ERR_NOT_OWNER ; 'permission denied !' error
  2517                              <1> 	; 29/07/2022
  2518                              <1> 	;sub	eax, eax
  2519                              <1> 	;mov	al, ERR_NOT_OWNER
  2520                              <1> sndc_perm_error:
  2521 000128DD A3[AC940100]        <1> 	mov	[u.r0], eax
  2522 000128E2 A3[18950100]        <1> 	mov	[u.error], eax
  2523 000128E7 E994A5FFFF          <1> 	jmp	error
  2524                              <1> sndc_init0:
  2525 000128EC A2[558F0100]        <1> 	mov	[audio_user], al
  2526                              <1> sndc_init1:
  2527 000128F1 8915[588F0100]      <1> 	mov	[audio_cb_addr], edx
  2528 000128F7 881D[568F0100]      <1> 	mov	[audio_cb_mode], bl
  2529 000128FD 880D[578F0100]      <1> 	mov	[audio_srb], cl
  2530                              <1> 
  2531                              <1> 	; 27/07/2020
  2532                              <1> 	;mov	byte [audio_flag], 0  ; clear dma half buffer flag
  2533                              <1> 
  2534                              <1> 	; 24/04/2017
  2535 00012903 803D[298F0100]03    <1> 	cmp	byte [audio_device], 3 ; VT8233 (VT8237R)
  2536 0001290A 7435                <1> 	je	short sndc_init9
  2537                              <1> 	;ja	short soundc_respond_err ; temporary (28/05/2017)
  2538 0001290C 803D[298F0100]01    <1> 	cmp	byte [audio_device], 1 ; SB 16
  2539 00012913 7510                <1> 	jne	short sndc_init13
  2540 00012915 BB[C7460100]        <1> 	mov	ebx, sb16_int_handler
  2541                              <1> 	; Note: 'SbInit' is at 'Start to Play' stage
  2542                              <1> 	; 20/05/2017
  2543 0001291A 66C705[648F0100]08- <1> 	mov	word [audio_master_volume], 0808h ; 2/8
  2543 00012922 08                  <1>
  2544 00012923 EB34                <1> 	jmp	short sndc_init10
  2545                              <1> sndc_init13:
  2546                              <1> 	; 28/05/2017
  2547 00012925 803D[298F0100]02    <1> 	cmp	byte [audio_device], 2 ; AC 97 (ICH)
  2548                              <1> 	;jne	soundc_respond_err ; temporary (28/05/2017)
  2549                              <1> 	; 29/07/2022
  2550 0001292C 7405                <1> 	je	short sndc_init16
  2551                              <1> sndc_init15:
  2552 0001292E E95AFEFFFF          <1> 	jmp	soundc_respond_err
  2553                              <1> sndc_init16:
  2554 00012933 E8D71E0000          <1> 	call	ac97_codec_config
  2555                              <1> 	;jc	soundc_respond_err ; codec error !
  2556                              <1> 	; 29/07/2022
  2557 00012938 72F4                <1> 	jc	short sndc_init15
  2558                              <1> 
  2559 0001293A BB[A94A0100]        <1> 	mov	ebx, ac97_int_handler
  2560 0001293F EB18                <1> 	jmp	short sndc_init10
  2561                              <1> 
  2562                              <1> sndc_init9:
  2563                              <1> 	;call	reset_codec
  2564                              <1> 	;; eax = 1
  2565                              <1> 	;call	codec_io_w16 ; w32
  2566 00012941 E8EF170000          <1> 	call	init_codec ; 28/05/2017
  2567                              <1> 	;jc	soundc_respond_err ; codec error !
  2568                              <1> 	; 29/07/2022
  2569 00012946 72E6                <1> 	jc	short sndc_init15
  2570                              <1> 
  2571 00012948 E8FD190000          <1> 	call	channel_reset
  2572                              <1> 
  2573                              <1> 	; setup the Codec (actually mixer registers)
  2574 0001294D E826190000          <1>         call    codec_config  ; unmute codec, set rates.
  2575                              <1> 	;jc	soundc_respond_err ; codec error !
  2576                              <1> 	; 29/07/2022
  2577 00012952 72DA                <1> 	jc	short sndc_init15
  2578                              <1> 
  2579 00012954 BB[DE420100]        <1> 	mov	ebx, vt8233_int_handler
  2580                              <1> sndc_init10:
  2581                              <1> 	; 13/04/2017
  2582 00012959 A0[2A8F0100]        <1> 	mov	al, [audio_intr] ; IRQ number
  2583 0001295E E833FDFFFF          <1> 	call	set_dev_IRQ_service
  2584                              <1> 
  2585                              <1> 	; SETUP (audio) INTERRUPT CALLBACK SERVICE
  2586 00012963 8A1D[2A8F0100]      <1> 	mov	bl, [audio_intr] ; IRQ number
  2587 00012969 8A3D[568F0100]      <1> 	mov	bh, [audio_cb_mode]
  2588 0001296F FEC7                <1> 	inc	bh  ; 1 = Signal Response Byte method (fixed value)
  2589                              <1> 		    ; 2 = Callback service method
  2590                              <1> 		    ; 3 = Auto Increment S.R.B. method
  2591 00012971 8A0D[578F0100]      <1> 	mov	cl, [audio_srb]
  2592 00012977 8B15[588F0100]      <1> 	mov	edx, [audio_cb_addr]
  2593 0001297D A0[558F0100]        <1> 	mov	al, [audio_user]
  2594                              <1> 	; 14/04/2017
  2595 00012982 E83C050000          <1>  	call	set_irq_callback_service
  2596                              <1> 	; 16/04/2017
  2597 00012987 A3[AC940100]        <1> 	mov	[u.r0], eax
  2598                              <1> 	;jnc	sysret
  2599 0001298C 7316                <1> 	jnc	short sndc_init2 ; 21/04/2017
  2600                              <1> 	;
  2601 0001298E A3[18950100]        <1> 	mov	dword [u.error], eax
  2602                              <1> 
  2603 00012993 A0[2A8F0100]        <1> 	mov	al, [audio_intr] ; IRQ number
  2604 00012998 31DB                <1> 	xor	ebx, ebx ; reset IRQ handler address
  2605 0001299A E8F7FCFFFF          <1> 	call	set_dev_IRQ_service
  2606                              <1> 
  2607 0001299F E9DCA4FFFF          <1> 	jmp	error
  2608                              <1> 
  2609                              <1> sndc_init2:
  2610                              <1> 	; 21/04/2017
  2611 000129A4 8B0D[448F0100]      <1> 	mov	ecx, [audio_buff_size] ; audio buffer size
  2612                              <1> 	; 05/06/2024	
  2613                              <1> 	;shl	ecx, 1 ; *2
  2614                              <1> 	
  2615                              <1> 	; 05/06/2024
  2616 000129AA A0[298F0100]        <1> 	mov	al, [audio_device]
  2617 000129AF 3C01                <1> 	cmp	al, 1 ; SB16
  2618 000129B1 760A                <1> 	jna	short sndc_init22
  2619 000129B3 80E1FE              <1> 	and	cl, ~1 ; truncated for word alignment
  2620 000129B6 3C03                <1> 	cmp	al, 3 ; VT8233  
  2621 000129B8 7303                <1> 	jnb	short sndc_init22
  2622                              <1> 	; al = 2 ; AC'97 	
  2623 000129BA 80E1F8              <1> 	and	cl, ~7 ; truncated for 8 byte (8x) alignment
  2624                              <1> sndc_init22:
  2625                              <1> 	; 05/06/2024
  2626 000129BD 890D[508F0100]      <1> 	mov	[dma_hbuff_size], ecx  ; DMA half buffer size
  2627 000129C3 D1E1                <1> 	shl	ecx, 1  ; add ecx, ecx ; * 2
  2628                              <1> 
  2629                              <1> 	;;;
  2630                              <1> 	; 04/06/2024
  2631 000129C5 81C1FF0F0000        <1> 	add	ecx, 4095  ; PAGE_SIZE - 1
  2632 000129CB 6681E100F0          <1> 	and	cx, ~4095  ; ~PAGE_OFF	
  2633                              <1> 	; ecx = page border aligned DMA buffer size (required) (*)
  2634                              <1> 	;;;
  2635                              <1> 
  2636 000129D0 A1[488F0100]        <1> 	mov	eax, [audio_dma_buff]
  2637 000129D5 21C0                <1> 	and	eax, eax
  2638 000129D7 741C                <1> 	jz	short sndc_init3 ; no need to compare dma buff size
  2639                              <1> 	
  2640 000129D9 8B15[4C8F0100]      <1> 	mov	edx, [audio_dmabuff_size] ; dma buffer size
  2641 000129DF 39D1                <1> 	cmp	ecx, edx
  2642 000129E1 742B                <1> 	je	short sndc_init5
  2643                              <1> 
  2644                              <1> 	; 04/12/2023
  2645 000129E3 3D00000500          <1> 	cmp	eax, sb16_dma_buffer	; reserved buffer ?
  2646 000129E8 7409                <1> 	je	short sndc_init20 ; it isn't an allocated mem buff
  2647                              <1> 
  2648 000129EA 87CA                <1> 	xchg	ecx, edx
  2649                              <1> 	; 26/11/2023 
  2650                              <1> 	; round up (always -rounded up- page count is allocated)
  2651                              <1> 	; ((so deallocation must be done for the rounded up value))
  2652                              <1> 	;add	ecx, PAGE_SIZE - 1   ; 4095
  2653                              <1> 	;call	deallocate_memory_block
  2654                              <1> 	; 04/06/2024
  2655                              <1> 	;call	deallocate_memory_block_x
  2656                              <1> 	;		; deallocate ((ecx+4095)>>12) pages
  2657 000129EC E81C35FFFF          <1> 	call	deallocate_memory_block	
  2658                              <1> 
  2659 000129F1 87D1                <1> 	xchg	edx, ecx
  2660                              <1> sndc_init20:
  2661 000129F3 31C0                <1> 	xor	eax, eax
  2662                              <1> sndc_init3:
  2663                              <1> 	; 05/06/2024
  2664 000129F5 890D[4C8F0100]      <1> 	mov	[audio_dmabuff_size], ecx ; (*)
  2665                              <1> 	; 12/05/2017
  2666 000129FB 803D[298F0100]01    <1> 	cmp	byte [audio_device], 1 ; SB 16
  2667 00012A02 750B                <1> 	jne	short sndc_init4
  2668 00012A04 C705[488F0100]0000- <1> 	mov	dword [audio_dma_buff], sb16_dma_buffer
  2668 00012A0C 0500                <1>
  2669                              <1> 	; 05/06/2024
  2670                              <1> 	;mov	dword [audio_dmabuff_size], 65536
  2671                              <1> 	;xor	eax, eax
  2672                              <1> 	;mov	[u.r0], eax ; 0 = no error, successful
  2673                              <1> sndc_init5:	; 29/07/2022
  2674 00012A0E C3                  <1> 	retn 
  2675                              <1> 
  2676                              <1> sndc_init4:
  2677                              <1> 	; 02/12/2023 - TRDOS 386 v2.0.7
  2678 00012A0F 81F900000100        <1> 	cmp	ecx, 65536
  2679 00012A15 7707                <1> 	ja	short sndc_init21
  2680 00012A17 B800000500          <1> 	mov	eax, sb16_dma_buffer ; use already reserved buffer
  2681 00012A1C EB0C                <1> 	jmp	short sndc_init17
  2682                              <1> 
  2683                              <1> sndc_init21:
  2684                              <1> 	; EAX = Beginning address (physical)
  2685                              <1> 	; EAX = 0 -> Allocate mem block from the 1st proper aperture
  2686                              <1> 	; ECX = Number of bytes to be allocated	(>0)
  2687 00012A1E E8D032FFFF          <1> 	call	allocate_memory_block
  2688                              <1> 	;jc	sound_buff_error
  2689                              <1> 	; 29/07/2022
  2690 00012A23 7305                <1> 	jnc	short sndc_init17
  2691 00012A25 E988FDFFFF          <1> 	jmp	sound_buff_error
  2692                              <1> 
  2693                              <1> sndc_init17:	; 29/07/2022
  2694                              <1> 	; set dma buffer address and size parameters
  2695 00012A2A A3[488F0100]        <1> 	mov	[audio_dma_buff], eax ; dma buffer address
  2696                              <1> 	; 05/06/2024
  2697                              <1> 	;mov	[audio_dmabuff_size], ecx ; dma buffer size
  2698                              <1> 
  2699                              <1> 	;;;
  2700                              <1> 	; 05/06/2024
  2701 00012A2F 8B0D[508F0100]      <1> 	mov	ecx, [dma_hbuff_size] ; DMA half (1-2) buffer size
  2702                              <1> 	; 04/06/2024
  2703                              <1> 	;mov	ecx, [audio_buff_size] ; audio buffer size in bytes
  2704                              <1> 	;;;
  2705                              <1> 
  2706                              <1> ;	; EAX = Beginning (physical) addr of the allocated mem block
  2707                              <1> ;	; ECX = Num of allocated bytes (rounded up to page borders)
  2708                              <1> ;	cmp	byte [audio_pci], 0 ; AC97 audio controller ?
  2709                              <1> ;	ja	short sndc_init4
  2710                              <1> ;
  2711                              <1> ;	; Sound Blaster 16 uses classic DMA
  2712                              <1> ;	mov	edx, eax
  2713                              <1> ;	add	edx, ecx
  2714                              <1> ;	cmp	edx, 1000000h ; 1st 16 MB
  2715                              <1> ;	jna	short sndc_init4
  2716                              <1> ;
  2717                              <1> ;	; error !
  2718                              <1> ;	; restore Memory Allocation Table Content
  2719                              <1> ;	; EAX = Beginning address (physical)
  2720                              <1> ;	; ECX = Number of bytes to be deallocated
  2721                              <1> ;	call	deallocate_memory_block
  2722                              <1> ;	; reset dma buffer address and size parameters
  2723                              <1> ;	xor	eax, eax ; 0
  2724                              <1> ;	mov	[audio_dma_buff], eax ; 0
  2725                              <1> ;	mov	[audio_dmabuff_size], ecx ; 0
  2726                              <1> ;	jmp	sound_buff_error
  2727                              <1> ;
  2728                              <1> ;sndc_init4:
  2729 00012A35 803D[298F0100]03    <1> 	cmp	byte [audio_device], 3
  2730                              <1> 	;jne	short sndc_init5
  2731                              <1> 	; 29/07/2022
  2732 00012A3C 7505                <1> 	jne	short sndc_init18 ; 28/05/2017
  2733                              <1> 
  2734                              <1> ; 29/07/2022
  2735                              <1> ;	call	set_vt8233_bdl
  2736                              <1> ;sndc_init5:
  2737                              <1> ;	;sub	eax, eax ; 0
  2738                              <1> ;	;mov	[u.r0], eax ; 0 = no error, successful
  2739                              <1> ;	retn
  2740                              <1> 
  2741                              <1> 	; 05/06/2024
  2742                              <1> 	;;;
  2743                              <1> 	; 04/06/2024 (use truncated buffer size for BDL setup)
  2744                              <1> 	; NOTE: Round up adds spurious bytes (noise) to the DMA buff;
  2745                              <1> 	;	so, round down the size is better than the round up.
  2746                              <1> 	;	((BDL/SGD feature needs word aligned buffer address))
  2747                              <1> 	;
  2748                              <1> 	;mov	ecx, [audio_buff_size] ; audio buffer size in bytes
  2749                              <1> 	;and	cl, ~1
  2750                              <1> 	; 05/06/2024
  2751                              <1> 	;mov	[dma_hbuff_size], ecx
  2752                              <1> 	; ecx = DMA half buffer size as word aligned
  2753                              <1> 	;	(in fact, half buffer is one of the two DMA buffers)
  2754                              <1> 	;;;
  2755                              <1> 
  2756 00012A3E E941190000          <1> 	jmp	set_vt8233_bdl
  2757                              <1> 
  2758                              <1> sndc_init18:
  2759                              <1> 	;call	set_ac97_bdl
  2760                              <1> 	;;jmp	short sndc_init5
  2761                              <1> 	;retn
  2762                              <1> 
  2763                              <1> 	; 05/06/2024
  2764                              <1> 	;;;
  2765                              <1> 	;;;
  2766                              <1> 	; 04/06/2024 (use truncated buffer size for BDL setup)
  2767                              <1> 	; NOTE: Round up adds spurious bytes (noise) to the DMA buff;
  2768                              <1> 	;	so, round down the size is better than the round up.
  2769                              <1> 	;	((BDL feature needs 8 byte aligned buffer address))
  2770                              <1> 	;
  2771                              <1> 	;mov	ecx, [audio_buff_size] ; audio buffer size in bytes
  2772                              <1> 	;and	cl, ~7
  2773                              <1> 	; 05/06/2024
  2774                              <1> 	;mov	[dma_hbuff_size], ecx
  2775                              <1> 	; ecx = DMA half buffer size as truncated for 8 byte alignment
  2776                              <1> 	;	(in fact, half buffer is one of the two DMA buffers)
  2777                              <1> 	;;;
  2778                              <1> 
  2779                              <1> 	; 29/07/2022
  2780 00012A43 E96D1F0000          <1> 	jmp	set_ac97_bdl
  2781                              <1> 
  2782                              <1> sound_play:
  2783                              <1> 	; FUNCTION = 4 
  2784                              <1> 	; bl = Mode 
  2785                              <1> 	;      bit 0 = mono/stereo (1 = stereo)
  2786                              <1> 	;      bit 1 = 8 bit / 16 bit (1 = 16 bit)
  2787                              <1> 	; cx = Sampling Rate (Hz)
  2788                              <1> 
  2789                              <1> 	; 13/06/2017
  2790                              <1> 	; Note: Even if Mode bits are not 11b,
  2791                              <1> 	; 	AC'97 Audio Controller (&Codec)
  2792                              <1> 	;	will play audio samples as 16 bit, stereo
  2793                              <1> 	;	samples.
  2794                              <1> 	;	(Program must fill the audio buffer
  2795                              <1> 	;	as required; 8 bit samples must be converted
  2796                              <1> 	;	to 16 bit samples and mono samples must be
  2797                              <1> 	;	converted to stereo samples...)
  2798                              <1> 	 
  2799                              <1> 	; 19/12/2024 (BugFix)
  2800                              <1> 	; 05/06/2024
  2801                              <1> 	; 04/06/2024
  2802                              <1> 	; 30/07/2022
  2803                              <1> 	; 28/07/2020
  2804                              <1> 	; 27/07/2020
  2805                              <1> 	; 28/05/2017
  2806                              <1> 	; 15/05/2017, 20/05/2017
  2807                              <1> 	; 21/04/2017, 24/04/2017
  2808                              <1> 	; ... device check at first
  2809 00012A48 A0[298F0100]        <1> 	mov	al, [audio_device]
  2810 00012A4D 08C0                <1> 	or	al, al ; 0 ; pc speaker or invalid
  2811                              <1> 	;jz	beeper_gfx ; 'video.s' ; temporary
  2812                              <1> 	; 30/07/022
  2813 00012A4F 7505                <1> 	jnz	short snd_play_7
  2814 00012A51 E932F9FEFF          <1> 	jmp	beeper_gfx
  2815                              <1> 
  2816                              <1> snd_play_7:
  2817                              <1> ;	cmp	al, 3 ; VIA VT 8237R (vt8233)
  2818                              <1> ;	je	short snd_play_1
  2819                              <1> ;	cmp	al, 1 ; SB 16
  2820                              <1> ;	jne	soundc_dev_err ; temporary !
  2821                              <1> ;snd_play_0:
  2822                              <1> 	; ... buffer & (buffer) owner check at second
  2823 00012A56 833D[3C8F0100]00    <1> 	cmp	dword [audio_buffer], 0
  2824                              <1> 	;jna	sound_buff_error
  2825                              <1> 	; 30/07/2022
  2826 00012A5D 763C                <1> 	jna	short snd_play_4 ; jmp sound_buff_error
  2827 00012A5F A0[FD940100]        <1> 	mov	al, [u.uno]
  2828 00012A64 3A05[558F0100]      <1> 	cmp	al, [audio_user]
  2829                              <1> 	;jne	sndc_owner_error
  2830                              <1> 	; 30/07/2022
  2831 00012A6A 7405                <1> 	je	short snd_play_3
  2832 00012A6C E967FEFFFF          <1> 	jmp	sndc_owner_error
  2833                              <1> snd_play_3:
  2834 00012A71 66890D[5E8F0100]    <1> 	mov	[audio_freq], cx ; sample frequency (Hertz)
  2835 00012A78 88D8                <1> 	mov	al, bl
  2836 00012A7A 2401                <1> 	and	al, 1 ; mono/stereo (1= stereo)
  2837 00012A7C FEC0                <1> 	inc	al ; channels
  2838 00012A7E A2[5D8F0100]        <1> 	mov	[audio_stmo], al ; sound channels (1 or 2)
  2839 00012A83 B008                <1> 	mov	al, 8
  2840 00012A85 F6C302              <1> 	test	bl, 2 ; bits per sample (1= 16 bit)
  2841 00012A88 7402                <1> 	jz	short snd_play_bps
  2842 00012A8A D0E0                <1> 	shl	al, 1  
  2843                              <1> snd_play_bps:	
  2844 00012A8C A2[5C8F0100]        <1> 	mov	[audio_bps], al
  2845                              <1> 
  2846                              <1> 	; Transfer ring 3 (user's) audio buffer content to dma buffer
  2847 00012A91 8B3D[488F0100]      <1> 	mov	edi, [audio_dma_buff] ; dma buffer (ring 0)
  2848 00012A97 09FF                <1> 	or	edi, edi
  2849                              <1> 	;jz	sound_buff_error
  2850                              <1> 	; 30/07/2022
  2851 00012A99 7505                <1> 	jnz	short snd_play_5
  2852                              <1> snd_play_4:
  2853 00012A9B E912FDFFFF          <1> 	jmp	sound_buff_error
  2854                              <1> snd_play_5:
  2855                              <1> 	; 27/07/2020
  2856 00012AA0 8B35[408F0100]      <1> 	mov	esi, [audio_p_buffer] ; physical address (ring 3)
  2857                              <1> 	;mov	ecx, [audio_buff_size] ; 15/05/2017
  2858                              <1> 
  2859                              <1> ; 04/06/2024
  2860                              <1> %if 0
  2861                              <1> 	mov	ecx, [audio_dmabuff_size] ; 27/07/2020
  2862                              <1> 	;or	ecx, ecx 
  2863                              <1> 	;jz	sound_buff_error
  2864                              <1> 	; 28/07/2020
  2865                              <1> 	shr	ecx, 1  ; dma half buffer size
  2866                              <1> %else
  2867                              <1> 	; 05/06/2024
  2868 00012AA6 8B0D[508F0100]      <1> 	mov	ecx, [dma_hbuff_size]  ; DMA half buffer size
  2869                              <1> 
  2870                              <1> 	; 04/06/2024
  2871                              <1> 	;mov	ecx, [audio_buff_size]
  2872                              <1> 	; 19/12/2024 (BugFix)
  2873 00012AAC A0[298F0100]        <1> 	mov	al, [audio_device]
  2874                              <1> 	;
  2875                              <1> 	;cmp	al, 1 ; Sound Blaster 16
  2876                              <1> 	;je	short snd_play_8
  2877                              <1> 	;and	cl, ~1
  2878                              <1> 	;cmp	al, 3 ; VT8233 (VT8237R)
  2879                              <1> 	;je	short snd_play_8
  2880                              <1> 	; AC'97
  2881                              <1> 	;and	cl, ~7
  2882                              <1> snd_play_8:
  2883                              <1> %endif
  2884                              <1> 
  2885 00012AB1 8035[548F0100]01    <1> 	xor	byte [audio_flag], 1 ;  0 -> 1, 1 -> 0
  2886 00012AB8 7502                <1> 	jnz	short snd_play_0 ; [audio_flag] = 1
  2887                              <1> 				 ; fill dma half buffer 1
  2888                              <1> 	; [audio_flag] = 0
  2889                              <1> 	
  2890                              <1> 	; fill dma half buffer 2
  2891 00012ABA 01CF                <1> 	add	edi, ecx
  2892                              <1> 
  2893                              <1> snd_play_0:
  2894                              <1> 	; 05/06/2024
  2895                              <1> 	;;rep	movsb
  2896                              <1> 	;shr	ecx, 2 ; convert byte count to dword count
  2897                              <1> 	;rep	movsd  ;	
  2898 00012ABC F3A4                <1> 	rep	movsb  ; SB16, AC97, VT8233
  2899                              <1> 
  2900                              <1> 	; here, if [audio_flag] = 0, interrupt handler will update
  2901                              <1> 				; dma half buffer 2 
  2902                              <1> 				; (user's audio buffer data will be
  2903                              <1> 				; copied into dma half buffer 2) 
  2904                              <1> 	;; 20/05/2017
  2905                              <1> 	;mov	byte [audio_flag], 1 ; next half (on next time)
  2906                              <1> 
  2907                              <1> 	; 24/04/2017
  2908                              <1> 	;mov	al, [audio_device]
  2909                              <1> 	; 04/06/2024
  2910                              <1> 	; al = [audio_device]
  2911                              <1> 
  2912 00012ABE 3C03                <1> 	cmp	al, 3 ; VT8233 (VT8237R)
  2913 00012AC0 7409                <1> 	je	short snd_play_1
  2914 00012AC2 3C01                <1> 	cmp	al, 1 ; Sound Blaster 16
  2915 00012AC4 750A                <1> 	jne	short snd_play_2  ; 28/05/2017
  2916                              <1> 
  2917                              <1> ; 30/07/2022
  2918                              <1> ;	call	SbInit_play
  2919                              <1> ;	;jc	soundc_respond_err
  2920                              <1> ;	;retn
  2921                              <1> ;	; 30/07/2022
  2922                              <1> ;	jnc	short snd_play_6  ; retn
  2923                              <1> ;	jmp	soundc_respond_err
  2924                              <1> 
  2925                              <1> 	; 30/07/2022
  2926 00012AC6 E9AA1A0000          <1> 	jmp	SbInit_play	; sb16_start_play
  2927                              <1> 
  2928                              <1> snd_play_1:	
  2929                              <1> 	;call	vt8233_start_play
  2930                              <1> 	;retn
  2931                              <1> 	; 30/07/2022
  2932 00012ACB E9E8180000          <1> 	jmp	vt8233_start_play
  2933                              <1> 
  2934                              <1> snd_play_2:
  2935                              <1> 	; 28/05/2017
  2936                              <1> 	;cmp	al, 2 ; AC'97
  2937                              <1> 	;jne	short snd_play_3
  2938                              <1> 
  2939                              <1> 	;call	ac97_start_play
  2940                              <1> 	;retn
  2941                              <1> 	; 30/07/2022
  2942 00012AD0 E9111F0000          <1> 	jmp	ac97_start_play
  2943                              <1> 
  2944                              <1> ;snd_play_3:
  2945                              <1> ;	;call	hda_start_play
  2946                              <1> ;	retn
  2947                              <1> 	; 30/07/2022
  2948                              <1> 	;jmp	hda_start_play
  2949                              <1> 
  2950                              <1> ; 04/06/2024
  2951                              <1> ;snd_play_6:
  2952                              <1> ;	; 30/07/2022
  2953                              <1> ;	retn
  2954                              <1> 
  2955                              <1> sound_pause:
  2956                              <1> 	; FUNCTION = 5
  2957                              <1> 	; Pause
  2958                              <1> 	; 28/05/2017
  2959                              <1> 	; 24/04/2017
  2960                              <1> 	; 22/04/2017
  2961 00012AD5 E82B030000          <1> 	call	snd_dev_check
  2962 00012ADA 7277                <1> 	jc	short snd_nothing ; temporary.
  2963 00012ADC E831030000          <1> 	call	snd_buf_check
  2964 00012AE1 7270                <1> 	jc	short snd_nothing ; temporary.
  2965 00012AE3 A0[298F0100]        <1> 	mov	al, [audio_device]
  2966 00012AE8 3C03                <1> 	cmp	al, 3 ; VIA VT 8237R (vt8233)
  2967 00012AEA 7409                <1> 	je	short snd_pause_1
  2968 00012AEC 3C01                <1> 	cmp	al, 1 ; Sound Blaster 16
  2969 00012AEE 750A                <1> 	jne	short snd_pause_2 ; 28/05/2017
  2970 00012AF0 E9531C0000          <1> 	jmp	sb16_pause
  2971                              <1> snd_pause_1:
  2972 00012AF5 E973190000          <1> 	jmp	vt8233_pause
  2973                              <1> snd_pause_2:
  2974                              <1> 	; 28/05/2017
  2975                              <1> 	;cmp	al, 2 ; AC'97
  2976                              <1> 	;jne	short snd_nothing ; temporary.
  2977 00012AFA E9E31F0000          <1> 	jmp	ac97_pause
  2978                              <1> 
  2979                              <1> sound_continue:
  2980                              <1> 	; FUNCTION = 6
  2981                              <1> 	; Continue to play
  2982                              <1> 	; 28/05/2017
  2983                              <1> 	; 22/04/2017
  2984 00012AFF E801030000          <1> 	call	snd_dev_check
  2985 00012B04 724D                <1> 	jc	short snd_nothing ; temporary.
  2986 00012B06 E807030000          <1> 	call	snd_buf_check
  2987 00012B0B 7246                <1> 	jc	short snd_nothing ; temporary.
  2988 00012B0D A0[298F0100]        <1> 	mov	al, [audio_device]
  2989 00012B12 3C03                <1> 	cmp	al, 3 ; VIA VT 8237R (vt8233)
  2990 00012B14 7409                <1> 	je	short snd_cont_1
  2991 00012B16 3C01                <1> 	cmp	al, 1 ; Sound Blaster 16
  2992 00012B18 750A                <1> 	jne	short snd_cont_2 ; 28/05/2017
  2993 00012B1A E94B1C0000          <1> 	jmp	sb16_continue
  2994                              <1> snd_cont_1:
  2995 00012B1F E9FB180000          <1> 	jmp	vt8233_play
  2996                              <1> snd_cont_2:
  2997                              <1> 	; 28/05/2017
  2998                              <1> 	;cmp	al, 2 ; AC'97
  2999                              <1> 	;;jne	short snd_nothing ; temporary.
  3000                              <1> 	; 30/07/2022
  3001                              <1> 	;jne	short snd_cont_3
  3002 00012B24 E9FA1E0000          <1> 	jmp	ac97_play
  3003                              <1> ;snd_cont_3:
  3004                              <1> 	;jmp	hda_play
  3005                              <1> 
  3006                              <1> sound_stop:
  3007                              <1> 	; FUNCTION = 7
  3008                              <1> 	; Stop playing
  3009                              <1> 	; 30/07/2022
  3010                              <1> 	; 28/05/2017
  3011                              <1> 	; 24/05/2017
  3012                              <1> 	; 21/04/2017, 22/04/2017, 24/04/2017
  3013 00012B29 E8D7020000          <1> 	call	snd_dev_check
  3014 00012B2E 7223                <1> 	jc	short snd_nothing ; temporary.
  3015                              <1> 	;call	snd_buf_check
  3016 00012B30 E8E6020000          <1> 	call	snd_user_check ; 24/05/2017
  3017 00012B35 721C                <1> 	jc	short snd_nothing ; temporary.	
  3018                              <1> 	
  3019 00012B37 A0[298F0100]        <1> 	mov	al, [audio_device]
  3020 00012B3C 3C03                <1> 	cmp	al, 3 ; VIA VT 8237R (vt8233)
  3021                              <1> 	;je	vt8233_stop
  3022                              <1> 	;; 28/05/2017
  3023                              <1> 	;;ja	short snd_nothing
  3024                              <1> 	; 30/07/2022
  3025 00012B3E 7505                <1> 	jne	short snd_stop_1
  3026 00012B40 E936180000          <1> 	jmp	vt8233_stop
  3027                              <1> snd_stop_1:
  3028 00012B45 3C01                <1> 	cmp	al, 1 ; Sound Blaster 16
  3029                              <1> 	;je	sb16_stop
  3030                              <1> 	; 30/07/2022
  3031 00012B47 7505                <1> 	jne	short snd_stop_2
  3032 00012B49 E93E1C0000          <1> 	jmp	sb16_stop
  3033                              <1> snd_stop_2:
  3034                              <1> 	;cmp	al, 2 
  3035                              <1> 	;;je	short ac97_stop
  3036                              <1> 	; 30/07/2022
  3037                              <1> 	;jne	short snd_stop_3
  3038 00012B4E E9861F0000          <1> 	jmp	ac97_stop ; temporary.
  3039                              <1> ;snd_stop_3:
  3040                              <1> 	;jmp	hda_stop
  3041                              <1> 
  3042                              <1> sndc_cancel_ok:
  3043                              <1> 	; 30/07/2022
  3044                              <1> sndc_reset_ok:
  3045                              <1> 	; 30/07/2022
  3046                              <1> snd_nothing:
  3047                              <1> 	; 21/04/2017
  3048 00012B53 C3                  <1> 	retn
  3049                              <1> 
  3050                              <1> soundc_reset:
  3051                              <1> 	; FUNCTION = 8
  3052                              <1> 	; Reset Audio Controller
  3053                              <1> 	; 30/07/2022
  3054                              <1> 	; 28/05/2017
  3055                              <1> 	; 22/04/2017
  3056 00012B54 E8AC020000          <1> 	call	snd_dev_check
  3057 00012B59 72F8                <1> 	jc	short snd_nothing ; temporary.
  3058 00012B5B E8B2020000          <1> 	call	snd_buf_check
  3059 00012B60 72F1                <1> 	jc	short snd_nothing ; temporary.	
  3060                              <1> 	
  3061 00012B62 A0[298F0100]        <1> 	mov	al, [audio_device]
  3062                              <1> 	; 30/07/2022
  3063 00012B67 3C03                <1> 	cmp	al, 3 ; VIA VT 8237R (vt8233)
  3064 00012B69 7207                <1> 	jb	short sndc_reset_1
  3065                              <1> 	;je	vt8233_reset
  3066 00012B6B 77E6                <1> 	ja	short snd_nothing ; temporary.
  3067                              <1> 	;;ja	hda_reset
  3068                              <1> 	;ja	short sndc_reset_3
  3069                              <1> 	; 30/07/2022
  3070 00012B6D E907190000          <1> 	jmp	vt8233_reset	
  3071                              <1> sndc_reset_1:
  3072 00012B72 3C01                <1> 	cmp	al, 1 ; Sound Blaster 16
  3073                              <1> 	;jne	ac97_reset	
  3074                              <1> 	; 30/07/2022
  3075 00012B74 750C                <1> 	jne	short sndc_reset_2
  3076 00012B76 E8621C0000          <1> 	call	sb16_reset
  3077                              <1> 	;jc	soundc_respond_err
  3078                              <1> 	;retn
  3079                              <1> 	; 30/07/2022
  3080 00012B7B 73D6                <1> 	jnc	short sndc_reset_ok
  3081 00012B7D E90BFCFFFF          <1> 	jmp	soundc_respond_err
  3082                              <1> sndc_reset_2:
  3083                              <1> 	; 30/07/2022
  3084                              <1> 	;cmp	al, 2
  3085                              <1> 	;ja	short sndc_reset_3
  3086 00012B82 E917200000          <1> 	jmp	ac97_reset
  3087                              <1> ;sndc_reset_3:
  3088                              <1> 	;jmp	hda_reset
  3089                              <1> 
  3090                              <1> soundc_cancel:
  3091                              <1> 	; FUNCTION = 9
  3092                              <1> 	; Cancel audio callback service
  3093                              <1> 	; 30/07/2022
  3094                              <1> 	; 22/04/2017
  3095 00012B87 A0[558F0100]        <1> 	mov	al, [audio_user]
  3096 00012B8C 3A05[FD940100]      <1> 	cmp	al, [u.uno]
  3097 00012B92 75BF                <1> 	jne	short snd_nothing
  3098                              <1> 	; RESET (audio) INTERRUPT CALLBACK SERVICE
  3099 00012B94 8A1D[2A8F0100]      <1> 	mov	bl, [audio_intr] ; IRQ number
  3100 00012B9A A0[FD940100]        <1> 	mov	al, [u.uno]
  3101 00012B9F 28FF                <1> 	sub	bh, bh ; 0 ; unlink IRQ from user service
  3102 00012BA1 E81D030000          <1>  	call	set_irq_callback_service
  3103                              <1> 	;jc	sndc_perm_error ; 'permission denied' error
  3104                              <1> 	;retn
  3105                              <1> 	; 30/07/2022
  3106 00012BA6 73AB                <1> 	jnc	short sndc_cancel_ok
  3107 00012BA8 E930FDFFFF          <1> 	jmp	sndc_perm_error
  3108                              <1> 
  3109                              <1> sound_dalloc:
  3110                              <1> 	; FUNCTION = 10
  3111                              <1> 	; Deallocate (ring 3) audio buffer
  3112                              <1> 	; 22/04/2017
  3113 00012BAD A0[558F0100]        <1> 	mov	al, [audio_user]
  3114 00012BB2 3A05[FD940100]      <1> 	cmp	al, [u.uno]
  3115 00012BB8 7599                <1> 	jne	short snd_nothing
  3116 00012BBA 8B1D[3C8F0100]      <1> 	mov	ebx, [audio_buffer]
  3117                              <1> 	;or	ebx, ebx
  3118                              <1> 	;jz	short snd_nothing
  3119 00012BC0 8B0D[448F0100]      <1> 	mov	ecx, [audio_buff_size]
  3120 00012BC6 E88034FFFF          <1> 	call	deallocate_user_pages
  3121 00012BCB 31C0                <1> 	xor	eax, eax
  3122 00012BCD A3[3C8F0100]        <1> 	mov	[audio_buffer], eax ; 0
  3123 00012BD2 A2[558F0100]        <1> 	mov	[audio_user], al ; 0
  3124                              <1> ;sndc_cancel_ok:
  3125 00012BD7 C3                  <1> 	retn
  3126                              <1> 
  3127                              <1> sound_volume:
  3128                              <1> 	; FUNCTION = 11
  3129                              <1> 	; Set sound volume level
  3130                              <1> 	; 23/05/2024
  3131                              <1> 	; 30/07/2022
  3132                              <1> 	; 28/05/2017
  3133                              <1> 	; 20/05/2017
  3134                              <1> 	; 22/04/2017, 24/04/2017
  3135                              <1> 	; bl = component
  3136                              <1> 	;		0 = master/playback/lineout volume
  3137                              <1> 	;		1 = PCM out volume ; 23/05/2024
  3138                              <1> 	; cl = left channel volume level (0 to 31)
  3139                              <1> 	; ch = right channel volume level (0 to 31)
  3140                              <1> 
  3141 00012BD8 80FB80              <1> 	cmp	bl, 80h
  3142 00012BDB 720A                <1> 	jb	short snd_vol_1
  3143                              <1> 	;ja	snd_nothing ; temporary.
  3144                              <1> 	; 30/07/2022
  3145 00012BDD 7707                <1> 	ja	short snd_vol_0
  3146                              <1> 	; Set volume level for next play (BL>= 80h)
  3147 00012BDF 66890D[648F0100]    <1> 	mov	[audio_master_volume], cx
  3148                              <1> snd_vol_0:
  3149 00012BE6 C3                  <1> 	retn
  3150                              <1> snd_vol_1:
  3151                              <1> 	; set volume level immediate (BL< 80h)
  3152                              <1> 	;cmp	bl, 0
  3153                              <1> 	;;ja	snd_nothing ; temporary.
  3154                              <1> 	; 30/07/2022
  3155                              <1> 	;ja	short snd_vol_0
  3156                              <1> 	; 23/05/2024
  3157 00012BE7 80FB01              <1> 	cmp	bl, 1
  3158 00012BEA 77FA                <1> 	ja	short snd_vol_0 ; temporary
  3159                              <1> 
  3160 00012BEC E814020000          <1> 	call	snd_dev_check
  3161                              <1> 	;jc	snd_nothing ; temporary.
  3162                              <1> 	; 30/07/2022
  3163 00012BF1 72F3                <1> 	jc	short snd_vol_0
  3164 00012BF3 E81A020000          <1> 	call	snd_buf_check
  3165                              <1> 	;jc	snd_nothing ; temporary.
  3166                              <1> 	; 30/07/2022
  3167 00012BF8 72EC                <1> 	jc	short snd_vol_0	
  3168                              <1> 
  3169 00012BFA A0[298F0100]        <1> 	mov	al, [audio_device]
  3170 00012BFF 3C03                <1> 	cmp	al, 3 ; VIA VT 8237R (vt8233)
  3171                              <1> 	;je	vt8233_volume
  3172                              <1> 	; 30/07/2022
  3173 00012C01 7207                <1> 	jb	short snd_vol_2
  3174                              <1> 	; 28/05/2017
  3175                              <1> 	;ja	snd_nothing ; temporary.
  3176                              <1> 	; 30/07/2022
  3177 00012C03 77E1                <1> 	ja	short snd_vol_0
  3178                              <1> 	;ja	hda_volume
  3179                              <1> 	; 30/07/2022
  3180 00012C05 E988180000          <1> 	jmp	vt8233_volume
  3181                              <1> snd_vol_2:	
  3182                              <1> 	; Sound Blaster 16
  3183 00012C0A 3C01                <1> 	cmp	al, 1 ; SB 16
  3184                              <1> 	;je	sb16_volume
  3185                              <1> 	; 30/07/2022
  3186 00012C0C 7705                <1> 	ja	short snd_vol_3
  3187 00012C0E E9041B0000          <1> 	jmp	sb16_volume
  3188                              <1> snd_vol_3:
  3189                              <1> 	; 30/07/2022
  3190                              <1> 	;cmp	al, 2
  3191                              <1> 	;ja	short snd_vol_4
  3192 00012C13 E9571E0000          <1> 	jmp	ac97_volume
  3193                              <1> ;snd_vol_4:
  3194                              <1> 	;jmp	hda_volume
  3195                              <1> 
  3196                              <1> soundc_disable:
  3197                              <1> 	; FUNCTION = 12 
  3198                              <1> 	; Disable audio device (and unlink DMA memory)
  3199                              <1> 	; 23/08/2024
  3200                              <1> 	; 04/06/2024
  3201                              <1> 	; 30/07/2022
  3202                              <1> 	; 28/05/2017
  3203                              <1> 	; 24/05/2017
  3204                              <1> 	; 22/04/2017
  3205 00012C18 E8E8010000          <1> 	call	snd_dev_check
  3206                              <1> 	;jc	soundc_dev_err ; temporary.
  3207                              <1> 	; 30/07/2022
  3208 00012C1D 7305                <1> 	jnc	short snd_disable_4
  3209 00012C1F E962FBFFFF          <1> 	jmp	soundc_dev_err
  3210                              <1> snd_disable_4:
  3211                              <1> 	;call	snd_buf_check
  3212                              <1> 	;;jc	sndc_owner_error ; temporary.
  3213                              <1> 	; 30/07/2022
  3214                              <1> 	;jnc	short snd_disable_5
  3215                              <1> 	;jmp	sndc_owner_error
  3216                              <1> ;snd_disable_5:
  3217 00012C24 A0[298F0100]        <1> 	mov	al, [audio_device]
  3218 00012C29 3C03                <1> 	cmp	al, 3 ; VIA VT 8237R (vt8233)
  3219 00012C2B 7414                <1> 	je	short snd_disable_1
  3220                              <1> 	;ja	snd_nothing ; temporary.
  3221                              <1> 	; 30/07/2022
  3222 00012C2D 7766                <1> 	ja	short snd_disable_3 ; retn
  3223 00012C2F 3C01                <1> 	cmp	al, 1 ; Sound Blaster 16
  3224 00012C31 7507                <1> 	jne	short snd_disable_0
  3225 00012C33 E8541B0000          <1> 	call	sb16_stop
  3226 00012C38 EB0C                <1> 	jmp	short snd_disable_2
  3227                              <1> snd_disable_0:
  3228 00012C3A E89A1E0000          <1> 	call	ac97_stop
  3229 00012C3F EB05                <1> 	jmp	short snd_disable_2
  3230                              <1> snd_disable_1:
  3231 00012C41 E835170000          <1> 	call	vt8233_stop
  3232                              <1> snd_disable_2:
  3233 00012C46 A0[2A8F0100]        <1> 	mov	al, [audio_intr]
  3234                              <1> 
  3235                              <1> 	; 15/01/2025
  3236 00012C4B 20C0                <1> 	and	al, al
  3237 00012C4D 740E                <1> 	jz	short snd_disable_5
  3238                              <1> 
  3239 00012C4F 29DB                <1> 	sub	ebx, ebx ; 0 = reset
  3240 00012C51 E840FAFFFF          <1> 	call	set_dev_IRQ_service
  3241                              <1> 
  3242                              <1> 	;mov	al, [audio_intr]
  3243 00012C56 28E4                <1> 	sub	ah, ah ; 0 = reset
  3244 00012C58 E800F8FFFF          <1> 	call	set_hardware_int_vector
  3245                              <1> 
  3246                              <1> snd_disable_5:	; 15/01/2025
  3247 00012C5D 31C0                <1> 	xor	eax, eax
  3248 00012C5F A2[298F0100]        <1> 	mov	byte [audio_device], al
  3249 00012C64 A2[2A8F0100]        <1> 	mov	byte [audio_intr], al
  3250 00012C69 8705[488F0100]      <1> 	xchg	eax, [audio_dma_buff]
  3251                              <1> 
  3252                              <1> 	; 15/01/2025
  3253 00012C6F 09C0                <1> 	or	eax, eax
  3254 00012C71 7422                <1> 	jz	short snd_disable_3
  3255                              <1> 
  3256                              <1> 	; 24/05/2017
  3257                              <1> 	;or	eax, eax
  3258                              <1> 	;jz	short snd_disable_3
  3259                              <1> 	;cmp	eax, sb16_dma_buffer ; default DMA buffer
  3260                              <1> 	;je	short snd_disable_3
  3261 00012C73 803D[288F0100]00    <1> 	cmp	byte [audio_pci], 0 ; AC97 audio controller ?
  3262 00012C7A 7619                <1> 	jna	short snd_disable_3
  3263 00012C7C C605[288F0100]00    <1> 	mov	byte [audio_pci], 0
  3264                              <1> 
  3265                              <1> 	; 23/08/2024 - bugfix
  3266 00012C83 3D00000500          <1> 	cmp	eax, sb16_dma_buffer ; reserved buffer ?
  3267 00012C88 740B                <1> 	je	short snd_disable_3 ; it isn't an allocated mem buff
  3268                              <1> 
  3269                              <1> 	;sub	ecx, ecx
  3270                              <1> 	;xchg	ecx, [audio_dmabuff_size]
  3271 00012C8A 8B0D[4C8F0100]      <1> 	mov	ecx, [audio_dmabuff_size]
  3272                              <1> 	; 26/11/2023 
  3273                              <1> 	; round up (always -rounded up- page count is allocated)
  3274                              <1> 	; ((so deallocation must be done for the rounded up value))
  3275                              <1> 	;add	ecx, PAGE_SIZE - 1   ; 4095
  3276                              <1> 	;call	deallocate_memory_block
  3277                              <1> 	; 04/06/2024
  3278                              <1> 	;call	deallocate_memory_block_x 
  3279                              <1> 			; deallocate ((ecx+4095)>>12) pages
  3280 00012C90 E87832FFFF          <1> 	call	deallocate_memory_block
  3281                              <1> snd_disable_3:
  3282 00012C95 C3                  <1> 	retn
  3283                              <1> 
  3284                              <1> sound_dma_map:
  3285                              <1> 	; FUNCTION = 13 
  3286                              <1> 	; Map audio dma buff addr to user's buffer addr
  3287                              <1> 	; 30/07/2022
  3288                              <1> 	; 12/05/2017
  3289 00012C96 21C9                <1> 	and	ecx, ecx
  3290                              <1> 	;jz	sound_buff_error
  3291                              <1> 	; 30/07/2022
  3292 00012C98 7505                <1> 	jnz	short snd_dma_map_3
  3293 00012C9A E913FBFFFF          <1> 	jmp	sound_buff_error
  3294                              <1> snd_dma_map_3:
  3295 00012C9F 803D[298F0100]01    <1> 	cmp	byte [audio_device], 1
  3296 00012CA6 722A                <1> 	jb	short snd_dma_map_1
  3297                              <1> snd_dma_map_0:
  3298 00012CA8 A1[488F0100]        <1> 	mov	eax, [audio_dma_buff]
  3299 00012CAD 21C0                <1> 	and	eax, eax
  3300 00012CAF 7421                <1> 	jz	short snd_dma_map_1
  3301                              <1> 	;
  3302 00012CB1 8A1D[558F0100]      <1> 	mov	bl, [audio_user]
  3303 00012CB7 08DB                <1> 	or	bl, bl
  3304 00012CB9 7417                <1> 	jz	short snd_dma_map_1
  3305 00012CBB 3A1D[FD940100]      <1> 	cmp	bl, [u.uno]
  3306                              <1> 	;jne	sndc_owner_error
  3307                              <1> 	; 30/07/2022
  3308 00012CC1 7405                <1> 	je	short snd_dma_map_4
  3309 00012CC3 E910FCFFFF          <1> 	jmp	sndc_owner_error
  3310                              <1> snd_dma_map_4:
  3311 00012CC8 8B1D[4C8F0100]      <1> 	mov	ebx, [audio_dmabuff_size]
  3312 00012CCE 21DB                <1> 	and	ebx, ebx
  3313 00012CD0 750A                <1> 	jnz	short snd_dma_map_2
  3314                              <1> snd_dma_map_1:
  3315 00012CD2 B800000500          <1> 	mov	eax, sb16_dma_buffer
  3316 00012CD7 BB00000100          <1> 	mov	ebx, 65536
  3317                              <1> snd_dma_map_2:	
  3318 00012CDC 81C1FF0F0000        <1> 	add	ecx, PAGE_SIZE-1 ; 4095
  3319 00012CE2 6681E100F0          <1> 	and	cx, ~PAGE_OFF ; not 4095
  3320 00012CE7 39D9                <1> 	cmp	ecx, ebx
  3321                              <1> 	;ja	sound_buff_error
  3322                              <1> 	; 30/07/2022
  3323 00012CE9 7605                <1> 	jna	short snd_dma_map_6
  3324                              <1> snd_dma_map_5:
  3325 00012CEB E9C2FAFFFF          <1> 	jmp	sound_buff_error
  3326                              <1> snd_dma_map_6:
  3327 00012CF0 50                  <1> 	push	eax
  3328 00012CF1 89D3                <1> 	mov	ebx, edx
  3329 00012CF3 C1E90C              <1> 	shr	ecx, 12 ; byte count to page count
  3330                              <1> 	; eax = physical address of (audio) dma buffer
  3331                              <1> 	; ebx = virtual address of (audio) dma buffer (user's pgdir)
  3332                              <1> 	; ecx = page count (>0)
  3333 00012CF6 E88232FFFF          <1> 	call	direct_memory_access
  3334 00012CFB 58                  <1> 	pop	eax
  3335                              <1> 	;jc	sound_buff_error
  3336                              <1> 	; 30/07/2022
  3337 00012CFC 72ED                <1> 	jc	short snd_dma_map_5
  3338 00012CFE A3[AC940100]        <1> 	mov	[u.r0], eax
  3339 00012D03 C3                  <1> 	retn
  3340                              <1> 
  3341                              <1> soundc_info:
  3342                              <1> 	; FUNCTION = 14 
  3343                              <1> 	; Get Audio Controller Info
  3344                              <1> 	; 19/11/2023
  3345                              <1> 	; 30/07/2022
  3346                              <1> 	; 10/06/2017
  3347                              <1> 	; 05/06/2017
  3348                              <1> 	
  3349                              <1> 	;and	bl, bl ; 0
  3350                              <1> 	;jz	short sndc_info_0
  3351                              <1> 	
  3352                              <1> 	; 19/11/2023
  3353 00012D04 80FB01              <1> 	cmp	bl, 1
  3354 00012D07 7609                <1> 	jna	short sndc_info_0
  3355                              <1> 
  3356                              <1> ; invalid parameter !
  3357                              <1> ; 30/07/2022
  3358                              <1> 	;mov	eax, ERR_INV_PARAMETER ; 23
  3359                              <1> ;sndc_inf_error:
  3360                              <1> ;	mov	[u.r0], eax
  3361                              <1> ;	mov	[u.error], eax
  3362                              <1> ;	jmp	error
  3363                              <1> 	; 30/07/2022
  3364 00012D09 29C0                <1> 	sub	eax, eax
  3365 00012D0B B017                <1> 	mov	al, ERR_INV_PARAMETER ; 23
  3366 00012D0D E980FAFFFF          <1> 	jmp	sysaudio_err
  3367                              <1> 
  3368                              <1> sndc_info_0:
  3369 00012D12 E8EE000000          <1> 	call	snd_dev_check
  3370                              <1> 	;jc	soundc_dev_err
  3371                              <1> 	; 30/07/2022
  3372 00012D17 7305                <1> 	jnc	short sndc_info_3
  3373                              <1> snd_data_dev_err:
  3374 00012D19 E968FAFFFF          <1> 	jmp	soundc_dev_err
  3375                              <1> sndc_info_3:
  3376                              <1> 	; 19/11/2023
  3377                              <1> 	;cmp	bl, 1
  3378                              <1> 	;je	short sndc_info_4
  3379 00012D1E 20DB                <1> 	and	bl, bl
  3380 00012D20 7546                <1> 	jnz	short sndc_info_4
  3381                              <1> 
  3382 00012D22 8B1D[348F0100]      <1> 	mov	ebx, [audio_vendor]
  3383 00012D28 8B0D[308F0100]      <1> 	mov	ecx, [audio_dev_id]
  3384                              <1> 	;mov	al,  [audio_device]
  3385 00012D2E 3C02                <1> 	cmp	al, 2 ; AC'97 (ICH)
  3386 00012D30 7513                <1> 	jne	short sndc_info_1
  3387                              <1> 	; Intel AC97 (ICH) Audio Controller (=2)
  3388 00012D32 668B15[2E8F0100]    <1> 	mov	dx, [NABMBAR]
  3389 00012D39 C1E210              <1> 	shl	edx, 16
  3390 00012D3C 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  3391 00012D43 EB07                <1> 	jmp	short sndc_info_2
  3392                              <1> sndc_info_1:
  3393                              <1> 	; 05/06/2017
  3394                              <1> 	; Note: Intel HDA code (here) is not ready yet!
  3395                              <1> 	; !!! SB16 or VT8233 (VT8237R) !!!
  3396 00012D45 0FB715[2E8F0100]    <1> 	movzx	edx, word [audio_io_base]
  3397                              <1> sndc_info_2:
  3398 00012D4C 88C4                <1> 	mov	ah, al ; [audio_device]
  3399 00012D4E A0[2A8F0100]        <1> 	mov	al, [audio_intr] 
  3400                              <1> 
  3401                              <1> 	; EAX = IRQ Number in AL
  3402                              <1> 	;	Audio Device Number in AH 
  3403                              <1> 	; EBX = DEV/VENDOR ID
  3404                              <1> 	;	(DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
  3405                              <1> 	; ECX = BUS/DEV/FN 
  3406                              <1> 	;	(00000000BBBBBBBBDDDDDFFF00000000)
  3407                              <1> 	; EDX = NABMBAR/NAMBAR (for AC97)
  3408                              <1> 	;	(Low word, DX = NAMBAR address)
  3409                              <1> 	; EDX = Base IO Addr (DX) for SB16 & VT8233
  3410                              <1> 
  3411                              <1> 	; 10/06/2017
  3412 00012D53 A3[AC940100]        <1> 	mov	[u.r0], eax
  3413 00012D58 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]
  3414 00012D5E 895D10              <1> 	mov	[ebp+16], ebx  ; ebx
  3415 00012D61 895514              <1> 	mov	[ebp+20], edx  ; edx
  3416 00012D64 894D18              <1> 	mov	[ebp+24], ecx  ; ecx
  3417                              <1> 
  3418 00012D67 C3                  <1>  	retn
  3419                              <1> 
  3420                              <1> sndc_info_4:
  3421                              <1> 	; 19/11/2023
  3422 00012D68 3C02                <1> 	cmp	al, 2 ; Intel AC97 (ICH) Audio Controller
  3423 00012D6A 7413                <1> 	je	short sndc_info_7
  3424                              <1> sndc_info_5:
  3425                              <1> 	; return ZERO if it is not AC97 audio controller codec
  3426 00012D6C 31C0                <1> 	xor	eax, eax ; 0
  3427 00012D6E 31DB                <1> 	xor	ebx, ebx ; 0
  3428                              <1> sndc_info_6:
  3429 00012D70 A3[AC940100]        <1> 	mov	[u.r0], eax
  3430 00012D75 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]
  3431 00012D7B 895D10              <1> 	mov	[ebp+16], ebx  ; ebx
  3432 00012D7E C3                  <1> 	retn
  3433                              <1> sndc_info_7:
  3434 00012D7F E8F31F0000          <1> 	call	ac97_codec_info
  3435 00012D84 72E6                <1> 	jc	short sndc_info_5
  3436                              <1> 
  3437                              <1> 	; 26/11/2023 - temporary
  3438                              <1> 	;and	al, 0FEh	; clear VRA support bit for test
  3439                              <1> 
  3440 00012D86 EBE8                <1> 	jmp	short sndc_info_6
  3441                              <1> 
  3442                              <1> sound_data:
  3443                              <1> 	; FUNCTION = 15 
  3444                              <1> 	; Get Current Sound data for graphics
  3445                              <1> 	; 30/07/2022
  3446                              <1> 	; 22/06/2017
  3447                              <1> 	;
  3448 00012D88 E878000000          <1> 	call	snd_dev_check
  3449                              <1> 	;jc	soundc_dev_err ; Device not ready !
  3450                              <1> 	; 30/07/2022
  3451 00012D8D 728A                <1> 	jc	short snd_data_dev_err
  3452                              <1> 
  3453 00012D8F 80FB00              <1> 	cmp	bl, 0
  3454 00012D92 760A                <1> 	jna	short sound_data_0
  3455                              <1> 
  3456                              <1> 	; Only PCM OUT buffer data is valid for now!
  3457 00012D94 B817000000          <1> 	mov	eax, ERR_INV_PARAMETER  ; 23
  3458 00012D99 E9F4F9FFFF          <1> 	jmp	sysaudio_err
  3459                              <1> 
  3460                              <1> sound_data_0:
  3461 00012D9E A1[488F0100]        <1> 	mov	eax, [audio_dma_buff]
  3462 00012DA3 09C0                <1> 	or	eax, eax
  3463                              <1> 	;jz	sound_buff_error
  3464                              <1> 	; 30/07/2022
  3465 00012DA5 741A                <1> 	jz	short sound_data_5
  3466                              <1> 
  3467 00012DA7 803D[298F0100]04    <1> 	cmp	byte [audio_device], 4 ; Intel HDA
  3468 00012DAE 744C                <1> 	je	short sound_data_4 ; temporary ! (22/06/2017)
  3469                              <1> 
  3470 00012DB0 21C9                <1> 	and	ecx, ecx
  3471                              <1> 	;jnz	short sound_data_1 ; sample transfer
  3472                              <1> 	
  3473                              <1> 	; Return only DMA Buffer pointer/offset... 
  3474                              <1> 	; (If DMA Buffer has been mapped to user's
  3475                              <1> 	;  memory space; program can get graphics
  3476                              <1> 	;  data by using only this pointer value.)
  3477                              <1> 	   	
  3478                              <1> 	;call	get_dma_buffer_offset
  3479                              <1> 	;; eax = DMA buffer offset
  3480                              <1> 	;;	(!not half buffer offset!)
  3481                              <1> 	;mov	[u.r0], eax
  3482                              <1> 	;retn
  3483                              <1> 
  3484                              <1> 	;jz	get_dma_buffer_offset
  3485                              <1> 	; 30/07/2022
  3486 00012DB2 7505                <1> 	jnz	short sound_data_1
  3487 00012DB4 E95F1F0000          <1> 	jmp	get_dma_buffer_offset
  3488                              <1> 	
  3489                              <1> sound_data_1:
  3490                              <1> 	;mov	eax, [audio_dmabuff_size]
  3491                              <1> 	;shr	eax, 1 ; half buffer size
  3492                              <1> 	;cmp	ecx, eax
  3493                              <1> 	;ja	short sound_buff_error
  3494                              <1> 
  3495 00012DB9 3B0D[4C8F0100]      <1> 	cmp	ecx, [audio_dmabuff_size]
  3496                              <1> 	;ja	sound_buff_error
  3497                              <1> 	; 30/07/2022
  3498 00012DBF 7605                <1> 	jna	short sound_data_6
  3499                              <1> sound_data_5:
  3500 00012DC1 E9ECF9FFFF          <1> 	jmp	sound_buff_error	
  3501                              <1> sound_data_6:
  3502 00012DC6 89D0                <1> 	mov	eax, edx
  3503 00012DC8 25FF0F0000          <1> 	and	eax, PAGE_OFF ; 4095 (0FFFh)
  3504 00012DCD 81F900100000        <1> 	cmp	ecx, 4096
  3505 00012DD3 7604                <1> 	jna	short sound_data_2
  3506                              <1> 	;mov	ecx, 4096 ; max. 1 page
  3507                              <1> 	; 30/07/2022
  3508 00012DD5 31C9                <1> 	xor	ecx, ecx
  3509 00012DD7 B510                <1> 	mov	ch, 16
  3510                              <1> 	; ecx = 4096
  3511                              <1> sound_data_2:
  3512 00012DD9 01C8                <1> 	add	eax, ecx
  3513 00012DDB 3D00100000          <1> 	cmp	eax, 4096
  3514 00012DE0 7606                <1> 	jna	short sound_data_3
  3515 00012DE2 6625FF0F            <1> 	and	ax, PAGE_OFF ; 4095 (0FFFh)
  3516 00012DE6 29C1                <1> 	sub	ecx, eax
  3517                              <1> 	; here, ECX has been adjusted to fit 
  3518                              <1> 	;	in page border..  (<= 4096, >0)
  3519                              <1> sound_data_3:
  3520 00012DE8 51                  <1> 	push	ecx
  3521 00012DE9 52                  <1> 	push	edx
  3522 00012DEA 89D3                <1> 	mov	ebx, edx 
  3523 00012DEC E8CD2DFFFF          <1> 	call	get_physical_addr
  3524 00012DF1 5A                  <1> 	pop	edx
  3525 00012DF2 59                  <1> 	pop	ecx
  3526                              <1> 	;jc	sound_buff_error
  3527                              <1> 	; 30/07/2022
  3528 00012DF3 72CC                <1> 	jc	short sound_data_5
  3529                              <1> 	
  3530                              <1> 	; eax = physical address of user's buffer
  3531 00012DF5 89C3                <1> 	mov	ebx, eax  
  3532                              <1> 	; ecx = byte (transfer) count
  3533                              <1> 	;call	get_current_sound_data
  3534                              <1> 	;retn
  3535 00012DF7 E9711E0000          <1> 	jmp	get_current_sound_data
  3536                              <1> 
  3537                              <1> sound_data_4:
  3538                              <1> 	; Intel HDA code is not ready yet !
  3539                              <1> 	; 22/06/2017
  3540 00012DFC 31C0                <1> 	xor	eax, eax
  3541 00012DFE 48                  <1> 	dec	eax
  3542 00012DFF A3[AC940100]        <1> 	mov	[u.r0], eax ; 0FFFFFFFFh
  3543 00012E04 C3                  <1> 	retn 
  3544                              <1> 
  3545                              <1> snd_dev_check:
  3546                              <1> 	; 10/06/2017
  3547                              <1> 	; 05/06/2017
  3548                              <1> 	; 24/05/2017
  3549                              <1> 	; 22/04/2017
  3550                              <1> 	; 21/04/2017
  3551                              <1> 	; ... device check at first
  3552 00012E05 A0[298F0100]        <1> 	mov	al, [audio_device]
  3553 00012E0A 3C01                <1> 	cmp	al, 1 ; SB 16
  3554 00012E0C 7203                <1> 	jb	short snd_dev_chk_retn ; error !
  3555                              <1> 	;cmp	al, 4 ; Intel HDA
  3556                              <1> 	;ja	short snd_dbchk_stc ; invalid !
  3557                              <1> 	; 10/06/2017
  3558 00012E0E 3C05                <1> 	cmp	al, 5
  3559 00012E10 F5                  <1> 	cmc
  3560                              <1> snd_dev_chk_retn:
  3561 00012E11 C3                  <1> 	retn
  3562                              <1> 
  3563                              <1> snd_buf_check:
  3564                              <1> 	; 10/06/2017
  3565                              <1> 	; 22/04/2017
  3566                              <1> 	; 21/04/2017
  3567                              <1> 	; ... buffer & (buffer) owner check at second
  3568 00012E12 833D[3C8F0100]00    <1> 	cmp	dword [audio_buffer], 0
  3569 00012E19 760D                <1> 	jna	short snd_dbchk_stc
  3570                              <1> snd_user_check:
  3571 00012E1B A0[FD940100]        <1> 	mov	al, [u.uno]
  3572 00012E20 3A05[558F0100]      <1> 	cmp	al, [audio_user]
  3573                              <1> 	;jne	short snd_dbchk_stc
  3574                              <1> 	;retn
  3575 00012E26 74E9                <1> 	je	short snd_dev_chk_retn
  3576                              <1> 
  3577                              <1> snd_dbchk_stc:
  3578 00012E28 F9                  <1> 	stc
  3579 00012E29 C3                  <1> 	retn
  3580                              <1> 
  3581                              <1> sound_update:
  3582                              <1> 	; FUNCTION = 16
  3583                              <1> 	; bl = 
  3584                              <1> 	;    0 = automatic (sequental) update (with flag switch!)
  3585                              <1> 	;    1 = update dma half buffer 1 (without flag switch!)
  3586                              <1> 	;    2 = update dma half buffer 2 (without flag switch!)
  3587                              <1> 	;  FFh = get current flag value	
  3588                              <1> 	;      0 = dma half buffer 1 (will be played next)
  3589                              <1> 	;      1 = dma half buffer 2 (will be played next)
  3590                              <1> 	;
  3591                              <1> 	; 29/12/2024
  3592                              <1> 	; Note:	Requested half buffer is updated and 
  3593                              <1> 	;	flag is set to other value for other half buffer
  3594                              <1> 	;
  3595                              <1> 	; For example:
  3596                              <1> 	;     *	if BL input is 1, half buffer 1 is loaded and
  3597                              <1> 	;	   flag is switched to 1 -half buff 2 is in order-
  3598                              <1> 	;     (next time half buffer 2 is updated automaticly)
  3599                              <1> 	;     *	if BL input is 2, half buffer 2 is updated/loaded
  3600                              <1> 	;	   and flag is switched to 0
  3601                              <1> 	;
  3602                              <1> 	; Return value for BL input = 0,1,2
  3603                              <1>  	;     Current flag value (just after switched)
  3604                              <1> 	;       -flag will have same value-
  3605                              <1> 	;     If BL input is 1, return value will be 1 (1 xor 0)
  3606                              <1> 	;     IF BL input is 2, return value will be 0 (1 xor 1)
  3607                              <1> 	
  3608                              <1> 	; 28/12/2024
  3609                              <1> 	; 05/06/2024
  3610                              <1> 	; 30/07/2022
  3611                              <1> 	; 10/10/2017
  3612                              <1> 	; ... device check at first
  3613 00012E2A A0[298F0100]        <1> 	mov	al, [audio_device]
  3614 00012E2F 08C0                <1> 	or	al, al ; 0 ; pc speaker or invalid 
  3615                              <1> 	;jz	soundc_dev_err
  3616                              <1> 	; 30/07/2022
  3617 00012E31 7505                <1> 	jnz	short snd_update_4
  3618 00012E33 E94EF9FFFF          <1> 	jmp	soundc_dev_err
  3619                              <1> snd_update_4:
  3620                              <1> 	; ... buffer & (buffer) owner check at second
  3621 00012E38 833D[3C8F0100]00    <1> 	cmp	dword [audio_buffer], 0
  3622                              <1> 	;jna	sound_buff_error
  3623                              <1> 	; 30/07/2022
  3624 00012E3F 761C                <1> 	jna	short snd_update_6 ; jmp sound_buff_error
  3625 00012E41 A0[FD940100]        <1> 	mov	al, [u.uno]
  3626 00012E46 3A05[558F0100]      <1> 	cmp	al, [audio_user]
  3627                              <1> 	;jne	sndc_owner_error
  3628                              <1> 	; 30/07/2022
  3629 00012E4C 7405                <1> 	je	short snd_update_5
  3630 00012E4E E985FAFFFF          <1> 	jmp	sndc_owner_error
  3631                              <1> snd_update_5:
  3632                              <1> 	; Transfer ring 3 (user's) audio buffer content to dma buffer
  3633 00012E53 8B3D[488F0100]      <1> 	mov	edi, [audio_dma_buff] ; dma buffer (ring 0)
  3634 00012E59 09FF                <1> 	or	edi, edi
  3635                              <1> 	;jz	sound_buff_error
  3636                              <1> 	; 30/07/2022
  3637 00012E5B 7505                <1> 	jnz	short snd_update_7
  3638                              <1> snd_update_6:
  3639 00012E5D E950F9FFFF          <1> 	jmp	sound_buff_error
  3640                              <1> snd_update_7:
  3641 00012E62 8B35[408F0100]      <1> 	mov	esi, [audio_p_buffer] ; physical address (ring 3)
  3642                              <1> 	; 05/06/2024
  3643                              <1> 	;mov	ecx, [audio_buff_size]
  3644                              <1> 	;
  3645                              <1> 	;;;
  3646                              <1> 	; 04/06/2024
  3647                              <1> 	;mov	al, [audio_device]
  3648                              <1> 	;cmp	al, 1
  3649                              <1> 	;je	short snd_update_8 ; SB16
  3650                              <1> 	;and	cl, ~1 ; word alignment
  3651                              <1> 	;cmp	al, 3
  3652                              <1> 	;je	short snd_update_8 ; VIA VT8233
  3653                              <1> 	;; al = 2 ; AC97
  3654                              <1> 	;and	cl, ~7 ; 8 byte alignment
  3655                              <1> ;snd_update_8:
  3656                              <1> 	;;;
  3657                              <1> 
  3658                              <1> 	; 05/06/2024
  3659 00012E68 8B0D[508F0100]      <1> 	mov	ecx, [dma_hbuff_size] ; DMA half buffer size
  3660                              <1> 
  3661                              <1> 	;movzx	eax, byte [audio_flag]
  3662 00012E6E A0[548F0100]        <1> 	mov	al, [audio_flag]
  3663 00012E73 FEC3                <1> 	inc	bl
  3664 00012E75 742F                <1> 	jz	short snd_update_3 ; bl = 0FFh
  3665 00012E77 FECB                <1> 	dec	bl 
  3666 00012E79 7417                <1> 	jz	short snd_update_0 ; bl = 0
  3667                              <1> 
  3668                              <1> 	; 28/12/2024
  3669 00012E7B 80FB02              <1> 	cmp	bl, 2
  3670 00012E7E 7609                <1> 	jna	short snd_update_8
  3671                              <1> 	;cmp	bl, 2
  3672                              <1> 	;je	short snd_update_1 ; dma half buffer 2
  3673                              <1> 	;jb	short snd_update_2 ; dma half buffer 1
  3674                              <1> 	; 28/12/2024
  3675                              <1> 	;jz	short  snd_update_2
  3676                              <1> 
  3677                              <1> 	; invalid parameter !
  3678                              <1> ; 30/07/2022
  3679                              <1> 	;mov	eax, ERR_INV_PARAMETER ; 23
  3680                              <1> ;	mov	[u.r0], eax
  3681                              <1> ;	mov	[u.error], eax
  3682                              <1> ;	jmp	error
  3683                              <1> 
  3684                              <1> snd_update_err:
  3685                              <1> 	; 30/07/2022
  3686 00012E80 29C0                <1> 	sub	eax, eax
  3687 00012E82 B017                <1> 	mov	al, ERR_INV_PARAMETER ; 23
  3688 00012E84 E909F9FFFF          <1> 	jmp	sysaudio_err
  3689                              <1> 
  3690                              <1> 	; 29/12/2024
  3691                              <1> snd_update_8:
  3692 00012E89 88D8                <1> 	mov	al, bl	; 1 or 2
  3693 00012E8B FEC8                <1> 	dec	al
  3694 00012E8D A2[548F0100]        <1> 	mov	[audio_flag], al ; 0 or 1
  3695                              <1> snd_update_0:
  3696 00012E92 8035[548F0100]01    <1> 	xor	byte [audio_flag], 1 ; update flag !!!
  3697                              <1> snd_update_9:
  3698 00012E99 3C01                <1> 	cmp	al, 1
  3699 00012E9B 7202                <1> 	jb	short snd_update_2 ; dma half buffer 1
  3700                              <1> snd_update_1:
  3701                              <1> 	; dma half buffer 2
  3702 00012E9D 01CF                <1> 	add	edi, ecx
  3703                              <1> snd_update_2:
  3704                              <1> 	;rep	movsb
  3705                              <1> 	; 05/06/2024
  3706                              <1> 	;shr	ecx, 2
  3707                              <1> 	;rep	movsd
  3708 00012E9F F3A4                <1> 	rep	movsb ; SB16, AC97, VT8233
  3709                              <1> 	; 29/12/2024
  3710 00012EA1 A0[548F0100]        <1> 	mov	al, [audio_flag]
  3711                              <1> snd_update_3:
  3712 00012EA6 A3[AC940100]        <1> 	mov	[u.r0], eax
  3713                              <1> 
  3714 00012EAB C3                  <1> 	retn
  3715                              <1> 
  3716                              <1> sound_getvol:
  3717                              <1> 	; FUNCTION = 17
  3718                              <1> 	; Get sound volume level
  3719                              <1> 	; 24/05/2024
  3720                              <1> 	; bl = component
  3721                              <1> 	;		0 = master/playback/lineout volume
  3722                              <1> 	;		1 = PCM out volume
  3723                              <1> 	; Return:
  3724                              <1> 	; cl = left channel volume level (0 to 31)
  3725                              <1> 	; ch = right channel volume level (0 to 31)
  3726                              <1> 
  3727 00012EAC 80FB01              <1> 	cmp	bl, 1
  3728 00012EAF 7709                <1> 	ja	short snd_gvol_0 ; temporary ; 24/05/2024
  3729 00012EB1 7408                <1> 	je	short snd_gvol_1
  3730 00012EB3 668B0D[648F0100]    <1> 	mov	cx, [audio_master_volume]
  3731                              <1> snd_gvol_0:
  3732 00012EBA C3                  <1> 	retn
  3733                              <1> snd_gvol_1:
  3734 00012EBB 668B0D[668F0100]    <1> 	mov	cx, [audio_pcmo_volume]
  3735 00012EC2 C3                  <1> 	retn
  3736                              <1> 
  3737                              <1> %if 0
  3738                              <1> 
  3739                              <1> sound_dmaclear:
  3740                              <1> 	; FUNCTION = 18
  3741                              <1> 	; Clear DMA buffer
  3742                              <1> 	;	 (may be useful for non-VRA AC97 hardware)
  3743                              <1> 	; bl = cleaning byte value
  3744                              <1> 	;      0 or 80h (not a necessary value, 0 is most proper)
  3745                              <1> 	;
  3746                              <1> 	; Return value
  3747                              <1> 	;	eax = DMA half buffer size (DMA buff size / 2)
  3748                              <1> 	;  If eax = 0
  3749                              <1> 	;	there is not an active DMA buffer for user)
  3750                              <1> 	;
  3751                              <1> 	; 28/12/2024
  3752                              <1> 	mov	edi, [audio_dma_buff]
  3753                              <1> 	and	edi, edi
  3754                              <1> 	jz	short snd_dma_clear_ok
  3755                              <1> 	mov	ecx, [audio_dmabuff_size]
  3756                              <1> 	or	ecx, ecx
  3757                              <1> 	jz	short snd_dma_clear_ok
  3758                              <1> 	; security (is necessary for multitasking)
  3759                              <1> 	mov	cl, [audio_user]
  3760                              <1> 	or	cl, cl
  3761                              <1> 	jz	short snd_dma_clear_ok
  3762                              <1> 	cmp	cl, [u.uno]
  3763                              <1> 	jne 	short snd_dma_clear_ok
  3764                              <1> 	mov	ecx, [dma_hbuff_size]
  3765                              <1> 	and	ecx, ecx
  3766                              <1> 	jz	short snd_dma_clear_ok
  3767                              <1> 
  3768                              <1> 	mov	[u.r0], ecx
  3769                              <1> 	shl	ecx, 1 ; full buffer size in bytes
  3770                              <1> 	mov	al, bl
  3771                              <1> 	rep	stosb	
  3772                              <1> 
  3773                              <1> snd_dma_clear_ok:
  3774                              <1> 	retn
  3775                              <1> 
  3776                              <1> %endif
  3777                              <1> 
  3778                              <1> set_irq_callback_service:
  3779                              <1> 	; 23/11/2023
  3780                              <1> 	; 20/11/2023 (TRDOS 386 Kernel v2.0.7)
  3781                              <1> 	; 30/07/2022 (TRDOS 386 Kernel v2.0.5)
  3782                              <1> 	; 03/08/2020
  3783                              <1> 	; 10/06/2017
  3784                              <1> 	; 12/05/2017
  3785                              <1> 	; 24/04/2017
  3786                              <1> 	; 22/04/2017
  3787                              <1> 	; caller: 'syscalbac' or 'sysaudio' or ...
  3788                              <1> 	; 13/04/2017, 14/04/2017, 17/04/2017
  3789                              <1> 	; 24/02/2017, 26/02/2017, 28/02/2017
  3790                              <1> 	; 21/02/2017 - TRDOS 386 (TRDOS v2.0)
  3791                              <1> 	;
  3792                              <1> 	; Link or unlink IRQ callback service to/from user (ring 3)
  3793                              <1> 	;
  3794                              <1> 	; INPUT ->
  3795                              <1> 	;	If AL = 0, the caller is 'syscalbac';
  3796                              <1> 	;	   otherwise, the caller is 'sysaudio' or ...
  3797                              <1> 	;	   (AL = user number) 
  3798                              <1> 	;
  3799                              <1> 	;	BL = IRQ number (Hardware interrupt request number)
  3800                              <1> 	;	     (0 to 15 but IRQ 0,1,2,6,8,14,15 are prohibited)
  3801                              <1> 	;	     IRQ numbers 3,4,5,7,9,10,11,12,13 are valid
  3802                              <1> 	;	     (numbers >15 are invalid)
  3803                              <1> 	;
  3804                              <1> 	;	BH = 0 = Unlink IRQ (in BL) from user (ring 3) service
  3805                              <1> 	;	     1 = Link IRQ by using Signal Response Byte method
  3806                              <1> 	;	     2 = Link IRQ by using Callback service method
  3807                              <1> 	;	     3 = Link IRQ by using Auto Increment S.R.B. method
  3808                              <1> 	;	    >3 = invalid 
  3809                              <1> 	;		 (syscallback version will return to user)
  3810                              <1> 	;
  3811                              <1> 	;	CL = Signal Return/Response Byte value 
  3812                              <1> 	;
  3813                              <1> 	;	If BH = 3, kernel will put a counter value ; 03/08/2020
  3814                              <1> 	;	          (into the S.R.B. addr)
  3815                              <1> 	;		  between 0 to 255. (start value = CL+1)
  3816                              <1> 	;	
  3817                              <1> 	;	NOTE: counter value, for example: even and odd numbers
  3818                              <1> 	;	      may be used for -audio- DMA buffer switch 
  3819                              <1> 	;	      within double buffer method, etc.
  3820                              <1> 	;
  3821                              <1> 	;	EDX = Signal return (Response) byte address
  3822                              <1> 	;	       		  - or -
  3823                              <1> 	;	      Interrupt/Callback service/routine address
  3824                              <1> 	;
  3825                              <1> 	;	      (virtual address in user's memory space)
  3826                              <1> 	;
  3827                              <1> 	; OUTPUT ->
  3828                              <1> 	;	CF = 0 & EAX = 0 -> Successful setting
  3829                              <1> 	;	CF = 1 & EAX > 0 -> IRQ is prohibited or locked
  3830                              <1> 	;			by another process
  3831                              <1> 	;		 eax = ERR_PERM_DENIED -> prohibited or locked
  3832                              <1> 	;		 eax = ERR_INV_PARAMETER -> 
  3833                              <1> 	;		       invalid parameter/option or bad address
  3834                              <1> 	;
  3835                              <1> 	; TRDOS 386 - IRQ CALLBACK structures (parameters):
  3836                              <1> 	;
  3837                              <1> 	;	   [u.irqlock]	: 1 word, IRQ flags (0-15) that indicates
  3838                              <1> 	;			which IRQs are locked by (that) user.
  3839                              <1> 	;		        Lock and unlock (by user) will change
  3840                              <1> 	;			these flags or 'terminate process' (sysexit)
  3841                              <1> 	;			will clear these flags and unlock those IRQs.
  3842                              <1> 	;
  3843                              <1> 	;		   	Bit 0 is for IRQ 0 and Bit 15 is for IRQ 15
  3844                              <1> 	;
  3845                              <1> 	;	   IRQ(x).owner	: 1 byte, user, [u.uno], 0 = free (unlocked)
  3846                              <1> 	;
  3847                              <1> 	;	   IRQ(x).method : 1 byte for callback method & status
  3848                              <1> 	;			   0 = Signal Response Byte method
  3849                              <1> 	;			   1 = Callback service method
  3850                              <1> 	;			   >1 = invalid for current 'syscalback'.
  3851                              <1> 	;			or(+) 80h = IRQ is in use by system (ring 0)
  3852                              <1> 	;			            function (audio etc.) or
  3853                              <1> 	;			   	    a device driver.
  3854                              <1> 	;			(system function will ignore the lock/owner)
  3855                              <1> 	;
  3856                              <1> 	;	   IRQ(x).srb	: 1 byte, Signal Return/Response byte value
  3857                              <1> 	;			  (a fixed value by user or a counter value
  3858                              <1> 	;			 from 0 to 255, which is increased by every
  3859                              <1> 	;			 interrupt just before putting it into 
  3860                              <1> 	;			 the Signal Response byte address)
  3861                              <1> 	;			 (This is not used in callback serv method)
  3862                              <1> 	;
  3863                              <1> 	;	   IRQ(x).addr	: 1 dword
  3864                              <1> 	;			  Signal Response Byte address (physical)
  3865                              <1> 	;			  		-or-
  3866                              <1> 	;			  Callback service address (virtual)
  3867                              <1> 	;
  3868                              <1> 	;	   IRQ(x).dev	: 1 byte
  3869                              <1> 	;			  0 = Default device or kernel function
  3870                              <1> 	;			  		-or-
  3871                              <1> 	;			  1-255 = Assigned device driver number
  3872                              <1> 	;
  3873                              <1> 	;	   (x) = 3,4,5,7,9,10,11,12,13
  3874                              <1> 	;
  3875                              <1> 	
  3876 00012EC3 80FB0F              <1> 	cmp	bl, 15
  3877 00012EC6 7727                <1> 	ja	short scbs_2
  3878                              <1> 	
  3879 00012EC8 80FF03              <1> 	cmp	bh, 3
  3880 00012ECB 7722                <1> 	ja	short scbs_2  ; invalid parameter
  3881                              <1> 
  3882 00012ECD 0FB6FB              <1> 	movzx	edi, bl ; save IRQ number
  3883                              <1> 
  3884                              <1> 		; IRQ 0,1,2,6,8,14,15 are prohibited
  3885                              <1> 	;IRQenum: ; 'trdosk9.s'
  3886                              <1> 	;	db  0,0,0,1,2,3,0,4,0,5,6,7,8,9,0,0
  3887                              <1> 
  3888 00012ED0 0FB6B7[F23B0100]    <1> 	movzx	esi, byte [edi+IRQenum] ; IRQ availability
  3889                              <1> 					; enumeration/index
  3890                              <1> 	; 20/11/2023
  3891 00012ED7 4E                  <1> 	dec	esi
  3892                              <1> 	;dec	si
  3893 00012ED8 780F                <1> 	js	short scbs_1 ;  0 -> 0FFFFh  
  3894                              <1> 
  3895                              <1> 	; ESI = IRQ callback parameters index number (0 to 8)
  3896                              <1> 
  3897 00012EDA 08FF                <1> 	or	bh, bh
  3898 00012EDC 7417                <1> 	jz	short scbs_4 ; unlink the IRQ (in BL)
  3899                              <1> 
  3900 00012EDE FECF                <1> 	dec	bh
  3901                              <1> 	; bh = method (0 = signal response byte, 1 = callback)
  3902                              <1> 	;	      (2 = auto increment of signal response byte)
  3903                              <1> 
  3904 00012EE0 80BE[D88E0100]00    <1> 	cmp	byte [esi+IRQ.owner], 0 ; locked ?
  3905 00012EE7 7635                <1> 	jna	short scbs_6	; no... OK...
  3906                              <1> 
  3907                              <1> scbs_1:
  3908                              <1> 	; permission denied (prohibited IRQ)
  3909                              <1> 	;mov	eax, ERR_PERM_DENIED
  3910                              <1> 	; 30/07/2022
  3911 00012EE9 29C0                <1> 	sub	eax, eax
  3912 00012EEB B00B                <1> 	mov	al, ERR_PERM_DENIED
  3913 00012EED F9                  <1> 	stc
  3914 00012EEE C3                  <1> 	retn
  3915                              <1> scbs_2:
  3916                              <1> 	;stc
  3917                              <1> scbs_3:
  3918                              <1> 	;mov	eax, ERR_INV_PARAMETER
  3919                              <1> 	; 30/07/2022
  3920 00012EEF 29C0                <1> 	sub	eax, eax
  3921 00012EF1 B017                <1> 	mov	al, ERR_INV_PARAMETER
  3922 00012EF3 F9                  <1> 	stc
  3923 00012EF4 C3                  <1> 	retn
  3924                              <1> 
  3925                              <1> scbs_4: ; unlink the requested IRQ (if it belongs to current user)
  3926                              <1> 	; 10/06/2017
  3927                              <1> 	; 22/04/2017
  3928                              <1> 	; 14/04/2017
  3929                              <1> 	; If AL = 0 -> The caller is 'syscalbac'
  3930 00012EF5 8AA6[D88E0100]      <1> 	mov	ah, [esi+IRQ.owner]
  3931 00012EFB 3A25[FD940100]      <1> 	cmp	ah, [u.uno]
  3932 00012F01 75E6                <1> 	jne	short scbs_1
  3933                              <1> 
  3934 00012F03 FE0D[26950100]      <1> 	dec	byte [u.irqc] ; decrease IRQ count (in use)
  3935                              <1> 
  3936                              <1> 	;sub	ah, ah
  3937                              <1> 	;mov	[esi+IRQ.owner], ah ; 0 ; free !!!
  3938                              <1> 	;and	byte [esi+IRQ.method], 80h
  3939                              <1> 	;mov	[esi+IRQ.srb], ah ; 0
  3940                              <1> 	;mov	[esi+IRQ.dev], ah ; 0
  3941                              <1> 	;mov	dword [esi+IRQ.addr], 0
  3942                              <1> 	;mov	dword [u.r0], 0
  3943                              <1> 
  3944                              <1> 	;mov	byte [esi+IRQ.owner], 0
  3945                              <1> 
  3946                              <1> 	; 22/04/2017
  3947 00012F09 29C0                <1> 	sub	eax, eax
  3948 00012F0B 8886[D88E0100]      <1> 	mov	[esi+IRQ.owner], al ; 0
  3949                              <1> 	; 10/06/2017
  3950 00012F11 8686[EA8E0100]      <1> 	xchg	al, [esi+IRQ.method]
  3951 00012F17 2480                <1> 	and	al, 80h
  3952 00012F19 745D                <1> 	jz	short scbs_12 
  3953                              <1> 	; Audio device must be disabled -later- ! ([IRQ.medhod] = 80h)
  3954                              <1> 
  3955                              <1> ;	cmp	byte [esi+IRQ.method], 80h ; device drv or kernel extension ?
  3956                              <1> ;	jb	short scbs_12 ; bh = 0 reset to default IRQ handler
  3957                              <1> ;
  3958                              <1> ;	and	al, al
  3959                              <1> ;	jz	short scbs_5  ; the caller is 'syscalbac'
  3960                              <1> ;	; The caller is 'sysaudio' or ...
  3961 00012F1B 30C0                <1> 	xor	al, al
  3962                              <1> ;	mov	[esi+IRQ.method], al ; 0 ; reset kernel extension flag
  3963                              <1> ;scbs_5:
  3964                              <1> ;	sub	ah, ah
  3965                              <1> 	;mov	[u.r0], eax ; 0
  3966 00012F1D C3                  <1> 	retn
  3967                              <1> 
  3968                              <1> scbs_6:
  3969                              <1> 	; 14/04/2017
  3970 00012F1E 20C0                <1> 	and	al, al
  3971 00012F20 7405                <1> 	jz	short scbs_7  ; the caller is 'syscalbac'
  3972                              <1> 	; AL = user number ([u.uno] or [audio.user] or ...)
  3973                              <1> 	; The caller is 'sysaudio' or ...
  3974                              <1> 	;	
  3975                              <1> 	; bh = method (0 = signal response byte, 1 = callback)
  3976                              <1> 	;	      (2 = auto increment of signal response byte) 
  3977                              <1> 
  3978 00012F22 80CF80              <1> 	or	bh, 80h		; Kernel extension flag !
  3979 00012F25 EB0A                <1> 	jmp	short scbs_8
  3980                              <1> scbs_7:	
  3981 00012F27 8A86[EA8E0100]      <1> 	mov	al, [esi+IRQ.method] ; >= 80h = kernel is using this IRQ
  3982 00012F2D 2480                <1> 	and	al, 80h ; use only bit 7 (kernel function flag)
  3983 00012F2F 08C7                <1> 	or	bh, al		 ; method 
  3984                              <1> 				 ; 0 = signal response byte, 1 = callback
  3985                              <1> 				 ; 2 = auto increment of s.r.b.
  3986                              <1> scbs_8:
  3987 00012F31 A0[FD940100]        <1> 	mov	al, [u.uno] ; user (process) number (1 to 16)
  3988 00012F36 8886[D88E0100]      <1> 	mov	[esi+IRQ.owner], al ; lock the IRQ for user
  3989 00012F3C 88BE[EA8E0100]      <1> 	mov	[esi+IRQ.method], bh
  3990                              <1> 
  3991                              <1> ;	test	bh, 1
  3992                              <1> ;	jnz	short scbs_9 	 ; Callback method, CX will not be used
  3993                              <1> ;
  3994                              <1> ;	test	bh, 2		 ; use auto increment (counter) method
  3995                              <1> ;	jz	short scbs_10	 ; (count can be used for buffer switch)
  3996                              <1> ;scbs_9:
  3997                              <1> ;	xor	ecx, ecx ; 0
  3998                              <1> 
  3999                              <1> scbs_10:
  4000                              <1> 	;mov	[esi+IRQ.method], bh
  4001 00012F42 888E[F38E0100]      <1> 	mov	[esi+IRQ.srb], cl
  4002 00012F48 C686[E18E0100]00    <1> 	mov	byte [esi+IRQ.dev], 0 ; device number is always 0
  4003                              <1> 				 ; for this system call
  4004                              <1> 	;test	bh, 1
  4005 00012F4F 80E701              <1> 	and	bh, 1 ; 17/04/2017
  4006 00012F52 7513                <1> 	jnz	short scbs_11	 ; callback method, use virtual address
  4007                              <1> 
  4008 00012F54 53                  <1> 	push	ebx ; IRQ number (in BL)
  4009 00012F55 89D3                <1> 	mov	ebx, edx
  4010                              <1> 	; ebx = virtual address
  4011                              <1> 	; [u.pgdir] = page directory's physical address
  4012 00012F57 FE05[968E0100]      <1> 	inc	 byte [no_page_swap] ; 1 
  4013                              <1> 			; Do not add this page to swap queue
  4014                              <1> 			; and remove it from swap queue if it is
  4015                              <1> 			; on the queue.
  4016 00012F5D E85C2CFFFF          <1> 	call	get_physical_addr
  4017 00012F62 5B                  <1> 	pop	ebx
  4018 00012F63 728A                <1> 	jc	short scbs_3 ; invalid address !
  4019                              <1> 	; eax = physical address of the virtual address in user's space
  4020 00012F65 89C2                <1> 	mov	edx, eax
  4021                              <1> scbs_11:
  4022                              <1> 	;shl	si, 2		; byte (index) to dword (offset)
  4023                              <1> 	; 23/11/2023
  4024 00012F67 C1E602              <1> 	shl	esi, 2
  4025 00012F6A 8996[FC8E0100]      <1> 	mov	[esi+IRQ.addr], edx
  4026                              <1> 
  4027 00012F70 FE05[26950100]      <1> 	inc	byte [u.irqc]	; increase IRQ (in use) count
  4028                              <1> 
  4029 00012F76 FEC7                <1> 	inc	bh ; 17/04/2017
  4030                              <1> 	; bh > 0 -> set to requested IRQ handler (IRQ_u_list)
  4031                              <1> scbs_12:
  4032 00012F78 88D8                <1> 	mov	al, bl ; IRQ number
  4033 00012F7A 88FC                <1> 	mov	ah, bh ; 0 = reset, >0 = set
  4034 00012F7C E8DCF4FFFF          <1> 	call	set_hardware_int_vector
  4035                              <1> 
  4036 00012F81 31C0                <1> 	xor	eax, eax
  4037                              <1> 	;mov 	[u.r0], eax ; 0	
  4038                              <1> 
  4039 00012F83 C3                  <1> 	retn	; return with success (cf=0, eax=0)
  4040                              <1> 
  4041                              <1> sysdma: ; DMA FUNCTIONS
  4042                              <1> 	; 08/08/2022
  4043                              <1> 	; 30/07/2022 - TRDOS 386 Kernel v2.0.5
  4044                              <1> 	; 02/09/2017
  4045                              <1> 	; 28/08/2017
  4046                              <1> 	; 20/08/2017 - TRDOS 386 (TRDOS v2.0)
  4047                              <1> 	;
  4048                              <1> 	; Inputs:
  4049                              <1> 	;	BH = 0 -> Allocate DMA buffer
  4050                              <1> 	;	   BL = 0 -> Use the system's default DMA
  4051                              <1> 	;		     (SB16) Buffer
  4052                              <1> 	;	        Buffer Size (max.) = 65536 bytes
  4053                              <1> 	;	   BL > 0 -> Allocate (a new) DMA buffer
  4054                              <1>  	;	   ECX = DMA Buffer Size in bytes (<=128KB)
  4055                              <1> 	;	   EDX = Virtual Address of DMA buffer
  4056                              <1> 	;
  4057                              <1> 	;	BH = 1 -> Initialize (Start) DMA service
  4058                              <1> 	;	     BL, bit 0 to 3 = Channel Number (0 to 7)
  4059                              <1> 	;	     BL, bit 7 = Auto Initialized Mode
  4060                              <1> 	;			(If bit 7 is set)
  4061                              <1> 	;		 bit 6 = Record (read) mode (0= playback)
  4062                              <1> 	;	     ECX = byte count (0 = use dma buffer size)
  4063                              <1> 	;	     EDX = physical buffer address
  4064                              <1> 	;	     	   (0 = use dma buffer -start- address)
  4065                              <1> 	;
  4066                              <1> 	;	BH = 2 -> Get Current DMA Buffer Offset
  4067                              <1> 	;	     BL = DMA channel number	
  4068                              <1> 	;
  4069                              <1> 	;	BH = 3 -> Get Current DMA count down value
  4070                              <1> 	;	     BL = DMA channel number (0 tO 7)
  4071                              <1> 	;
  4072                              <1> 	;	BH = 4 -> Get Current DMA channel (in progress)
  4073                              <1> 	;
  4074                              <1> 	;	BH = 5 -> Get System's Default DMA Buffer Address
  4075                              <1> 	;
  4076                              <1> 	;	BH = 6 -> Get Current DMA Buffer Address
  4077                              <1> 	;
  4078                              <1> 	;	BH = 7 -> Stop DMA service
  4079                              <1> 	;
  4080                              <1> 	; Outputs:
  4081                              <1> 	;
  4082                              <1> 	;	For BH = 0 ; Allocate DMA buffer
  4083                              <1> 	;	    EAX = Physical address of DMA buffer
  4084                              <1> 	;	    ECX = Allocated buffer size in bytes
  4085                              <1> 	;		  - page count * 4096 -
  4086                              <1> 	;		  (may be bigger than requested)
  4087                              <1> 	;	    If BL input > 0,
  4088                              <1> 	;	       'sysalloc:' system call will be used with
  4089                              <1>   	;	       EBX (for 'sysalloc') = EDX (for 'sysdma')
  4090                              <1> 	;	       ECX is same, byte count (buffer size)
  4091                              <1> 	;	       EDX = 1024*1024*16 ; 16 MB upper limit
  4092                              <1> 	;	    If BL input = 0,
  4093                              <1> 	;	       Default DMA buffer (SB16 buffer) will be
  4094                              <1> 	;	       checked and if it is free, it's address
  4095                              <1> 	;	       will be returned in EAX and it's size
  4096                              <1> 	;	       will be returned in ECX (as 65536)
  4097                              <1> 	;
  4098                              <1> 	;	    If CF = 1, error code is in EAX
  4099                              <1> 	;	       EAX = -1 ; DMA buffer allocation error!
  4100                              <1> 	;	       EAX = 11 ; 'Permission Denied' error !
  4101                              <1> 	;
  4102                              <1> 	;	       Note: 'sysalloc' error return method
  4103                              <1> 	;		      will be applied if BL input > 0 !
  4104                              <1> 	;
  4105                              <1> 	; 	 For BH = 1 ; Initialize (Start) DMA
  4106                              <1> 	;	     EAX = 0 (Successful)
  4107                              <1> 	;	     If CF = 1, error code is in EAX
  4108                              <1> 	;
  4109                              <1> 	; 	 For BH = 2 ; Get Current DMA Buffer Offset
  4110                              <1> 	;	     EAX = DMA Buffer Offset (in bytes)
  4111                              <1> 	;	     ;
  4112                              <1> 	;	      AX = DMA buffer offset
  4113                              <1> 	;	     EAX bits 16 to 23 = Page register value
  4114                              <1> 	;
  4115                              <1> 	; 	 For BH = 3 ; Get Current DMA count down value
  4116                              <1> 	;	     EAX = Count down value (remain bytes)
  4117                              <1> 	;	
  4118                              <1> 	;	 For BH = 4 ; Get Current DMA channel (in progress)
  4119                              <1> 	;	     EAX = DMA channel number (0 to 7)
  4120                              <1> 	;		AH = 0 if the owner is the caller process
  4121                              <1> 	;		AH > 0 if the dma channel is in use by
  4122                              <1> 	;		       another user/process
  4123                              <1> 	;	     EAX = -1 (0FFFFFFFFh) 
  4124                              <1> 	;		    if DMA service is not in use
  4125                              <1> 	;	 	    (stopped or not initialized/started)
  4126                              <1> 	;
  4127                              <1> 	;	 For BH = 5 ; Get System's Default DMA Buff Addr
  4128                              <1> 	;	     EAX = Default DMA Buffer Address (Physical)
  4129                              <1> 	;		 = offset 'sb16_dma_buffer:'
  4130                              <1> 	;	     ECX = Buffer size
  4131                              <1> 	;		 = 65536
  4132                              <1> 	;
  4133                              <1> 	;	 For BH = 6 ; Get Current DMA Buffer Address
  4134                              <1> 	;	     EAX = Current DMA buffer address (Physical)
  4135                              <1> 	;	     ECX = Current DMA buffer size (setting value)
  4136                              <1> 	;	     Note: These values are for current dma channel
  4137                              <1> 	;		   settings for the user/process
  4138                              <1> 	;	     ** For now (for current TRDOS 386 version)
  4139                              <1> 	;		only one user/process can use only one
  4140                              <1> 	;		dma channel & one dma buffer at same time
  4141                              <1> 	;		(no multi tasking on DMA service) !!! **
  4142                              <1> 	;	     (Once, current DMA user must stop it's own DMA
  4143                              <1> 	;	      DMA service, than another user/program 
  4144                              <1> 	;	      can use DMA service with same dma channel
  4145                              <1> 	;	      or with another DMA channel.)
  4146                              <1> 	;
  4147                              <1> 	;	 For BH = 7 ; Stop DMA service (for current user
  4148                              <1> 	;	     and current DMA channel)
  4149                              <1> 	;	     EAX = 0 ; successful
  4150                              <1> 	;	     CF = 1 & EAX > 0 (= -1) -> Error
  4151                              <1> 
  4152 00012F84 80FF07              <1> 	cmp	bh, 7
  4153 00012F87 7612                <1> 	jna	short sysdma_0
  4154                              <1> 
  4155                              <1> sysdma_err:
  4156 00012F89 31C0                <1> 	xor	eax, eax
  4157 00012F8B 48                  <1> 	dec	eax ; -1
  4158                              <1> sysdma_perm_err:
  4159 00012F8C A3[AC940100]        <1> 	mov	[u.r0], eax
  4160 00012F91 A3[18950100]        <1> 	mov	[u.error], eax ; DMA service error !
  4161 00012F96 E9E59EFFFF          <1> 	jmp	error
  4162                              <1> 
  4163                              <1> sysdma_0:
  4164 00012F9B 08FF                <1> 	or	bh, bh
  4165 00012F9D 7537                <1> 	jnz	short sysdma_1 ; 30/07/2022
  4166                              <1> 	
  4167 00012F9F 20DB                <1> 	and	bl, bl
  4168 00012FA1 7416                <1> 	jz	short sysdma_01
  4169                              <1> 
  4170                              <1> 	; redirect system call to 'sysalloc'
  4171 00012FA3 89D3                <1> 	mov	ebx, edx ; virtual address of DMA buffer
  4172                              <1> 	;ecx = Buffer size in bytes
  4173                              <1> 	; DMA buffer address <= 16MB upper limit
  4174 00012FA5 BA00000001          <1> 	mov	edx, 1024*1024*16 ; 16MB limit for DMA buff
  4175                              <1> 
  4176 00012FAA C705[70930100]FFFF- <1> 	mov	dword [dma_addr], 0FFFFFFFFh ; -1
  4176 00012FB2 FFFF                <1>
  4177                              <1> 
  4178 00012FB4 E90DE8FFFF          <1> 	jmp	sysalloc
  4179                              <1> 
  4180                              <1> sysdma_01:
  4181 00012FB9 B800000500          <1> 	mov	eax, sb16_dma_buffer
  4182                              <1> 
  4183 00012FBE 803D[298F0100]01    <1> 	cmp	byte [audio_device], 1
  4184 00012FC5 724A                <1> 	jb	short sysdma_03
  4185                              <1> 
  4186 00012FC7 3B05[488F0100]      <1> 	cmp	eax, [audio_dma_buff]
  4187 00012FCD 7527                <1> 	jne	short sysdma_02
  4188                              <1> 
  4189                              <1> sysdma_0_err:
  4190 00012FCF B80B000000          <1> 	mov	eax, ERR_PERM_DENIED
  4191 00012FD4 EBB6                <1> 	jmp	short sysdma_perm_err
  4192                              <1> 
  4193                              <1> 	; 30/07/2022
  4194                              <1> sysdma_1:
  4195 00012FD6 80FF01              <1> 	cmp	bh, 1
  4196                              <1> 	;ja	sysdma_5
  4197                              <1> 	; 30/07/2022
  4198 00012FD9 7605                <1> 	jna	short sysdma_10
  4199 00012FDB E90C010000          <1> 	jmp	sysdma_5
  4200                              <1> 
  4201                              <1> sysdma_10:
  4202 00012FE0 F6C340              <1> 	test	bl, 40h	; record (read) mode -BL, bit 6-
  4203                              <1> 	;jnz	sysdma_err ; not ready yet!
  4204                              <1> 	; 30/07/2022
  4205 00012FE3 757C                <1> 	jnz	short sysdma_06 ; jmp sysdma_err
  4206                              <1> 
  4207 00012FE5 A1[70930100]        <1> 	mov	eax, [dma_addr] ; physical address of dma buffer
  4208 00012FEA 21C0                <1> 	and	eax, eax
  4209                              <1> 	;jz	sysdma_err
  4210                              <1> 	; 30/07/2022
  4211 00012FEC 7473                <1> 	jz	short sysdma_06 ; jmp sysdma_err
  4212                              <1> 
  4213 00012FEE 09D2                <1> 	or	edx, edx
  4214 00012FF0 7574                <1> 	jnz	short sysdma_11
  4215                              <1> 
  4216 00012FF2 89C2                <1> 	mov	edx, eax
  4217 00012FF4 EB74                <1> 	jmp	short sysdma_12
  4218                              <1> 
  4219                              <1> sysdma_02:
  4220                              <1> 	; Only one user is permitted for audio/dma functions
  4221                              <1> 
  4222 00012FF6 833D[488F0100]00    <1> 	cmp	dword [audio_dma_buff], 0
  4223 00012FFD 7612                <1> 	jna	short sysdma_03
  4224                              <1> 
  4225 00012FFF 8A1D[558F0100]      <1> 	mov	bl, [audio_user]
  4226 00013005 08DB                <1> 	or	bl, bl
  4227 00013007 7408                <1> 	jz	short sysdma_03
  4228                              <1> 
  4229 00013009 3A1D[FD940100]      <1> 	cmp	bl, [u.uno]
  4230 0001300F 75BE                <1> 	jne	short sysdma_0_err
  4231                              <1> 
  4232                              <1> sysdma_03:
  4233 00013011 8A1D[6D930100]      <1> 	mov	bl, [dma_user]
  4234 00013017 20DB                <1> 	and	bl, bl
  4235 00013019 750E                <1> 	jnz	short sysdma_04
  4236                              <1> 	
  4237 0001301B 8A1D[FD940100]      <1> 	mov	bl, [u.uno]
  4238 00013021 881D[6D930100]      <1> 	mov	[dma_user], bl
  4239                              <1> 
  4240 00013027 EB15                <1> 	jmp	short sysdma_05
  4241                              <1> 
  4242                              <1> sysdma_04:
  4243 00013029 8B35[70930100]      <1> 	mov	esi, [dma_addr]
  4244 0001302F 21F6                <1> 	and	esi, esi
  4245 00013031 740B                <1> 	jz	short sysdma_05
  4246                              <1> 
  4247 00013033 46                  <1> 	inc	esi ; -1 -> 0
  4248 00013034 7408                <1> 	jz	short sysdma_05
  4249                              <1> 
  4250 00013036 3A1D[FD940100]      <1> 	cmp	bl, [u.uno]
  4251 0001303C 7591                <1> 	jne	short sysdma_0_err
  4252                              <1> 	
  4253                              <1> sysdma_05:
  4254                              <1> 	; edx = virtual address (user's buffer address)
  4255                              <1> 	; 
  4256 0001303E 81F900000100        <1> 	cmp	ecx, 65536   ; byte count (buffer size)
  4257                              <1> 	;ja	sysdma_err
  4258                              <1> 	; 30/07/2022
  4259 00013044 771B                <1> 	ja	short sysdma_06 ; jmp sysdma_err
  4260                              <1> 	;
  4261 00013046 81C1FF0F0000        <1> 	add	ecx, PAGE_SIZE-1 ; 4095
  4262 0001304C 6681E100F0          <1> 	and	cx, ~PAGE_OFF ; not 4095
  4263                              <1> 	;cmp	ecx, 65536
  4264                              <1> 	;ja	sysdma_err
  4265 00013051 51                  <1> 	push	ecx	; buffer size (allocated pages * 4096)
  4266 00013052 50                  <1> 	push	eax	; offset sb16_dma_buffer
  4267 00013053 89D3                <1> 	mov	ebx, edx
  4268 00013055 C1E90C              <1> 	shr	ecx, 12 ; byte count to page count
  4269                              <1> 	; eax = physical address of (audio) dma buffer
  4270                              <1> 	; ebx = virtual address of (audio) dma buffer (user's pgdir)
  4271                              <1> 	; ecx = page count (>0)
  4272 00013058 E8202FFFFF          <1> 	call	direct_memory_access
  4273 0001305D 58                  <1> 	pop	eax
  4274 0001305E 59                  <1> 	pop	ecx
  4275                              <1> 	;jc	sysdma_err
  4276                              <1> 	; 30/07/2022
  4277 0001305F 7315                <1> 	jnc	short sysdma_07
  4278                              <1> sysdma_06:
  4279 00013061 E923FFFFFF          <1> 	jmp	sysdma_err
  4280                              <1> 
  4281                              <1> sysdma_11:
  4282 00013066 39C2                <1> 	cmp	edx, eax
  4283                              <1> 	;jb	sysdma_err
  4284                              <1> 	; 30/07/2022
  4285 00013068 72F7                <1> 	jb	short sysdma_06 ; jmp sysdma_err
  4286                              <1> sysdma_12:
  4287 0001306A 21C9                <1> 	and	ecx, ecx
  4288 0001306C 7515                <1> 	jnz	short sysdma_13
  4289                              <1> 
  4290 0001306E 8B0D[74930100]      <1> 	mov	ecx, [dma_size]
  4291 00013074 EB15                <1> 	jmp	short sysdma_14
  4292                              <1> 
  4293                              <1> sysdma_07:
  4294 00013076 A3[70930100]        <1> 	mov	[dma_addr], eax
  4295 0001307B 890D[74930100]      <1> 	mov	[dma_size], ecx ; dma buffer size (in bytes)
  4296                              <1> 
  4297                              <1> 	;mov	[u.r0], eax ; DMA Buffer Address (Physical)
  4298                              <1> 
  4299                              <1> 	;mov	ebp, [u.usp]  ; ebp points to user's registers
  4300                              <1> 	;mov	[ebp+24], ecx ; return to user with ecx value
  4301                              <1> 
  4302                              <1> 	;jmp	sysret
  4303                              <1> 
  4304                              <1> 	; 28/08/2017
  4305 00013081 EB7A                <1> 	jmp	sysdma_51
  4306                              <1> 
  4307                              <1> sysdma_13:
  4308 00013083 3B0D[74930100]      <1> 	cmp	ecx, [dma_size]
  4309                              <1> 	;ja	sysdma_err
  4310                              <1> 	; 30/07/2022
  4311 00013089 77D6                <1> 	ja	short sysdma_06 ; jmp sysdma_err
  4312                              <1> sysdma_14:
  4313 0001308B 89C6                <1> 	mov	esi, eax
  4314 0001308D 0335[74930100]      <1> 	add	esi, [dma_size]
  4315                              <1> 
  4316 00013093 89D0                <1> 	mov	eax, edx
  4317 00013095 01C8                <1> 	add	eax, ecx
  4318                              <1> 	;jc	sysdma_err ; 02/09/2017
  4319                              <1> 	; 30/07/2022
  4320 00013097 72C8                <1> 	jc	short sysdma_06 ; jmp sysdma_err
  4321                              <1> 		
  4322 00013099 39F0                <1> 	cmp	eax, esi
  4323                              <1> 	;ja	sysdma_err
  4324                              <1> 	; 30/07/2022
  4325 0001309B 77C4                <1> 	ja	short sysdma_06 ; jmp sysdma_err
  4326                              <1> 
  4327 0001309D 8B3D[488F0100]      <1> 	mov	edi, [audio_dma_buff]
  4328 000130A3 8B35[70930100]      <1> 	mov	esi, [dma_addr]
  4329                              <1> 
  4330 000130A9 09FF                <1> 	or	edi, edi
  4331 000130AB 7425                <1> 	jz	short sysdma_16
  4332                              <1> 	
  4333 000130AD 803D[298F0100]01    <1> 	cmp	byte [audio_device], 1
  4334 000130B4 7209                <1> 	jb	short sysdma_15
  4335                              <1> 
  4336                              <1> 	; Sound Blaster 16
  4337 000130B6 39FE                <1> 	cmp	esi, edi
  4338                              <1> 	;je	sysdma_0_err ; permmission denied !
  4339                              <1> 	; 30/07/2022
  4340 000130B8 7505                <1> 	jne	short sysdma_15
  4341 000130BA E910FFFFFF          <1> 	jmp	sysdma_0_err
  4342                              <1> sysdma_15:
  4343 000130BF C605[6F930100]48    <1> 	mov	byte [dma_mode], 48h ; single mode playback
  4344                              <1> 
  4345 000130C6 F6C380              <1> 	test	bl, 80h ; DMA mode - BL, bit 7, auto init -
  4346 000130C9 7407                <1> 	jz	short sysdma_16	
  4347                              <1> 	; Auto initialized playback (write) mode
  4348 000130CB 8005[6F930100]10    <1> 	add	byte [dma_mode], 10h ; = 58h
  4349                              <1> sysdma_16:
  4350 000130D2 80E307              <1> 	and	bl, 07h
  4351 000130D5 881D[6E930100]      <1> 	mov	[dma_channel], bl
  4352 000130DB 8915[78930100]      <1> 	mov	[dma_start], edx
  4353 000130E1 890D[7C930100]      <1> 	mov	[dma_count], ecx
  4354                              <1> 	 
  4355                              <1> 	; 28/08/2017
  4356                              <1> 	;call	dma_init
  4357                              <1> 	;jmp	sysret
  4358 000130E7 E945010000          <1> 	jmp	dma_init
  4359                              <1> 
  4360                              <1> sysdma_5:
  4361 000130EC 80FF05              <1> 	cmp	bh, 5
  4362 000130EF 726D                <1> 	jb	short sysdma_3
  4363 000130F1 7759                <1> 	ja	short sysdma_6
  4364                              <1> 
  4365                              <1> 	; Get the system's default dma buffer addr and size
  4366 000130F3 B800000500          <1> 	mov	eax, sb16_dma_buffer
  4367 000130F8 B900000100          <1> 	mov	ecx, 65536 ; Buffer size in bytes
  4368                              <1> 
  4369                              <1> sysdma_51:
  4370                              <1> 	; 0 = there is not a dma buffer (in use or available)
  4371 000130FD A3[AC940100]        <1> 	mov	[u.r0], eax
  4372                              <1> 
  4373 00013102 8B2D[A8940100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
  4374 00013108 894D18              <1> 	mov	[ebp+24], ecx ; return to user with ecx value
  4375                              <1> 
  4376 0001310B E9909DFFFF          <1> 	jmp	sysret
  4377                              <1> 
  4378                              <1> sysdma_2:
  4379                              <1> 	; Get current dma buffer offset (& page)
  4380                              <1> 	; 28/08/2017
  4381 00013110 0FB635[6E930100]    <1> 	movzx	esi, byte [dma_channel]
  4382 00013117 0FB696[2A3C0100]    <1> 	movzx	edx, byte [dma_flip+esi]
  4383 0001311E EE                  <1> 	out	dx, al			; flip-flop clear
  4384 0001311F 8A96[023C0100]      <1> 	mov	dl, [dma_adr+esi]
  4385 00013125 EC                  <1> 	in	al, dx			; get dma position
  4386 00013126 0FB6D8              <1> 	movzx	ebx, al
  4387 00013129 EC                  <1> 	in	al, dx
  4388 0001312A 88C7                <1> 	mov	bh, al
  4389                              <1> 
  4390 0001312C 6683FE04            <1> 	cmp	si, 4	; channel number ?
  4391 00013130 7202                <1> 	jb	short sysdma_21 ; 8 bit dma channel
  4392                              <1> 
  4393 00013132 D1E3                <1> 	shl	ebx, 1	; word offset to byte offset
  4394                              <1> 
  4395                              <1> sysdma_21:
  4396 00013134 891D[AC940100]      <1> 	mov	[u.r0], ebx
  4397                              <1> 
  4398 0001313A 8A96[123C0100]      <1> 	mov	dl, [dma_page+esi]
  4399 00013140 EC                  <1> 	in	al, dx			; get dma page
  4400                              <1> 
  4401                              <1> 	;add	[u.ro+2], al
  4402 00013141 0805[AE940100]      <1> 	or	[u.r0+2], al
  4403                              <1> 
  4404 00013147 E9549DFFFF          <1> 	jmp	sysret
  4405                              <1> 
  4406                              <1> sysdma_6:
  4407 0001314C 80FF06              <1> 	cmp	bh, 6
  4408 0001314F 775C                <1> 	ja	short sysdma_7
  4409                              <1> 
  4410                              <1> 	; 28/08/2017
  4411                              <1> 	; Get current DMA buffer addr and size
  4412 00013151 A1[70930100]        <1> 	mov	eax, [dma_addr] ; dma buffer address
  4413 00013156 8B0D[74930100]      <1> 	mov	ecx, [dma_size] ; dma buffer size (in bytes)
  4414                              <1> 
  4415 0001315C EB9F                <1> 	jmp	short sysdma_51
  4416                              <1> 
  4417                              <1> sysdma_3:
  4418 0001315E 80FF03              <1> 	cmp	bh, 3
  4419 00013161 72AD                <1> 	jb	short sysdma_2
  4420 00013163 772F                <1> 	ja	short sysdma_4
  4421                              <1> 
  4422                              <1> 	; Get current dma count down value (remain bytes)
  4423                              <1> 	; 28/08/2017
  4424 00013165 0FB635[6E930100]    <1> 	movzx	esi, byte [dma_channel]
  4425 0001316C 0FB696[2A3C0100]    <1> 	movzx	edx, byte [dma_flip+esi]
  4426 00013173 EE                  <1> 	out	dx, al			; flip-flop clear
  4427 00013174 8A96[0A3C0100]      <1> 	mov	dl, [dma_cnt+esi] ; dma count register addr
  4428 0001317A EC                  <1> 	in	al, dx
  4429 0001317B 0FB6D8              <1> 	movzx	ebx, al
  4430 0001317E EC                  <1> 	in	al, dx
  4431 0001317F 88C7                <1> 	mov     bh, al
  4432                              <1> 	
  4433 00013181 6683FE04            <1> 	cmp	si, 4	; channel number ?
  4434 00013185 7202                <1> 	jb	short sysdma_31 ; 8 bit dma channel
  4435                              <1> 
  4436 00013187 D1E3                <1> 	shl	ebx, 1	; word count to byte count
  4437                              <1> 
  4438                              <1> sysdma_31:
  4439 00013189 891D[AC940100]      <1> 	mov	[u.r0], ebx
  4440                              <1> 
  4441 0001318F E90C9DFFFF          <1> 	jmp	sysret
  4442                              <1> 
  4443                              <1> sysdma_4:
  4444                              <1> 	; Get current DMA channel number
  4445                              <1> 	; 28/08/2017
  4446 00013194 8A25[6D930100]      <1> 	mov	ah, [dma_user]
  4447 0001319A 20E4                <1> 	and	ah, ah
  4448 0001319C 7539                <1> 	jnz	short sysdma_42
  4449                              <1> 
  4450                              <1> sysdma_41:	
  4451                              <1> 	; Not a valid dma channel (in use)
  4452 0001319E C705[AC940100]FFFF- <1> 	mov	dword [u.r0], -1 ; 0FFFFFFFFh
  4452 000131A6 FFFF                <1>
  4453 000131A8 E9F39CFFFF          <1> 	jmp	sysret
  4454                              <1> 
  4455                              <1> sysdma_7:
  4456                              <1> 	; DMA service STOP
  4457 000131AD A0[FD940100]        <1> 	mov	al, [u.uno]
  4458 000131B2 3A05[6D930100]      <1> 	cmp	al, [dma_user]
  4459 000131B8 7543                <1> 	jne	short sysdma_72
  4460                              <1> 	
  4461 000131BA 28C0                <1> 	sub	al, al ; 0
  4462                              <1> 
  4463 000131BC A2[6D930100]        <1> 	mov	[dma_user], al ; clear user
  4464                              <1> 
  4465 000131C1 8605[6F930100]      <1> 	xchg	al, [dma_mode]
  4466 000131C7 20C0                <1> 	and	al, al
  4467                              <1> 	;jz	short sysdma_err
  4468 000131C9 754E                <1> 	jnz	short sysdma_73	
  4469                              <1> 
  4470                              <1> sysdma_71:
  4471 000131CB 31C0                <1> 	xor	eax, eax
  4472 000131CD A3[AC940100]        <1> 	mov	[u.r0], eax; 0
  4473 000131D2 E9C99CFFFF          <1> 	jmp	sysret
  4474                              <1> 
  4475                              <1> sysdma_42:
  4476 000131D7 8B35[70930100]      <1> 	mov	esi, [dma_addr]
  4477 000131DD 21F6                <1> 	and	esi, esi
  4478 000131DF 74BD                <1> 	jz	short sysdma_41
  4479                              <1> 
  4480 000131E1 46                  <1> 	inc	esi ; -1 -> 0
  4481 000131E2 74BA                <1> 	jz	short sysdma_41
  4482                              <1> 
  4483 000131E4 A0[6E930100]        <1> 	mov	al, [dma_channel]
  4484                              <1> 
  4485 000131E9 3A25[FD940100]      <1> 	cmp	ah, [u.uno]
  4486 000131EF 7502                <1> 	jne	short sysdma_43
  4487                              <1> 
  4488 000131F1 30E4                <1> 	xor	ah, ah ; DMA channel in use by current user
  4489                              <1> 
  4490                              <1> sysdma_43:
  4491 000131F3 A3[AC940100]        <1> 	mov	[u.r0], eax ; AL = dma channel number
  4492                              <1> 			    ; AH > 0 if the the channel
  4493                              <1> 			    ; in use by another user/process
  4494 000131F8 E9A39CFFFF          <1> 	jmp	sysret
  4495                              <1> 
  4496                              <1> sysdma_72:
  4497                              <1> 	; 28/08/2017
  4498 000131FD 803D[6D930100]00    <1> 	cmp	byte [dma_user], 0
  4499 00013204 76C5                <1> 	jna	short sysdma_71 ; Nothing to do !
  4500                              <1> 
  4501 00013206 833D[70930100]00    <1> 	cmp	dword [dma_addr], 0
  4502                              <1> 	;ja	sysdma_0_err
  4503                              <1> 	; 30/07/2022
  4504 0001320D 7605                <1> 	jna	short sysdma_74
  4505 0001320F E9BBFDFFFF          <1> 	jmp	sysdma_0_err
  4506                              <1> 
  4507                              <1> sysdma_74:	
  4508 00013214 A2[6D930100]        <1> 	mov	[dma_user], al ; reset to current user
  4509                              <1> 
  4510                              <1> sysdma_73:
  4511                              <1> 	; 28/08/2017
  4512 00013219 0FB635[6E930100]    <1> 	movzx	esi, byte [dma_channel]
  4513 00013220 0FB696[1A3C0100]    <1> 	movzx	edx, byte [dma_mask+esi]
  4514 00013227 A0[6E930100]        <1> 	mov	al, [dma_channel]
  4515 0001322C 0C04                <1> 	or	al, 4
  4516 0001322E EE                  <1> 	out	dx, al
  4517                              <1> 
  4518 0001322F EB9A                <1> 	jmp	short sysdma_71
  4519                              <1> 
  4520                              <1> dma_init:
  4521                              <1> 	; 30/07/2022 (TRDOS 386 Kernel v2.0.5)
  4522                              <1> 	; 28/08/2017
  4523                              <1> 	; 20/08/2017
  4524                              <1> 	; DMA initialization
  4525                              <1> 	; 14/08/2017
  4526                              <1> 	; 03/08/2017, 06/08/2017, 08/08/2017
  4527                              <1> 	; 02/07/2017, 13/07/2017, 16/07/2017, 30/07/2017
  4528                              <1> 	; (Derived from 'DMA_INIT' procedure in SB16MOD.ASM)
  4529                              <1> 	; Modified for TRDOS 386 DMA buffer allocation & initialization !
  4530                              <1> 
  4531 00013231 8B1D[78930100]      <1> 	mov	ebx, [dma_start]
  4532 00013237 8B0D[7C930100]      <1> 	mov	ecx, [dma_count]
  4533                              <1> 
  4534 0001323D 0FB635[6E930100]    <1> 	movzx	esi, byte [dma_channel]
  4535                              <1> 
  4536 00013244 6683FE04            <1> 	cmp	si, 4
  4537 00013248 7204                <1> 	jb	short gdmi1
  4538                              <1> 	; 08/08/2017
  4539                              <1> 	;shr	cx, 1 ; word count
  4540                              <1> 	; 30/07/2022
  4541 0001324A D1E9                <1> 	shr	ecx, 1
  4542 0001324C D1EB                <1> 	shr	ebx, 1 ; convert byte offset to word offset
  4543                              <1> gdmi1:
  4544                              <1> 	;mov	[dma_poff], bx ; 08/08/2017
  4545                              <1> 	;dec	cx			; dma size = block size - 1
  4546                              <1> 	; 30/07/2022
  4547 0001324E 49                  <1> 	dec	ecx	
  4548                              <1> 
  4549 0001324F 0FB696[1A3C0100]    <1> 	movzx	edx, byte [dma_mask+esi] ; 30/07/2017
  4550 00013256 A0[6E930100]        <1> 	mov	al, [dma_channel]
  4551 0001325B 0C04                <1> 	or	al, 4
  4552 0001325D EE                  <1> 	out	dx, al			; dma channel mask
  4553                              <1> 
  4554 0001325E 30C0                <1> 	xor	al, al ; 0 ; any value ! 08/08/2017
  4555 00013260 8A96[2A3C0100]      <1> 	mov	dl, [dma_flip+esi]
  4556 00013266 EE                  <1> 	out	dx, al			; flip-flop clear
  4557                              <1> 	
  4558 00013267 8A96[223C0100]      <1> 	mov	dl, [dma_mod+esi]
  4559 0001326D A0[6E930100]        <1> 	mov	al, [dma_channel]  ; 13/07/2017
  4560 00013272 2403                <1> 	and	al, 3
  4561                              <1> 	; 08/08/2017
  4562 00013274 0A05[6F930100]      <1> 	or	al, [dma_mode] ; 58h    ; dma mode for SB16
  4563 0001327A EE                  <1> 	out	dx, al
  4564                              <1> 
  4565 0001327B 8A96[023C0100]      <1> 	mov	dl, [dma_adr+esi]
  4566 00013281 88D8                <1> 	mov	al, bl
  4567 00013283 EE                  <1> 	out	dx, al			; offset low
  4568                              <1> 
  4569 00013284 88F8                <1> 	mov	al, bh
  4570 00013286 EE                  <1> 	out	dx, al			; offset high
  4571                              <1> 
  4572 00013287 8A96[0A3C0100]      <1> 	mov	dl, [dma_cnt+esi]
  4573 0001328D 88C8                <1> 	mov	al, cl
  4574 0001328F EE                  <1> 	out	dx, al			; size low
  4575                              <1> 
  4576 00013290 88E8                <1> 	mov	al, ch
  4577 00013292 EE                  <1> 	out	dx, al			; size high
  4578                              <1> 
  4579 00013293 8A96[123C0100]      <1> 	mov	dl, [dma_page+esi]
  4580                              <1> 	; 14/08/2017 
  4581 00013299 6683FE04            <1> 	cmp	si, 4
  4582 0001329D 7305                <1> 	jnb	short gdmi2
  4583 0001329F C1EB10              <1> 	shr	ebx, 16
  4584 000132A2 EB06                <1> 	jmp	short gdmi3
  4585                              <1> gdmi2:
  4586                              <1> 	; 09/08/2017
  4587 000132A4 C1EB0F              <1> 	shr	ebx, 15	 ; complete 16 bit shift
  4588 000132A7 80E3FE              <1> 	and	bl, 0FEh ; clear bit 0 (not necessary)
  4589                              <1> gdmi3:	
  4590 000132AA 88D8                <1> 	mov	al, bl
  4591 000132AC EE                  <1> 	out	dx, al			; page
  4592                              <1> 	
  4593 000132AD 8A96[1A3C0100]      <1> 	mov	dl, [dma_mask+esi]
  4594 000132B3 A0[6E930100]        <1> 	mov	al, [dma_channel]  ; 13/07/2017
  4595 000132B8 2403                <1> 	and	al, 3
  4596 000132BA EE                  <1> 	out	dx, al			; dma channel unmask
  4597                              <1> 
  4598                              <1> 	;retn
  4599                              <1> 	; 28/08/2017
  4600 000132BB E9E09BFFFF          <1> 	jmp	sysret
  4601                              <1> 
  4602                              <1> sysstdio: ; STDIN/STDOUT/STDERR functions
  4603                              <1> 	; 18/09/2024
  4604                              <1> 	; 07/09/2024
  4605                              <1> 	;	(STDAUX/STDPRN functions, pre-definions)
  4606                              <1> 	;	(!these functions are not ready!)
  4607                              <1> 	; 24/08/2024
  4608                              <1> 	; 23/08/2024
  4609                              <1> 	; 20/08/2024 - TRDOS 386 Kernel v2.0.9
  4610                              <1> 	;
  4611                              <1> 	; Inputs:
  4612                              <1> 	;	BL = 0 -> read a character on stdin (wait)
  4613                              <1> 	;	BL = 1 -> read a character on stdin (no wait)
  4614                              <1> 	;	BL = 2 -> write a character onto stdout (redirection)
  4615                              <1> 	;	BL = 3 -> write a character onto stderr (no redirection)
  4616                              <1> 	;	BL = 4 -> redirect stdin to file (if cl > 0)
  4617                              <1> 	;	BL = 5 -> redirect stdout to file (if cl > 0)
  4618                              <1> 	;	BL = 6 -> read character (ascii and scancode) on stdin
  4619                              <1> 	;				-no redirection, wait-
  4620                              <1> 	;	BL = 7 -> read character (ascii and scancode) on stdin
  4621                              <1> 	;				-no redirection, no wait-
  4622                              <1> 	;	BL = 8 -> write character and color onto stdout
  4623                              <1> 	;				-no redirection-
  4624                              <1> 	;	BL = 9 -> ungetchar (put back the ascii code in u.getc)
  4625                              <1> 	;
  4626                              <1> 	;	For BL=2,3,8,9
  4627                              <1> 	;	    CL = character (ascii) code
  4628                              <1> 	;	For BL=8
  4629                              <1> 	;	    CH = color (Attribute) -CGA-
  4630                              <1> 	;	For BL=4,5
  4631                              <1> 	;	    CL = file descriptor number + 1
  4632                              <1> 	;	    (File must be open and that number is 'u.fp' index)
  4633                              <1> 	;
  4634                              <1> 	;	07/09/2024 (these subfunctions will not be handled
  4635                              <1> 	;		   by kernel v2.0.9 for now)
  4636                              <1> 	;	 -I am writing them here for C compiler compatibility,
  4637                              <1> 	;	  for now. Ref: SCC STDIO.H-
  4638                              <1> 	;	BL = 10 -> get STDAUX status
  4639                              <1> 	;	BL = 11 -> get/select STDAUX (COM) port
  4640                              <1> 	;				(clears redirection)
  4641                              <1> 	;	BL = 12 -> redirect STDAUX
  4642                              <1> 	;	BL = 13 -> STDAUX IOCTL (control functions)
  4643                              <1> 	;	BL = 14 -> read byte/character from STDAUX
  4644                              <1> 	;	BL = 15 -> write byte/character to STDAUX
  4645                              <1> 	;	BL = 16 -> get STDPRN status (LPT printer only)
  4646                              <1> 	;	BL = 17 -> redirect STDPRN
  4647                              <1> 	;	BL = 18 -> STDPRN IOCTL (init/control functions)
  4648                              <1> 	;	BL = 19 -> write byte/character to STDPRN
  4649                              <1> 	;
  4650                              <1> 	;	For BL = 11
  4651                              <1> 	;	    If	CL = 0 -> get STDAUX (COM) port number
  4652                              <1> 	;		CL = 1 -> COM1
  4653                              <1> 	;		CL = 2 -> COM2
  4654                              <1> 	;		CL > 4 -> invalid
  4655                              <1> 	;	For BL = 12
  4656                              <1> 	;	    If ECX = 0 -> clear redirection
  4657                              <1> 	;	    If  CH & 7Fh = 0 -> redirect INPUT
  4658                              <1> 	;	        CH & 7Fh > 0 -> redirect OUTPUT
  4659                              <1> 	;	    If  CH & 80h = 80h 
  4660                              <1> 	;		CL = file handle (descriptor index)
  4661                              <1> 	;	    If  CH & 80h = 0
  4662                              <1> 	;		CL = console (pseudo) tty number,
  4663                              <1> 	;		     1 to 8 for tty0 to tty7.
  4664                              <1> 	;	For BL = 13
  4665                              <1> 	;	    If CL = 0 -> get control byte
  4666                              <1> 	;	    If CL > 1 -> set control byte (in CL)
  4667                              <1> 	;		bit 0 = 1
  4668                              <1> 	;		bit 1 = data bits (set=8, clear=7)
  4669                              <1> 	;		bit 2 = stop bit (set=2, clear=1)
  4670                              <1> 	;		bit 3 = parity bit (set=yes, clear=no)
  4671                              <1> 	;		bit 4 = parity bit (set=even, clear=odd)
  4672                              <1> 	;		bit 5-6-7 = data rate
  4673                              <1> 	;			000 = 9600
  4674                              <1> 	;		        001 = 19200
  4675                              <1> 	;			010 = 38400
  4676                              <1> 	;			011 = 57600
  4677                              <1> 	;			100 = 115200
  4678                              <1> 	;	For BL = 15, 19
  4679                              <1> 	;	    CL = byte/character to r/w
  4680                              <1> 	;	For BL = 17
  4681                              <1> 	;	    If ECX = 0 -> clear redirection	
  4682                              <1> 	;	    If  CH & 80h = 80h 
  4683                              <1> 	;		CL = file handle (descriptor index)
  4684                              <1> 	;	    If  CH & 80h = 0
  4685                              <1> 	;		CL = console (pseudo) tty number,
  4686                              <1> 	;		     1 to 8 for tty0 to tty7.
  4687                              <1> 	;	For BL = 18
  4688                              <1> 	;	    If CL = 0 -> initialize printer (command=0)
  4689                              <1> 	;	       CL > 0 -> configuration/command byte
  4690                              <1> 	;			 (reserved, not used)		
  4691                              <1> 	;
  4692                              <1> 	; Outputs:
  4693                              <1> 	;
  4694                              <1> 	;	For BL=0,1,2,3,6,7,8,9
  4695                              <1> 	;	    AL = character (ascii) code
  4696                              <1> 	;	For BL=6,7
  4697                              <1> 	;	    AH = scan code
  4698                              <1> 	;	For BL=4,5
  4699                              <1> 	;	    AL = file descriptor (CL input - 1)	
  4700                              <1> 	;
  4701                              <1> 	;	If CF=1
  4702                              <1> 	;	   AL (EAX) = error code
  4703                              <1> 	;	   If EAX = 0 -> EOF ; 18/09/2024
  4704                              <1> 	;
  4705                              <1> 	;	07/09/2024
  4706                              <1> 	;	For BL = 10 to 19
  4707                              <1> 	;	    IF CF = 1, EAX/AL = error code 		
  4708                              <1> 	;    .. If CF = 0 ...
  4709                              <1> 	;	For BL = 10 & 16
  4710                              <1> 	;	    AL (EAX) = status
  4711                              <1> 	;	For BL = 11
  4712                              <1> 	;	    EAX/AL = COM (serial) port (1 to 4)
  4713                              <1> 	;	For BL = 12, 15, 17, 18, 19
  4714                              <1> 	;	    EAX/AL = 0
  4715                              <1> 	;	For BL = 13
  4716                              <1> 	;	    If CL input = 0
  4717                              <1> 	;		  EAX/AL = current ctrl/cfg byte
  4718                              <1> 	;           If CL input > 0
  4719                              <1> 	;		  EAX/AL = ctrl/cfg byte
  4720                              <1> 	;	For BL = 14
  4721                              <1> 	;	    EAX/AL = byte/character
  4722                              <1> 	;			
  4723                              <1> 
  4724 000132C0 80FB0A              <1> 	cmp	bl, (end_of_stdiofuncs-stdiofuncs)>>2
  4725 000132C3 7214                <1> 	jb	short sysstdio_0
  4726                              <1> 	
  4727                              <1> 	; invalid parameter (invalid sub function number)
  4728 000132C5 B817000000          <1> 	mov	eax, ERR_INV_PARAMETER
  4729                              <1> sysstdio_err:
  4730 000132CA A3[AC940100]        <1> 	mov	[u.r0], eax
  4731 000132CF A3[18950100]        <1> 	mov	[u.error], eax
  4732 000132D4 E9A79BFFFF          <1> 	jmp	error
  4733                              <1> 
  4734                              <1> sysstdio_0:
  4735 000132D9 31C0                <1> 	xor	eax, eax ; 0
  4736 000132DB A3[18950100]        <1> 	mov	[u.error], eax ; clear previous error code	
  4737 000132E0 A3[AC940100]        <1> 	mov	[u.r0], eax ; clear previous return code
  4738                              <1> 
  4739 000132E5 0FB6F3              <1> 	movzx	esi, bl
  4740 000132E8 C1E602              <1> 	shl	esi, 2
  4741 000132EB FFA6[F1320100]      <1> 	jmp	dword [esi+stdiofuncs]
  4742                              <1> 
  4743                              <1> stdiofuncs:
  4744 000132F1 [7B330100]          <1> 	dd	readstdinw
  4745 000132F5 [7B330100]          <1> 	dd	readstdinnw
  4746 000132F9 [92340100]          <1> 	dd	writestdout
  4747 000132FD [49340100]          <1> 	dd	writestderr
  4748 00013301 [19330100]          <1> 	dd	redirstdin
  4749 00013305 [57330100]          <1> 	dd	redirstdout
  4750                              <1> stdinacsc:
  4751 00013309 [67340100]          <1> 	dd	readstdin2w
  4752 0001330D [67340100]          <1> 	dd	readstdin2nw
  4753                              <1> stdoutcc:
  4754 00013311 [9D340100]          <1> 	dd	writestdoutcc
  4755 00013315 [B4340100]          <1> 	dd	ungetchar
  4756                              <1> end_of_stdiofuncs:
  4757                              <1> 
  4758                              <1> redirstdin:
  4759                              <1> 	; CL = file handle (descriptor/index) + 1
  4760 00013319 08C9                <1> 	or	cl, cl
  4761 0001331B 7508                <1> 	jnz	short redirstdin_0
  4762 0001331D 880D[14950100]      <1> 	mov	[u.stdin], cl ; 0 ; reset STDIN to keyboard
  4763 00013323 EB24                <1> 	jmp	short redirstdin_3
  4764                              <1> redirstdin_0: 
  4765 00013325 88C8                <1> 	mov	al, cl
  4766 00013327 E807D4FFFF          <1> 	call	getf
  4767                              <1> 	; eax = first cluster
  4768                              <1> 	; ebx = system (not user) open file index
  4769 0001332C 80BB[5C8A0100]01    <1> 	cmp	byte [ebx+OF_MODE], 1 ; open for read
  4770 00013333 7407                <1> 	je	short redirstdin_1
  4771                              <1> redir_acc_denied:
  4772 00013335 B805000000          <1> 	mov	eax, ERR_ACCESS_DENIED
  4773 0001333A EB8E                <1> 	jmp	short sysstdio_err
  4774                              <1> redirstdin_1:
  4775 0001333C 880D[14950100]      <1> 	mov	[u.stdin], cl
  4776                              <1> redirstdout_2:
  4777 00013342 49                  <1> 	dec	ecx
  4778 00013343 880D[AC940100]      <1> 	mov	[u.r0], cl ; return file descriptor
  4779                              <1> redirstdin_3:
  4780                              <1> redirstdout_3:
  4781 00013349 66C705[16950100]00- <1> 	mov	word [u.ungetc], 0
  4781 00013351 00                  <1>
  4782                              <1> 		; reset u.ungetc and u.getc
  4783 00013352 E9499BFFFF          <1> 	jmp	sysret
  4784                              <1> 
  4785                              <1> redirstdout:
  4786                              <1> 	; CL = file handle (descriptor/index) + 1
  4787 00013357 08C9                <1> 	or	cl, cl
  4788 00013359 7508                <1> 	jnz	short redirstdout_0
  4789 0001335B 880D[15950100]      <1> 	mov	[u.stdout], cl ; 0 ; reset STDOUT to keyboard
  4790 00013361 EBE6                <1> 	jmp	short redirstdout_3
  4791                              <1> redirstdout_0: 
  4792 00013363 88C8                <1> 	mov	al, cl
  4793 00013365 E8C9D3FFFF          <1> 	call	getf
  4794                              <1> 	; eax = first cluster
  4795                              <1> 	; ebx = system (not user) open file index
  4796 0001336A 80BB[5C8A0100]02    <1> 	cmp	byte [ebx+OF_MODE], 2 ; open for write
  4797 00013371 75C2                <1> 	jne	short redir_acc_denied
  4798                              <1> redirstdout_1:
  4799 00013373 880D[15950100]      <1> 	mov	[u.stdout], cl
  4800 00013379 EBC7                <1> 	jmp	short redirstdout_2
  4801                              <1> 	
  4802                              <1> readstdinw:
  4803                              <1> readstdinnw:
  4804                              <1> 	; read a character on stdin (wait)
  4805                              <1> 	;sub	eax, eax
  4806 0001337B 3805[16950100]      <1> 	cmp	byte [u.ungetc], al ; 0
  4807 00013381 761E                <1> 	jna	short readstdinw_0
  4808                              <1> 	; read the character in u.getc buffer (put by ungetchar)
  4809 00013383 A2[16950100]        <1> 	mov	[u.ungetc], al ; 0
  4810 00013388 8605[17950100]      <1> 	xchg	al, [u.getc]
  4811                              <1> readstdinw_retn:
  4812 0001338E A2[AC940100]        <1> 	mov	[u.r0], al
  4813 00013393 E9089BFFFF          <1> 	jmp	sysret
  4814                              <1> 
  4815                              <1> readstdinw_3:
  4816                              <1> 	; 23/08/2024
  4817 00013398 B410                <1> 	mov	ah, 10h
  4818 0001339A E87DDBFEFF          <1> 	call	int16h
  4819 0001339F EBED                <1> 	jmp	short readstdinw_retn
  4820                              <1> 
  4821                              <1> readstdinw_0:
  4822 000133A1 A0[14950100]        <1> 	mov	al, [u.stdin]
  4823 000133A6 08C0                <1> 	or	al, al
  4824 000133A8 745F                <1> 	jz	short readstdinw_1
  4825                              <1> 
  4826                              <1> readstdinf:
  4827                              <1> 	; 24/08/2024
  4828 000133AA 48                  <1> 	dec	eax
  4829                              <1> 
  4830                              <1> 	; file
  4831 000133AB 89C3                <1> 	mov	ebx, eax ; File handle (descriptor/index)
  4832                              <1> 	; 18/09/2024
  4833 000133AD B9[CC340100]        <1> 	mov	ecx, charbuf ; buffer address
  4834 000133B2 BA01000000          <1> 	mov	edx, 1  ; 1 character only
  4835                              <1> 
  4836                              <1> 	; 18/09/2024
  4837                              <1> 	;;;
  4838 000133B7 E879D3FFFF          <1> 	call	getf1
  4839 000133BC 722B                <1> 	jc	short redirect_fno_err
  4840                              <1> 	
  4841                              <1> readstdinf_@:
  4842                              <1> 	; eax = first cluster
  4843                              <1> 	; ebx = file descriptor (system, open files)
  4844                              <1> 
  4845 000133BE E85DA2FFFF          <1> 	call	rw1
  4846 000133C3 7229                <1> 	jc	short redirection_err
  4847                              <1> 
  4848 000133C5 FE05[12950100]      <1> 	inc	byte [u.kcall]
  4849                              <1> 	;mov	byte [u.kcall], 1 ; >0 means system buffer
  4850                              <1> 			      ; (buff addr is not virtual)
  4851 000133CB E827D7FFFF          <1> 	call	readi
  4852                              <1> 
  4853                              <1> redirected_rw_OK:
  4854 000133D0 31C0                <1> 	xor	eax, eax
  4855 000133D2 3905[D8940100]      <1> 	cmp	[u.nread], eax ; 0
  4856 000133D8 7623                <1> 	jna	short readstdinf_EOF
  4857                              <1> 
  4858 000133DA A0[CC340100]        <1> 	mov	al, [charbuf]
  4859                              <1> ;redirected_w_not_OK:
  4860 000133DF A3[AC940100]        <1> 	mov	[u.r0], eax
  4861 000133E4 E9B79AFFFF          <1> 	jmp	sysret
  4862                              <1> 
  4863                              <1> redirect_fno_err:
  4864 000133E9 B80A000000          <1> 	mov 	eax, ERR_FILE_NOT_OPEN ; file not open !
  4865                              <1> redirection_err:
  4866 000133EE A3[18950100]        <1> 	mov	[u.error], eax
  4867                              <1> readstdinf_EOF_@:
  4868 000133F3 A3[AC940100]        <1> 	mov	[u.r0], eax ; error code ; 0 = EOF
  4869 000133F8 E9839AFFFF          <1> 	jmp	error
  4870                              <1> 
  4871                              <1> readstdinf_EOF:
  4872                              <1> 	; 'end of file !' error 
  4873 000133FD C705[18950100]1000- <1> 	mov	dword [u.error], ERR_FILE_EOF ; 16
  4873 00013405 0000                <1>
  4874 00013407 EBEA                <1> 	jmp	short readstdinf_EOF_@
  4875                              <1> 	;;;
  4876                              <1> 
  4877                              <1> readstdinw_1:
  4878                              <1> 	; 18/09/2024
  4879 00013409 20DB                <1> 	and	bl, bl
  4880 0001340B 748B                <1> 	jz	short readstdinw_3 ; wait (int16h, 10h)
  4881                              <1> 	; no wait (int16h, 11h)
  4882 0001340D B411                <1> 	mov	ah,11h	; EXTENDED ASCII STATUS
  4883 0001340F E808DBFEFF          <1> 	call	int16h
  4884                              <1> 	; ah = scan code, al = ascii code
  4885                              <1> 	;jnz	short readstdinw_retn
  4886                              <1> 	; 23/08/2024
  4887 00013414 7582                <1> 	jnz	short readstdinw_3
  4888                              <1> readstdinw_2:
  4889                              <1> 
  4890                              <1> ; 23/08/2024
  4891                              <1> ;	; if zf=1 at here
  4892                              <1> ;	; it means 'no code available' for function 11h
  4893                              <1> ;	and	bl, bl	; 0 ?
  4894                              <1> ;	jz	short  short readstdinw_retn ; function 10h
  4895                              <1> ;	; function 11h
  4896                              <1> ;	; [u.r0] = 0 = eax return
  4897                              <1> readstdin2w@_retn:
  4898 00013416 E9859AFFFF          <1> 	jmp	sysret
  4899                              <1> 
  4900                              <1> writestdoutf:
  4901                              <1> 	; 24/08/2024
  4902 0001341B 48                  <1> 	dec	eax
  4903                              <1> 
  4904                              <1> 	; file
  4905 0001341C 89C3                <1> 	mov	ebx, eax ; File handle (descriptor/index)
  4906                              <1> 	; 18/09/2024
  4907 0001341E 880D[CC340100]      <1> 	mov	byte [charbuf], cl
  4908 00013424 B9[CC340100]        <1> 	mov	ecx, charbuf
  4909 00013429 BA01000000          <1> 	mov	edx, 1  ; 1 character only
  4910                              <1> 
  4911                              <1> 	; 18/09/2024
  4912                              <1> 	;;;
  4913 0001342E E802D3FFFF          <1> 	call	getf1
  4914 00013433 72B4                <1> 	jc	short redirect_fno_err
  4915                              <1> 
  4916                              <1> writestdoutf_@:
  4917                              <1> 	; eax = first cluster
  4918                              <1> 	; ebx = file descriptor (system, open files)
  4919                              <1> 
  4920 00013435 E8E6A1FFFF          <1> 	call	rw1
  4921 0001343A 72B2                <1> 	jc	short redirection_err
  4922                              <1> 
  4923 0001343C FE05[12950100]      <1> 	inc	byte [u.kcall]
  4924                              <1> 	;mov	byte [u.kcall], 1 ; >0 means system buffer
  4925                              <1> 			      ; (buff addr is not virtual)
  4926 00013442 E8CBDDFFFF          <1> 	call	writei
  4927                              <1> 
  4928                              <1> 	;xor	eax, eax
  4929                              <1> 	;cmp	[u.nread], eax ; 0
  4930                              <1> 	;jna	short redirected_w_not_OK
  4931 00013447 EB87                <1> 	jmp	short redirected_rw_OK
  4932                              <1> 	;;;
  4933                              <1> 
  4934                              <1> writestderr:	; skip redirection
  4935                              <1> 		; STDERR = STDOUT (as file redirection disabled)
  4936 00013449 88C8                <1> 	mov	al, cl  ; character
  4937 0001344B A2[AC940100]        <1> 	mov	[u.r0], al
  4938 00013450 B40E                <1> 	mov	ah, 0Eh	; write a character (as tty write)
  4939 00013452 BB07000000          <1> 	mov	ebx, 07h ; video page 0 (and color/attrib 07h)
  4940                              <1> 	; 23/08/2024
  4941 00013457 8A3D[1E7D0100]      <1> 	mov	bh, [ptty] ; ACTIVE_PAGE
  4942 0001345D E8C2E2FEFF          <1> 	call	_int10h
  4943 00013462 E9399AFFFF          <1> 	jmp	sysret
  4944                              <1> 
  4945                              <1> readstdin2w:
  4946                              <1> readstdin2nw:
  4947 00013467 66C705[16950100]00- <1> 	mov	word [u.ungetc], 0
  4947 0001346F 00                  <1>
  4948                              <1> 		; reset u.ungetc and u.getc
  4949 00013470 B410                <1> 	mov	ah, 10h  ; Keyboard, EXTENDED READ
  4950                              <1> 	;cmp	bl, 6
  4951 00013472 80FB06              <1> 	cmp	bl, (stdinacsc-stdiofuncs)>>2
  4952 00013475 740B                <1> 	je	short readstdin2w_1 ; wait (int16h, 10h)
  4953                              <1> 	; no wait (int16h, 11h)
  4954 00013477 FEC4                <1> 	inc	ah  ; function 11h ; EXTENDED ASCII STATUS
  4955                              <1> 
  4956                              <1> 	; 24/08/2024
  4957 00013479 E89EDAFEFF          <1> 	call	int16h
  4958                              <1> 	; ah = scan code, al = ascii code
  4959                              <1> 	;jnz	short readstdin2w_retn
  4960                              <1> 	; 23/08/2024
  4961 0001347E 7496                <1> 	jz	short readstdin2w@_retn
  4962                              <1> ;readstdin2w_1:
  4963                              <1> 
  4964                              <1> ; 23/08/2024
  4965                              <1> ;	; if zf=1 at here
  4966                              <1> ;	; it means 'no code available' for function 11h
  4967                              <1> ;	;cmp	bl, 6
  4968                              <1> ;	cmp	bl, (stdinacsc-stdiofuncs)>>2
  4969                              <1> ;	;je	short readstdin2w_retn ; function 10h
  4970                              <1> ;	; function 11h
  4971                              <1> ;	; [u.r0] = 0 = eax return
  4972                              <1> ;	;jmp	sysret
  4973                              <1> ;	jne	short readstdin2w@_retn
  4974                              <1> 
  4975                              <1> 	; 23/08/2024
  4976 00013480 B410                <1> 	mov	ah, 10h
  4977                              <1> readstdin2w_1:	; 18/09/2024
  4978 00013482 E895DAFEFF          <1> 	call	int16h
  4979                              <1> 
  4980                              <1> readstdin2w_retn:
  4981 00013487 66A3[AC940100]      <1> 	mov	[u.r0], ax
  4982 0001348D E90E9AFFFF          <1> 	jmp	sysret
  4983                              <1> 
  4984                              <1> writestdout:
  4985                              <1> 	; 18/09/2024
  4986 00013492 A0[15950100]        <1> 	mov	al, [u.stdout]
  4987 00013497 20C0                <1> 	and	al, al
  4988 00013499 7580                <1> 	jnz	short writestdoutf ; 18/09/2024
  4989                              <1> 
  4990                              <1> writestdout_1:
  4991                              <1> 	;mov	byte [ccolor], 07h ; default color (CGA) 
  4992                              <1> 			; (black background, light gray character) 
  4993                              <1> 	; 18/09/2024
  4994 0001349B B507                <1> 	mov	ch, 07h
  4995                              <1> writestdoutcc:	
  4996 0001349D BE[AC940100]        <1> 	mov	esi, u.r0 ; buffer
  4997                              <1> 	; 18/09/2024
  4998 000134A2 880E                <1> 	mov	[esi], cl ; character
  4999                              <1> 	;;cmp	bl, 8 ; write char and color
  5000                              <1> 	;cmp	bl, (stdoutcc-stdiofuncs)>>2
  5001                              <1> 	;jne	short writestdout_2
  5002 000134A4 882D[1F7D0100]      <1> 	mov	byte [ccolor], ch ; color/attribute (CGA)
  5003                              <1> writestdout_2:
  5004 000134AA E8FBD4FFFF          <1> 	call	print_cmsg
  5005                              <1> 	; 18/09/2024
  5006                              <1> 	;mov	byte [ccolor], 07h ; set default color again
  5007                              <1> 
  5008                              <1> 	; [u.r0] = written character (AL)
  5009 000134AF E9EC99FFFF          <1> 	jmp	sysret
  5010                              <1> 
  5011                              <1> ungetchar:
  5012                              <1> 	; put a character back in u.getc STDIN buffer
  5013 000134B4 C605[16950100]01    <1> 	mov	byte [u.ungetc], 1 
  5014 000134BB 880D[17950100]      <1> 	mov	[u.getc], cl
  5015 000134C1 880D[AC940100]      <1> 	mov	[u.r0],cl
  5016 000134C7 E9D499FFFF          <1> 	jmp	sysret
  5017                              <1> 
  5018                              <1> 	; 18/09/2024
  5019 000134CC 00                  <1> charbuf: db 0
  5020                              <1> 
  5021                              <1> otty:
  5022                              <1> sret:
  5023                              <1> ocvt:
  5024                              <1> ctty:
  5025                              <1> cret:
  5026                              <1> ccvt:
  5027                              <1> rtty:
  5028                              <1> wtty:
  5029                              <1> rmem:
  5030                              <1> wmem:
  5031                              <1> rfd:
  5032                              <1> rhd:
  5033                              <1> wfd:
  5034                              <1> whd:
  5035                              <1> rlpt:
  5036                              <1> wlpt:
  5037                              <1> rcvt:
  5038                              <1> xmtt:
  5039 000134CD C3                  <1> 	retn
  3438                                  %include 'trdosk9.s' ; 04/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.10) - INITIALIZED DATA : trdosk9.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 25/07/2025 (Previous: 29/12/2024 - Kernel v2.0.9)
     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 000134CE 01                  <1> 		db 1 ; A: = 0 & B: = 1
    22                              <1> 
    23                              <1> Restore_CDIR:	
    24 000134CF FF                  <1> 		db 0FFh ; Initial value -> any number except 0
    25                              <1> 
    26                              <1> msg_CRLF_temp:  
    27 000134D0 070D0A00            <1> 		db 07h, 0Dh, 0Ah, 0
    28                              <1> 
    29                              <1> Magic_Bytes:
    30 000134D4 04                  <1> 		db 4
    31 000134D5 01                  <1> 		db 1
    32                              <1> mainprog_Version:
    33 000134D6 07                  <1> 		db 7
    34 000134D7 5B5452444F535D204D- <1> 		db "[TRDOS] Main Program v2.0.10 (25/07/2025)"
    34 000134E0 61696E2050726F6772- <1>
    34 000134E9 616D2076322E302E31- <1>
    34 000134F2 30202832352F30372F- <1>
    34 000134FB 3230323529          <1>
    35 00013500 0D0A                <1> 		db 0Dh, 0Ah
    36 00013502 286329204572646F67- <1> 		db "(c) Erdogan Tan 2005-2025"
    36 0001350B 616E2054616E203230- <1>
    36 00013514 30352D32303235      <1>
    37 0001351B 0D0A00              <1> 		db 0Dh, 0Ah, 0
    38                              <1> 
    39                              <1> MainProgCfgFile: ; 14/04/2016
    40 0001351E 4D41494E50524F472E- <1> 		db "MAINPROG.CFG", 0
    40 00013527 43464700            <1>
    41                              <1> 
    42                              <1> TRDOSPromptLabel:
    43 0001352B 5452444F53          <1> 		db "TRDOS"
    44 00013530 00                  <1> 		db 0
    45 00013531 00<rep 5h>          <1>                 times 5 db 0
    46 00013536 00                  <1> 		db 0
    47                              <1> 
    48                              <1> ; INTERNAL COMMANDS
    49                              <1> Command_List:
    50 00013537 44495200            <1> Cmd_Dir:	db "DIR", 0
    51 0001353B 434400              <1> Cmd_Cd:		db "CD", 0
    52 0001353E 433A00              <1> Cmd_Drive:	db "C:", 0
    53 00013541 56455200            <1> Cmd_Ver:	db "VER", 0
    54 00013545 4558495400          <1> Cmd_Exit:	db "EXIT", 0
    55 0001354A 50524F4D505400      <1> Cmd_Prompt:	db "PROMPT", 0
    56 00013551 564F4C554D4500      <1> Cmd_Volume:	db "VOLUME", 0
    57 00013558 4C4F4E474E414D4500  <1> Cmd_LongName:	db "LONGNAME", 0
    58 00013561 4441544500          <1> Cmd_Date:	db "DATE", 0
    59 00013566 54494D4500          <1> Cmd_Time:	db "TIME", 0
    60 0001356B 52554E00            <1> Cmd_Run:	db "RUN", 0
    61 0001356F 53455400            <1> Cmd_Set:	db "SET", 0 
    62 00013573 434C5300            <1> Cmd_Cls:	db "CLS", 0
    63 00013577 53484F5700          <1> Cmd_Show:	db "SHOW", 0
    64 0001357C 44454C00            <1> Cmd_Del:	db "DEL", 0
    65 00013580 41545452494200      <1> Cmd_Attrib:	db "ATTRIB", 0
    66 00013587 52454E414D4500      <1> Cmd_Rename:	db "RENAME", 0
    67 0001358E 524D44495200        <1> Cmd_Rmdir:	db "RMDIR", 0
    68 00013594 4D4B44495200        <1> Cmd_Mkdir:	db "MKDIR", 0
    69 0001359A 434F505900          <1> Cmd_Copy:	db "COPY", 0
    70 0001359F 4D4F564500          <1> Cmd_Move:	db "MOVE", 0
    71 000135A4 5041544800          <1> Cmd_Path:	db "PATH", 0
    72 000135A9 4D454D00            <1> Cmd_Mem:	db "MEM", 0
    73 000135AD 00                  <1> 		db 0
    74 000135AE 46494E4400          <1> Cmd_Find:	db "FIND", 0
    75 000135B3 4543484F00          <1> Cmd_Echo:	db "ECHO", 0
    76 000135B8 2A00                <1> Cmd_Remark:	db "*", 0
    77 000135BA 3F00                <1> Cmd_Help:	db "?", 0
    78 000135BC 44455649434500      <1> Cmd_Device:	db "DEVICE", 0
    79 000135C3 4445564C49535400    <1> Cmd_DevList:	db "DEVLIST", 0
    80 000135CB 434844495200        <1> Cmd_Chdir:	db "CHDIR", 0
    81 000135D1 4245455000          <1> Cmd_Beep:	db "BEEP", 0
    82                              <1> 		
    83 000135D6 00                  <1> 		db 0
    84                              <1> 
    85                              <1> ; 15/02/2016 (FILE.ASM, 09/10/2011)
    86                              <1> invalid_fname_chars:
    87 000135D7 222728292A2B2C2F    <1> 		db 22h, 27h, 28h, 29h, 2Ah, 2Bh, 2Ch, 2Fh
    88 000135DF 3A3B3C3D3E3F40      <1> 		db 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh, 40h
    89 000135E6 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 000135EB 456E746572206E6577- <1>                 db 'Enter new date (dd-mm-yy): '
    94 000135F4 206461746520286464- <1>
    94 000135FD 2D6D6D2D7979293A20  <1>
    95 00013606 00                  <1>                 db 0
    96                              <1> Msg_Show_Date:
    97 00013607 43757272656E742064- <1>                 db   'Current date is '
    97 00013610 61746520697320      <1>
    98 00013617 30                  <1> Day:            db   '0'
    99 00013618 30                  <1> 		db   '0'
   100 00013619 2F                  <1>                 db   '/'
   101 0001361A 30                  <1> Month:          db   '0'
   102 0001361B 30                  <1> 		db   '0'
   103 0001361C 2F                  <1>                 db   '/'
   104 0001361D 30                  <1> Century:        db   '0'
   105 0001361E 30                  <1>                 db   '0'
   106 0001361F 30                  <1> Year:           db   '0'
   107 00013620 30                  <1> 		db   '0'
   108 00013621 0D0A00              <1>                 db   0Dh, 0Ah, 0
   109                              <1> 
   110                              <1> Msg_Enter_Time:
   111 00013624 456E746572206E6577- <1> 		db 'Enter new time: '
   111 0001362D 2074696D653A20      <1>
   112 00013634 00                  <1> 		db 0
   113                              <1> Msg_Show_Time:
   114 00013635 43757272656E742074- <1> 		db   'Current time is '
   114 0001363E 696D6520697320      <1>
   115 00013645 30                  <1> Hour:           db   '0'
   116 00013646 30                  <1> 		db   '0'
   117 00013647 3A                  <1> 		db   ':'
   118 00013648 30                  <1> Minute:         db   '0'
   119 00013649 30                  <1> 		db   '0'
   120 0001364A 3A                  <1> 		db   ':'
   121 0001364B 30                  <1> Second:         db   '0'
   122 0001364C 30                  <1> 		db   '0'
   123 0001364D 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 00013650 206B696C6F62797465- <1> 		db " kilobytes", 0Dh, 0Ah, 0
   129 00013659 730D0A00            <1>
   130                              <1> VolSize_Bytes:
   131 0001365D 2062797465730D0A00  <1> 		db " bytes", 0Dh, 0Ah, 0
   132                              <1> Volume_in_drive:
   133 00013666 0D0A                <1> 		db 0Dh, 0Ah
   134                              <1> Vol_FS_Name:
   135 00013668 54522046533120      <1> 		db "TR FS1 "
   136 0001366F 566F6C756D6520696E- <1> 		db "Volume in drive "
   136 00013678 20647269766520      <1>
   137 0001367F 30                  <1> Vol_Drv_Name:   db 30h
   138 00013680 3A                  <1> 		db ":"
   139 00013681 20697320            <1> 		db " is "
   140 00013685 0D0A00              <1> 		db 0Dh, 0Ah, 0
   141                              <1> Dir_Drive_Str:
   142 00013688 54522D444F53204472- <1>                 db "TR-DOS Drive "
   142 00013691 69766520            <1>
   143                              <1> Dir_Drive_Name:
   144 00013695 303A                <1>                 db "0:"
   145 00013697 0D0A                <1>                 db  0Dh, 0Ah
   146                              <1> Vol_Str_Header:
   147 00013699 566F6C756D65204E61- <1>                 db "Volume Name: "
   147 000136A2 6D653A20            <1>
   148                              <1> Vol_Name:
   149 000136A6 00<rep 40h>         <1> 		times 64 db 0
   150 000136E6 00                  <1> 		db 0
   151                              <1> Vol_Serial_Header:
   152 000136E7 0D0A                <1> 		db 0Dh, 0Ah
   153 000136E9 566F6C756D65205365- <1> 		db "Volume Serial No: "
   153 000136F2 7269616C204E6F3A20  <1>
   154                              <1> Vol_Serial1:
   155 000136FB 30303030            <1> 		db "0000"
   156 000136FF 2D                  <1> 		db "-"
   157                              <1> Vol_Serial2:
   158 00013700 30303030            <1> 		db "0000"
   159 00013704 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 00013707 0D0A                <1> 		db 0Dh, 0Ah
   165 00013709 566F6C756D65205369- <1> 		db "Volume Size : ", 0
   165 00013712 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 00013718 467265652053706163- <1> 		db "Free Space  : ", 0
   173 00013721 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 00013727 4469726563746F7279- <1>                 db "Directory: "
   180 00013730 3A20                <1>
   181 00013732 2F                  <1> Dir_Str_Root:   db "/"
   182 00013733 00<rep 40h>         <1> Dir_Str:        times 64 db 0
   183 00013773 00000000            <1>                 dd 0
   184 00013777 00                  <1>                 db 0
   185                              <1> 
   186                              <1> Msg_Bad_Command:
   187 00013778 42616420636F6D6D61- <1>                 db "Bad command or file name!"
   187 00013781 6E64206F722066696C- <1>
   187 0001378A 65206E616D6521      <1>
   188 00013791 0D0A00              <1>                 db 0Dh, 0Ah, 0
   189                              <1> 
   190                              <1> msgl_drv_not_ready: 
   191 00013794 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 00013797 4472697665206E6F74- <1>                 db "Drive not ready or read error!"
   196 000137A0 207265616479206F72- <1>
   196 000137A9 207265616420657272- <1>
   196 000137B2 6F7221              <1>
   197 000137B5 0D0A00              <1>                 db 0Dh, 0Ah, 0
   198                              <1> 
   199                              <1> Msg_Not_Ready_Write_Err:
   200 000137B8 4472697665206E6F74- <1>                 db "Drive not ready or write error!"
   200 000137C1 207265616479206F72- <1>
   200 000137CA 207772697465206572- <1>
   200 000137D3 726F7221            <1>
   201 000137D7 0D0A00              <1>                 db 0Dh, 0Ah, 0
   202                              <1> 
   203                              <1> Msg_Dir_Not_Found:
   204 000137DA 4469726563746F7279- <1>                 db "Directory not found!"
   204 000137E3 206E6F7420666F756E- <1>
   204 000137EC 6421                <1>
   205 000137EE 0D0A00              <1>                 db 0Dh, 0Ah, 0
   206                              <1> 
   207                              <1> Msg_File_Not_Found:
   208 000137F1 46696C65206E6F7420- <1>                 db "File not found!"
   208 000137FA 666F756E6421        <1>
   209 00013800 0D0A00              <1>                 db 0Dh, 0Ah, 0
   210                              <1> 
   211                              <1> Msg_File_Directory_Not_Found:
   212 00013803 46696C65206F722064- <1>                 db "File or directory not found!"
   212 0001380C 69726563746F727920- <1>
   212 00013815 6E6F7420666F756E64- <1>
   212 0001381E 21                  <1>
   213 0001381F 0D0A00              <1>                 db 0Dh, 0Ah, 0
   214                              <1> 
   215                              <1> Msg_LongName_Not_Found:
   216 00013822 4C6F6E67206E616D65- <1>                 db "Long name not found!"
   216 0001382B 206E6F7420666F756E- <1>
   216 00013834 6421                <1>
   217 00013836 0D0A00              <1>                 db 0Dh, 0Ah, 0
   218                              <1> 
   219                              <1> beep_Insufficient_Memory: ; 20/02/2017
   220 00013839 0D0A                <1> 		db 0Dh, 0Ah
   221 0001383B 07                  <1> 		db 07h
   222                              <1> Msg_Insufficient_Memory:
   223 0001383C 496E73756666696369- <1>                 db "Insufficient memory!"
   223 00013845 656E74206D656D6F72- <1>
   223 0001384E 7921                <1>
   224 00013850 0D0A00              <1>                 db 0Dh, 0Ah, 0
   225                              <1> 
   226                              <1> Msg_Error_Code:
   227 00013853 436F6D6D616E642066- <1>                 db 'Command failed! Error code : '
   227 0001385C 61696C656421204572- <1>
   227 00013865 726F7220636F646520- <1>
   227 0001386E 3A20                <1>
   228 00013870 303068              <1> error_code_hex: db '00h'
   229 00013873 0A0A00              <1>                 db 0Ah, 0Ah, 0
   230                              <1> 
   231                              <1> align 2
   232                              <1> 
   233                              <1> ; 10/02/2016
   234                              <1> ; DIR.ASM - 09/10/2011
   235                              <1> 
   236 00013876 3C4449523E20202020- <1> Type_Dir:       db '<DIR>     ' ; 10 bytes
   236 0001387F 20                  <1>
   237                              <1> 
   238                              <1> File_Name:
   239 00013880 20<rep Ch>          <1>                 times 12 db 20h
   240 0001388C 20                  <1> 		db 20h
   241                              <1> Dir_Or_FileSize:
   242 0001388D 20<rep Ah>          <1>                 times 10 db 20h
   243 00013897 20                  <1> 		db 20h
   244                              <1> File_Attribute:
   245 00013898 20202020            <1> 		dd 20202020h
   246 0001389C 20                  <1> 		db 20h
   247                              <1> File_Day:
   248 0001389D 3030                <1>                 db '0','0'
   249 0001389F 2F                  <1> 		db '/'
   250                              <1> File_Month:
   251 000138A0 3030                <1>                 db '0','0'
   252 000138A2 2F                  <1> 		db '/'
   253                              <1> File_Year:
   254 000138A3 30303030            <1>                 db '0','0','0','0'
   255 000138A7 20                  <1> 		db 20h
   256                              <1> File_Hour:
   257 000138A8 3030                <1>                 db '0','0'
   258 000138AA 3A                  <1> 		db ':'
   259                              <1> File_Minute:
   260 000138AB 3030                <1>                 db '0','0'
   261 000138AD 00                  <1> 		db 0
   262                              <1> 
   263                              <1> Decimal_File_Count_Header:
   264 000138AE 0D0A                <1> 		db 0Dh, 0Ah
   265                              <1> Decimal_File_Count:
   266 000138B0 00<rep 6h>          <1> 		times 6 db 0
   267                              <1> 
   268 000138B6 2066696C6528732920- <1> str_files:	db " file(s) & "
   268 000138BF 2620                <1>
   269                              <1> Decimal_Dir_Count: 
   270 000138C1 00<rep 6h>          <1> 		times 6 db 0
   271                              <1> str_dirs:       
   272 000138C7 206469726563746F72- <1> 		db " directory(s) "
   272 000138D0 7928732920          <1>
   273 000138D5 0D0A00              <1> 		db 0Dh, 0Ah, 0
   274                              <1> 
   275 000138D8 206279746528732920- <1> str_bytes:	db " byte(s) in file(s)"
   275 000138E1 696E2066696C652873- <1>
   275 000138EA 29                  <1>
   276 000138EB 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 000138EE 496E76616C69642066- <1>                 db "Invalid file or directory name characters!"
   281 000138F7 696C65206F72206469- <1>
   281 00013900 726563746F7279206E- <1>
   281 00013909 616D65206368617261- <1>
   281 00013912 637465727321        <1>
   282 00013918 0D0A00              <1>         	db 0Dh, 0Ah, 0
   283                              <1> ; 21/02/2016
   284 0001391B 46696C65206F722064- <1> Msg_Name_Exists: db "File or directory name exists!"
   284 00013924 69726563746F727920- <1>
   284 0001392D 6E616D652065786973- <1>
   284 00013936 747321              <1>
   285 00013939 0D0A00              <1>                 db 0Dh, 0Ah, 0
   286                              <1> Msg_DoYouWantMkdir:
   287 0001393C 446F20796F75207761- <1>                 db "Do you want to make directory ", 0
   287 00013945 6E7420746F206D616B- <1>
   287 0001394E 65206469726563746F- <1>
   287 00013957 72792000            <1>
   288 0001395B 2028592F4E29203F20- <1> Msg_YesNo:      db " (Y/N) ? ", 0  
   288 00013964 00                  <1>
   289 00013965 000D0A00            <1> Y_N_nextline:	db 0, 0Dh, 0Ah, 0 
   290 00013969 4F4B2E0D0A00        <1> Msg_OK:		db "OK.", 0Dh, 0Ah, 0
   291                              <1> 
   292                              <1> ; 27/02/2016
   293                              <1> Msg_DoYouWantRmDir:
   294 0001396F 446F20796F75207761- <1>                 db "Do you want to delete directory ", 0
   294 00013978 6E7420746F2064656C- <1>
   294 00013981 657465206469726563- <1>
   294 0001398A 746F72792000        <1>
   295                              <1> Msg_Dir_Not_Empty:
   296 00013990 4469726563746F7279- <1>                 db "Directory not empty!"
   296 00013999 206E6F7420656D7074- <1>
   296 000139A2 7921                <1>
   297 000139A4 0D0A00              <1>                 db 0Dh, 0Ah, 0
   298                              <1> 
   299                              <1> Msg_DoYouWantDelete:
   300 000139A7 446F20796F75207761- <1>                 db "Do you want to delete file ",0
   300 000139B0 6E7420746F2064656C- <1>
   300 000139B9 6574652066696C6520- <1>
   300 000139C2 00                  <1>
   301                              <1> 
   302 000139C3 44656C657465642E2E- <1> Msg_Deleted:    db "Deleted...", 0Dh, 0Ah, 0
   302 000139CC 2E0D0A00            <1>
   303                              <1> 
   304                              <1> Msg_Permission_Denied:
   305 000139D0 07                  <1>                 db 7
   306 000139D1 5065726D697373696F- <1>                 db "Permission denied!", 0Dh, 0Ah, 0
   306 000139DA 6E2064656E69656421- <1>
   306 000139E3 0D0A00              <1>
   307                              <1> 
   308                              <1> ; 04/03/2016
   309 000139E6 4E657720            <1> Msg_New:        db "New "
   310 000139EA 00                  <1>                 db 0
   311                              <1> Str_Attributes:
   312 000139EB 417474726962757465- <1>                 db "Attributes : "
   312 000139F4 73203A20            <1>
   313 000139F8 4E4F524D414C        <1> Attr_Chars:     db "NORMAL"
   314 000139FE 00                  <1>                 db 0
   315                              <1> 
   316                              <1> ; 06/03/2016
   317                              <1> ; CMD_INTR.ASM - 16/11/2010 
   318                              <1> Msg_DoYouWantRename:
   319 000139FF 446F20796F75207761- <1>                 db "Do you want to rename ", 0
   319 00013A08 6E7420746F2072656E- <1>
   319 00013A11 616D652000          <1>
   320 00013A16 66696C652000        <1> Rename_File:    db "file ", 0
   321 00013A1C 6469726563746F7279- <1> Rename_Directory: db "directory ", 0
   321 00013A25 2000                <1>
   322 00013A27 00<rep Dh>          <1> Rename_OldName: times 13 db 0
   323 00013A34 20617320            <1> Msg_File_rename_as: db " as "
   324 00013A38 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 00013A45 4E6F742073616D6520- <1>                 db "Not same drive!" 
   329 00013A4E 647269766521        <1>
   330 00013A54 0D0A00              <1>                 db 0Dh, 0Ah, 0 
   331                              <1> 
   332                              <1> Msg_DoYouWantMoveFile:
   333 00013A57 446F20796F75207761- <1>                 db "Do you want to move file", 0
   333 00013A60 6E7420746F206D6F76- <1>
   333 00013A69 652066696C6500      <1>
   334                              <1> 
   335                              <1> msg_insufficient_disk_space:
   336 00013A70 496E73756666696369- <1>                 db "Insufficient disk space!" 
   336 00013A79 656E74206469736B20- <1>
   336 00013A82 737061636521        <1>
   337 00013A88 0D0A00              <1>                 db 0Dh, 0Ah, 0
   338                              <1> 
   339                              <1> ; 01/08/2010
   340                              <1> msg_source_file: 
   341 00013A8B 0D0A536F7572636520- <1> 		db 0Dh, 0Ah, "Source file name      :   "
   341 00013A94 66696C65206E616D65- <1>
   341 00013A9D 2020202020203A2020- <1>
   341 00013AA6 20                  <1>
   342                              <1> msg_source_file_drv: 
   343 00013AA7 203A00              <1> 		db " :", 0
   344                              <1> msg_destination_file: 
   345 00013AAA 0D0A44657374696E61- <1> 		db 0Dh, 0Ah, "Destination file name :   "
   345 00013AB3 74696F6E2066696C65- <1>
   345 00013ABC 206E616D65203A2020- <1>
   345 00013AC5 20                  <1>
   346                              <1> msg_destination_file_drv: 
   347 00013AC6 203A00              <1> 		db " :", 0
   348                              <1> msg_copy_nextline: 
   349 00013AC9 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 00013ACC 446F20796F75207761- <1>                 db "Do you want to overwrite file ",0
   355 00013AD5 6E7420746F206F7665- <1>
   355 00013ADE 727772697465206669- <1>
   355 00013AE7 6C652000            <1>
   356                              <1>   
   357                              <1> Msg_DoYouWantCopyFile:
   358 00013AEB 446F20796F75207761- <1>                 db "Do you want to copy file",0
   358 00013AF4 6E7420746F20636F70- <1>
   358 00013AFD 792066696C6500      <1>
   359                              <1> 
   360                              <1> Msg_read_file_error_before_EOF:
   361 00013B04 46696C652072656164- <1> 		db "File reading error! (before EOF)"
   361 00013B0D 696E67206572726F72- <1>
   361 00013B16 2120286265666F7265- <1>
   361 00013B1F 20454F4629          <1>
   362 00013B24 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 00013B27 52656164696E672E2E- <1> 		db "Reading... ", 0
   367 00013B30 2E2000              <1>
   368                              <1> msg_writing:
   369 00013B33 57726974696E672E2E- <1> 		db "Writing... ", 0
   369 00013B3C 2E2000              <1>
   370                              <1> percentagestr:
   371 00013B3F 2020202500          <1> 		db "   %", 0  ; "  0%" .. "100%"
   372                              <1> ; 11/04/2016
   373                              <1> Msg_No_Set_Space:
   374 00013B44 496E73756666696369- <1>                 db "Insufficient environment space!"
   374 00013B4D 656E7420656E766972- <1>
   374 00013B56 6F6E6D656E74207370- <1>
   374 00013B5F 61636521            <1>
   375 00013B63 0D0A00              <1>                 db 0Dh, 0Ah, 0
   376                              <1> ; 18/04/2016
   377                              <1> isc_msg:	
   378 00013B66 0D0A                <1> 		db 0Dh, 0Ah
   379 00013B68 494E56414C49442053- <1> 		db "INVALID SYSTEM CALL", 0
   379 00013B71 595354454D2043414C- <1>
   379 00013B7A 4C00                <1>
   380                              <1> usi_msg:
   381 00013B7C 0D0A                <1> 		db 0Dh, 0Ah
   382 00013B7E 554E444546494E4544- <1> 		db "UNDEFINED SOFTWARE INTERRUPT", 0
   382 00013B87 20534F465457415245- <1>
   382 00013B90 20494E544552525550- <1>
   382 00013B99 5400                <1>
   383                              <1> ifc_msg:
   384 00013B9B 0D0A                <1> 		db 0Dh, 0Ah
   385 00013B9D 494E56414C49442046- <1> 		db "INVALID FUNCTION CALL"
   385 00013BA6 554E4354494F4E2043- <1>
   385 00013BAF 414C4C              <1>
   386                              <1> inv_msg_for_trdos_v2:
   387 00013BB2 20                  <1> 		db 20h
   388 00013BB3 666F72205452444F53- <1> 		db "for TRDOS v2!"
   388 00013BBC 20763221            <1>
   389 00013BC0 07                  <1> 		db 07h
   390 00013BC1 0D0A                <1> 		db 0Dh, 0Ah
   391 00013BC3 0D0A                <1> 		db 0Dh, 0Ah
   392 00013BC5 494E5420            <1> 		db "INT "
   393 00013BC9 303068              <1> int_num_str:	db "00h"
   394 00013BCC 0D0A                <1> 		db 0Dh, 0Ah
   395 00013BCE 454158203A20        <1> 		db "EAX : "
   396 00013BD4 303030303030303068- <1> eax_str:	db "00000000h", 0Dh, 0Ah
   396 00013BDD 0D0A                <1>
   397 00013BDF 454950203A20        <1> 		db "EIP : "
   398 00013BE5 303030303030303068- <1> eip_str:	db "00000000h", 0Dh, 0Ah, 0
   398 00013BEE 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 00013BF1 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 00013BF2 000000010203000400- <1> 	db  0,0,0,1,2,3,0,4,0,5,6,7,8,9,0,0
   618 00013BFB 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 00013C02 00020406C0C4C8CC    <1> dma_adr:	db 0,2,4,6,0C0h,0C4h,0C8h,0CCh
   625 00013C0A 01030507C2C6CACE    <1> dma_cnt:	db 1,3,5,7,0C2h,0C6h,0CAh,0CEh
   626 00013C12 878381828F8B898A    <1> dma_page:	db 87h,83h,81h,82h,8Fh,8Bh,89h,8Ah ; 03/08/2017
   627 00013C1A 0A0A0A0AD4D4D4D4    <1> dma_mask:	db 0Ah,0Ah,0Ah,0Ah,0D4h,0D4h,0D4h,0D4h
   628 00013C22 0B0B0B0BD6D6D6D6    <1> dma_mod:	db 0Bh,0Bh,0Bh,0Bh,0D6h,0D6h,0D6h,0D6h
   629 00013C2A 0C0C0C0CD8D8D8D8    <1> dma_flip:	db 0Ch,0Ch,0Ch,0Ch,0D8h,0D8h,0D8h,0D8h	
  3439                                  
  3440                                  ; 27/08/2014
  3441                                  scr_row:
  3442 00013C32 E0810B00                	dd 0B8000h + 0A0h + 0A0h + 0A0h ; Row 3
  3443                                  scr_col:
  3444 00013C36 00000000                	dd 0
  3445                                  
  3446 00013C3A 90<rep 2h>              Align 4
  3447                                  	; 15/04/2016
  3448                                  	; TRDOS 386 (TRDOS v2.0)
  3449                                  
  3450                                  	; 21/08/2014
  3451                                  ilist:
  3452                                  	;times 	32 dd cpu_except ; INT 0 to INT 1Fh
  3453                                  	;
  3454                                  	; Exception list
  3455                                  	; 25/08/2014	
  3456 00013C3C [1E0C0000]              	dd	exc0	; 0h,  Divide-by-zero Error
  3457 00013C40 [250C0000]              	dd	exc1	
  3458 00013C44 [2C0C0000]              	dd 	exc2	
  3459 00013C48 [330C0000]              	dd	exc3	
  3460 00013C4C [370C0000]              	dd	exc4	
  3461 00013C50 [3B0C0000]              	dd	exc5	
  3462 00013C54 [3F0C0000]              	dd 	exc6	; 06h,  Invalid Opcode
  3463 00013C58 [430C0000]              	dd	exc7	
  3464 00013C5C [470C0000]              	dd	exc8	
  3465 00013C60 [4B0C0000]              	dd	exc9	
  3466 00013C64 [4F0C0000]              	dd 	exc10	
  3467 00013C68 [530C0000]              	dd	exc11
  3468 00013C6C [570C0000]              	dd	exc12
  3469 00013C70 [5B0C0000]              	dd	exc13	; 0Dh, General Protection Fault
  3470 00013C74 [5F0C0000]              	dd 	exc14	; 0Eh, Page Fault
  3471 00013C78 [630C0000]              	dd	exc15
  3472 00013C7C [670C0000]              	dd	exc16
  3473 00013C80 [6B0C0000]              	dd	exc17
  3474 00013C84 [6F0C0000]              	dd 	exc18
  3475 00013C88 [730C0000]              	dd	exc19
  3476 00013C8C [770C0000]              	dd 	exc20
  3477 00013C90 [7B0C0000]              	dd	exc21
  3478 00013C94 [7F0C0000]              	dd	exc22
  3479 00013C98 [830C0000]              	dd	exc23
  3480 00013C9C [870C0000]              	dd 	exc24
  3481 00013CA0 [8B0C0000]              	dd	exc25
  3482 00013CA4 [8F0C0000]              	dd	exc26
  3483 00013CA8 [930C0000]              	dd	exc27
  3484 00013CAC [970C0000]              	dd 	exc28
  3485 00013CB0 [9B0C0000]              	dd	exc29
  3486 00013CB4 [9F0C0000]              	dd 	exc30
  3487 00013CB8 [A30C0000]              	dd	exc31
  3488                                  IRQ_list: ; 28/02/2017 ('syscalbac')
  3489                                  	; Interrupt list
  3490 00013CBC [88090000]              	dd	timer_int	; INT 20h
  3491                                  		;dd	irq0	
  3492 00013CC0 [ED100000]              	dd	kb_int		; 24/01/2016
  3493                                  		;dd	irq1
  3494 00013CC4 [740B0000]              	dd	irq2
  3495                                  		; COM2 int
  3496 00013CC8 [780B0000]              	dd	irq3
  3497                                  		; COM1 int
  3498 00013CCC [830B0000]              	dd	irq4
  3499 00013CD0 [8E0B0000]              	dd	irq5
  3500                                  ;DISKETTE_INT: ;06/02/2015
  3501 00013CD4 [5A4E0000]              	dd	fdc_int		; 16/02/2015, IRQ 6 handler	
  3502                                  		;dd	irq6
  3503                                  ; Default IRQ 7 handler against spurious IRQs (from master PIC)
  3504                                  ; 25/02/2015 (source: http://wiki.osdev.org/8259_PIC)
  3505 00013CD8 [FA0E0000]              	dd	default_irq7	; 25/02/2015
  3506                                  		;dd	irq7
  3507                                  ; Real Time Clock Interrupt
  3508 00013CDC [FC0A0000]              	dd	rtc_int		; 23/02/2015, IRQ 8 handler
  3509                                  		;dd	irq8	; INT 28h
  3510 00013CE0 [9E0B0000]              	dd	irq9
  3511 00013CE4 [A20B0000]              	dd	irq10
  3512 00013CE8 [A60B0000]              	dd	irq11
  3513 00013CEC [AA0B0000]              	dd	irq12
  3514 00013CF0 [AE0B0000]              	dd	irq13
  3515                                  ;HDISK_INT1:  ;06/02/2015 	
  3516 00013CF4 [99570000]              	dd	hdc1_int 	; 21/02/2015, IRQ 14 handler		
  3517                                  		;dd	irq14
  3518                                  ;HDISK_INT2:  ;06/02/2015
  3519 00013CF8 [BC570000]              	dd	hdc2_int 	; 21/02/2015, IRQ 15 handler		
  3520                                  		;dd	irq15	; INT 2Fh
  3521                                  		; 14/08/2015
  3522                                  	;dd	sysent		; INT 30h (system calls)
  3523                                  
  3524                                  	; 15/04/2016
  3525                                  	; TRDOS 386(TRDOS v2.0) Software Interrupts
  3526                                  
  3527 00013CFC [593D0100]              	dd	int30h		; Reserved for
  3528                                  				; !!! Retro UNIX (RUNIX) !!!
  3529                                  				; !!! SINGLIX !!! System Calls
  3530 00013D00 [7C170000]              	dd	int31h		; Video BIOS (IBM PC/AT, Int 10h)
  3531 00013D04 [490F0000]              	dd	int32h		; Keyboard Functions (IBM PC/AT, Int 16h)
  3532 00013D08 [FC4E0000]              	dd	int33h		; DISK I/O (IBM PC/AT, Int 13h)
  3533 00013D0C [DD210100]              	dd	int34h		; #IOCTL# (I/O port access support for ring 3)
  3534 00013D10 [9F620000]              	dd	int35h		; Time/Date Functions (IBM PC/AT, Int 1Ah)
  3535 00013D14 [AE0D0000]              	dd	ignore_int	; INT 36h : Timer Functions	
  3536 00013D18 [AE0D0000]              	dd	ignore_int	; INT 37h	
  3537 00013D1C [AE0D0000]              	dd	ignore_int	; INT 38h
  3538 00013D20 [AE0D0000]              	dd	ignore_int	; INT 39h
  3539 00013D24 [AE0D0000]              	dd	ignore_int	; INT 3Ah	
  3540 00013D28 [AE0D0000]              	dd	ignore_int	; INT 3Bh
  3541 00013D2C [AE0D0000]              	dd	ignore_int	; INT 3Ch
  3542 00013D30 [AE0D0000]              	dd	ignore_int	; INT 3Dh	
  3543 00013D34 [AE0D0000]              	dd	ignore_int	; INT 3Eh
  3544 00013D38 [AE0D0000]              	dd	ignore_int	; INT 3Fh
  3545 00013D3C [E8CC0000]              	dd	sysent		; INT 40h : !!! TRDOS 386 System Calls !!!
  3546                                  	;dd	ignore_int
  3547 00013D40 00000000                	dd	0
  3548                                  
  3549                                  ; 20/08/2014
  3550                                    ; /* This is the default interrupt "handler" :-) */ 
  3551                                    ; Linux v0.12 (head.s)
  3552                                  int_msg:
  3553 00013D44 556E6B6E6F776E2069-     	db "Unknown interrupt ! ", 0
  3553 00013D4D 6E7465727275707420-
  3553 00013D56 212000             
  3554                                  
  3555                                  ; 15/04/2016
  3556                                  ; TRDOS 386 (TRDOS v2.0)
  3557                                  
  3558                                  ; 29/04/2016
  3559                                  int30h:
  3560                                  trdos_isc_routine:
  3561                                  	; 02/05/2016
  3562                                  	; 01/05/2016
  3563                                  	; 29/04/2016
  3564                                  	; 18/04/2016
  3565                                  	; 15/04/2016 (TRDOS 386 = TRDOS v2.0)
  3566                                  	; 17/04/2011 (TRDOS v1.0, 'IFC.ASM')
  3567                                  	; 03/02/2011 ('trdos_ifc_routine')
  3568                                  	;
  3569 00013D59 8B1C24                  	mov	ebx, [esp] ; EIP (next)
  3570 00013D5C 83EB02                  	sub	ebx, 2 ; EIP (CD ##h)
  3571                                  
  3572 00013D5F 89C1                    	mov	ecx, eax
  3573 00013D61 8A4301                  	mov	al, [ebx+1] ; CDh ##h
  3574                                  
  3575 00013D64 66BA1000                	mov	dx, KDATA
  3576 00013D68 8EDA                    	mov	ds, dx
  3577 00013D6A 8EC2                    	mov	es, dx
  3578                                  
  3579 00013D6C FC                      	cld
  3580 00013D6D 8B15[F07C0100]          	mov	edx, [k_page_dir]
  3581 00013D73 0F22DA                  	mov	cr3, edx
  3582                                  
  3583 00013D76 E8FA03FFFF              	call	bytetohex
  3584 00013D7B 66A3[C93B0100]          	mov	[int_num_str], ax
  3585                                  
  3586 00013D81 89D8                    	mov	eax, ebx ; EIP
  3587 00013D83 E82D04FFFF              	call	dwordtohex
  3588 00013D88 8915[E53B0100]          	mov	[eip_str], edx
  3589 00013D8E A3[E93B0100]            	mov	[eip_str+4], eax
  3590                                  
  3591 00013D93 89C8                    	mov	eax, ecx
  3592 00013D95 E81B04FFFF              	call	dwordtohex
  3593 00013D9A 8915[D43B0100]          	mov	[eax_str], edx
  3594 00013DA0 A3[D83B0100]            	mov	[eax_str+4], eax 	
  3595                                  
  3596 00013DA5 43                      	inc	ebx
  3597 00013DA6 8A03                    	mov	al, [ebx] ; Interrupt number
  3598                                  
  3599                                  trdos_isc_handler:
  3600 00013DA8 80FE30                  	cmp	dh, 30h ; Retro UNIX, SINGLIX System calls
  3601 00013DAB 7507                    	jne	short trdos_usi_handler
  3602 00013DAD BE[663B0100]            	mov	esi, isc_msg
  3603 00013DB2 EB05                    	jmp	short loc_write_inv_system_call_msg
  3604                                  
  3605                                  trdos_usi_handler:
  3606 00013DB4 BE[7C3B0100]            	mov	esi, usi_msg
  3607                                  
  3608                                  loc_write_inv_system_call_msg:
  3609 00013DB9 E8AC2FFFFF              	call	print_msg
  3610                                  	; 29/04/2016
  3611 00013DBE BE[B23B0100]            	mov	esi, inv_msg_for_trdos_v2
  3612 00013DC3 E8A22FFFFF              	call	print_msg
  3613                                  
  3614                                  loc_ifc_terminate_process:
  3615                                  	; u.uno = process number
  3616                                  	; 29/04/2016
  3617                                  
  3618                                  	; 02/05/2016
  3619 00013DC8 FE05[A0940100]          	inc	byte [sysflg] ; 0FFh -> 0
  3620                                  
  3621 00013DCE B801000000              	mov	eax, 1
  3622 00013DD3 E90692FFFF              	jmp	sysexit
  3623                                  
  3624                                  ; 07/03/2015
  3625                                  ; Temporary Code
  3626                                  display_disks:
  3627 00013DD8 803D[3C660000]00        	cmp 	byte [fd0_type], 0
  3628 00013DDF 7605                    	jna 	short ddsks1
  3629 00013DE1 E87D000000              	call	pdskm
  3630                                  ddsks1:
  3631 00013DE6 803D[3D660000]00        	cmp	byte [fd1_type], 0
  3632 00013DED 760C                    	jna	short ddsks2
  3633 00013DEF C605[333F0100]31        	mov	byte [dskx], '1'
  3634 00013DF6 E868000000              	call	pdskm
  3635                                  ddsks2:
  3636 00013DFB 803D[3E660000]00        	cmp	byte [hd0_type], 0
  3637 00013E02 7654                    	jna	short ddsk6
  3638 00013E04 66C705[313F0100]68-     	mov	word [dsktype], 'hd'
  3638 00013E0C 64                 
  3639 00013E0D C605[333F0100]30        	mov	byte [dskx], '0'
  3640 00013E14 E84A000000              	call	pdskm
  3641                                  ddsks3:
  3642 00013E19 803D[3F660000]00        	cmp	byte [hd1_type], 0
  3643 00013E20 7636                    	jna	short ddsk6
  3644 00013E22 C605[333F0100]31        	mov	byte [dskx], '1'
  3645 00013E29 E835000000              	call	pdskm
  3646                                  ddsks4:
  3647 00013E2E 803D[40660000]00        	cmp	byte [hd2_type], 0
  3648 00013E35 7621                    	jna	short ddsk6
  3649 00013E37 C605[333F0100]32        	mov	byte [dskx], '2'
  3650 00013E3E E820000000              	call	pdskm
  3651                                  ddsks5:
  3652 00013E43 803D[41660000]00        	cmp	byte [hd3_type], 0
  3653 00013E4A 760C                    	jna	short ddsk6
  3654 00013E4C C605[333F0100]33        	mov	byte [dskx], '3'
  3655 00013E53 E80B000000              	call	pdskm
  3656                                  ddsk6:
  3657 00013E58 BE[5B3F0100]            	mov	esi, nextline
  3658 00013E5D E806000000              	call	pdskml
  3659                                  pdskm_ok:
  3660 00013E62 C3                      	retn
  3661                                  pdskm:
  3662 00013E63 BE[2F3F0100]            	mov	esi, dsk_ready_msg
  3663                                  pdskml:	
  3664 00013E68 AC                      	lodsb
  3665 00013E69 08C0                    	or	al, al
  3666 00013E6B 74F5                    	jz	short pdskm_ok
  3667 00013E6D 56                      	push	esi
  3668                                  	; 13/05/2016
  3669 00013E6E BB07000000                      mov     ebx, 7  ; Black background, 
  3670                                  			; light gray forecolor
  3671                                  			; Video page 0 (bh=0)
  3672 00013E73 E81DE4FEFF              	call	_write_tty
  3673 00013E78 5E                      	pop	esi
  3674 00013E79 EBED                    	jmp	short pdskml
  3675                                  
  3676 00013E7B 90                      Align 2
  3677                                  	; 21/08/2014
  3678                                  exc_msg:
  3679 00013E7C 435055206578636570-     	db "CPU exception ! "
  3679 00013E85 74696F6E202120     
  3680                                  excnstr: 		; 25/08/2014
  3681 00013E8C 3F3F68202045495020-     	db "??h", "  EIP : "
  3681 00013E95 3A20               
  3682                                  EIPstr: ; 29/08/2014
  3683 00013E97 00<rep Ch>              	times 12 db 0
  3684                                  
  3685                                  	; 23/02/2015
  3686                                  	; 25/08/2014
  3687                                  ;scounter:
  3688                                  ;	db 5
  3689                                  ;	db 19
  3690                                  
  3691                                  ; 06/11/2014
  3692                                  ; Memory Information message
  3693                                  ; 14/08/2015
  3694                                  msg_memory_info:
  3695 00013EA3 07                      	db	07h
  3696 00013EA4 0D0A                    	db	0Dh, 0Ah
  3697                                  	;db 	"MEMORY ALLOCATION INFO", 0Dh, 0Ah, 0Dh, 0Ah
  3698 00013EA6 546F74616C206D656D-     	db	"Total memory : "
  3698 00013EAF 6F7279203A20       
  3699                                  mem_total_b_str: ; 10 digits
  3700 00013EB5 303030303030303030-     	db	"0000000000 bytes", 0Dh, 0Ah
  3700 00013EBE 302062797465730D0A 
  3701 00013EC7 202020202020202020-     	db	"               ", 20h, 20h, 20h
  3701 00013ED0 202020202020202020 
  3702                                  mem_total_p_str: ; 7 digits
  3703 00013ED9 303030303030302070-     	db	"0000000 pages", 0Dh, 0Ah
  3703 00013EE2 616765730D0A       
  3704 00013EE8 0D0A                    	db 	0Dh, 0Ah
  3705 00013EEA 46726565206D656D6F-     	db	"Free memory  : "
  3705 00013EF3 727920203A20       
  3706                                  free_mem_b_str:  ; 10 digits
  3707 00013EF9 3F3F3F3F3F3F3F3F3F-     	db	"?????????? bytes", 0Dh, 0Ah
  3707 00013F02 3F2062797465730D0A 
  3708 00013F0B 202020202020202020-     	db	"               ", 20h, 20h, 20h
  3708 00013F14 202020202020202020 
  3709                                  free_mem_p_str:  ; 7 digits
  3710 00013F1D 3F3F3F3F3F3F3F2070-     	db	"??????? pages", 0Dh, 0Ah
  3710 00013F26 616765730D0A       
  3711 00013F2C 0D0A00                  	db	0Dh, 0Ah, 0
  3712                                  
  3713                                  dsk_ready_msg:
  3714 00013F2F 0D0A                    	db 	0Dh, 0Ah
  3715                                  dsktype:
  3716 00013F31 6664                    	db	'fd'
  3717                                  dskx:
  3718 00013F33 30                      	db	'0'
  3719 00013F34 20                      	db	20h
  3720 00013F35 697320524541445920-     	db 	'is READY ...'
  3720 00013F3E 2E2E2E             
  3721 00013F41 00                      	db 	0
  3722                                  
  3723                                  setup_error_msg:
  3724 00013F42 0D0A                    	db	0Dh, 0Ah
  3725 00013F44 4469736B2053657475-     	db	'Disk Setup Error !' 
  3725 00013F4D 70204572726F722021 
  3726 00013F56 0D0A00                  	db	0Dh, 0Ah,0
  3727                                  
  3728                                  next2line: ; 08/02/2016
  3729 00013F59 0D0A                    	db	0Dh, 0Ah
  3730                                  nextline:
  3731 00013F5B 0D0A00                  	db 	0Dh, 0Ah, 0
  3732                                  
  3733                                  ; temporary
  3734                                  ; 19/12/2020
  3735                                  msg_lfb_addr:
  3736                                  	;db	0Dh, 0Ah
  3737 00013F5E 4C696E656172206672-     	db	"Linear frame buffer at "
  3737 00013F67 616D65206275666665-
  3737 00013F70 7220617420         
  3738                                  lfb_addr_str: ; 8 (hex) digits
  3739 00013F75 303030303030303068-     	db	"00000000h", 0Dh, 0Ah
  3739 00013F7E 0D0A               
  3740 00013F80 0D0A00                  	db	0Dh, 0Ah, 0
  3741                                  
  3742                                  ; KERNEL - SYSINIT Messages
  3743                                  ; 24/08/2015
  3744                                  ; 13/04/2015 - (Retro UNIX 386 v1 Beginning)
  3745                                  ; 14/07/2013
  3746                                  ;kernel_init_err_msg:
  3747                                  ;	db 0Dh, 0Ah
  3748                                  ;	db 07h
  3749                                  ;	db 'Kernel initialization ERROR !'
  3750                                  ;	db 0Dh, 0Ah, 0 
  3751                                  
  3752                                  ;welcome_msg: 
  3753                                  ;	db 0Dh, 0Ah
  3754                                  ;	db 07h
  3755                                  ;	db 'Welcome to TRDOS 386 Operating System !'
  3756                                  ;	db 0Dh, 0Ah
  3757                                  ;	db 'by Erdogan Tan - 31/12/2017 (v2.0.0)'
  3758                                  ;	db 0Dh, 0Ah, 0
  3759                                  
  3760                                  panic_msg:
  3761 00013F83 0D0A07                  	db 0Dh, 0Ah, 07h
  3762 00013F86 4552524F523A204B65-     	db 'ERROR: Kernel Panic !'
  3762 00013F8F 726E656C2050616E69-
  3762 00013F98 632021             
  3763 00013F9B 0D0A00                  	db 0Dh, 0Ah, 0
  3764                                  
  3765                                  ;msgl_drv_not_ready: 
  3766                                  ;	db 07h, 0Dh, 0Ah
  3767                                  ;       db 'Drive not ready or read error !'
  3768                                  ;       db 0Dh, 0Ah, 0
  3769                                  
  3770                                  starting_msg:
  3771                                  	;;;;;;;db "Turkish Rational DOS v2.0 [18/04/2021] ...", 0
  3772                                  	;;;;;;db "Turkish Rational DOS v2.0 [11/08/2022] ...", 0
  3773                                  	;;;;;db "Turkish Rational DOS v2.0 [30/08/2023] ...", 0
  3774                                  	;;;;db "Turkish Rational DOS v2.0 [07/12/2023] ...", 0
  3775                                  	;;;db "Turkish Rational DOS v2.0 [23/06/2024] ...", 0
  3776                                  	;;db "Turkish Rational DOS v2.0 [29/12/2024] ...", 0
  3777                                  	;db "Turkish Rational DOS v2.0 [28/01/2025] ...", 0
  3778 00013F9E 5475726B6973682052-     	db "Turkish Rational DOS v2.0 [25/07/2025] ...", 0
  3778 00013FA7 6174696F6E616C2044-
  3778 00013FB0 4F532076322E30205B-
  3778 00013FB9 32352F30372F323032-
  3778 00013FC2 355D202E2E2E00     
  3779                                  
  3780                                  NextLine:
  3781 00013FC9 0D0A00                  	db 0Dh, 0Ah, 0
  3782                                  
  3783                                  %include 'audio.s' ; 03/04/2017
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.10 - audio.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 28/01/2025  (Previous: 06/06/2024 - Kernel v2.0.9)
     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 00013FCC BE[EF4D0100]        <1> 	mov	esi, valid_ids	; address of Valid ICH (AC97) Device IDs
   314 00013FD1 B915000000          <1> 	mov	ecx, valid_id_count
   315                              <1> pfd_1:
   316 00013FD6 AD                  <1> 	lodsd
   317 00013FD7 E857000000          <1> 	call	pciFindDevice
   318 00013FDC 730F                <1> 	jnc	short d_ac97_1
   319 00013FDE E2F6                <1> 	loop	pfd_1
   320                              <1> 	;stc
   321                              <1> 
   322                              <1> d_ac97_0:
   323                              <1> ; couldn't find the audio device!
   324 00013FE0 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 00013FE1 B806115930          <1> 	mov     eax, (VT8233_DID << 16) + VIA_VID
   338 00013FE6 E848000000          <1>         call    pciFindDevice
   339                              <1> ;       jnc     short d_vt8233_0
   340                              <1> ; couldn't find the audio device!
   341                              <1> ;	retn
   342 00013FEB 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 00013FED A3[308F0100]        <1> 	mov	[audio_dev_id], eax
   359 00013FF2 8915[348F0100]      <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 00013FF8 B010                <1> 	mov	al, PCI_IO_BASE ; IO base address register (10h)
   372                              <1> 	;mov	al, NAMBAR_REG	; Native Audio Mixer BAR (10h)
   373 00013FFA E8BF000000          <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 00013FFF 66813D[348F0100]06- <1> 	cmp	word [audio_vendor], VIA_VID	; 1106h ; VT8233-VT8237R 
   382 00014007 11                  <1>
   383 00014008 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 0001400A 80E2FE              <1> 	and	dl, 0FEh
   388 0001400D 668915[2C8F0100]    <1> 	mov	[NAMBAR], dx
   389                              <1> 
   390 00014014 B014                <1> 	mov	al, NABMBAR_REG ; Native Audio Bus Mastering BAR (14h)
   391 00014016 E8A3000000          <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 0001401B 80E2C0              <1> 	and	dl, 0C0h
   407 0001401E 668915[2E8F0100]    <1>         mov     [audio_io_base], dx
   408                              <1> 
   409                              <1> d_ac97_2:
   410                              <1> 	; 10/06/2017
   411 00014025 B03C                <1> 	mov	al, AC97_INT_LINE ; Interrupt Line Register (3Ch)
   412                              <1> 	;call	pciRegRead32
   413 00014027 E87F000000          <1> 	call	pciRegRead8
   414                              <1> 
   415                              <1> 	;;and 	edx, 0FFh
   416                              <1> 	; 06/08/2022
   417                              <1> 	;and	dx, 0FFh
   418                              <1> 
   419 0001402C 8815[2A8F0100]      <1> 	mov     [audio_intr], dl
   420                              <1> 
   421 00014032 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                              <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 00014033 89C3                <1> 	mov	ebx, eax
   507                              <1> 	;mov	edi, (80000000h - 100h)	; start with bus 0, dev 0 func 0
   508 00014035 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 0001403A 89F8                <1> 	mov 	eax, edi		; read PCI registers
   516 0001403C E87D000000          <1> 	call	pciRegRead32
   517                              <1> 	; 19/11/2023
   518 00014041 39DA                <1> 	cmp	edx, ebx
   519                              <1> 	;cmp	edx, esi		; found device?
   520                              <1> 	;jne	short nextPCIdevice
   521                              <1> 	;;clc
   522 00014043 7412                <1> 	je	short PCIScanExit	; found
   523                              <1> 	; 19/11/2023
   524 00014045 81FF00F8FF80        <1> 	cmp	edi, 80FFF800h
   525 0001404B 7308                <1> 	jnb	short pfd_nf		; not found
   526 0001404D 81C700010000        <1> 	add	edi, 100h
   527 00014053 EBE5                <1> 	jmp	short nextPCIdevice
   528                              <1> pfd_nf:
   529 00014055 F9                  <1> 	stc
   530 00014056 C3                  <1> 	retn
   531                              <1> PCIScanExit:
   532                              <1> 	;pushf
   533 00014057 B8FFFFFF7F          <1> 	mov	eax, NOT_BIT31 	; 19/03/2017
   534 0001405C 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 0001405E 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 0001405F 53                  <1> 	push	ebx
   567 00014060 51                  <1> 	push	ecx
   568 00014061 89C3                <1>         mov     ebx, eax		; save eax, dh
   569 00014063 88F1                <1>         mov     cl, dh
   570                              <1> 
   571 00014065 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; clear out data size request
   572 0001406A 0D00000080          <1>         or      eax, BIT31		; make a PCI access request
   573 0001406F 24FC                <1>         and     al, ~3 ; NOT 3		; force index to be dword
   574                              <1> 
   575 00014071 66BAF80C            <1>         mov     dx, PCI_INDEX_PORT
   576 00014075 EF                  <1>         out	dx, eax			; write PCI selector
   577                              <1> 	
   578 00014076 66BAFC0C            <1>         mov     dx, PCI_DATA_PORT
   579 0001407A 88D8                <1>         mov     al, bl
   580 0001407C 2403                <1>         and     al, 3			; figure out which port to
   581 0001407E 00C2                <1>         add     dl, al			; read to
   582                              <1> 
   583 00014080 F7C3000000C0        <1> 	test    ebx, PCI32+PCI16
   584 00014086 7507                <1>         jnz     short _pregr0
   585 00014088 EC                  <1> 	in	al, dx			; return 8 bits of data
   586 00014089 88C2                <1>         mov	dl, al
   587 0001408B 88CE                <1> 	mov     dh, cl			; restore dh for 8 bit read
   588 0001408D EB12                <1> 	jmp	short _pregr2
   589                              <1> _pregr0:	
   590 0001408F F7C300000080        <1> 	test    ebx, PCI32
   591 00014095 7507                <1>         jnz	short _pregr1
   592 00014097 66ED                <1> 	in	ax, dx
   593 00014099 6689C2              <1>         mov     dx, ax			; return 16 bits of data
   594 0001409C EB03                <1> 	jmp	short _pregr2
   595                              <1> _pregr1:
   596 0001409E ED                  <1> 	in	eax, dx			; return 32 bits of data
   597 0001409F 89C2                <1> 	mov	edx, eax
   598                              <1> _pregr2:
   599 000140A1 89D8                <1> 	mov     eax, ebx		; restore eax
   600 000140A3 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; clear out data size request
   601 000140A8 59                  <1> 	pop	ecx
   602 000140A9 5B                  <1> 	pop	ebx
   603 000140AA C3                  <1> 	retn
   604                              <1> 
   605                              <1> pciRegRead8:
   606 000140AB 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; set up 8 bit read size
   607 000140B0 EBAD                <1>         jmp     short pciRegRead	; call generic PCI access
   608                              <1> 
   609                              <1> pciRegRead16:
   610 000140B2 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; set up 16 bit read size
   611 000140B7 0D00000040          <1>         or      eax, PCI16		; call generic PCI access
   612 000140BC EBA1                <1>         jmp     short pciRegRead
   613                              <1> 
   614                              <1> pciRegRead32:
   615 000140BE 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; set up 32 bit read size
   616 000140C3 0D00000080          <1>         or      eax, PCI32		; call generic PCI access
   617 000140C8 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 000140CA 53                  <1> 	push	ebx
   638 000140CB 51                  <1> 	push	ecx
   639 000140CC 89C3                <1>         mov     ebx, eax		; save eax, edx
   640 000140CE 89D1                <1>         mov     ecx, edx
   641 000140D0 25FFFFFF3F          <1> 	and     eax, NOT_PCI32_PCI16	; clear out data size request
   642 000140D5 0D00000080          <1>         or      eax, BIT31		; make a PCI access request
   643 000140DA 24FC                <1>         and     al, ~3 ; NOT 3		; force index to be dword
   644                              <1> 
   645 000140DC 66BAF80C            <1>         mov     dx, PCI_INDEX_PORT
   646 000140E0 EF                  <1>         out	dx, eax			; write PCI selector
   647                              <1> 	
   648 000140E1 66BAFC0C            <1>         mov     dx, PCI_DATA_PORT
   649 000140E5 88D8                <1>         mov     al, bl
   650 000140E7 2403                <1>         and     al, 3			; figure out which port to
   651 000140E9 00C2                <1>         add     dl, al			; write to
   652                              <1> 
   653 000140EB F7C3000000C0        <1> 	test    ebx, PCI32+PCI16
   654 000140F1 7505                <1>         jnz     short _pregw0
   655 000140F3 88C8                <1> 	mov	al, cl 			; put data into al
   656 000140F5 EE                  <1> 	out	dx, al
   657 000140F6 EB12                <1> 	jmp	short _pregw2
   658                              <1> _pregw0:
   659 000140F8 F7C300000080        <1> 	test    ebx, PCI32
   660 000140FE 7507                <1>         jnz     short _pregw1
   661 00014100 6689C8              <1> 	mov	ax, cx			; put data into ax
   662 00014103 66EF                <1> 	out	dx, ax
   663 00014105 EB03                <1> 	jmp	short _pregw2
   664                              <1> _pregw1:
   665 00014107 89C8                <1> 	mov	eax, ecx		; put data into eax
   666 00014109 EF                  <1> 	out	dx, eax
   667                              <1> _pregw2:
   668 0001410A 89D8                <1>         mov     eax, ebx		; restore eax
   669 0001410C 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; clear out data size request
   670 00014111 89CA                <1>         mov     edx, ecx		; restore dx
   671 00014113 59                  <1> 	pop	ecx
   672 00014114 5B                  <1> 	pop	ebx
   673 00014115 C3                  <1> 	retn
   674                              <1> 
   675                              <1> pciRegWrite8:
   676 00014116 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; set up 8 bit write size
   677 0001411B EBAD                <1>         jmp	short pciRegWrite	; call generic PCI access
   678                              <1> 
   679                              <1> pciRegWrite16:
   680 0001411D 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; set up 16 bit write size
   681 00014122 0D00000040          <1>         or      eax, PCI16		; call generic PCI access
   682 00014127 EBA1                <1>         jmp	short pciRegWrite
   683                              <1> 
   684                              <1> pciRegWrite32:
   685 00014129 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; set up 32 bit write size
   686 0001412E 0D00000080          <1>         or      eax, PCI32		; call generic PCI access
   687 00014133 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 00014135 A1[308F0100]        <1> 	mov	eax, [audio_dev_id]
   837 0001413A B041                <1> 	mov	al, VIA_ACLINK_CTRL
   838 0001413C E86AFFFFFF          <1> 	call	pciRegRead8
   839                              <1> 	; ?
   840 00014141 B040                <1> 	mov	al, VIA_ACLINK_STAT
   841 00014143 E863FFFFFF          <1> 	call	pciRegRead8
   842 00014148 F6C201              <1> 	test	dl, VIA_ACLINK_C00_READY
   843 0001414B 7508                <1>         jnz     short _codec_ready_1
   844 0001414D E80D000000          <1> 	call	reset_codec
   845 00014152 7305                <1> 	jnc	short _codec_ready_2 ; eax = 1
   846 00014154 C3                  <1> 	retn
   847                              <1> _codec_ready_1:
   848                              <1> 	;mov	eax, 1
   849                              <1> 	; 06/08/2022
   850 00014155 29C0                <1> 	sub	eax, eax
   851 00014157 FEC0                <1> 	inc	al
   852                              <1> 	; eax = 1
   853                              <1> _codec_ready_2:
   854 00014159 E880000000          <1> 	call	codec_io_w16
   855                              <1> detect_codec:
   856 0001415E 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 0001415F A1[308F0100]        <1> 	mov	eax, [audio_dev_id]
   864 00014164 B041                <1>  	mov	al, VIA_ACLINK_CTRL
   865 00014166 B2E0                <1>        	mov	dl, VIA_ACLINK_CTRL_ENABLE + VIA_ACLINK_CTRL_RESET + VIA_ACLINK_CTRL_SYNC
   866 00014168 E8A9FFFFFF          <1> 	call	pciRegWrite8
   867                              <1> 
   868 0001416D E843000000          <1> 	call	delay_100ms 	; wait 100 ms
   869                              <1> _rc_cold:
   870 00014172 E811000000          <1>         call    cold_reset
   871 00014177 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 00014179 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 0001417A 29C0                <1> 	sub	eax, eax
   886                              <1> 	; 02/11/2023
   887                              <1> 	;mov	edx, CODEC_RESET_REG ; 00h ; Reset register
   888 0001417C 31D2                <1> 	xor	edx, edx ; 00h ; Reset register
   889 0001417E 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 00014183 31C0                <1>         xor     eax, eax
   902                              <1>         ;mov	al, VIA_ACLINK_C00_READY ; 1
   903 00014185 FEC0                <1>         inc	al
   904 00014187 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 00014188 30D2                <1> 	xor	dl, dl ; 0
   915 0001418A E887FFFFFF          <1> 	call	pciRegWrite8
   916                              <1> 
   917 0001418F 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 00014194 B2CC                <1> 	mov	dl, VIA_ACLINK_CTRL_INIT
   925 00014196 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 0001419B B110                <1> 	mov	cl, 16
   933                              <1> _crst_wait:
   934                              <1> 	;mov	eax, [audio_dev_id]
   935 0001419D B040                <1> 	mov	al, VIA_ACLINK_STAT
   936 0001419F E807FFFFFF          <1> 	call	pciRegRead8
   937                              <1> 
   938 000141A4 F6C201              <1>         test    dl, VIA_ACLINK_C00_READY
   939 000141A7 750B                <1>         jnz     short _crst_ok
   940                              <1> 
   941 000141A9 51                  <1> 	push	ecx
   942 000141AA E806000000          <1> 	call	delay_100ms
   943 000141AF 59                  <1> 	pop	ecx
   944                              <1> 
   945 000141B0 49                  <1>         dec     ecx
   946 000141B1 75EA                <1>         jnz     short _crst_wait
   947                              <1> 
   948                              <1> _crst_fail:
   949 000141B3 F9                  <1>         stc
   950                              <1> _crst_ok:
   951 000141B4 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 000141B5 B990010000          <1> 	mov	ecx, 400  ; 400*0.25ms
   958                              <1> _delay_x_ms:
   959 000141BA E803000000          <1> 	call	delay1_4ms
   960 000141BF E2F9                <1>         loop	_delay_x_ms
   961 000141C1 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 000141C2 50                  <1>         push    eax 
   979 000141C3 51                  <1>         push    ecx
   980 000141C4 B110                <1>         mov	cl, 16		; close enough.
   981                              <1> 
   982 000141C6 E461                <1> 	in	al, PORTB ; 61h
   983                              <1> 		
   984 000141C8 2410                <1> 	and	al, REFRESH_STATUS ; 10h
   985 000141CA 88C5                <1> 	mov	ch, al		; Start toggle state
   986                              <1> _d4ms1:	
   987 000141CC E461                <1> 	in	al, PORTB	; Read system control port
   988                              <1> 	
   989 000141CE 2410                <1> 	and	al, REFRESH_STATUS ; Refresh toggles 15.085 microseconds
   990 000141D0 38C5                <1> 	cmp	ch, al
   991 000141D2 74F8                <1> 	je	short _d4ms1	; Wait for state change
   992                              <1> 
   993 000141D4 88C5                <1> 	mov	ch, al		; Update with new state
   994 000141D6 FEC9                <1> 	dec	cl
   995 000141D8 75F2                <1> 	jnz	short _d4ms1
   996                              <1> 
   997 000141DA F8                  <1> 	clc	; 29/05/2017
   998                              <1> 
   999 000141DB 59                  <1>         pop     ecx
  1000 000141DC 58                  <1>         pop     eax
  1001 000141DD 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 000141DE 668B15[2E8F0100]    <1>         mov	dx, [audio_io_base]
  1009 000141E5 6681C28000          <1>         add     dx, VIA_REG_AC97
  1010 000141EA EF                  <1> 	out	dx, eax
  1011 000141EB C3                  <1>         retn
  1012                              <1> 
  1013                              <1> codec_io_r16: ;r32
  1014                              <1> 	; ('codec.asm')
  1015 000141EC 668B15[2E8F0100]    <1>         mov     dx, [audio_io_base]
  1016 000141F3 6681C28000          <1>         add     dx, VIA_REG_AC97
  1017 000141F8 ED                  <1>         in	eax, dx
  1018 000141F9 C3                  <1>         retn
  1019                              <1> 
  1020                              <1> ctrl_io_w8:
  1021                              <1> 	; ('codec.asm')
  1022 000141FA 660315[2E8F0100]    <1>         add     dx, [audio_io_base]
  1023 00014201 EE                  <1>         out	dx, al
  1024 00014202 C3                  <1>         retn
  1025                              <1> 
  1026                              <1> ctrl_io_r8:
  1027                              <1> 	; ('codec.asm')
  1028 00014203 660315[2E8F0100]    <1>         add     dx, [audio_io_base]
  1029 0001420A EC                  <1>         in	al, dx
  1030 0001420B C3                  <1>         retn
  1031                              <1> 
  1032                              <1> ctrl_io_w32:
  1033                              <1> 	; ('codec.asm')
  1034 0001420C 660315[2E8F0100]    <1>         add     dx, [audio_io_base]
  1035 00014213 EF                  <1>         out	dx, eax
  1036 00014214 C3                  <1>         retn
  1037                              <1> 
  1038                              <1> ctrl_io_r32:
  1039                              <1> 	; ('codec.asm')
  1040 00014215 660315[2E8F0100]    <1>         add	dx, [audio_io_base]
  1041 0001421C ED                  <1> 	in	eax, dx
  1042                              <1> _cr_not_rdy:	; 06/08/2022
  1043 0001421D 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 0001421E C1E010              <1>         shl     eax, VIA_REG_AC97_CMD_SHIFT
  1051 00014221 0D00008002          <1>         or      eax, VIA_REG_AC97_PRIMARY_VALID + VIA_REG_AC97_READ
  1052                              <1> 
  1053 00014226 E8B3FFFFFF          <1> 	call    codec_io_w16
  1054                              <1> 
  1055                              <1>       	; codec_valid
  1056 0001422B E825000000          <1> 	call	codec_check_ready
  1057                              <1> 	;jnc	short _cr_ok
  1058                              <1> 	;retn
  1059                              <1> 	; 06/08/2022
  1060 00014230 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 00014232 B150                <1> 	mov	cl, 80
  1068                              <1> 	; ecx = 80
  1069                              <1> _cr_wloop:
  1070 00014234 E889FFFFFF          <1> 	call	delay1_4ms
  1071 00014239 E2F9                <1> 	loop	_cr_wloop
  1072                              <1> 
  1073 0001423B E8ACFFFFFF          <1>         call    codec_io_r16
  1074                              <1> 	; 06/08/2022
  1075                              <1> 	;and	eax, 0FFFFh
  1076 00014240 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 00014241 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 00014244 09C2                <1>         or      edx, eax
  1091                              <1> 
  1092 00014246 B800000000          <1>         mov     eax, VIA_REG_AC97_CODEC_ID_PRIMARY
  1093 0001424B C1E01E              <1>         shl     eax, VIA_REG_AC97_CODEC_ID_SHIFT
  1094 0001424E 09D0                <1>         or      eax, edx
  1095                              <1> 
  1096 00014250 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 00014255 29C9                <1> 	sub	ecx, ecx
  1111                              <1> 	;mov	cl, 20
  1112                              <1> 	; 02/11/2023
  1113 00014257 B10A                <1> 	mov	cl, 10	; wait 1s
  1114                              <1> _ccr_wait:
  1115 00014259 51                  <1> 	push	ecx
  1116                              <1> 
  1117 0001425A E88DFFFFFF          <1>         call    codec_io_r16
  1118 0001425F A900000001          <1>         test    eax, VIA_REG_AC97_BUSY
  1119 00014264 740B                <1>         jz      short _ccr_ok
  1120                              <1> 
  1121 00014266 E84AFFFFFF          <1> 	call	delay_100ms
  1122                              <1> 
  1123 0001426B 59                  <1> 	pop	ecx
  1124                              <1> 
  1125 0001426C 49                  <1> 	dec     ecx
  1126 0001426D 75EA                <1>         jnz     short _ccr_wait
  1127                              <1> 
  1128 0001426F F9                  <1>         stc
  1129 00014270 C3                  <1>         retn
  1130                              <1> 
  1131                              <1> _ccr_ok:
  1132 00014271 59                  <1> 	pop	ecx
  1133 00014272 25FFFF0000          <1> 	and     eax, 0FFFFh
  1134 00014277 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 00014278 B802020000          <1> 	mov     eax, 0202h
  1150 0001427D 66A3[648F0100]      <1> 	mov	[audio_master_volume], ax
  1151                              <1> 
  1152                              <1> 	;mov	ax, 1F1Fh ; 31,31
  1153                              <1> 	; 02/11/2023
  1154 00014283 66B80B0B            <1> 	mov	ax, 0B0Bh
  1155                              <1> 	;mov	edx, CODEC_MASTER_VOL_REG ; 02h ; Line Out
  1156                              <1> 	; 06/08/2022
  1157 00014287 29D2                <1> 	sub	edx, edx
  1158 00014289 B202                <1> 	mov	dl, CODEC_MASTER_VOL_REG ; 02h ; Line Out
  1159 0001428B E8B1FFFFFF          <1> 	call	codec_write
  1160                              <1> 	;jc	short cconfig_error
  1161                              <1> 
  1162                              <1>  	;mov    eax, 0202h
  1163 00014290 66B80202            <1> 	mov     ax, 0202h
  1164                              <1> 	;mov	edx, CODEC_PCM_OUT_REG ; 18h ; Wave Output (Stereo)
  1165                              <1> 	; 06/08/2022
  1166 00014294 29D2                <1> 	sub	edx, edx
  1167 00014296 B218                <1> 	mov	dl, CODEC_PCM_OUT_REG ; 18h ; Wave Output (Stereo)
  1168 00014298 E8A4FFFFFF          <1> 	call	codec_write
  1169                              <1> 	;jc	short cconfig_error
  1170                              <1>       
  1171                              <1>  	;mov    eax, 0202h
  1172 0001429D 66B80202            <1> 	mov	ax, 0202h
  1173                              <1> 	;mov	edx, CODEC_AUX_VOL ; 04h ; CODEC_HP_VOL_REG ; HeadPhone
  1174                              <1> 	; 06/08/2022
  1175 000142A1 29D2                <1> 	sub	edx, edx
  1176 000142A3 B204                <1> 	mov	dl, CODEC_AUX_VOL ; 04h ; CODEC_HP_VOL_REG ; HeadPhone
  1177 000142A5 E897FFFFFF          <1> 	call	codec_write
  1178                              <1> 	;jc	short cconfig_error
  1179                              <1> 
  1180                              <1>  	;mov    eax, 08h
  1181                              <1>         ;mov    ax, 08h
  1182 000142AA 66B80880            <1> 	mov	ax, 8008h ; Mute
  1183                              <1> 	;mov	edx, 0Ch  ; AC97_PHONE_VOL ; TAD Input (Mono)
  1184                              <1> 	; 06/08/2022
  1185 000142AE 29D2                <1> 	sub	edx, edx
  1186 000142B0 B20C                <1> 	mov	dl, 0Ch	  ; AC97_PHONE_VOL ; TAD Input (Mono)
  1187 000142B2 E88AFFFFFF          <1> 	call	codec_write
  1188                              <1> 	;jc	short cconfig_error
  1189                              <1> 
  1190                              <1>  	;mov    eax, 0808h
  1191 000142B7 66B80808            <1> 	mov	ax, 0808h
  1192                              <1> 	;mov	edx, CODEC_LINE_IN_VOL_REG ; 10h ; Line Input (Stereo)	
  1193                              <1> 	; 06/08/2022
  1194 000142BB 29D2                <1> 	sub	edx, edx
  1195 000142BD B210                <1> 	mov	dl, CODEC_LINE_IN_VOL_REG ; 10h ; Line Input (Stereo)	
  1196 000142BF E87DFFFFFF          <1> 	call	codec_write
  1197                              <1> 	;jc	short cconfig_error
  1198                              <1> 
  1199                              <1>  	;mov    eax, 0808h
  1200 000142C4 66B80808            <1> 	mov	ax, 0808h
  1201                              <1> 	;mov	edx, CODEC_CD_VOL_REG ; 12h ; CR Input (Stereo)
  1202                              <1> 	; 06/08/2022
  1203 000142C8 29D2                <1> 	sub	edx, edx ; 02/11/2023
  1204 000142CA B212                <1> 	mov	dl, CODEC_CD_VOL_REG ; 12h ; CR Input (Stereo)
  1205 000142CC E870FFFFFF          <1> 	call	codec_write
  1206                              <1> 	;jc	short cconfig_error
  1207                              <1> 
  1208                              <1>  	;mov    eax, 0808h
  1209 000142D1 66B80808            <1> 	mov     ax, 0808h
  1210                              <1>         ;mov	edx, CODEC_AUX_VOL_REG ; 16h ; Aux Input (Stereo)
  1211                              <1> 	; 06/08/2022
  1212 000142D5 29D2                <1> 	sub	edx, edx
  1213 000142D7 B216                <1> 	mov	dl, CODEC_AUX_VOL_REG ; 16h ; Aux Input (Stereo)
  1214                              <1> 	;call	codec_write
  1215                              <1> 	;;jc	short cconfig_error
  1216 000142D9 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> 	; 05/06/2024
  1241                              <1> 	; 04/06/2024 - TRDOS 386 v2.0.8
  1242                              <1> 	; 27/07/2020
  1243                              <1> 	; 22/07/2020
  1244                              <1> 	; Interrupt Handler for VIA VT8237R Audio Controller
  1245                              <1> 	; Note: called by 'dev_IRQ_service'
  1246                              <1> 	; 14/10/2017 
  1247                              <1> 	; 09/10/2017, 10/10/2017, 12/10/2017
  1248                              <1> 	; 13/06/2017
  1249                              <1> 	; 21/04/2017 (TRDOS 386 kernel, 'audio.s')
  1250                              <1> 	; 24/03/2017 - 'PLAYER.COM' ('player.asm')
  1251                              <1> 
  1252                              <1> 	;push	eax ; * must be saved !
  1253                              <1> 	;push	edx
  1254                              <1> 	;push	ecx
  1255                              <1> 	;push	ebx ; * must be saved !
  1256                              <1> 	;push	esi
  1257                              <1> 	;push	edi
  1258                              <1> 
  1259                              <1> 	;cmp	byte [audio_busy], 1
  1260                              <1> 	;jnb	short _ih0 ; 09/10/2017
  1261                              <1> 
  1262                              <1> 	;mov	byte [audio_flag_eol], 0
  1263                              <1> 
  1264 000142DE 66BA0000            <1>         mov     dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_STATUS
  1265 000142E2 E81CFFFFFF          <1>         call    ctrl_io_r8
  1266                              <1> 
  1267 000142E7 A880                <1> 	test    al, VIA_REG_STAT_ACTIVE
  1268 000142E9 7417                <1>         jz      short _ih0 ; 09/10/2017
  1269                              <1> 
  1270 000142EB 2407                <1>         and     al, VIA_REG_STAT_EOL + VIA_REG_STAT_FLAG + VIA_REG_STAT_STOPPED
  1271 000142ED A2[638F0100]        <1> 	mov	[audio_flag_eol], al
  1272 000142F2 740E                <1>         jz	short _ih0 ; 09/10/2017
  1273                              <1> 
  1274                              <1> 	; 09/10/2017
  1275                              <1> 	;mov	byte [audio_busy], 1
  1276                              <1> 
  1277 000142F4 803D[628F0100]01    <1> 	cmp	byte [audio_play_cmd], 1
  1278 000142FB 7315                <1> 	jnb	short _ih1 ; 10/10/2017
  1279                              <1> 
  1280 000142FD E848000000          <1> 	call	channel_reset
  1281                              <1> _ih0:
  1282                              <1> 	; 09/10/2017
  1283 00014302 A0[638F0100]        <1>         mov     al, [audio_flag_eol]   ;; ack ;;
  1284 00014307 66BA0000            <1>         mov     dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_STATUS
  1285 0001430B E8EAFEFFFF          <1>         call    ctrl_io_w8
  1286 00014310 EB37                <1> 	jmp	short _ih4
  1287                              <1> _ih1:
  1288                              <1> vt8233_tuneLoop:
  1289 00014312 A0[638F0100]        <1>         mov     al, [audio_flag_eol]   ;; ack ;;
  1290 00014317 66BA0000            <1>         mov     dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_STATUS
  1291 0001431B E8DAFEFFFF          <1>         call    ctrl_io_w8
  1292                              <1> 
  1293                              <1> 	; 22/07/2020
  1294                              <1> 	;; 12/10/2017
  1295                              <1> 	;mov	byte [audio_flag], 0 ; Reset
  1296                              <1> 
  1297                              <1> 	; 10/10/2017
  1298                              <1> 	; 09/10/2017
  1299                              <1> 	;test	byte [audio_flag_eol], VIA_REG_STAT_FLAG
  1300                              <1> 	;jz	short _ih2 ; EOL
  1301                              <1> 
  1302                              <1> 	; 22/07/2020
  1303                              <1> 	; 14/10/2017
  1304                              <1> 	;test	byte [audio_flag_eol], VIA_REG_STAT_EOL
  1305                              <1> 	;jnz	short _ih2 ; EOL
  1306                              <1> 	;		   ; (Half Buffer 2 has been completed 
  1307                              <1> 	;		   ; and Half Buffer 1 will be played.)
  1308                              <1> 	
  1309                              <1> 	; FLAG
  1310                              <1> 	; (Half Buffer 1 has been completed
  1311                              <1> 	;  and Half Buffer 2 will be played.)
  1312                              <1> 
  1313                              <1> 	; 14/10/2017
  1314                              <1> 	;; (Continue to play.)
  1315                              <1> 	;mov	al, VIA_REG_CTRL_INT
  1316                              <1>        	;or	al, VIA_REG_CTRL_START
  1317                              <1>        	;mov	dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_CONTROL
  1318                              <1>         ;call	ctrl_io_w8
  1319                              <1> 	; 12/10/2017
  1320                              <1> 	;mov	byte [audio_flag], 1 
  1321                              <1> 
  1322                              <1> 	; 22/07/2020
  1323                              <1> 	;inc	byte [audio_flag] ; = 1
  1324                              <1> _ih2: 
  1325                              <1> 	; 10/10/2017
  1326 00014320 8B3D[488F0100]      <1> 	mov	edi, [audio_dma_buff]
  1327                              <1> 	
  1328                              <1> 	; 05/06/2024
  1329                              <1> 	; 04/06/2024
  1330                              <1> 	;;mov	ecx, [audio_dmabuff_size]
  1331                              <1> 	;;shr	ecx, 1 ; dma buff size / 2 = half buffer size
  1332                              <1> 	;mov	ecx, [audio_buff_size]
  1333                              <1> 	;and	cl, ~1 ; word aligned
  1334                              <1> 	; 05/06/2024
  1335 00014326 8B0D[508F0100]      <1> 	mov	ecx, [dma_hbuff_size] ; half buffer size
  1336                              <1> 
  1337                              <1> 	; 22/07/2020
  1338                              <1> 	; 12/10/2017
  1339                              <1> 	;cmp	byte [audio_flag], 0
  1340                              <1> 	;ja	short _ih3 ; Playing Half Buffer 2 (Current: FLAG)
  1341                              <1> 	
  1342                              <1> 	; 27/07/2020
  1343                              <1> 	; 22/07/2020
  1344 0001432C F605[548F0100]01    <1> 	test	byte [audio_flag], 1  ; Current flag value
  1345 00014333 7402                <1> 	jz	short _ih3 ; Half Buffer 1 must be filled
  1346                              <1> 
  1347                              <1> 	; Half Buffer 2 must be filled
  1348 00014335 01CF                <1> 	add	edi, ecx
  1349                              <1> _ih3:
  1350                              <1> 	; Update half buffer 2 while playing half buffer 1
  1351                              <1> 	; Update half buffer 1 while playing half buffer 2
  1352                              <1> 
  1353 00014337 8B35[408F0100]      <1> 	mov	esi, [audio_p_buffer] ; phy addr of audio buff
  1354                              <1> 	; 05/06/2024
  1355                              <1> 	;shr	ecx, 2 ; half buff size / 4
  1356                              <1> 	;rep	movsd
  1357 0001433D D1E9                <1> 	shr	ecx, 1	; word aligned buffer
  1358 0001433F F366A5              <1> 	rep	movsw
  1359                              <1> 
  1360                              <1> 	; switch flag value ;
  1361 00014342 8035[548F0100]01    <1> 	xor	byte [audio_flag], 1
  1362                              <1> 	; 12/10/2017
  1363                              <1> 	; [audio_flag] = 0 : Playing dma half buffer 2
  1364                              <1> 			   ; Next buffer (to update) is dma half buff 1
  1365                              <1> 	; 	       = 1 : Playing dma half buffer 1
  1366                              <1> 			   ; Next buffer (to update) is dma half buff 2
  1367                              <1> _ih4:	
  1368                              <1> 	; 28/05/2017
  1369                              <1> 	;mov	byte [audio_busy], 0 ; 09/10/2017
  1370                              <1> 	;
  1371                              <1> 	;pop	edi
  1372                              <1> 	;pop	esi
  1373                              <1> 	;pop	ebx ; * must be restored !
  1374                              <1> 	;pop	ecx
  1375                              <1> 	;pop	edx
  1376                              <1> 	;pop	eax ; * must be restored !
  1377                              <1> 
  1378 00014349 C3                  <1> 	retn
  1379                              <1> 
  1380                              <1> channel_reset:
  1381                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  1382                              <1> 	; 24/06/2017
  1383                              <1> 	; 29/05/2017
  1384                              <1> 	; 23/03/2017
  1385                              <1> 	; 14/11/2016 - Erdogan Tan
  1386                              <1> 	; 12/11/2016 - Erdogan Tan (Ref: KolibriOS, vt823x.asm)
  1387                              <1>         ;mov	edx, VIA_REG_OFFSET_CONTROL
  1388                              <1> 	; 06/08/2022
  1389 0001434A 29D2                <1> 	sub	edx, edx
  1390 0001434C B201                <1> 	mov	dl, VIA_REG_OFFSET_CONTROL 
  1391                              <1> 	;mov	eax, VIA_REG_CTRL_PAUSE + VIA_REG_CTRL_TERMINATE + VIA_REG_CTRL_RESET
  1392 0001434E B848000000          <1>         mov	eax, VIA_REG_CTRL_PAUSE + VIA_REG_CTRL_TERMINATE ; 24/06/2017
  1393 00014353 E8A2FEFFFF          <1> 	call    ctrl_io_w8
  1394                              <1> 
  1395                              <1>         ;mov	edx, VIA_REG_OFFSET_CONTROL
  1396                              <1>         ;call   ctrl_io_r8
  1397                              <1> 
  1398                              <1> 	; wait for 50 ms
  1399                              <1> 	;mov	ecx, 160 ; (200*0.25 ms) ; 29/05/2017
  1400                              <1> 	; 06/08/2022
  1401 00014358 31C9                <1> 	xor	ecx, ecx
  1402 0001435A B1A0                <1> 	mov	cl, 160
  1403                              <1> _ch_rst_wait:
  1404 0001435C E861FEFFFF          <1> 	call	delay1_4ms
  1405 00014361 49                  <1> 	dec	ecx
  1406 00014362 75F8                <1> 	jnz	short _ch_rst_wait
  1407                              <1> 
  1408                              <1>         ; disable interrupts
  1409                              <1> 	;mov	edx, VIA_REG_OFFSET_CONTROL
  1410                              <1>         ; 06/08/2022
  1411 00014364 29D2                <1> 	sub	edx, edx
  1412 00014366 B201                <1> 	mov	dl, VIA_REG_OFFSET_CONTROL
  1413 00014368 31C0                <1>  	xor     eax, eax
  1414 0001436A E88BFEFFFF          <1>         call    ctrl_io_w8
  1415                              <1> 
  1416                              <1>         ; clear interrupts
  1417                              <1>         ;mov	edx, VIA_REG_OFFSET_STATUS
  1418                              <1> 	; 06/08/2022
  1419 0001436F 29D2                <1> 	sub	edx, edx
  1420                              <1> 	;mov	dl, VIA_REG_OFFSET_STATUS ; 0
  1421                              <1> 	; edx = 0
  1422                              <1> 	;mov	eax, 3
  1423                              <1>         ; 06/08/2022
  1424 00014371 29C0                <1> 	sub	eax, eax
  1425 00014373 B003                <1> 	mov	al, 3
  1426                              <1> 	; eax = 3
  1427 00014375 E880FEFFFF          <1> 	call	ctrl_io_w8
  1428                              <1> 
  1429                              <1> 	;mov	edx, VIA_REG_OFFSET_CURR_PTR
  1430                              <1> 	;xor	eax, eax
  1431                              <1> 	;call	ctrl_io_w32
  1432                              <1> 
  1433 0001437A C3                  <1>         retn	
  1434                              <1> 
  1435                              <1> vt8233_stop: ; 22/04/2017
  1436 0001437B C605[628F0100]00    <1> 	mov	byte [audio_play_cmd], 0 ; stop !
  1437                              <1> _tlp2:
  1438                              <1> 	; 24/06/2017
  1439                              <1>         ; finished with song, stop everything
  1440                              <1> 	;mov	al, VIA_REG_CTRL_INT
  1441                              <1>         ;or	al, VIA_REG_CTRL_TERMINATE
  1442                              <1> 	;mov	dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_CONTROL
  1443                              <1>         ;call	ctrl_io_w8
  1444                              <1> 
  1445                              <1>         ;call	channel_reset
  1446                              <1> 	;retn
  1447                              <1> 
  1448 00014382 EBC6                <1> 	jmp	short channel_reset
  1449                              <1> 
  1450                              <1> set_vt8233_bdl: ; Set VT8237R Buffer Descriptor List
  1451                              <1> 	; 04/06/2024 - TRDOS 386 v2.0.8
  1452                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  1453                              <1> 	; 22/07/2020 - TRDOS 386 v2.0.2
  1454                              <1> 	; 28/05/2017
  1455                              <1> 	; 21/04/2017 (TRDOS 386 kernel, 'audio.s')
  1456                              <1> 	; 24/03/2017 - 'PLAYER.COM' ('via_wav.asm' - 29/11/2016)
  1457                              <1> 	
  1458                              <1> 	; eax = dma buffer address = [audio_DMA_buff]
  1459                              <1> 	; ecx = dma buffer buffer size = [audio_dmabuff_size]
  1460                              <1> 
  1461                              <1> 	; 04/06/2024
  1462                              <1> 	; ecx = DMA half buffer size (same as audio buffer size)
  1463                              <1> 
  1464                              <1> 	;shr	ecx, 1 ; dma half buffer size
  1465 00014384 89CE                <1> 	mov	esi, ecx
  1466                              <1> 
  1467 00014386 BF[688F0100]        <1>         mov     edi, audio_bdl_buff	; get BDL address
  1468                              <1> 	;mov	ecx, 32 / 2		; make 32 entries in BDL
  1469                              <1> 	; 06/08/2022
  1470 0001438B 29C9                <1> 	sub	ecx, ecx
  1471 0001438D B110                <1> 	mov	cl, 16
  1472                              <1> 
  1473 0001438F EB05                <1> 	jmp	short s_vt8233_bdl1 
  1474                              <1> 
  1475                              <1> s_vt8233_bdl0:
  1476                              <1> 	; set buffer descriptor 0 to start of data file in memory
  1477                              <1> 
  1478 00014391 A1[488F0100]        <1>  	mov	eax, [audio_dma_buff]	; Physical address of DMA buffer
  1479                              <1>  
  1480                              <1> s_vt8233_bdl1:
  1481 00014396 AB                  <1> 	stosd				; store dmabuffer1 address
  1482                              <1> 
  1483 00014397 89C2                <1> 	mov	edx, eax
  1484                              <1> 
  1485                              <1> ; VIA VT8235.PDF: (Page 110) (Erdogan Tan, 29/11/2016)
  1486                              <1> 	;
  1487                              <1> 	; 	Audio SGD Table Format
  1488                              <1> 	;	-------------------------------
  1489                              <1> 	;	63   62    61-56    55-32  31-0
  1490                              <1> 	;	--   --   --------  -----  ----
  1491                              <1> 	;	EOL FLAG -reserved- Base   Base
  1492                              <1> 	;		    	    Count  Address
  1493                              <1> 	;		            [23:0] [31:0]
  1494                              <1> 	;	EOL: End Of Link. 
  1495                              <1> 	;	     1 indicates this block is the last of the link.
  1496                              <1> 	;	     If the channel Interrupt on EOL bit is set, then
  1497                              <1> 	;	     an interrupt is generated at the end of the transfer.
  1498                              <1> 	;
  1499                              <1> 	;	FLAG: Block Flag. If set, transfer pauses at the end of this
  1500                              <1> 	;	      block. If the channel Interrupt on FLAG bit is set,
  1501                              <1> 	;	      then an interrupt is generated at the end of this block.
  1502                              <1> 
  1503 00014399 89F0                <1> 	mov	eax, esi ; DMA half buffer size
  1504                              <1> 
  1505                              <1> 		; 04/06/2024 - Erdogan Tan
  1506                              <1> 		; NOTE: I have changed DMA half buffer size to
  1507                              <1> 		; (word aligned) audio buffer size for smooth audio playing
  1508                              <1> 		; (it was page border aligned before June 4, 2024)
  1509                              <1> 		;
  1510                              <1> 		; For example:
  1511                              <1> 		;    For 65416 bytes audio buffer (22kHz, 16bit samples)
  1512                              <1> 		;       (user's audio buff virtual addr is mapped to physical)
  1513                              <1> 		;	((kernel's and user's audio buff pages are same)) 
  1514                              <1> 		;    1) Memory allocation (of it) is 65536 bytes
  1515                              <1> 		;    2) DMA half buffer size is 65416 bytes
  1516                              <1> 		;	(it would be 65536 bytes before this modification)
  1517                              <1> 		;	((additional 140 bytes would cause to a noise))	     
  1518                              <1> 		;    3) Total DMA buffer size is 131072 bytes
  1519                              <1> 		;       (the last 240 bytes will not be used for playing)
  1520                              <1> 
  1521 0001439B 01C2                <1> 	add	edx, eax
  1522 0001439D 0D00000040          <1> 	or	eax, FLAG
  1523                              <1> 	;or	eax, EOL
  1524 000143A2 AB                  <1> 	stosd
  1525                              <1> 
  1526                              <1> ; 2nd buffer:
  1527                              <1> 
  1528 000143A3 89D0                <1>         mov	eax, edx ; Physical address of the 2nd half of DMA buffer
  1529 000143A5 AB                  <1> 	stosd		 ; store dmabuffer2 address
  1530                              <1> 
  1531                              <1> ; set length to [audio_dmabuff_size]/2
  1532                              <1> ; Set control (bits 31:16) to BUP, bits 15:0=number of samples
  1533                              <1> ; 
  1534 000143A6 89F0                <1> 	mov	eax, esi ; DMA half buffer size
  1535                              <1> 	; 22/07/2020
  1536                              <1> 	;or	eax, EOL
  1537 000143A8 0D00000040          <1> 	or	eax, FLAG
  1538 000143AD AB                  <1> 	stosd
  1539                              <1> 
  1540 000143AE E2E1                <1> 	loop    s_vt8233_bdl0
  1541                              <1> 
  1542                              <1> 	; 22/07/2020
  1543 000143B0 814FFC00000080      <1> 	or	dword [edi-4], EOL
  1544                              <1> 	
  1545 000143B7 C3                  <1> 	retn
  1546                              <1> 
  1547                              <1> vt8233_start_play:
  1548                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  1549                              <1> 	; 01/09/2020
  1550                              <1> 	; 22/07/2020
  1551                              <1> 	; start to play audio data via VT8233 audio controller
  1552                              <1> 	; 13/06/2017
  1553                              <1> 	; 10/06/2017
  1554                              <1> 	; 24/04/2017
  1555                              <1> 	; 21/04/2017 (TRDOS 386 kernel, 'audio.s')
  1556                              <1> 	; 24/03/2017 - 'PLAYER.COM' ('via_wav.asm' - 29/11/2016)
  1557                              <1> 	; write buffer descriptor list address
  1558                              <1> 
  1559                              <1> 	; Extended Audio Status (2Ah)
  1560 000143B8 B82A000000          <1> 	mov	eax, CODEC_EXT_AUDIO_CTRL_REG ; 2Ah
  1561 000143BD E85CFEFFFF          <1> 	call	codec_read
  1562 000143C2 25FDFF0000          <1> 	and     eax, 0FFFFh - 2		; clear DRA (BIT1)
  1563                              <1> 	;or     eax, 1			; set VRA (BIT0)
  1564                              <1> 	;or	eax, 5  	; VRA (BIT0) & S/PDIF (BIT2) ; 14/11/2016
  1565 000143C7 0C05                <1> 	or	al, 5
  1566                              <1> 	; 01/09/2020
  1567                              <1> 	;or	eax, 3805h ; AD1980 (PRK, PRJ, PRI = 1 .. only front DAC)
  1568                              <1> 	; 01/09/2020
  1569                              <1> 	;mov	edx, CODEC_EXT_AUDIO_CTRL_REG
  1570                              <1> 	;cmp	word [audio_freq], 0BB80h ; 48 kHz
  1571                              <1> 	;jne	short set_extd_audio_status_1
  1572                              <1> 	;and	al, 0FEh ; disable VRA bit (set sample rate to 48000 Hz)
  1573                              <1> 	;jmp	short set_extd_audio_status_2
  1574                              <1> ;set_extd_audio_status_1:
  1575 000143C9 BA2A000000          <1> 	mov	edx, CODEC_EXT_AUDIO_CTRL_REG
  1576 000143CE E86EFEFFFF          <1> 	call	codec_write
  1577                              <1> 	;jc	short cconfig_error
  1578                              <1> 
  1579                              <1> set_sample_rate:
  1580                              <1> 	;movzx	eax, word [audio_freq]
  1581 000143D3 66A1[5E8F0100]      <1> 	mov	ax, [audio_freq]
  1582 000143D9 BA2C000000          <1> 	mov	edx, CODEC_PCM_FRONT_DACRATE_REG ; 2Ch ; PCM Front DAC Rate
  1583                              <1> ;set_extd_audio_status_2:
  1584 000143DE E85EFEFFFF          <1> 	call	codec_write
  1585                              <1> 
  1586                              <1> 	; 01/09/2020
  1587                              <1> 	; set AD1980 MCB register (Index 76h) to 0C00h
  1588                              <1> 	; (CLDIS, HPSEL)
  1589                              <1> 	;mov	ax, 0C00h
  1590                              <1> 	;mov	edx, CODEC_MISC_CRTL_BITS_REG ; 76h 
  1591                              <1> 	;			; Miscellaneous Control Bit Register
  1592                              <1> 	;call	codec_write
  1593                              <1> 	;
  1594                              <1> 
  1595 000143E3 B8[688F0100]        <1>         mov	eax, audio_bdl_buff
  1596                              <1>   
  1597                              <1> 	; 12/11/2016 - Erdogan Tan 
  1598                              <1> 	; (Ref: KolibriOS, vt823x.asm, 'create_primary_buff')
  1599                              <1> 	;mov	edx, VIADEV_PLAYBACK + VIA_REG_OFFSET_TABLE_PTR
  1600                              <1>         ; 06/08/2022
  1601 000143E8 29D2                <1> 	sub	edx, edx
  1602                              <1> 	;mov	dl, VIADEV_PLAYBACK + VIA_REG_OFFSET_TABLE_PTR
  1603                              <1> 	; edx = 0
  1604 000143EA E81DFEFFFF          <1> 	call	ctrl_io_w32
  1605                              <1> 
  1606                              <1> 	;call	codec_check_ready
  1607                              <1> 
  1608 000143EF 66BA0200            <1>   	mov	dx, VIADEV_PLAYBACK + VIA_REG_OFS_PLAYBACK_VOLUME_L
  1609                              <1>         ;mov	eax, 2	; 31
  1610 000143F3 B01F                <1> 	mov	al, 31
  1611 000143F5 2A05[648F0100]      <1>         sub	al, [audio_master_volume_l]
  1612 000143FB E8FAFDFFFF          <1> 	call	ctrl_io_w8
  1613                              <1> 
  1614                              <1> 	;call	codec_check_ready
  1615                              <1> 
  1616 00014400 66BA0300            <1>         mov     dx, VIADEV_PLAYBACK + VIA_REG_OFS_PLAYBACK_VOLUME_R
  1617                              <1>         ;mov	ax, 2	; 31
  1618 00014404 B01F                <1> 	mov	al, 31
  1619 00014406 2A05[658F0100]      <1>         sub	al, [audio_master_volume_r]
  1620 0001440C E8E9FDFFFF          <1> 	call    ctrl_io_w8
  1621                              <1> 
  1622                              <1> 	;call	codec_check_ready
  1623                              <1> ;
  1624                              <1> ;
  1625                              <1> ; All set. Let's play some music.
  1626                              <1> ;
  1627                              <1> ;
  1628                              <1>        	;mov    dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_STOP_IDX
  1629                              <1>         ;mov    ax, VIA8233_REG_TYPE_16BIT or VIA8233_REG_TYPE_STEREO or 0xfffff or 0xff000000
  1630                              <1>         ;call   ctrl_io_w32
  1631                              <1> 
  1632                              <1> 	;call	codec_check_ready
  1633                              <1> 
  1634                              <1> 	; 08/12/2016
  1635                              <1> 	; 07/10/2016
  1636                              <1>         ;;mov    al, 1
  1637                              <1>         ;mov	al, 31
  1638                              <1> 	; 22/07/2020
  1639 00014411 B0FF                <1> 	mov	al, 0FFh
  1640 00014413 E813000000          <1> 	call    set_VT8233_LastValidIndex
  1641                              <1> 
  1642 00014418 C605[628F0100]01    <1> 	mov	byte [audio_play_cmd], 1 ; play command (do not stop) !
  1643                              <1> 
  1644                              <1> 	; 22/07/2020
  1645                              <1> 	;mov	byte [audio_flag], 0  ; clear half buffer flag
  1646                              <1> 
  1647                              <1> vt8233_play: ; continue to play
  1648                              <1> 	; 22/04/2017
  1649                              <1> 	;mov	al, VIA_REG_CTRL_INT
  1650                              <1>        	;or	al, VIA_REG_CTRL_START
  1651                              <1>         ;;mov	al, VIA_REG_CTRL_AUTOSTART + VIA_REG_CTRL_START
  1652                              <1> 	; 22/07/2020	
  1653 0001441F B0A1                <1> 	mov	al, VIA_REG_CTRL_AUTOSTART + VIA_REG_CTRL_START + VIA_REG_CTRL_INT_FLAG
  1654                              <1> 
  1655 00014421 66BA0100            <1> 	mov     dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_CONTROL
  1656 00014425 E8D0FDFFFF          <1>         call    ctrl_io_w8
  1657                              <1> 	;call	codec_check_ready
  1658                              <1> 	;retn
  1659                              <1> 	;jmp	codec_check_ready
  1660 0001442A C3                  <1> 	retn
  1661                              <1> 
  1662                              <1> ;input AL = index # to stop on
  1663                              <1> set_VT8233_LastValidIndex:
  1664                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  1665                              <1> 	; 23/07/2020
  1666                              <1> 	; 10/06/2017
  1667                              <1> 	; 21/04/2017 (TRDOS 386 kernel, 'audio.s')
  1668                              <1> 	; 24/03/2017 - 'PLAYER.COM' ('via_wav.asm' - 29/11/2016) 
  1669                              <1> 	; 19/11/2016
  1670                              <1> 	; 14/11/2016 - Erdogan Tan (Ref: VIA VT8235.PDF, Page 110)
  1671                              <1> 	; 12/11/2016 - Erdogan Tan
  1672                              <1> 	; (Ref: KolibriOS, vt823x.asm, 'create_primary_buff')
  1673                              <1> 	;push	edx
  1674                              <1> 	;push	ax
  1675 0001442B 50                  <1> 	push	eax ; 23/07/2020
  1676                              <1> 	;push	ecx
  1677 0001442C 0FB705[5E8F0100]    <1> 	movzx	eax, word [audio_freq] ; Hertz
  1678 00014433 BA00001000          <1> 	mov	edx, 100000h ; 2^20 = 1048576
  1679 00014438 F7E2                <1> 	mul	edx
  1680 0001443A B980BB0000          <1> 	mov	ecx, 48000
  1681 0001443F F7F1                <1> 	div	ecx
  1682                              <1> 	;and	eax, 0FFFFFh
  1683                              <1> 	;pop	ecx
  1684                              <1> 	;pop	dx 
  1685 00014441 5A                  <1> 	pop	edx ; 23/07/2020
  1686 00014442 C1E218              <1> 	shl	edx, 24  ; STOP Index Setting: Bit 24 to 31
  1687 00014445 09D0                <1> 	or	eax, edx
  1688                              <1> 	; 19/11/2016
  1689 00014447 803D[5C8F0100]10    <1> 	cmp	byte [audio_bps], 16
  1690 0001444E 7505                <1> 	jne	short sLVI_1
  1691 00014450 0D00002000          <1> 	or	eax, VIA8233_REG_TYPE_16BIT
  1692                              <1> sLVI_1:
  1693 00014455 803D[5D8F0100]02    <1> 	cmp	byte [audio_stmo], 2
  1694 0001445C 7505                <1> 	jne	short sLVI_2
  1695 0001445E 0D00001000          <1> 	or	eax, VIA8233_REG_TYPE_STEREO
  1696                              <1> sLVI_2:
  1697                              <1> 	;mov	edx, VIADEV_PLAYBACK + VIA_REG_OFFSET_STOP_IDX
  1698                              <1> 	; 06/08/2022
  1699 00014463 29D2                <1> 	sub	edx, edx
  1700 00014465 B208                <1> 	mov	dl, VIADEV_PLAYBACK + VIA_REG_OFFSET_STOP_IDX
  1701 00014467 E8A0FDFFFF          <1> 	call    ctrl_io_w32
  1702                              <1> 	;call	codec_check_ready
  1703                              <1> 	;pop	edx
  1704 0001446C C3                  <1> 	retn
  1705                              <1> 
  1706                              <1> vt8233_pause: ; pause
  1707                              <1> 	; 10/06/2017
  1708                              <1> 	; 22/04/2017
  1709                              <1> 	;mov	al, VIA_REG_CTRL_INT
  1710                              <1>         ;or	al, VIA_REG_CTRL_PAUSE
  1711                              <1> 	; 23/07/2020
  1712 0001446D B029                <1> 	mov	al, VIA_REG_CTRL_PAUSE+VIA_REG_CTRL_INT_FLAG+VIA_REG_CTRL_AUTOSTART
  1713                              <1> 	
  1714 0001446F 66BA0100            <1> 	mov     dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_CONTROL
  1715 00014473 E882FDFFFF          <1>         call    ctrl_io_w8
  1716                              <1> 	;call	codec_check_ready
  1717                              <1> 	;retn
  1718                              <1> 	;jmp	codec_check_ready
  1719 00014478 C3                  <1> 	retn
  1720                              <1> 
  1721                              <1> vt8233_reset:
  1722                              <1> 	; 22/04/2017
  1723                              <1> 	; reset VT8237R (vt8233) Audio Controller
  1724                              <1> 	;cmp	byte [audio_play_cmd], 1
  1725                              <1> 	;jna	short vt8233_rst_0
  1726 00014479 C605[628F0100]00    <1> 	mov	byte [audio_play_cmd], 0 ; stop !
  1727                              <1> vt8233_rst_0:
  1728 00014480 E8DAFCFFFF          <1> 	call	reset_codec
  1729 00014485 720A                <1> 	jc	short vt8233_rst_1 ; codec error !
  1730                              <1> 	; eax = 1
  1731 00014487 E852FDFFFF          <1> 	call	codec_io_w16 ; w32
  1732 0001448C E8B9FEFFFF          <1> 	call	channel_reset
  1733                              <1> vt8233_rst_1:
  1734                              <1> vt8233_vol_1:	; 06/08/2022
  1735 00014491 C3                  <1> 	retn
  1736                              <1> 
  1737                              <1> vt8233_volume:
  1738                              <1> 	; set VT8237R (vt8233) sound volume level
  1739                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  1740                              <1> 	; 24/04/2017
  1741                              <1> 	; 22/04/2017
  1742                              <1> 	; bl = component (0 = master/playback/lineout volume)
  1743                              <1> 	; cl = left channel volume level (0 to 31)
  1744                              <1> 	; ch = right channel volume level (0 to 31)
  1745                              <1> 
  1746 00014492 08DB                <1> 	or	bl, bl
  1747 00014494 75FB                <1> 	jnz	short vt8233_vol_1 ; temporary !
  1748 00014496 66B81F1F            <1> 	mov	ax, 1F1Fh ; 31,31
  1749 0001449A 38C1                <1> 	cmp	cl, al
  1750 0001449C 77F3                <1> 	ja	short vt8233_vol_1 ; temporary !
  1751 0001449E 38E5                <1> 	cmp	ch, ah
  1752 000144A0 77EF                <1> 	ja	short vt8233_vol_1 ; temporary !
  1753 000144A2 66890D[648F0100]    <1> 	mov	[audio_master_volume], cx
  1754 000144A9 6629C8              <1> 	sub	ax, cx
  1755                              <1> 	;mov	edx, CODEC_MASTER_VOL_REG ; 02h ; Line Out
  1756                              <1> 	; 06/08/2022
  1757 000144AC 29D2                <1> 	sub	edx, edx
  1758 000144AE B202                <1> 	mov	dl, CODEC_MASTER_VOL_REG ; 02h ; Line Out
  1759                              <1> 	; 06/08/2022
  1760 000144B0 E98CFDFFFF          <1> 	jmp	codec_write
  1761                              <1> 	;call	codec_write
  1762                              <1> ;vt8233_vol_1:
  1763                              <1> 	;retn
  1764                              <1> 
  1765                              <1> ; CODE for SOUND BLASTER 16
  1766                              <1> 
  1767                              <1> DetectSB:
  1768                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  1769                              <1> 	; 24/04/2017
  1770                              <1> 	;pushad
  1771                              <1> ScanPort:
  1772                              <1> 	; 06/08/2022
  1773 000144B5 66BB1002            <1> 	mov	bx, 0210h	; start scanning ports
  1774                              <1> 				; 210h, 220h, .. 260h
  1775                              <1> 	; 06/08/2022
  1776 000144B9 31C9                <1> 	xor	ecx, ecx
  1777 000144BB 88FE                <1> 	mov	dh, bh
  1778                              <1> ResetDSP:       
  1779                              <1> 	;mov	dx, bx		; try to reset the DSP.
  1780                              <1> 	;add	dx, 06h
  1781                              <1> 	; 06/08/2022
  1782 000144BD 88DA                <1> 	mov	dl, bl
  1783 000144BF 80C206              <1> 	add	dl, 06h
  1784                              <1> 
  1785 000144C2 B001                <1> 	mov	al, 1
  1786 000144C4 EE                  <1> 	out	dx, al
  1787                              <1> 
  1788 000144C5 EC                  <1> 	in	al, dx
  1789 000144C6 EC                  <1> 	in	al, dx
  1790 000144C7 EC                  <1> 	in	al, dx
  1791 000144C8 EC                  <1> 	in	al, dx
  1792                              <1> 
  1793 000144C9 30C0                <1> 	xor     al, al
  1794 000144CB EE                  <1> 	out	dx, al
  1795                              <1> 
  1796                              <1> 	;add	dx, 08h
  1797                              <1> 	; 06/08/2022
  1798 000144CC 80C208              <1> 	add	dl, 08h
  1799                              <1> 	;mov	cx, 100
  1800 000144CF B164                <1> 	mov	cl, 100
  1801                              <1> WaitID:
  1802 000144D1 EC                  <1> 	in	al, dx
  1803 000144D2 08C0                <1> 	or      al, al
  1804 000144D4 7804                <1> 	js      short GetID
  1805 000144D6 E2F9                <1> 	loop    WaitID
  1806 000144D8 EB0D                <1> 	jmp     short NextPort
  1807                              <1> GetID:          
  1808                              <1> 	;sub	dx, 04h
  1809                              <1> 	; 06/08/2022
  1810 000144DA 80EA04              <1> 	sub	dl, 04h
  1811 000144DD EC                  <1> 	in	al, dx
  1812 000144DE 3CAA                <1> 	cmp     al, 0AAh
  1813 000144E0 740F                <1> 	je      short Found
  1814                              <1> 	;add	dx, 04h
  1815                              <1> 	; 06/08/2022
  1816 000144E2 80C204              <1> 	add	dl, 04h
  1817 000144E5 E2EA                <1> 	loop    WaitID
  1818                              <1> NextPort:
  1819                              <1> 	;add	bx, 10h		; if not response,
  1820                              <1> 	; 06/08/2022
  1821 000144E7 80C310              <1> 	add	bl, 10h
  1822                              <1> 	;cmp	bx, 260h	; try the next port.
  1823 000144EA 80FB60              <1> 	cmp	bl, 60h
  1824 000144ED 76CE                <1> 	jbe     short ResetDSP
  1825 000144EF F9                  <1> 	stc
  1826 000144F0 C3                  <1> 	retn
  1827                              <1> Found:
  1828 000144F1 66891D[2E8F0100]    <1> 	mov     [audio_io_base], bx	; SB Port Address Found!
  1829                              <1> ScanIRQ:
  1830                              <1> SetIrqs:
  1831 000144F8 28C0                <1> 	sub 	al, al ; 0
  1832 000144FA A2[248F0100]        <1> 	mov 	[IRQnum], al ; reset
  1833 000144FF A2[2A8F0100]        <1> 	mov	[audio_intr], al ; reset
  1834                              <1> 
  1835                              <1> 	; ah > 0 -> set IRQ vector
  1836                              <1> 	; al = IRQ number
  1837                              <1> 	;mov	ax, 103h ; IRQ 3
  1838                              <1> 	;call	set_hardware_int_vector
  1839                              <1> 	;mov	ax, 104h ; IRQ 4
  1840                              <1> 	;call	set_hardware_int_vector
  1841 00014504 66B80501            <1> 	mov	ax, 105h ; IRQ 5
  1842 00014508 E850DFFFFF          <1> 	call	set_hardware_int_vector
  1843 0001450D 66B80701            <1> 	mov	ax, 107h ; IRQ 7
  1844 00014511 E847DFFFFF          <1> 	call	set_hardware_int_vector
  1845                              <1> 
  1846 00014516 668B15[2E8F0100]    <1> 	mov     dx, [audio_io_base] ; tells to the SB to
  1847                              <1> 	;add	dx, 0Ch		    ; generate a IRQ!
  1848                              <1> 	; 06/08/2022
  1849 0001451D 80C20C              <1> 	add	dl, 0Ch
  1850                              <1> WaitSb:
  1851 00014520 EC                  <1> 	in	al, dx
  1852 00014521 08C0                <1> 	or      al, al
  1853 00014523 78FB                <1> 	js      short WaitSb
  1854 00014525 B0F2                <1> 	mov     al, 0F2h
  1855 00014527 EE                  <1> 	out	dx, al
  1856                              <1> 
  1857 00014528 31C9                <1> 	xor     ecx, ecx	; wait until IRQ level
  1858                              <1> WaitIRQ: 
  1859 0001452A A0[248F0100]        <1> 	mov	al, [IRQnum]
  1860 0001452F 3C00                <1> 	cmp     al, 0 ; is changed or timeout.
  1861 00014531 7706                <1> 	ja	short IrqOk
  1862 00014533 6649                <1> 	dec	cx
  1863 00014535 75F3                <1> 	jnz	short WaitIRQ
  1864 00014537 EB14                <1> 	jmp	short RestoreIrqs
  1865                              <1> IrqOk:
  1866 00014539 A2[2A8F0100]        <1> 	mov	[audio_intr], al ; set
  1867 0001453E 668B15[2E8F0100]    <1> 	mov     dx, [audio_io_base]
  1868                              <1> 	;add	dx, 0Eh
  1869                              <1> 	; 06/08/2022
  1870 00014545 80C20E              <1> 	add	dl, 0Eh
  1871 00014548 EC                  <1> 	in	al, dx	; SB acknowledge.
  1872 00014549 B020                <1> 	mov	al, 20h
  1873 0001454B E620                <1> 	out	20h, al	; Hardware acknowledge.
  1874                              <1> 
  1875                              <1> RestoreIrqs:
  1876                              <1> 	; ah = 0 -> reset IRQ vector
  1877                              <1> 	; al = IRQ number
  1878                              <1> 	;mov	ax, 3 ; IRQ 3
  1879                              <1> 	;call	set_hardware_int_vector
  1880                              <1> 	;mov	ax, 4 ; IRQ 4
  1881                              <1> 	;call	set_hardware_int_vector
  1882 0001454D 66B80500            <1> 	mov	ax, 5 ; IRQ 5
  1883 00014551 E807DFFFFF          <1> 	call	set_hardware_int_vector
  1884 00014556 66B80700            <1> 	mov	ax, 7 ; IRQ 7
  1885 0001455A E8FEDEFFFF          <1> 	call	set_hardware_int_vector
  1886                              <1> 
  1887 0001455F 31D2                <1> 	xor	edx, edx
  1888 00014561 8915[308F0100]      <1> 	mov	[audio_dev_id], edx ; 0
  1889 00014567 8915[348F0100]      <1> 	mov	[audio_vendor], edx ; 0
  1890                              <1> 	; 22/11/2023
  1891                              <1> 	;mov	[audio_stats_cmd], edx ; 0
  1892                              <1> 
  1893                              <1> 	;popad
  1894                              <1> 
  1895 0001456D 803D[2A8F0100]01    <1> 	cmp     byte [audio_intr], 1 ; IRQ level was changed?
  1896                              <1> 	
  1897 00014574 C3                  <1> 	retn
  1898                              <1> 
  1899                              <1> %macro	SbOut	1
  1900                              <1> %%Wait:
  1901                              <1> 	in	al, dx
  1902                              <1> 	or	al, al
  1903                              <1> 	js	short %%Wait
  1904                              <1> 	mov	al, %1
  1905                              <1> 	out	dx, al
  1906                              <1> %endmacro
  1907                              <1> 
  1908                              <1> SbInit_play:
  1909                              <1> 	; 28/01/2025 - TRDOS 386 Kernel v2.0.10
  1910                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  1911                              <1> 	; 22/10/2017
  1912                              <1> 	; 20/10/2017
  1913                              <1> 	; 06/10/2017
  1914                              <1> 	; 13/07/2017 - 09/08/2017
  1915                              <1> 	; 24/04/2017 - 15/05/2017 - 24/06/2017
  1916                              <1> 	;pushad
  1917                              <1> SetBuffer:
  1918                              <1> 	;mov	byte [DmaFlag], 0
  1919                              <1> 
  1920 00014575 8B1D[488F0100]      <1> 	mov	ebx, [audio_dma_buff] ; physical addr of DMA buff
  1921 0001457B 89DF                <1> 	mov	edi, ebx
  1922                              <1> 	;mov	ecx, [audio_dmabuff_size]
  1923                              <1> 	; 28/01/2025 (BugFix)
  1924 0001457D 8B0D[508F0100]      <1> 	mov	ecx, [dma_hbuff_size]
  1925                              <1> 	;shl	ecx, 1 ; * 2 ; *!*
  1926                              <1> 
  1927 00014583 803D[5C8F0100]10    <1> 	cmp	byte [audio_bps], 16
  1928 0001458A 752F                <1> 	jne	short sbInit_0 ; set 8 bit DMA buffer
  1929                              <1> 	
  1930                              <1> 	; 09/08/2017
  1931                              <1> 	; convert byte count to word count
  1932                              <1> 	; 28/01/2025
  1933                              <1> 	;shr	ecx, 1 ; *!*
  1934                              <1> 	
  1935 0001458C 49                  <1> 	dec	ecx ; word count - 1
  1936                              <1> 	; convert byte offset to word offset
  1937 0001458D D1EB                <1> 	shr	ebx, 1
  1938                              <1> 
  1939                              <1> 	; 16 bit DMA buffer setting (DMA channel 5)
  1940 0001458F B005                <1> 	mov     al, 05h  ; set mask bit for channel 5  (4+1)
  1941 00014591 E6D4                <1> 	out	0D4h, al
  1942                              <1> 	
  1943 00014593 30C0                <1> 	xor     al, al   ; stops all DMA processes on selected channel
  1944 00014595 E6D8                <1> 	out	0D8h, al ; clear selected channel register
  1945                              <1> 
  1946 00014597 88D8                <1> 	mov     al, bl	 ; byte 0 of DMA buffer offset in words (physical)
  1947 00014599 E6C4                <1> 	out	0C4h, al ; DMA channel 5 port number
  1948                              <1> 
  1949 0001459B 88F8                <1> 	mov     al, bh   ; byte 1 of DMA buffer offset in words (physical)
  1950 0001459D E6C4                <1> 	out	0C4h, al
  1951                              <1> 	
  1952                              <1> 	; 09/08/2017
  1953 0001459F C1EB0F              <1> 	shr	ebx, 15	 ; complete 16 bit shift
  1954 000145A2 80E3FE              <1> 	and	bl, 0FEh ; clear bit 0 (not necessary, it will be ignored)
  1955                              <1> 
  1956 000145A5 88D8                <1> 	mov     al, bl   ; byte 2 of DMA buffer address (physical)
  1957 000145A7 E68B                <1> 	out	8Bh, al  ; page register port addr for channel 5 ; 13/07/2017
  1958                              <1> 
  1959 000145A9 88C8                <1> 	mov     al, cl   ; low byte of DMA count - 1
  1960 000145AB E6C6                <1> 	out	0C6h, al ; count register port addr for channel 1
  1961                              <1> 
  1962 000145AD 88E8                <1> 	mov     al, ch   ; high byte of DMA count - 1
  1963 000145AF E6C6                <1> 	out	0C6h, al
  1964                              <1> 
  1965                              <1> 	; channel 5, read, autoinitialized, single mode
  1966                              <1> 	;mov	al, 49h
  1967 000145B1 B059                <1> 	mov	al, 59h  ; 06/10/2017 
  1968 000145B3 E6D6                <1> 	out	0D6h, al ; DMA mode register port address
  1969                              <1> 
  1970 000145B5 B001                <1> 	mov     al, 01h  ; clear mask bit for channel 1
  1971 000145B7 E6D4                <1> 	out	0D4h, al ; DMA mask register port address
  1972                              <1> 
  1973 000145B9 EB2A                <1> 	jmp	short ClearBuffer
  1974                              <1> 
  1975                              <1> sbInit_0:
  1976                              <1> 	; 28/01/2025
  1977 000145BB D1E1                <1> 	shl	ecx, 1 ; half buffer size * 2 ; *!*
  1978                              <1> 
  1979 000145BD 49                  <1> 	dec     ecx	; 09/08/2017
  1980                              <1> 
  1981                              <1> 	; 8 bit DMA buffer setting (DMA channel 1)
  1982 000145BE B005                <1> 	mov     al, 05h ; set mask bit for channel 1  (4+1)
  1983 000145C0 E60A                <1> 	out	0Ah, al ; DMA mask register
  1984                              <1> 
  1985 000145C2 30C0                <1> 	xor     al, al  ; stops all DMA processes on selected channel
  1986 000145C4 E60C                <1> 	out	0Ch, al ; clear selected channel register
  1987                              <1> 
  1988 000145C6 88D8                <1> 	mov     al, bl	; byte 0 of DMA buffer address (physical)
  1989 000145C8 E602                <1> 	out	02h, al ; DMA channel 1 port number
  1990                              <1> 
  1991 000145CA 88F8                <1> 	mov     al, bh  ; byte 1 of DMA buffer address (physical)
  1992 000145CC E602                <1> 	out	02h, al
  1993                              <1> 
  1994 000145CE C1EB10              <1> 	shr	ebx, 16
  1995                              <1> 
  1996 000145D1 88D8                <1> 	mov     al, bl  ; byte 2 of DMA buffer address (physical)
  1997 000145D3 E683                <1> 	out	83h, al ; page register port addr for channel 1
  1998                              <1> 
  1999 000145D5 88C8                <1> 	mov     al, cl  ; low byte of DMA count - 1
  2000 000145D7 E603                <1> 	out	03h, al ; count register port addr for channel 1
  2001                              <1> 
  2002 000145D9 88E8                <1> 	mov     al, ch  ; high byte of DMA count - 1
  2003 000145DB E603                <1> 	out	03h, al
  2004                              <1> 
  2005                              <1> 	; channel 1, read, autoinitialized, single mode
  2006                              <1> 	;mov	al, 49h
  2007 000145DD B059                <1> 	mov	al, 59h ; 06/10/2017 
  2008 000145DF E60B                <1> 	out	0Bh, al ; DMA mode register port address
  2009                              <1> 
  2010 000145E1 B001                <1> 	mov     al, 01h ; clear mask bit for channel 1
  2011 000145E3 E60A                <1> 	out	0Ah, al ; DMA mask register port address
  2012                              <1> 
  2013                              <1> ClearBuffer:
  2014                              <1> 	;;mov	edi, [audio_dma_buff]
  2015                              <1> 	;;mov	ecx, [audio_dmabuff_size]
  2016                              <1> 	;inc	ecx
  2017                              <1> 	;mov	al, 80h
  2018                              <1> 	;;cld
  2019                              <1> 	;rep	stosb
  2020                              <1> SetIrq:
  2021                              <1> 	;mov	ebx, SbIrqhandler
  2022                              <1> 	;mov	al, [audio_intr] ; IRQ number
  2023                              <1> 	;call	set_dev_IRQ_service
  2024                              <1> 	;; SETUP (audio) INTERRUPT CALLBACK SERVICE
  2025                              <1> 	;mov	bl, [audio_intr] ; IRQ number
  2026                              <1> 	;mov	bh, [audio_cb_mode]
  2027                              <1> 	;inc	bh  ; 1 = Signal Response Byte method (fixed value)
  2028                              <1> 	;	    ; 2 = Callback service method
  2029                              <1> 	;	    ; 3 = Auto Increment S.R.B. method
  2030                              <1> 	;mov	cl, [audio_srb]
  2031                              <1> 	;mov	edx, [audio_cb_addr]
  2032                              <1> 	;mov	al, [audio_user]
  2033                              <1>  	;call	set_irq_callback_service
  2034                              <1> ResetDsp:
  2035 000145E5 668B15[2E8F0100]    <1> 	mov     dx, [audio_io_base]
  2036                              <1> 	;add	dx, 06h
  2037                              <1> 	; 06/08/2022
  2038 000145EC 80C206              <1> 	add	dl, 06h
  2039 000145EF B001                <1> 	mov     al, 1
  2040 000145F1 EE                  <1> 	out	dx, al
  2041                              <1> 
  2042 000145F2 EC                  <1> 	in	al, dx
  2043 000145F3 EC                  <1> 	in	al, dx
  2044 000145F4 EC                  <1> 	in	al, dx
  2045 000145F5 EC                  <1> 	in	al, dx
  2046                              <1> 
  2047 000145F6 30C0                <1> 	xor     al, al
  2048 000145F8 EE                  <1> 	out	dx, al
  2049                              <1> 
  2050                              <1> 	;mov	cx, 100
  2051                              <1> 	; 06/08/2022
  2052 000145F9 29C9                <1> 	sub	ecx, ecx
  2053 000145FB B164                <1> 	mov	cl, 100
  2054 000145FD 28E4                <1> 	sub	ah, ah ; 0
  2055                              <1> WaitId:         
  2056 000145FF 668B15[2E8F0100]    <1> 	mov     dx, [audio_io_base]
  2057                              <1> 	;add	dx, 0Eh
  2058                              <1> 	; 06/08/2022
  2059 00014606 80C20E              <1> 	add	dl, 0Eh
  2060 00014609 EC                  <1> 	in	al, dx
  2061 0001460A 08C0                <1> 	or      al, al
  2062 0001460C 7807                <1> 	js      short sb_GetId
  2063 0001460E E2EF                <1> 	loop    WaitId
  2064 00014610 E9B1000000          <1> 	jmp     sb_Exit
  2065                              <1> sb_GetId:
  2066 00014615 668B15[2E8F0100]    <1> 	mov     dx, [audio_io_base]
  2067                              <1> 	;add	dx, 0Ah
  2068                              <1> 	; 06/08/2022
  2069 0001461C 80C20A              <1> 	add	dl, 0Ah
  2070 0001461F EC                  <1> 	in	al, dx
  2071 00014620 3CAA                <1> 	cmp     al, 0AAh
  2072 00014622 7407                <1> 	je      short SbOk
  2073 00014624 E2D9                <1> 	loop    WaitId
  2074 00014626 E99B000000          <1> 	jmp	sb_Exit
  2075                              <1> SbOk:
  2076 0001462B 668B15[2E8F0100]    <1> 	mov     dx, [audio_io_base]
  2077                              <1> 	;add	dx, 0Ch
  2078                              <1> 	; 06/08/2022
  2079 00014632 80C20C              <1> 	add	dl, 0Ch
  2080                              <1> 	SbOut   0D1h ; Turn on speaker
  1900                              <2> %%Wait:
  1901 00014635 EC                  <2>  in al, dx
  1902 00014636 08C0                <2>  or al, al
  1903 00014638 78FB                <2>  js short %%Wait
  1904 0001463A B0D1                <2>  mov al, %1
  1905 0001463C EE                  <2>  out dx, al
  2081                              <1> 	SbOut   41h ; 8h bit or 16 bit transfer
  1900                              <2> %%Wait:
  1901 0001463D EC                  <2>  in al, dx
  1902 0001463E 08C0                <2>  or al, al
  1903 00014640 78FB                <2>  js short %%Wait
  1904 00014642 B041                <2>  mov al, %1
  1905 00014644 EE                  <2>  out dx, al
  2082 00014645 668B1D[5E8F0100]    <1> 	mov	bx, [audio_freq] ; sampling rate (Hz)
  2083                              <1> 	SbOut	bh ; sampling rate high byte
  1900                              <2> %%Wait:
  1901 0001464C EC                  <2>  in al, dx
  1902 0001464D 08C0                <2>  or al, al
  1903 0001464F 78FB                <2>  js short %%Wait
  1904 00014651 88F8                <2>  mov al, %1
  1905 00014653 EE                  <2>  out dx, al
  2084                              <1> 	SbOut	bl ; sampling rate low byte
  1900                              <2> %%Wait:
  1901 00014654 EC                  <2>  in al, dx
  1902 00014655 08C0                <2>  or al, al
  1903 00014657 78FB                <2>  js short %%Wait
  1904 00014659 88D8                <2>  mov al, %1
  1905 0001465B EE                  <2>  out dx, al
  2085                              <1> 
  2086                              <1> 	; 22/05/2017
  2087 0001465C E8BD000000          <1> 	call	sb16_volume_initial ; 15/05/2017
  2088                              <1> 	; 20/05/2017
  2089                              <1> 	;call	sb16_volume
  2090                              <1> 
  2091                              <1> StartDma: 
  2092                              <1> 	; autoinitialized mode
  2093 00014661 803D[5C8F0100]10    <1> 	cmp	byte [audio_bps], 16 ; 16 bit samples
  2094 00014668 7411                <1> 	je	short sb_play_1
  2095                              <1> 	; 8 bit samples
  2096 0001466A 66BBC600            <1> 	mov	bx, 0C6h ; 8 bit output (0C6h)
  2097 0001466E 803D[5D8F0100]02    <1> 	cmp	byte [audio_stmo], 2 ; 1 = mono, 2 = stereo
  2098 00014675 7214                <1> 	jb	short sb_play_2
  2099 00014677 B720                <1> 	mov	bh, 20h	; 8 bit stereo (20h)
  2100 00014679 EB10                <1> 	jmp	short sb_play_2
  2101                              <1> sb_play_1:
  2102                              <1> 	; 16 bit samples
  2103 0001467B 66BBB610            <1> 	mov	bx, 10B6h ; 16 bit output (0B6h)
  2104 0001467F 803D[5D8F0100]02    <1> 	cmp	byte [audio_stmo], 2 ; 1 = mono, 2 = stereo
  2105 00014686 7203                <1> 	jb	short sb_play_2
  2106 00014688 80C720              <1> 	add	bh, 20h	; 16 bit stereo (30h)
  2107                              <1> sb_play_2:     
  2108                              <1> 	; PCM output (8/16 bit mono autoinitialized transfer)
  2109                              <1> 	SbOut   bl ; bCommand
  1900                              <2> %%Wait:
  1901 0001468B EC                  <2>  in al, dx
  1902 0001468C 08C0                <2>  or al, al
  1903 0001468E 78FB                <2>  js short %%Wait
  1904 00014690 88D8                <2>  mov al, %1
  1905 00014692 EE                  <2>  out dx, al
  2110                              <1> 	SbOut	bh ; bMode
  1900                              <2> %%Wait:
  1901 00014693 EC                  <2>  in al, dx
  1902 00014694 08C0                <2>  or al, al
  1903 00014696 78FB                <2>  js short %%Wait
  1904 00014698 88F8                <2>  mov al, %1
  1905 0001469A EE                  <2>  out dx, al
  2111 0001469B 8B1D[4C8F0100]      <1> 	mov	ebx, [audio_dmabuff_size]  ; 15/05/2017
  2112 000146A1 D1EB                <1> 	shr	ebx, 1 ; half buffer size
  2113                              <1> 	; 20/10/2017	
  2114 000146A3 803D[5C8F0100]10    <1> 	cmp	byte [audio_bps], 16 ; 16 bit DMA
  2115 000146AA 7502                <1> 	jne	short sb_play_3
  2116 000146AC D1EB                <1> 	shr	ebx, 1 ; byte count to word count
  2117                              <1> sb_play_3: 
  2118                              <1> 	;dec	bx  ; wBlkSize is one less than the actual size
  2119                              <1> 	; 06/08/2022
  2120 000146AE 4B                  <1> 	dec	ebx
  2121                              <1> 	SbOut   bl
  1900                              <2> %%Wait:
  1901 000146AF EC                  <2>  in al, dx
  1902 000146B0 08C0                <2>  or al, al
  1903 000146B2 78FB                <2>  js short %%Wait
  1904 000146B4 88D8                <2>  mov al, %1
  1905 000146B6 EE                  <2>  out dx, al
  2122                              <1> 	SbOut   bh
  1900                              <2> %%Wait:
  1901 000146B7 EC                  <2>  in al, dx
  1902 000146B8 08C0                <2>  or al, al
  1903 000146BA 78FB                <2>  js short %%Wait
  1904 000146BC 88F8                <2>  mov al, %1
  1905 000146BE EE                  <2>  out dx, al
  2123                              <1> 
  2124 000146BF C605[628F0100]01    <1> 	mov	byte [audio_play_cmd], 1 ; playing !
  2125                              <1> 
  2126                              <1> 	;; Set Voice and master volumes
  2127                              <1> 	;mov	dx, [audio_io_base]
  2128                              <1> 	;add	dl, 4 ; Mixer chip Register Address Port
  2129                              <1> 	;SbOut	30h   ; select Master Volume Register (L)
  2130                              <1> 	;inc	dl    ; Mixer chip Register Data Port
  2131                              <1> 	;SbOut	0F8h  ; Max. volume value is 31 (31*8)
  2132                              <1> 	;dec	dl
  2133                              <1> 	;SbOut	31h   ; select Master Volume Register (R)
  2134                              <1> 	;inc	dl
  2135                              <1> 	;SbOut	0F8h  ; Max. volume value is 31 (31*8)
  2136                              <1> 	;dec	dl
  2137                              <1> 	;SbOut	32h   ; select Voice Volume Register (L)
  2138                              <1> 	;inc	dl
  2139                              <1> 	;SbOut	0F8h  ; Max. volume value is 31 (31*8)
  2140                              <1> 	;dec	dl
  2141                              <1> 	;SbOut	33h   ; select Voice Volume Register (R)
  2142                              <1> 	;inc	dl
  2143                              <1> 	;SbOut	0F8h  ; Max. volume value is 31 (31*8)
  2144                              <1> 	;;
  2145                              <1> 	;dec	dl
  2146                              <1> 	;SbOut	44h   ; select Treble Register (L)
  2147                              <1> 	;inc	dl
  2148                              <1> 	;SbOut	0F0h  ; Max. Treble value is 15 (15*16)
  2149                              <1> 	;dec	dl
  2150                              <1> 	;SbOut	45h   ; select Treble Register (R)
  2151                              <1> 	;inc	dl
  2152                              <1> 	;SbOut	0F0h  ; Max. Treble value is 15 (15*16)
  2153                              <1> 	;dec	dl
  2154                              <1> 	;SbOut	46h   ; select Bass Register (L)
  2155                              <1> 	;inc	dl
  2156                              <1> 	;SbOut	0F0h  ; Max. Bass value is 15 (15*16)
  2157                              <1> 	;dec	dl
  2158                              <1> 	;SbOut	47h   ; select Bass Register (R)
  2159                              <1> 	;inc	dl
  2160                              <1> 	;SbOut	0F0h  ; Max. Bass value is 15 (15*16)
  2161                              <1> 
  2162                              <1> sb_Exit:
  2163                              <1> 	;popad
  2164 000146C6 C3                  <1> 	retn
  2165                              <1> 
  2166                              <1> sb16_int_handler:
  2167                              <1> 	; Interrupt Handler for Sound Blaster 16 Audio Card
  2168                              <1> 	; Note: called by 'dev_IRQ_service'
  2169                              <1> 	; 28/01/2025
  2170                              <1> 	;	TRDOS 386 Kernel v2.0.10
  2171                              <1> 	; 20/10/2017
  2172                              <1> 	; 12/10/2017
  2173                              <1> 	; 10/10/2017 
  2174                              <1> 	; 12/05/2017, 09/10/2017
  2175                              <1> 	; 24/04/2017 (TRDOS 386 kernel, 'audio.s')
  2176                              <1> 	; 10/03/2017 - 'PLAYWAV.PRG' ('playwav.s')
  2177                              <1> 
  2178                              <1> 	;push	eax ; * must be saved !
  2179                              <1> 	;push	ebx ; * must be saved !
  2180                              <1> 	;push	ecx
  2181                              <1> 	;push	edx
  2182                              <1> 	;push	esi
  2183                              <1> 	;push	edi
  2184                              <1> 
  2185 000146C7 668B15[2E8F0100]    <1> 	mov     dx, [audio_io_base]
  2186                              <1> 	; 20/10/2017
  2187 000146CE 80C20F              <1> 	add     dl, 0Fh ; 2xFh (DSP 16 bit intr ack)
  2188 000146D1 803D[5C8F0100]10    <1> 	cmp	byte [audio_bps], 16
  2189 000146D8 7402                <1> 	je	short sb_irq_16bit_ack
  2190                              <1> sb_irq_8bit_ack:
  2191 000146DA FECA                <1> 	dec	dl  ; 2xEh (DSP 8 bit intr ack)
  2192                              <1> sb_irq_16bit_ack:
  2193 000146DC EC                  <1> 	in	al, dx
  2194                              <1> 
  2195                              <1> 	;cmp	byte [audio_busy], 0
  2196                              <1> 	;ja	short sb_irq_h3
  2197                              <1> 
  2198                              <1> 	;mov	byte [audio_busy], 1
  2199                              <1> 
  2200 000146DD 803D[628F0100]01    <1> 	cmp	byte [audio_play_cmd], 1
  2201 000146E4 7307                <1> 	jnb	short sb_irq_h1
  2202                              <1> sb_irq_h0:
  2203 000146E6 E8A1000000          <1> 	call	sb16_stop
  2204 000146EB EB29                <1> 	jmp	short sb_irq_h3
  2205                              <1> sb_irq_h1:
  2206                              <1> 	;call	sb16_tuneloop
  2207                              <1> 	; 09/10/2017
  2208                              <1> sb16_tuneloop:
  2209 000146ED 8B3D[488F0100]      <1> 	mov	edi, [audio_dma_buff]
  2210                              <1> 	;mov	ecx, [audio_dmabuff_size]
  2211                              <1> 	;shr	ecx, 1 ; dma buff size / 2 = half buffer size
  2212                              <1> 	; 28/01/2025 (BugFix)
  2213 000146F3 8B0D[508F0100]      <1> 	mov	ecx, [dma_hbuff_size]
  2214                              <1> 
  2215                              <1> 	; 22/05/2017
  2216 000146F9 F605[548F0100]01    <1> 	test	byte [audio_flag], 1  ; Current flag value
  2217 00014700 7402                <1> 	jz	short sb_tlp1 ; EOL (Half Buffer 1 must be filled)
  2218                              <1> 	; FLAG (Half Buffer 2 must be filled)
  2219 00014702 01CF                <1> 	add	edi, ecx
  2220                              <1> 	; 15/05/2017
  2221                              <1> sb_tlp1: 
  2222 00014704 8B35[408F0100]      <1> 	mov	esi, [audio_p_buffer] ; phy addr of audio buff
  2223                              <1> 	;rep	movsb
  2224 0001470A C1E902              <1> 	shr	ecx, 2 ; half buff size / 4
  2225 0001470D F3A5                <1> 	rep	movsd
  2226                              <1> 	;retn
  2227                              <1> 
  2228                              <1> 	; 10/10/2017
  2229                              <1> 	; switch flag value
  2230 0001470F 8035[548F0100]01    <1> 	xor	byte [audio_flag], 1
  2231                              <1> 
  2232                              <1> 	; 12/10/2017
  2233                              <1> 	; [audio_flag] = 0 : Playing dma half buffer 2 (odd intr count)
  2234                              <1> 			   ; Next buffer (to update) is dma half buff 1
  2235                              <1> 	; 	       = 1 : Playing dma half buffer 1 (even intr count)
  2236                              <1> 			   ; Next buffer (to update) is dma half buff 2
  2237                              <1> 
  2238                              <1> sb_irq_h3:
  2239                              <1> 	;mov	byte [audio_busy], 0
  2240                              <1> 
  2241                              <1> 	;pop	edi
  2242                              <1> 	;pop	esi
  2243                              <1> 	;pop	edx
  2244                              <1> 	;pop	ecx
  2245                              <1> 	;pop	ebx ; * must be restored !
  2246                              <1> 	;pop	eax ; * must be restored !
  2247                              <1> 	
  2248 00014716 C3                  <1> 	retn
  2249                              <1> 
  2250                              <1> sb16_volume:
  2251                              <1> 	; 06/08/2022 (TRDOS 386 v2.0.5)
  2252                              <1> 	; 22/10/2017
  2253                              <1> 	; mov [audio_master_volume_l], cl
  2254                              <1> 	; mov [audio_master_volume_h], ch
  2255 00014717 66890D[648F0100]    <1> 	mov	[audio_master_volume], cx
  2256                              <1> sb16_volume_initial:
  2257                              <1> 	;push	dx ; DX (port address) must be saved
  2258                              <1> 	; 06/08/2022
  2259 0001471E 52                  <1> 	push	edx
  2260 0001471F 668B15[2E8F0100]    <1> 	mov	dx, [audio_io_base]
  2261                              <1> 	;add	dx, 4 ; Mixer chip address port
  2262                              <1> 	; 06/08/2022
  2263 00014726 80C204              <1> 	add	dl, 4
  2264 00014729 B022                <1> 	mov	al, 22h ; master volume
  2265 0001472B EE                  <1> 	out	dx, al
  2266                              <1> 	;inc	dx
  2267                              <1> 	; 06/08/2022
  2268 0001472C 42                  <1> 	inc	edx
  2269 0001472D 8A25[648F0100]      <1> 	mov	ah, [audio_master_volume_l]
  2270 00014733 C0EC02              <1> 	shr	ah, 2 ; 32 -> 8 level
  2271 00014736 C0E405              <1> 	shl	ah, 5 ; bit 5 to 7
  2272 00014739 A0[658F0100]        <1> 	mov	al, [audio_master_volume_r]
  2273 0001473E C0E802              <1> 	shr	al, 2 ; 32 -> 8 level
  2274                              <1> 	;and	al, 0Fh
  2275 00014741 D0E0                <1> 	shl	al, 1 ; bit 1 to 3
  2276 00014743 08E0                <1> 	or	al, ah
  2277 00014745 EE                  <1> 	out	dx, al
  2278                              <1> 	;pop	dx ; DX (port address) must be restored
  2279                              <1> 	; 06/08/2022
  2280 00014746 5A                  <1> 	pop	edx
  2281 00014747 C3                  <1> 	retn
  2282                              <1> 
  2283                              <1> sb16_pause:
  2284                              <1> 	; 06/08/2022 (TRDOS 386 v2.0.5)
  2285 00014748 668B15[2E8F0100]    <1> 	mov	dx, [audio_io_base]
  2286                              <1> 	;add	dx, 0Ch ; Command & Data Port
  2287                              <1> 	; 06/08/2022
  2288 0001474F 80C20C              <1> 	add	dl, 0Ch
  2289 00014752 803D[5C8F0100]10    <1> 	cmp	byte [audio_bps], 16 ; 16 bit samples
  2290 00014759 7404                <1> 	je	short sb_pause_1
  2291                              <1> 	; 8 bit samples
  2292 0001475B B3D0                <1> 	mov	bl, 0D0h ; 8 bit DMA mode
  2293 0001475D EB02                <1> 	jmp	short sb_pause_2
  2294                              <1> sb_pause_1:
  2295                              <1> 	; 16 bit samples
  2296 0001475F B3D5                <1> 	mov	bl, 0D5h ; 16 bit DMA mode
  2297                              <1> sb_pause_2:
  2298                              <1> 	SbOut   bl ; bCommand
  1900                              <2> %%Wait:
  1901 00014761 EC                  <2>  in al, dx
  1902 00014762 08C0                <2>  or al, al
  1903 00014764 78FB                <2>  js short %%Wait
  1904 00014766 88D8                <2>  mov al, %1
  1905 00014768 EE                  <2>  out dx, al
  2299                              <1> sb_pause_3:
  2300 00014769 C3                  <1> 	retn
  2301                              <1> 
  2302                              <1> sb16_continue:
  2303                              <1> 	; 06/08/2022 (TRDOS 386 v2.0.5)
  2304 0001476A 668B15[2E8F0100]    <1> 	mov	dx, [audio_io_base]
  2305                              <1> 	;add	dx, 0Ch ; Command & Data Port
  2306                              <1> 	; 06/08/2022
  2307 00014771 80C20C              <1> 	add	dl, 0Ch
  2308 00014774 803D[5C8F0100]10    <1> 	cmp	byte [audio_bps], 16 ; 16 bit samples
  2309 0001477B 7404                <1> 	je	short sb_cont_1
  2310                              <1> 	; 8 bit samples
  2311 0001477D B3D4                <1> 	mov	bl, 0D4h ; 8 bit DMA mode
  2312 0001477F EB02                <1> 	jmp	short sb_cont_2
  2313                              <1> sb_cont_1:
  2314                              <1> 	; 16 bit samples
  2315 00014781 B3D6                <1> 	mov	bl, 0D6h ; 16 bit DMA mode
  2316                              <1> sb_cont_2:     
  2317                              <1> 	SbOut   bl ; bCommand
  1900                              <2> %%Wait:
  1901 00014783 EC                  <2>  in al, dx
  1902 00014784 08C0                <2>  or al, al
  1903 00014786 78FB                <2>  js short %%Wait
  1904 00014788 88D8                <2>  mov al, %1
  1905 0001478A EE                  <2>  out dx, al
  2318                              <1> sb_cont_3:
  2319 0001478B C3                  <1> 	retn
  2320                              <1> 
  2321                              <1> sb16_stop:
  2322                              <1> 	; 06/08/2022 (TRDOS 386 v2.0.5)
  2323                              <1> 	; 24/04/2017
  2324 0001478C 803D[628F0100]00    <1> 	cmp	byte [audio_play_cmd], 0
  2325 00014793 7647                <1> 	jna	short sb16_stop_4
  2326                              <1> 
  2327                              <1> 	; 22/05/2017
  2328 00014795 668B15[2E8F0100]    <1> 	mov	dx, [audio_io_base]
  2329                              <1> 	;add	dx, 0Ch
  2330                              <1> 	; 06/08/2022
  2331 0001479C 80C20C              <1> 	add	dl, 0Ch
  2332                              <1> 
  2333 0001479F B3D9                <1> 	mov	bl, 0D9h ; exit auto-initialize 16 bit transfer
  2334                              <1> 	; stop  autoinitialized DMA transfer mode 
  2335 000147A1 803D[5C8F0100]10    <1> 	cmp	byte [audio_bps], 16 ; 16 bit samples
  2336 000147A8 7402                <1> 	je	short sb16_stop_1
  2337                              <1> 	;mov	bl, 0DAh ; exit auto-initialize 8 bit transfer
  2338 000147AA FEC3                <1> 	inc	bl
  2339                              <1> sb16_stop_1:
  2340                              <1> 	SbOut	bl ; exit auto-initialize transfer command
  1900                              <2> %%Wait:
  1901 000147AC EC                  <2>  in al, dx
  1902 000147AD 08C0                <2>  or al, al
  1903 000147AF 78FB                <2>  js short %%Wait
  1904 000147B1 88D8                <2>  mov al, %1
  1905 000147B3 EE                  <2>  out dx, al
  2341                              <1> 
  2342 000147B4 30C0                <1> 	xor     al, al ; stops all DMA processes on selected channel
  2343                              <1> 
  2344 000147B6 803D[5C8F0100]10    <1> 	cmp	byte [audio_bps], 16 ; 16 bit samples
  2345 000147BD 7404                <1> 	je	short sb16_stop_2
  2346 000147BF E60C                <1> 	out	0Ch, al ; clear selected channel register
  2347 000147C1 EB02                <1> 	jmp	short sb16_stop_3
  2348                              <1> 
  2349                              <1> sb16_stop_2:
  2350 000147C3 E6D8                <1> 	out	0D8h, al ; clear selected channel register
  2351                              <1> 
  2352                              <1> sb16_stop_3:
  2353 000147C5 C605[628F0100]00    <1> 	mov	byte [audio_play_cmd], 0 ; stop !
  2354                              <1> SbDone:
  2355                              <1> 	;mov	dx, [audio_io_base]
  2356                              <1> 	;add	dx, 0Ch
  2357                              <1> 	SbOut   0D0h
  1900                              <2> %%Wait:
  1901 000147CC EC                  <2>  in al, dx
  1902 000147CD 08C0                <2>  or al, al
  1903 000147CF 78FB                <2>  js short %%Wait
  1904 000147D1 B0D0                <2>  mov al, %1
  1905 000147D3 EE                  <2>  out dx, al
  2358                              <1> 	SbOut   0D3h
  1900                              <2> %%Wait:
  1901 000147D4 EC                  <2>  in al, dx
  1902 000147D5 08C0                <2>  or al, al
  1903 000147D7 78FB                <2>  js short %%Wait
  1904 000147D9 B0D3                <2>  mov al, %1
  1905 000147DB EE                  <2>  out dx, al
  2359                              <1> sb16_stop_4:
  2360 000147DC C3                  <1> 	retn
  2361                              <1> 
  2362                              <1> sb16_reset:
  2363                              <1> 	; 06/08/2022 (TRDOS 386 v2.0.5)
  2364                              <1> 	; 24/04/2017
  2365 000147DD 668B15[2E8F0100]    <1> 	mov     dx, [audio_io_base] ; try to reset the DSP.
  2366                              <1> 	;add	dx, 06h
  2367                              <1> 	; 06/08/2022
  2368 000147E4 80C206              <1> 	add	dl, 06h
  2369 000147E7 B001                <1> 	mov	al, 1
  2370 000147E9 EE                  <1> 	out	dx, al
  2371                              <1> 
  2372 000147EA EC                  <1> 	in	al, dx
  2373 000147EB EC                  <1> 	in	al, dx
  2374 000147EC EC                  <1> 	in	al, dx
  2375 000147ED EC                  <1> 	in	al, dx
  2376                              <1> 
  2377 000147EE 30C0                <1> 	xor     al, al
  2378 000147F0 EE                  <1> 	out	dx, al
  2379                              <1> 
  2380                              <1> 	;add	dx, 08h
  2381                              <1> 	; 06/08/2022
  2382 000147F1 80C208              <1> 	add	dl, 08h
  2383                              <1> 	;mov	cx, 100
  2384 000147F4 29C9                <1> 	sub	ecx, ecx
  2385 000147F6 B164                <1> 	mov	cl, 100
  2386                              <1> sbrstWaitID:
  2387 000147F8 EC                  <1> 	in	al, dx
  2388 000147F9 08C0                <1> 	or      al, al
  2389 000147FB 7804                <1> 	js      short sbrstGetID
  2390 000147FD E2F9                <1> 	loop    sbrstWaitID
  2391 000147FF F9                  <1> 	stc
  2392 00014800 C3                  <1> 	retn
  2393                              <1> sbrstGetID:
  2394                              <1> 	;sub	dx, 04h
  2395                              <1> 	; 06/08/2022
  2396 00014801 80EA04              <1> 	sub	dl, 04h
  2397 00014804 EC                  <1> 	in	al, dx
  2398 00014805 3CAA                <1> 	cmp     al, 0AAh
  2399 00014807 7405                <1> 	je      short sb_rst_retn
  2400                              <1> 	;add	dx, 04h
  2401                              <1> 	; 06/08/2022
  2402 00014809 80C204              <1> 	add	dl, 04h
  2403 0001480C E2EA                <1> 	loop    sbrstWaitID
  2404                              <1> sb_rst_retn:
  2405 0001480E C3                  <1> 	retn
  2406                              <1> 
  2407                              <1> ac97_codec_config:
  2408                              <1> 	; 06/06/2024
  2409                              <1> 	; 04/06/2024
  2410                              <1> 	; 03/06/2024
  2411                              <1> 	; 02/06/2024
  2412                              <1> 	; 01/06/2024 (TRDOS 386 v2.0.8)
  2413                              <1> 	; 26/11/2023
  2414                              <1> 	; 21/11/2023
  2415                              <1> 	; 20/11/2023
  2416                              <1> 	; 19/11/2023 (TRDOS 386 v2.0.7)
  2417                              <1> 	; 10/06/2017
  2418                              <1> 	; 05/06/2017
  2419                              <1> 	; 29/05/2017
  2420                              <1> 	; 28/05/2017 (TRDOS 386, 'audio.s')
  2421                              <1> 	; 07/11/2016 (Erdogan Tan)
  2422                              <1> 	; Derived from 'codecConfig' procedure in 'CODEC.ASM'
  2423                              <1> 	; .wav player for DOS by Jeff Leyda (02/09/2002)
  2424                              <1> 
  2425                              <1> 	;; 'PLAYER.ASM'
  2426                              <1> 	;; get ICH base address regs for mixer and bus master
  2427                              <1> 
  2428                              <1> init_ac97_controller: ; 10/06/2017
  2429 0001480F A1[308F0100]        <1> 	mov	eax, [audio_dev_id]
  2430                              <1>         ;mov	al, NAMBAR_REG
  2431                              <1>         ;;call  pciRegRead16			; read PCI registers 10-11
  2432                              <1>         ;call	pciRegRead32
  2433                              <1> 	;and	dx, IO_ADDR_MASK 		; mask off BIT0
  2434                              <1> 	;;and	edx, IO_ADDR_MASK
  2435                              <1> 
  2436                              <1>         ;mov	[NAMBAR], dx			; save audio mixer base addr
  2437                              <1> 
  2438                              <1>         ;mov	al, NABMBAR_REG
  2439                              <1>         ;;call	pciRegRead16
  2440                              <1>         ;call	pciRegRead32
  2441                              <1> 	;and	dx, 0FFC0h ; IO_ADDR_MASK
  2442                              <1> 	;;and	edx, 0FFC0h
  2443                              <1> 
  2444                              <1>         ;mov    [NABMBAR], dx			; save bus master base addr
  2445                              <1> 
  2446                              <1> 	;mov	eax, [audio_dev_id]
  2447 00014814 B004                <1>         mov	al, PCI_CMD_REG
  2448                              <1>         ;call	pciRegRead8			; read PCI command register
  2449 00014816 E897F8FFFF          <1>         call	pciRegRead16
  2450 0001481B 80CA05              <1> 	or	dl, IO_ENA+BM_ENA               ; enable IO and bus master
  2451                              <1>         ;call	pciRegWrite8
  2452 0001481E E8FAF8FFFF          <1> 	call	pciRegWrite16
  2453                              <1> 
  2454                              <1> 	; 'CODEC.ASM'
  2455                              <1> 
  2456                              <1> 	; enable codec, unmute stuff, set output rate
  2457                              <1> ;	; entry: [audio_freq] = desired sample rate
  2458                              <1> 		
  2459                              <1> ;	mov	dx, [NAMBAR]
  2460                              <1> ;	add	dx, CODEC_EXT_AUDIO_CTRL_REG  	; 2Ah
  2461                              <1> ;	in	ax, dx
  2462                              <1> ;	or	ax, 1
  2463                              <1> ;	out	dx, ax 				; Enable variable rate audio
  2464                              <1> 
  2465                              <1> ;       ;call	delay1_4ms
  2466                              <1> ;       ;call	delay1_4ms
  2467                              <1> ;       ;call	delay1_4ms
  2468                              <1> ;       ;call	delay1_4ms
  2469                              <1> 
  2470                              <1> ;	mov	ax, [audio_freq]		; sample rate
  2471                              <1> 
  2472                              <1> ;	mov	dx, [NAMBAR]               	
  2473                              <1> ;	add	dx, CODEC_PCM_FRONT_DACRATE_REG	; 2Ch
  2474                              <1> ;	out	dx, ax 				; out sample rate
  2475                              <1> 		
  2476                              <1> ;       ;call	delay1_4ms
  2477                              <1> ;       ;call	delay1_4ms
  2478                              <1> ;       ;call	delay1_4ms
  2479                              <1> ;       ;call	delay1_4ms
  2480                              <1> 
  2481                              <1> 	;mov	dx, [NAMBAR]			; mixer base address
  2482                              <1>         ;add	dx, CODEC_RESET_REG  		; reset register
  2483                              <1>         ;mov	ax, 42
  2484                              <1> 	;out	dx, ax                          ; reset
  2485                              <1> 
  2486                              <1> 	;mov	dx, [NABMBAR]			; bus master base address
  2487                              <1>         ;add	dx, GLOB_STS_REG
  2488                              <1>         ;mov	ax, 2
  2489                              <1> 	;out	dx, ax
  2490                              <1> 
  2491                              <1> 	; 01/06/2024
  2492                              <1> 	; 16/05/2024
  2493                              <1> 	; 02/12/2023
  2494                              <1> 	;call	delay_100ms ; 29/05/2017
  2495                              <1> 
  2496                              <1> 	; 02/12/2023
  2497                              <1> 	;call	delay1_4ms
  2498                              <1> 	;call	delay1_4ms
  2499                              <1> 	;call	delay1_4ms
  2500                              <1> 	;call	delay1_4ms
  2501                              <1> 
  2502                              <1> init_ac97_codec:
  2503                              <1> 	; 26/11/2023
  2504                              <1> 	; 19/11/2023
  2505                              <1> 	;   (playwav3.com, ac97_vra.asm, Erdogan Tan, 19/11/2023)
  2506                              <1> 	; 10/06/2017
  2507                              <1> 	; 29/05/2017
  2508                              <1> 	; 28/05/2017 - Erdogan Tan (Ref: KolibriOS, intelac97.asm)
  2509                              <1> 
  2510                              <1> 	;; 23/11/2023 - temporary
  2511                              <1> 	;push	ebx
  2512                              <1> 	;mov	ebx, 0B8000h
  2513                              <1> 	;mov	al, '?'
  2514                              <1> 	;mov	ah, 4Eh
  2515                              <1> 	;mov	[ebx], ax
  2516                              <1> 	;pop	ebx
  2517                              <1> 
  2518                              <1> 	; 01/06/2024
  2519 00014823 C605[6C930100]01    <1> 	mov	byte [reset], 1
  2520                              <1> 
  2521                              <1> 	; 19/11/2023
  2522 0001482A BD28000000          <1> 	mov	ebp, 40	; 21/11/2023
  2523                              <1> _initc_1:
  2524                              <1> 	; 26/05/2024
  2525 0001482F 66BA3000            <1> 	mov	dx, GLOB_STS_REG ; 30h
  2526 00014833 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  2527 0001483A ED                  <1> 	in	eax, dx
  2528                              <1> 
  2529                              <1> 	; 01/06/2024
  2530                              <1> 	; 02/12/2023
  2531                              <1> 	;call	delay1_4ms
  2532                              <1> 
  2533 0001483B 83F8FF              <1> 	cmp	eax, 0FFFFFFFFh ; -1
  2534 0001483E 750A                <1> 	jne	short _initc_3
  2535                              <1> _initc_2:
  2536 00014840 4D                  <1> 	dec	ebp	; 21/11/2023
  2537 00014841 7425                <1> 	jz	short _ac97_codec_ready
  2538                              <1> 
  2539 00014843 E86DF9FFFF          <1> 	call	delay_100ms
  2540 00014848 EBE5                <1> 	jmp	short _initc_1
  2541                              <1> _initc_3:
  2542 0001484A A900030010          <1> 	test	eax, CTRL_ST_CREADY
  2543 0001484F 7517                <1> 	jnz	short _ac97_codec_ready
  2544                              <1> 
  2545                              <1> 	; 01/06/2024
  2546 00014851 803D[6C930100]00    <1> 	cmp	byte [reset], 0
  2547 00014858 76E6                <1> 	jna	short _initc_2
  2548                              <1> 
  2549 0001485A E849030000          <1> 	call	reset_ac97_codec
  2550                              <1> 	;jc	short _initc_2
  2551                              <1> 	; 01/06/2024
  2552 0001485F C605[6C930100]00    <1> 	mov	byte [reset], 0
  2553                              <1> 	; 26/11/2023
  2554 00014866 EBD8                <1> 	jmp	short _initc_2
  2555                              <1> 
  2556                              <1> _ac97_codec_ready:
  2557 00014868 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  2558                              <1> 	;add	dx, 0 ; ac_reg_0 ; reset register
  2559 0001486F 66EF                <1> 	out	dx, ax
  2560                              <1> 
  2561                              <1> 	; 06/06/2024
  2562                              <1> 	; 01/06/2024
  2563                              <1> 	;;;
  2564                              <1> 	;call	delay1_4ms
  2565                              <1> 	;call	delay1_4ms
  2566                              <1> 	;call	delay1_4ms
  2567                              <1> 	;call	delay1_4ms
  2568                              <1> 	;;;
  2569                              <1> 
  2570                              <1> 	; 01/06/2024
  2571                              <1> 	; 26/05/2024
  2572                              <1> 	; 19/11/2023
  2573                              <1> 	;call	delay_100ms
  2574                              <1> 	; 24/11/2023 - temporary
  2575                              <1> 	;call	delay_100ms
  2576                              <1> 	;call	delay_100ms
  2577                              <1> 	;call	delay_100ms
  2578                              <1> 
  2579                              <1> 	; 01/06/2024
  2580                              <1> 	;;;
  2581 00014871 09ED                <1> 	or	ebp, ebp  ; 21/11/2023
  2582 00014873 753E                <1> 	jnz	short _ac97_codec_init_ok
  2583                              <1> 	;;;
  2584                              <1> 
  2585 00014875 31C0                <1> 	xor	eax, eax ; 0
  2586 00014877 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  2587 0001487E 6683C226            <1> 	add	dx, CODEC_REG_POWERDOWN
  2588 00014882 66EF                <1> 	out	dx, ax
  2589                              <1> 
  2590                              <1> 	; 10/06/2017
  2591                              <1> 	; 29/05/2017
  2592                              <1> 	; wait for 1 second
  2593                              <1> 	; 01/06/2024
  2594                              <1> 	; 16/05/2024
  2595 00014884 B9E8030000          <1> 	mov	ecx, 1000 ; 1000*0.25ms
  2596                              <1> 	; 20/11/2023
  2597                              <1> 	;mov	ecx, 10
  2598                              <1> 	; 23/05/2024
  2599                              <1> 	;mov	cl, 10
  2600                              <1> 	; 24/11/2023 - temporary
  2601                              <1> 	;mov	cl, 40
  2602                              <1> 	; ecx = 40 ; 23/05/2024
  2603                              <1> _ac97_codec_rloop:
  2604                              <1> 	; 01/06/2024
  2605 00014889 E834F9FFFF          <1> 	call	delay1_4ms
  2606                              <1> 	; 06/06/2024
  2607 0001488E E82FF9FFFF          <1> 	call	delay1_4ms
  2608 00014893 E82AF9FFFF          <1> 	call	delay1_4ms
  2609 00014898 E825F9FFFF          <1> 	call	delay1_4ms
  2610                              <1> 	; 01/06/2024
  2611                              <1> 	; 19/11/2023
  2612                              <1> 	; 22/11/2023
  2613                              <1> 	;push	ecx
  2614                              <1> 	;call	delay_100ms
  2615                              <1> 	;pop	ecx
  2616                              <1> 
  2617                              <1> 	; 01/06/2024
  2618                              <1> 	;;;
  2619 0001489D 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  2620 000148A4 6683C226            <1> 	add	dx, CODEC_REG_POWERDOWN
  2621                              <1> 	;;;
  2622 000148A8 66ED                <1> 	in	ax, dx
  2623                              <1> 
  2624                              <1> 	; 06/06/2024
  2625                              <1> 	;call	delay1_4ms
  2626                              <1> 
  2627                              <1> 	;and	ax, 0Fh
  2628                              <1> 	; 21/11/2023
  2629 000148AA 240F                <1> 	and	al, 0Fh
  2630 000148AC 3C0F                <1> 	cmp	al, 0Fh
  2631 000148AE 7403                <1> 	je	short _ac97_codec_init_ok
  2632                              <1> 	; 24/11/2023 - temporary
  2633                              <1> 	;je	short _ac97_codec_init_ok_
  2634                              <1> _ac97_codec_yloop:	
  2635 000148B0 E2D7                <1> 	loop	_ac97_codec_rloop 
  2636                              <1> 	; 22/11/2023
  2637                              <1> 	; cf = 1
  2638                              <1> init_ac97_codec_err1:
  2639                              <1> 	;stc
  2640                              <1> init_ac97_codec_err2:
  2641 000148B2 C3                  <1> 	retn
  2642                              <1> 
  2643                              <1> ;_ac97_codec_init_ok_:
  2644                              <1> 	;mov	dx, GLOB_STS_REG ; 30h
  2645                              <1> 	;add	dx, [NABMBAR]
  2646                              <1> 	;in	eax, dx
  2647                              <1> 	;test	eax, CTRL_ST_CREADY
  2648                              <1> 	;jnz	short _ac97_codec_init_ok
  2649                              <1> 	;stc 
  2650                              <1> 	;retn
  2651                              <1> 
  2652                              <1> _ac97_codec_init_ok:
  2653                              <1> 	; 06/06/2024 (temporary)
  2654                              <1> 	; (this may not be needed)
  2655                              <1> 	;;;
  2656                              <1> 	; 24/05/2024
  2657                              <1> 	; 26/11/2023
  2658                              <1> 	; 23/11/2023
  2659 000148B3 31C0                <1> 	xor	eax, eax
  2660                              <1> 	; 21/11/2023 - temporary
  2661                              <1> 	; 19/11/2023
  2662 000148B5 B002                <1> 	mov	al, 2 ; force set 16-bit 2-channel PCM
  2663 000148B7 66BA2C00            <1> 	mov	dx, GLOB_CNT_REG ; 2Ch
  2664 000148BB 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  2665 000148C2 EF                  <1> 	out	dx, eax
  2666                              <1> 	;
  2667 000148C3 E8FAF8FFFF          <1> 	call	delay1_4ms
  2668                              <1> 	;;;
  2669                              <1> 
  2670                              <1> 	; 23/11/2023 - temporary
  2671                              <1> 	;call	delay_100ms
  2672                              <1> 	; 06/06/2024
  2673                              <1> 	;call	delay1_4ms
  2674                              <1> 
  2675                              <1> 	; 10/06/2017
  2676 000148C8 E884020000          <1> 	call 	reset_ac97_controller
  2677                              <1> 
  2678                              <1> 	; 21/11/2023
  2679                              <1> 	;call	delay1_4ms
  2680                              <1> 	
  2681                              <1> 	; 01/06/2024
  2682                              <1> 	; 24/05/2024
  2683                              <1> 	; 23/05/2024
  2684                              <1> 	; 21/11/2023 - temporary
  2685 000148CD E8E3F8FFFF          <1> 	call	delay_100ms ; 06/06/2024
  2686                              <1> 
  2687                              <1> ;	call 	setup_ac97_codec
  2688                              <1> ;
  2689                              <1> ;detect_ac97_codec:
  2690                              <1> ;	retn
  2691                              <1> 
  2692                              <1> setup_ac97_codec:
  2693                              <1> 	; 06/06/2024 - TRDOS 386 v2.0.8
  2694                              <1> 	;;;
  2695 000148D2 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  2696 000148D9 6683C22A            <1> 	add	dx, CODEC_EXT_AUDIO_CTRL_REG ; 2Ah
  2697 000148DD 66ED                <1> 	in	ax, dx
  2698                              <1> 
  2699                              <1> 	;and	al, ~BIT1 ; Clear DRA
  2700 000148DF 24FC                <1> 	and	al, ~(BIT1+BIT0) ; Clear DRA+VRA
  2701                              <1> 	;or	al, BIT0  ; Set VRA
  2702                              <1> 
  2703 000148E1 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  2704 000148E8 6683C22A            <1> 	add	dx, CODEC_EXT_AUDIO_CTRL_REG ; 2Ah
  2705 000148EC 66EF                <1> 	out	dx, ax
  2706                              <1> 	;;;
  2707                              <1> 
  2708                              <1> 	; 24/11/2023
  2709                              <1> 	; 19/11/2023 - TRDOS 386 v2.0.7
  2710 000148EE C605[608F0100]01    <1> 	mov	byte [VRA], 1
  2711                              <1> 
  2712                              <1> 	; 25/11/2023 - temporary
  2713                              <1> 	;jmp	short vra_not_supported
  2714                              <1> 
  2715                              <1> 	; 23/05/2024
  2716                              <1> 	; 18/05/2024
  2717                              <1> 	;call	delay1_4ms ; 06/06/2024
  2718                              <1> 	;call	delay_100ms
  2719                              <1> 
  2720                              <1> ; 06/06/2024
  2721                              <1> ; 01/06/2024
  2722                              <1> %if 0
  2723                              <1> 	; 24/05/2024
  2724                              <1> 	; 23/05/2024
  2725                              <1> 	mov	dx, [NAMBAR]
  2726                              <1> 	add	dx, CODEC_EXT_AUDIO_REG	; 28h
  2727                              <1> 	in	ax, dx
  2728                              <1> 	
  2729                              <1> 	; 18/05/2024
  2730                              <1> 	; 02/12/2023
  2731                              <1> 	call	delay1_4ms
  2732                              <1> 	; 17/05/2024
  2733                              <1> 	;call	delay_100ms
  2734                              <1> 	;
  2735                              <1> 	test	al, 1 ; BIT0 ; Variable Rate Audio bit
  2736                              <1> 	jz	short vra_not_supported
  2737                              <1> 
  2738                              <1> 	mov	dx, [NAMBAR]
  2739                              <1> 	add	dx, CODEC_EXT_AUDIO_CTRL_REG ; 2Ah
  2740                              <1> 	in	ax, dx
  2741                              <1> 
  2742                              <1> 	; 06/06/2024
  2743                              <1> 	; 23/05/2024
  2744                              <1> 	; 02/12/2023
  2745                              <1> 	;call	delay1_4ms
  2746                              <1> 	;call	delay_100ms ; 18/05/2024
  2747                              <1> 	; 24/05/2024
  2748                              <1> 	;call	delay1_4ms
  2749                              <1> 	;call	delay1_4ms
  2750                              <1> 	;call	delay1_4ms
  2751                              <1> 
  2752                              <1> 	;and	al, ~BIT1 ; Clear DRA
  2753                              <1> 	;;;
  2754                              <1> 	; 01/06/2024
  2755                              <1> 	and	al, ~(BIT1+BIT0) ; Clear DRA+VRA
  2756                              <1> 	;;;
  2757                              <1> 	; 04/06/2024
  2758                              <1> 	;mov	dx, [NAMBAR]
  2759                              <1> 	;add	dx, CODEC_EXT_AUDIO_CTRL_REG ; 2Ah
  2760                              <1> 	;;;
  2761                              <1> 	out	dx, ax
  2762                              <1> %endif
  2763                              <1> 
  2764                              <1> 	; 04/06/2024
  2765 000148F5 E8C8F8FFFF          <1> 	call	delay1_4ms
  2766                              <1> 	
  2767                              <1> 	; 01/06/2024
  2768                              <1> 	; check VRA
  2769 000148FA 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  2770 00014901 6683C228            <1> 	add	dx, CODEC_EXT_AUDIO_REG	; 28h
  2771 00014905 66ED                <1> 	in	ax, dx
  2772                              <1> 
  2773                              <1> 	; 06/06/2024
  2774                              <1> 	;call	delay1_4ms
  2775                              <1> 	
  2776 00014907 A801                <1> 	test	al, 1 ; BIT0	; Variable Rate Audio bit
  2777 00014909 746F                <1> 	jz	short vra_not_supported
  2778                              <1> 
  2779 0001490B 6640                <1> 	inc	ax ; 0FFh -> 0
  2780 0001490D 753D                <1> 	jnz	short not_alc ; skip ALC850 (and ALC655) checking
  2781                              <1> 	; ax = -1 -> 0 
  2782                              <1> 
  2783                              <1> 	;;;;
  2784                              <1> 	; 06/06/2024 (temporary!?)
  2785                              <1> 	; check ALC850
  2786                              <1> 	; (which does not support VRA but it may not be detected)
  2787                              <1> 	;
  2788 0001490F E8AEF8FFFF          <1> 	call	delay1_4ms
  2789                              <1> 	;
  2790 00014914 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  2791 0001491B 6683C27C            <1> 	add	dx, CODEC_VENDOR_ID1 ; 7Ch
  2792 0001491F 66ED                <1> 	in	ax, dx
  2793 00014921 C1E010              <1> 	shl	eax, 16 ; *
  2794                              <1> 	;cmp	ax, 414Ch ; VENDOR_ID - 'AL'
  2795                              <1> 	;jne	short not_alc
  2796 00014924 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  2797 0001492B 6683C27E            <1> 	add	dx, CODEC_VENDOR_ID2 ; 7Eh
  2798 0001492F 66ED                <1> 	in	ax, dx
  2799                              <1> 	;inc	edx
  2800                              <1> 	;inc	edx
  2801                              <1> 	;in	ax, dx ; VENDOR ID2
  2802                              <1> 
  2803 00014931 40                  <1> 	inc	eax ; 0FFFFFFFFh -> 0 ; 0 -> 1
  2804 00014932 7446                <1> 	jz	short vra_not_supported
  2805 00014934 48                  <1> 	dec	eax ; 1 -> 0
  2806 00014935 7443                <1> 	jz	short vra_not_supported	
  2807                              <1> 
  2808 00014937 C1C810              <1> 	ror	eax, 16
  2809 0001493A 663D4C41            <1> 	cmp	ax, 414Ch ; VENDOR_ID - 'AL'
  2810 0001493E 750C                <1> 	jne	short not_alc
  2811 00014940 C1C010              <1> 	rol	eax, 16
  2812                              <1> 	
  2813                              <1> 	; ALC850
  2814 00014943 80FC47              <1> 	cmp	ah, 47h ; 'G'
  2815 00014946 7504                <1> 	jne	short not_alc
  2816 00014948 3C90                <1> 	cmp	al, 90h
  2817                              <1> 	;cmp	ax, 4790h ; VENDOR ID - 'G' ; bit 8-15
  2818                              <1> 			  ; CHIP ID - 1001b ; bit 4-7
  2819                              <1> 			  ; Version Number - 0 ; bit 0-3
  2820                              <1> 	;jne	short not_alc850 ; not_alc
  2821 0001494A 742E                <1> 	je	short vra_not_supported
  2822                              <1> 	;
  2823                              <1> ; 06/06/2024
  2824                              <1> %if 0
  2825                              <1> not_alc850:
  2826                              <1> 	; ALC655
  2827                              <1> 	cmp	al, 60h
  2828                              <1> 	;cmp	ax, 4760h ; VENDOR ID - 'G' ; bit 8-15
  2829                              <1> 			  ; CHIP ID - 0110b ; bit 4-7
  2830                              <1> 			  ; Version Number - 0 ; bit 0-3
  2831                              <1> 	;jne	short not_alc655
  2832                              <1> 	je	short vra_not_supported
  2833                              <1> 	;
  2834                              <1> not_alc655:
  2835                              <1> %endif
  2836                              <1> not_alc:
  2837                              <1> 	; 06/06/2024
  2838                              <1> 
  2839 0001494C 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  2840 00014953 6683C22A            <1> 	add	dx, CODEC_EXT_AUDIO_CTRL_REG  	; 2Ah
  2841 00014957 66ED                <1> 	in	ax, dx
  2842                              <1> 
  2843                              <1> 	;and	al, ~BIT1 ; Clear DRA
  2844                              <1> 
  2845 00014959 0C01                <1> 	or	al, AC97_EA_VRA ; 1 ; 04/11/2023
  2846                              <1> 	
  2847                              <1> 	; 06/06/2024
  2848                              <1> 	; 04/06/2024
  2849                              <1> 	;mov	dx, CODEC_EXT_AUDIO_CTRL_REG  	; 2Ah
  2850                              <1> 	;add	dx, [NAMBAR]
  2851                              <1> 
  2852 0001495B 66EF                <1> 	out	dx, ax		; Enable variable rate audio
  2853                              <1> 
  2854                              <1> 	; 01/06/2024
  2855 0001495D B90A000000          <1> 	mov	ecx, 10
  2856                              <1> 	; 21/11/2023
  2857                              <1> 	;mov	cl, 10
  2858                              <1> check_vra:
  2859                              <1> 	; 01/06/2024
  2860                              <1> 	;call	delay_100ms
  2861 00014962 E85BF8FFFF          <1> 	call	delay1_4ms
  2862                              <1> 
  2863                              <1> 	;;;
  2864                              <1> 	; 04/06/2024
  2865 00014967 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  2866 0001496E 6683C22A            <1> 	add	dx, CODEC_EXT_AUDIO_CTRL_REG  	; 2Ah
  2867                              <1> 	;;;
  2868                              <1> 
  2869 00014972 66ED                <1> 	in	ax, dx
  2870                              <1> 
  2871                              <1> 	; 24/05/2024
  2872                              <1> 	; 18/05/2024
  2873                              <1> 	; 02/12/2023
  2874                              <1> 	;call	delay1_4ms
  2875                              <1> 
  2876                              <1> 	;test	al, AC97_EA_VRA ; 1
  2877                              <1> 	; 04/06/2024
  2878 00014974 2401                <1> 	and	al, AC97_EA_VRA ; 1
  2879 00014976 7508                <1> 	jnz	short vra_ok
  2880                              <1> 
  2881 00014978 E2E8                <1> 	loop	check_vra
  2882                              <1> 
  2883                              <1> vra_not_supported:	; 24/11/2023
  2884                              <1> 	; VRA is not usable
  2885                              <1> 	;mov	byte [VRA], 0
  2886 0001497A FE0D[608F0100]      <1> 	dec	byte [VRA]
  2887                              <1> 
  2888                              <1> ; 03/06/2024
  2889                              <1> %if 0
  2890                              <1> 	; 02/06/2024
  2891                              <1> 	jmp	short set_volume
  2892                              <1> 
  2893                              <1> 	; 02/06/2024
  2894                              <1> set_sampling_rate:
  2895                              <1> 	mov	dx, [NAMBAR]
  2896                              <1> 	add	dx, CODEC_PCM_FRONT_DACRATE_REG
  2897                              <1> 	out	dx, ax
  2898                              <1> 	retn
  2899                              <1> 
  2900                              <1> 	; 02/06/2024
  2901                              <1> get_sampling_rate:
  2902                              <1> 	mov	dx, CODEC_PCM_FRONT_DACRATE_REG
  2903                              <1> 	add	dx, [NAMBAR]
  2904                              <1> 	in	ax, dx
  2905                              <1> 	retn
  2906                              <1> %endif
  2907                              <1> 
  2908                              <1> vra_ok:
  2909                              <1> 
  2910                              <1> ; 03/06/2024
  2911                              <1> %if 0
  2912                              <1> 	; 02/06/2024
  2913                              <1> 	; a second test for verifying VRA status
  2914                              <1> 	; (may be needed for ALC850 codec and CK804 controller)
  2915                              <1> 	
  2916                              <1> 	call	get_sampling_rate
  2917                              <1> 	or	ax, ax
  2918                              <1> 	jz	short vra_not_supported
  2919                              <1> 	cmp	ax, 48000
  2920                              <1> 	jne	short set_volume
  2921                              <1> 	mov	ax, 24000
  2922                              <1> 	call	set_sampling_rate
  2923                              <1> 	call	get_sampling_rate
  2924                              <1> 	cmp	ax, 48000
  2925                              <1> 	je	short vra_not_supported
  2926                              <1> 	mov	ax, 48000
  2927                              <1> 	call	set_sampling_rate
  2928                              <1> 	;call	get_sampling_rate
  2929                              <1> %endif
  2930                              <1> 
  2931                              <1> 	; 02/06/2024
  2932                              <1> set_volume:
  2933                              <1> 	; 24/05/2024
  2934                              <1> 	; 18/05/2024 - TRDOS 386 v2.0.8
  2935                              <1> 	; 20/11/2023
  2936                              <1> 	; 19/11/2023 - TRDOS 386 v2.0.7
  2937                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  2938                              <1> 	; 22/07/2020
  2939                              <1> 	; 10/06/2017
  2940                              <1> 	; 29/05/2017
  2941                              <1> 
  2942                              <1> 	;mov	eax, 0202h
  2943                              <1> 	; 21/11/2023
  2944                              <1> 	;mov	eax, 0B0Bh
  2945                              <1> 	; 23/11/2023
  2946 00014980 B81D1D0000          <1> 	mov	eax, 1D1Dh
  2947 00014985 66A3[648F0100]      <1> 	mov	[audio_master_volume], ax
  2948                              <1> 	; 24/05/2024
  2949 0001498B 66A3[668F0100]      <1> 	mov	[audio_pcmo_volume], ax
  2950                              <1> 	;mov	ax, 1F1Fh ; 31, 31
  2951                              <1> 
  2952                              <1> 	; 21/11/2023
  2953                              <1> 	;push	eax
  2954                              <1> 	
  2955                              <1> 	; 20/11/2023
  2956                              <1> 	;mov	ax, 0B0Bh
  2957                              <1> 	; 23/11/2023
  2958 00014991 66B80202            <1> 	mov	ax, 0202h
  2959                              <1> 
  2960 00014995 668B15[2C8F0100]    <1>   	mov	dx, [NAMBAR]
  2961 0001499C 6683C202            <1>   	add	dx, CODEC_MASTER_VOL_REG	;02h
  2962                              <1> 	;xor	ax, ax 	; volume attenuation = 0 (max. volume)
  2963                              <1> 	; 06/08/2022
  2964                              <1> 	;xor	eax, eax
  2965                              <1> 	; 19/11/2023
  2966 000149A0 66EF                <1> 	out	dx, ax
  2967                              <1> 
  2968                              <1> 	; 01/06/2024
  2969                              <1> 	; 23/05/2024
  2970                              <1> 	; 16/05/2024
  2971                              <1> 	; 20/11/2023
  2972 000149A2 E81BF8FFFF          <1> 	call	delay1_4ms
  2973                              <1> 	;call	delay1_4ms
  2974                              <1> 	;call	delay1_4ms
  2975                              <1> 	;call	delay1_4ms
  2976                              <1> 	; 21/11/2023 temporary
  2977                              <1> 	;call	delay_100ms ; 18/05/2024
  2978                              <1> 
  2979                              <1> 	; 21/11/2023
  2980                              <1> 	;pop	eax
  2981                              <1> 	
  2982                              <1> 	; 23/11/2023
  2983                              <1> 	; 21/11/2023
  2984                              <1> 	;mov	ax, 0202h
  2985                              <1> 
  2986 000149A7 668B15[2C8F0100]    <1>   	mov	dx, [NAMBAR]
  2987 000149AE 6683C218            <1>   	add	dx, CODEC_PCM_OUT_REG		;18h
  2988                              <1>   	;xor	ax, ax
  2989 000149B2 66EF                <1>   	out	dx, ax
  2990                              <1> 
  2991                              <1> 	; 01/06/2024
  2992                              <1> 	; 23/05/2024
  2993                              <1> 	; 16/05/2024
  2994                              <1> 	; 20/11/2023
  2995                              <1>         ;call	delay1_4ms
  2996                              <1>         ;call	delay1_4ms
  2997                              <1>         ;call	delay1_4ms
  2998                              <1> 	;call	delay1_4ms
  2999                              <1> 	; 21/11/2023 - temporary
  3000                              <1> 	;call	delay_100ms ; 18/05/2024
  3001                              <1> 
  3002                              <1> ; 23/11/2023
  3003                              <1> %if 0
  3004                              <1>   	mov	dx, [NAMBAR]
  3005                              <1>   	add	dx, CODEC_MASTER_MONO_VOL_REG	;06h
  3006                              <1> 	;xor	ax, ax
  3007                              <1>   	out	dx, ax
  3008                              <1> 
  3009                              <1>         ;call	delay1_4ms
  3010                              <1>         ;call	delay1_4ms
  3011                              <1>         ;call	delay1_4ms
  3012                              <1> 	;call	delay1_4ms
  3013                              <1> 
  3014                              <1>   	mov	dx, [NAMBAR]
  3015                              <1>   	add	dx, CODEC_PCBEEP_VOL_REG	;0Ah
  3016                              <1>   	;xor	ax, ax
  3017                              <1>   	out	dx, ax
  3018                              <1> 
  3019                              <1>         ;call	delay1_4ms
  3020                              <1>         ;call	delay1_4ms
  3021                              <1>         ;call	delay1_4ms
  3022                              <1> 	;call	delay1_4ms
  3023                              <1> 
  3024                              <1> 	mov	ax, 8008h ; Mute
  3025                              <1>   	mov	dx, [NAMBAR]
  3026                              <1> 	; 22/07/2020
  3027                              <1> 	add	dx, CODEC_PHONE_VOL_REG		;0Ch
  3028                              <1> 				 ; AC97_PHONE_VOL ; TAD Input (Mono)
  3029                              <1>   	out	dx, ax
  3030                              <1> 
  3031                              <1>         ;call	delay1_4ms
  3032                              <1>         ;call	delay1_4ms
  3033                              <1>         ;call	delay1_4ms
  3034                              <1> 	;call	delay1_4ms
  3035                              <1> 
  3036                              <1>         mov	ax, 0808h
  3037                              <1>   	mov	dx, [NAMBAR]
  3038                              <1>         add	dx, CODEC_LINE_IN_VOL_REG ;10h ; Line Input (Stereo)
  3039                              <1>   	out	dx, ax
  3040                              <1> 
  3041                              <1>         ;call	delay1_4ms
  3042                              <1>         ;call	delay1_4ms
  3043                              <1>         ;call	delay1_4ms
  3044                              <1> 	;call	delay1_4ms
  3045                              <1> 
  3046                              <1> 	;mov	ax, 0808h
  3047                              <1>   	mov	dx, [NAMBAR]
  3048                              <1>         add	dx, CODEC_CD_VOL_REG ;12h ; CR Input (Stereo)
  3049                              <1>   	out	dx, ax
  3050                              <1> 
  3051                              <1>         ;call	delay1_4ms
  3052                              <1>         ;call	delay1_4ms
  3053                              <1>         ;call	delay1_4ms
  3054                              <1> 	;call	delay1_4ms
  3055                              <1> 
  3056                              <1> 	;mov	ax, 0808h
  3057                              <1>   	mov	dx, [NAMBAR]
  3058                              <1>         add	dx, CODEC_AUX_VOL_REG ;16h ; Aux Input (Stereo)
  3059                              <1>   	out	dx, ax
  3060                              <1> 
  3061                              <1>         ;call	delay1_4ms
  3062                              <1>         ;call	delay1_4ms
  3063                              <1>         ;call	delay1_4ms
  3064                              <1>         ;call	delay1_4ms
  3065                              <1> 
  3066                              <1> 	; 21/11/2023 - temporary
  3067                              <1> 	;call	delay_100ms
  3068                              <1> %endif
  3069                              <1> 	; 16/05/2024
  3070                              <1> 	;clc
  3071                              <1> 
  3072                              <1> set_volume_ok:
  3073                              <1> 
  3074                              <1> ;detect_ac97_codec:
  3075 000149B4 C3                  <1> 	retn
  3076                              <1> 
  3077                              <1> set_ac97_bdl: ; Set AC97 (ICH) Buffer Descriptor List
  3078                              <1> 	; 04/06/2024 - TRDOS 386 v2.0.8
  3079                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3080                              <1> 	; 17/06/2017
  3081                              <1> 	; 11/06/2017
  3082                              <1> 	; 28/05/2017
  3083                              <1> 	; eax = dma buffer address = [audio_DMA_buff]
  3084                              <1> 	;; ecx = dma buffer buffer size = [audio_dmabuff_size]
  3085                              <1> 
  3086                              <1> 	; 04/06/2024
  3087                              <1> 	; ecx = DMA half buffer size as truncated for 8 byte alignment
  3088                              <1> 
  3089                              <1> 	;shr	ecx, 1 ; dma half buffer size
  3090 000149B5 89CE                <1> 	mov	esi, ecx
  3091                              <1> 
  3092 000149B7 BF[688F0100]        <1>         mov     edi, audio_bdl_buff	; get BDL address
  3093                              <1> 	;mov	ecx, 32 / 2		; make 32 entries in BDL
  3094                              <1> 	; 06/08/2022
  3095 000149BC 29C9                <1> 	sub	ecx, ecx
  3096 000149BE B110                <1> 	mov	cl, 16
  3097                              <1> 
  3098 000149C0 EB05                <1> 	jmp	short s_ac97_bdl1
  3099                              <1> 
  3100                              <1> s_ac97_bdl0:
  3101                              <1> 	; set buffer descriptor 0 to start of data file in memory
  3102                              <1> 
  3103 000149C2 A1[488F0100]        <1>  	mov	eax, [audio_dma_buff]	; Physical address of DMA buffer
  3104                              <1>  
  3105                              <1> s_ac97_bdl1:
  3106 000149C7 AB                  <1> 	stosd				; store dmabuffer1 address
  3107                              <1> 
  3108 000149C8 89C2                <1> 	mov	edx, eax
  3109                              <1> 
  3110                              <1> ;
  3111                              <1> ; Buffer Descriptors List
  3112                              <1> ; As stated earlier, each buffer descriptor list is a set of (up to) 32
  3113                              <1> ; descriptors, each 8 bytes in length. Bytes 0-3 of a descriptor entry point
  3114                              <1> ; to a chunk of memory to either play from or record to. Bytes 4-7 of an
  3115                              <1> ; entry describe various control things detailed below.
  3116                              <1> ; 
  3117                              <1> ; Buffer pointers must always be aligned on a Dword boundry.
  3118                              <1> ;
  3119                              <1> 
  3120                              <1> ;IOC	equ     BIT31			; Fire an interrupt whenever this
  3121                              <1> 					; buffer is complete.
  3122                              <1> 
  3123                              <1> ;BUP	equ     BIT30			; Buffer Underrun Policy.
  3124                              <1> 					; if this buffer is the last buffer
  3125                              <1> 					; in a playback, fill the remaining
  3126                              <1> 					; samples with 0 (silence) or not.
  3127                              <1>   					; It's a good idea to set this to 1
  3128                              <1> 					; for the last buffer in playback,
  3129                              <1> 					; otherwise you're likely to get a lot
  3130                              <1> 					; of noise at the end of the sound.
  3131                              <1> 
  3132                              <1> ;
  3133                              <1> ; Bits 15:0 contain the length of the buffer, in number of samples, which
  3134                              <1> ; are 16 bits each, coupled in left and right pairs, or 32bits each.
  3135                              <1> ; Luckily for us, that's the same format as .wav files.
  3136                              <1> ;
  3137                              <1> ; A value of FFFF is 65536 samples. Running at 44.1Khz, that's just about
  3138                              <1> ; 1.5 seconds of sample time. FFFF * 32bits is 1FFFFh bytes or 128k of data.
  3139                              <1> ;
  3140                              <1> ; A value of 0 in these bits means play no samples.
  3141                              <1> ;
  3142                              <1> 
  3143 000149CA 89F0                <1> 	mov	eax, esi ; DMA half buffer size
  3144                              <1> 
  3145                              <1> 		; 04/06/2024 - Erdogan Tan
  3146                              <1> 		; NOTE: I have changed DMA half buffer size to truncated
  3147                              <1> 		; (8 byte aligned) audio buffer size for smooth audio playing
  3148                              <1> 		; (it was page border aligned before June 4, 2024)
  3149                              <1> 		;
  3150                              <1> 		; For example:
  3151                              <1> 		;    For 65416 bytes audio buffer (22kHz, 16bit samples)
  3152                              <1> 		;       (user's audio buff virtual addr is mapped to physical)
  3153                              <1> 		;	((kernel's and user's audio buff pages are same)) 
  3154                              <1> 		;    1) Memory allocation (of it) is 65536 bytes
  3155                              <1> 		;    2) DMA half buffer size is 65416 bytes
  3156                              <1> 		;	(it would be 65536 bytes before this modification)
  3157                              <1> 		;	((additional 140 bytes would cause to a noise))	     
  3158                              <1> 		;    3) Total DMA buffer size is 131072 bytes
  3159                              <1> 		;       (the last 240 bytes will not be used for playing)
  3160                              <1> 		;
  3161                              <1> 		; (buffer will be truncated if the size is not a multiple of 8) 
  3162                              <1> 
  3163 000149CC 01C2                <1> 	add	edx, eax
  3164 000149CE D1E8                <1> 	shr	eax, 1	; count of 16 bit samples
  3165                              <1> 	; 19/11/2023
  3166 000149D0 0D000000C0          <1> 	or	eax, IOC+BUP
  3167                              <1> 	;or	eax, IOC ; 11/06/2017
  3168 000149D5 AB                  <1> 	stosd
  3169                              <1> 
  3170                              <1> ; 2nd buffer:
  3171                              <1> 
  3172 000149D6 89D0                <1>         mov	eax, edx ; Physical address of the 2nd half of DMA buffer
  3173 000149D8 AB                  <1> 	stosd		 ; store dmabuffer2 address
  3174                              <1> 
  3175                              <1> ; set length to [audio_dmabuff_size]/2
  3176                              <1> ; Set control (bits 31:16) to BUP, bits 15:0=number of samples
  3177                              <1> ; 
  3178 000149D9 89F0                <1> 	mov	eax, esi ; DMA half buffer size
  3179 000149DB D1E8                <1> 	shr	eax, 1 ; count of 16 bit samples
  3180                              <1> 	; 19/11/2023
  3181 000149DD 0D000000C0          <1> 	or	eax, IOC+BUP
  3182                              <1> 	;or	eax, IOC ; 11/06/2017
  3183 000149E2 AB                  <1> 	stosd
  3184                              <1> 
  3185 000149E3 E2DD                <1> 	loop    s_ac97_bdl0
  3186                              <1> 	
  3187 000149E5 C3                  <1> 	retn
  3188                              <1> 
  3189                              <1> ac97_start_play:
  3190                              <1> 	; 26/05/2024 - TRDOS 386 v2.0.8
  3191                              <1> 	; 26/11/2023
  3192                              <1> 	; 20/11/2023  
  3193                              <1> 	; 19/11/2023 - TRDOS 386 v2.0.7
  3194                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3195                              <1> 	; 28/05/2017
  3196                              <1> 	; Derived from 'playWav' procedure in 'ICHWAV.ASM'
  3197                              <1> 	; .wav player for DOS by Jeff Leyda (02/09/2002)
  3198                              <1> 
  3199                              <1> 	; set output rate
  3200                              <1> 	; entry: [audio_freq] = desired sample rate
  3201                              <1> 
  3202                              <1> 	; 21/11/2023 - temporary
  3203                              <1> 	;call	ac97_codec_config
  3204                              <1> 
  3205                              <1> ; 20/11/2023
  3206                              <1> %if 0
  3207                              <1> 	AC97_EA_VRA equ 0001h ; 04/11/2023
  3208                              <1> 		
  3209                              <1> 	mov	dx, [NAMBAR]
  3210                              <1> 	add	dx, CODEC_EXT_AUDIO_CTRL_REG  	; 2Ah
  3211                              <1> 	in	ax, dx
  3212                              <1> 
  3213                              <1> 	; 23/05/2024
  3214                              <1> 	call	delay1_4ms
  3215                              <1> 
  3216                              <1> 	and	al, ~BIT1 ; Clear DRA
  3217                              <1> 	or	al, AC97_EA_VRA ; 1 ; 04/11/2023
  3218                              <1> 	out	dx, ax			; Enable variable rate audio
  3219                              <1> 
  3220                              <1>        ;call	delay1_4ms
  3221                              <1>        ;call	delay1_4ms
  3222                              <1>        ;call	delay1_4ms
  3223                              <1>        ;call	delay1_4ms
  3224                              <1> 
  3225                              <1> 	; 23/05/2024
  3226                              <1> 	call	delay_100ms
  3227                              <1> %endif
  3228                              <1> 
  3229                              <1> 	; 26/11/2023
  3230                              <1> 	; 24/11/2023 - temporary
  3231                              <1> 	;mov	ax, 48000
  3232                              <1> 
  3233                              <1> 	; 20/11/2023
  3234 000149E6 803D[608F0100]01    <1> 	cmp	byte [VRA], 1
  3235 000149ED 7213                <1> 	jb	short skip_set_rate
  3236                              <1> 
  3237 000149EF 66A1[5E8F0100]      <1> 	mov	ax, [audio_freq]		; sample rate
  3238                              <1> 
  3239                              <1> ;skip_set_rate:	; 24/11/2023
  3240 000149F5 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  3241 000149FC 6683C22C            <1> 	add	dx, CODEC_PCM_FRONT_DACRATE_REG	; 2Ch
  3242 00014A00 66EF                <1> 	out	dx, ax 				; out sample rate
  3243                              <1> 	
  3244                              <1> 	; 01/06/2024
  3245                              <1> 	; 27/11/2023	
  3246                              <1> 	;call	delay1_4ms
  3247                              <1> 	;call	delay1_4ms
  3248                              <1> 	;call	delay1_4ms
  3249                              <1> 	;call	delay1_4ms
  3250                              <1> 	; 27/11/2023 - temporary
  3251                              <1> 	;call	delay_100ms
  3252                              <1> 
  3253                              <1> 	; 26/11/2023
  3254                              <1> skip_set_rate:	; 20/11/2023
  3255                              <1> 
  3256                              <1> 	;; 23/11/2023 - temporary
  3257                              <1> 	;push	ebx
  3258                              <1> 	;mov	ebx, 0B8000h
  3259                              <1> 	;mov	al, 'x'
  3260                              <1> 	;mov	ah, 4Eh
  3261                              <1> 	;mov	[ebx], ax
  3262                              <1> 	;pop	ebx
  3263                              <1> ;
  3264                              <1> ; register reset the DMA engine. This may cause a pop noise on the output
  3265                              <1> ; lines when the device is reset. Prolly a better idea to mute output, then
  3266                              <1> ; reset.
  3267                              <1> ;
  3268                              <1> 	;; 21/11/2023 - temporary
  3269                              <1> 	;; 20/11/2023
  3270                              <1> 	;mov	dx, [NABMBAR]
  3271                              <1> 	;add	dx, PO_CR_REG			; set pointer to Cntl reg
  3272                              <1> 	;mov	al, RR				; set reset
  3273                              <1> 	;out	dx, al				; self clearing bit
  3274                              <1> 
  3275                              <1> 	; 23/11/2023 - temporary
  3276                              <1> 	;call	delay_100ms
  3277                              <1> 
  3278                              <1> ;	mov	edi, audio_bdl_buff
  3279                              <1> ;	mov	edx, [audio_dmabuff_size]
  3280                              <1> ;	shr	edx, 1
  3281                              <1> ;	mov	ecx, 32/2
  3282                              <1> ;ac97_set_bdl_buffer:
  3283                              <1> ;	; 1st half of DMA buffer
  3284                              <1> ;	mov	eax, [audio_dma_buff]
  3285                              <1> ;	push	eax
  3286                              <1> ;	stosd
  3287                              <1> ;	mov	eax, edx ; dma buffer size / 2
  3288                              <1> ;	or	eax, IOC+BUP
  3289                              <1> ;	stosd
  3290                              <1> ;	pop	eax
  3291                              <1> ;	; 2nd half of DMA buffer
  3292                              <1> ;	add	eax, edx
  3293                              <1> ;	stosd
  3294                              <1> ;	mov	eax, edx ; dma buffer size / 2
  3295                              <1> ;	or	eax, IOC+BUP
  3296                              <1> ;	stosd
  3297                              <1> ;	loop	ac97_set_bdl_buffer
  3298                              <1>  	
  3299                              <1> ; tell the DMA engine where to find our list of Buffer Descriptors.
  3300                              <1> ; this 32bit value is a flat mode memory offset (ie no segment:offset)
  3301                              <1> ;
  3302                              <1> ; write NABMBAR+10h with offset of buffer descriptor list
  3303                              <1> ;
  3304 00014A02 B8[688F0100]        <1>         mov	eax, audio_bdl_buff
  3305 00014A07 668B15[2E8F0100]    <1> 	mov	dx, [NABMBAR]
  3306 00014A0E 6683C210            <1> 	add	dx, PO_BDBAR_REG
  3307 00014A12 EF                  <1> 	out	dx, eax
  3308                              <1> 
  3309                              <1> 	; 01/06/2024
  3310                              <1> 	; 24/05/2024
  3311                              <1> 	; 23/11/2023 - temporary
  3312                              <1> 	;call	delay_100ms
  3313                              <1> 	; 23/05/2024
  3314                              <1> 	;call	delay1_4ms
  3315                              <1> ;
  3316                              <1> ; All set. Let's play some music.
  3317                              <1> ;
  3318                              <1> 	;mov	eax, 31
  3319                              <1> 	; 06/08/2022
  3320 00014A13 29C0                <1> 	sub	eax, eax
  3321 00014A15 B01F                <1> 	mov	al, 31
  3322 00014A17 E846000000          <1> 	call    set_ac97_LastValidIndex
  3323                              <1> 
  3324                              <1> 	; 01/06/2024
  3325                              <1> 	; 24/05/2024
  3326                              <1> 	; 23/11/2023 - temporary
  3327                              <1> 	;call	delay_100ms
  3328                              <1> 	; 23/05/2024
  3329                              <1> 	;call	delay1_4ms
  3330                              <1> 	; 27/05/2024
  3331                              <1> 	;call	delay1_4ms
  3332                              <1> 	;call	delay1_4ms
  3333                              <1> 	;call	delay1_4ms
  3334                              <1> 
  3335 00014A1C C605[628F0100]01    <1> 	mov	byte [audio_play_cmd], 1 ; play command (do not stop) !
  3336                              <1> 
  3337                              <1> ac97_play: ; continue to play (after pause)
  3338                              <1> 	; 27/05/2024
  3339                              <1> 	;;;
  3340                              <1> 	; 19/05/2024 - temporary
  3341                              <1> 	; 24/11/2023 - temporary
  3342                              <1> 	;mov	ax, 0202h
  3343                              <1> 	; 23/05/2024
  3344 00014A23 66B81F1F            <1> 	mov	ax, 1F1Fh
  3345 00014A27 662B05[648F0100]    <1> 	sub	ax, [audio_master_volume]
  3346                              <1> 	
  3347 00014A2E 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  3348 00014A35 6683C202            <1>   	add	dx, CODEC_MASTER_VOL_REG  ; 02h ; Line Out 
  3349 00014A39 66EF                <1>   	out	dx, ax
  3350                              <1> 
  3351                              <1> 	; 01/06/2024
  3352                              <1> 	; 19/05/2024 - temporary
  3353                              <1> 	;call	delay_100ms
  3354                              <1> 	; 23/05/2024
  3355                              <1> 	;call	delay1_4ms
  3356                              <1> 	; 24/05/2024
  3357                              <1> 	;call	delay1_4ms
  3358                              <1> 	;call	delay1_4ms
  3359                              <1> 	;call	delay1_4ms
  3360                              <1> 
  3361                              <1> 	;mov	ax, 0202h
  3362                              <1> 	; 23/05/2024
  3363                              <1> 	;mov	ax, 1F1Fh
  3364                              <1> 	;sub	ax, [audio_master_volume]
  3365                              <1> 
  3366                              <1> 	; 27/05/2024
  3367 00014A3B 66B81F1F            <1> 	mov	ax, 1F1Fh
  3368 00014A3F 662B05[668F0100]    <1> 	sub	ax, [audio_pcmo_volume]
  3369                              <1> 	
  3370 00014A46 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  3371 00014A4D 6683C218            <1>   	add	dx, CODEC_PCM_OUT_REG ; 18h ; PCM Out 
  3372 00014A51 66EF                <1>   	out	dx, ax
  3373                              <1> 
  3374                              <1> 	; 01/06/2024
  3375                              <1> 	; 24/05/2024
  3376                              <1> 	; 23/05/2024
  3377                              <1> 	;call	delay1_4ms
  3378                              <1> 	;call	delay1_4ms
  3379                              <1> 	;call	delay1_4ms
  3380                              <1> 	;call	delay1_4ms
  3381                              <1> 	; 24/05/2024
  3382                              <1> 	;call	delay_100ms
  3383                              <1> 	;;;
  3384                              <1> 
  3385                              <1> 	; 11/06/2017
  3386                              <1> 	; 29/05/2017
  3387                              <1> 	; 28/05/2017
  3388 00014A53 668B15[2E8F0100]    <1>         mov     dx, [NABMBAR]
  3389 00014A5A 6683C21B            <1>         add     dx, PO_CR_REG		; PCM out control register
  3390                              <1> 	; 26/11/2023
  3391 00014A5E B011                <1> 	mov	al, IOCE+RPBM ; 29/05/2017
  3392                              <1> 	; 24/11/2023
  3393                              <1> 	;mov	al, 1Dh ; (Ref: KolibriOS, intelac97.asm, 'play:')
  3394 00014A60 EE                  <1> 	out     dx, al			; set start!
  3395                              <1> 
  3396                              <1> 	;mov	byte [audio_play_cmd], 1 ; play command (do not stop) !
  3397                              <1> 
  3398 00014A61 C3                  <1> 	retn
  3399                              <1> 
  3400                              <1> ;input AL = index # to stop on
  3401                              <1> set_ac97_LastValidIndex:
  3402                              <1> 	; 28/05/2017
  3403                              <1> 	; Derived from 'setLastValidIndex' procedure in 'ICHWAV.ASM'
  3404                              <1> 	; .wav player for DOS by Jeff Leyda (02/09/2002)
  3405 00014A62 668B15[2E8F0100]    <1> 	mov	dx, [NABMBAR]
  3406 00014A69 6683C215            <1> 	add	dx, PO_LVI_REG
  3407 00014A6D EE                  <1>         out     dx, al
  3408                              <1> 	;mov	[audio_lvi], al ; for ac97_int_handler
  3409 00014A6E C3                  <1> 	retn
  3410                              <1> 
  3411                              <1> ac97_volume:
  3412                              <1> 	; 23/05/2024
  3413                              <1> 	; 28/05/2017
  3414                              <1> 	; bl = component (0 = master/playback/lineout volume)
  3415                              <1> 	;		(1 = PCM Out volume) ; 23/05/2024
  3416                              <1> 	; cl = left channel volume level (0 to 31)
  3417                              <1> 	; ch = right channel volume level (0 to 31)
  3418                              <1> 
  3419                              <1> 	; 24/05/2024
  3420 00014A6F 80FB01              <1> 	cmp	bl, 1
  3421 00014A72 7727                <1> 	ja	short ac97_vol_2 ; temporary !
  3422                              <1> 
  3423 00014A74 66B81F1F            <1> 	mov	ax, 1F1Fh ; 31,31
  3424 00014A78 38C1                <1> 	cmp	cl, al
  3425 00014A7A 771F                <1> 	ja	short ac97_vol_2
  3426 00014A7C 38E5                <1> 	cmp	ch, ah
  3427 00014A7E 771B                <1> 	ja	short ac97_vol_2
  3428                              <1> 
  3429 00014A80 08DB                <1> 	or	bl, bl
  3430 00014A82 7518                <1> 	jnz	short ac97_vol_1
  3431                              <1> 
  3432                              <1> 	; 23/05/2024
  3433 00014A84 66BA0200            <1> 	mov	dx, CODEC_MASTER_VOL_REG  ; 02h ; Line Out
  3434                              <1> 	; 24/05/2024
  3435 00014A88 66890D[648F0100]    <1> 	mov	[audio_master_volume], cx
  3436                              <1> ac97_vol_0:
  3437 00014A8F 6629C8              <1> 	sub	ax, cx
  3438                              <1> 	;mov	dx, [NAMBAR]
  3439                              <1> 	;add	dx, CODEC_MASTER_VOL_REG
  3440                              <1>   	; 23/05/2024
  3441 00014A92 660315[2C8F0100]    <1> 	add	dx, [NAMBAR]
  3442 00014A99 66EF                <1>   	out     dx, ax
  3443                              <1> 	; 23/05/2024
  3444                              <1> ac97_vol_2:
  3445                              <1> 	; 21/11/2023
  3446                              <1> ;_ac97_ih5:	; 06/08/2022
  3447 00014A9B C3                  <1> 	retn
  3448                              <1> 
  3449                              <1> ac97_vol_1:
  3450                              <1> 	; 24/05/2024
  3451                              <1> 	; 23/05/2024
  3452                              <1> 	;cmp	bl, 1
  3453                              <1> 	;ja	short ac97_vol_2 ; temporary !
  3454                              <1> 	; BL = 1
  3455                              <1> 	; PCM OUT Volume
  3456 00014A9C 66BA1800            <1> 	mov	dx, CODEC_PCM_OUT_REG	; 18h ; PCM out
  3457                              <1> 	; 24/05/2024
  3458 00014AA0 66890D[668F0100]    <1> 	mov	[audio_pcmo_volume], cx
  3459 00014AA7 EBE6                <1> 	jmp	short ac97_vol_0
  3460                              <1> 
  3461                              <1> ac97_int_handler:
  3462                              <1> 	; 04/06/2024
  3463                              <1> 	; 03/06/2024
  3464                              <1> 	; 02/06/2024 - TRDOS 386 v2.0.8
  3465                              <1> 	; 27/11/2023
  3466                              <1> 	; 24/11/2023
  3467                              <1> 	; 21/11/2023
  3468                              <1> 	; 20/11/2023 - TRDOS 386 v2.0.7
  3469                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3470                              <1> 	; 12/10/2017
  3471                              <1> 	; 10/10/2017
  3472                              <1> 	; 09/10/2017
  3473                              <1> 	; 13/06/2017, 13/06/2017
  3474                              <1> 	; 10/06/2017, 11/06/2017
  3475                              <1> 	; Interrupt Handler for AC97 (ICH) Audio Controller
  3476                              <1> 	; Note: called by 'dev_IRQ_service'
  3477                              <1> 	; 28/05/2017
  3478                              <1> 
  3479                              <1> 	;push	eax ; * must be saved !
  3480                              <1> 	;push	edx
  3481                              <1> 	;push	ecx
  3482                              <1> 	;push	ebx ; * must be saved !
  3483                              <1> 	;push	esi
  3484                              <1> 	;push	edi
  3485                              <1> 
  3486                              <1> ; 02/06/2024
  3487                              <1> %if 0
  3488                              <1> 
  3489                              <1> 	;cmp	byte [audio_busy], 1
  3490                              <1> 	;jnb	_ac97_ih2 ; busy !
  3491                              <1> 
  3492                              <1> 	; 24/11/2023
  3493                              <1>         ;mov	dx, [NABMBAR]
  3494                              <1> 	;mov	dx, PO_SR_REG
  3495                              <1> 	;in	ax, dx
  3496                              <1> 	;test	al, BCIS ; bit 3, 8
  3497                              <1> 	;jz	short _ac97_ih5
  3498                              <1> 
  3499                              <1> 	; 24/11/2023
  3500                              <1> 	mov	dx, GLOB_STS_REG
  3501                              <1>         add	dx, [NABMBAR]
  3502                              <1> 	in	eax, dx
  3503                              <1> 
  3504                              <1> 	cmp	eax, 0FFFFFFFFh ; -1
  3505                              <1> 	;je	_ac97_ih3 ; exit
  3506                              <1> 	; 06/08/2022
  3507                              <1> 	je	short _ac97_ih5
  3508                              <1> 
  3509                              <1> 	;test	eax, 40h ; PCM Out Interrupt
  3510                              <1> 	; 06/08/2022
  3511                              <1> 	test	al, 40h
  3512                              <1> 	jnz	short _ac97_ih0
  3513                              <1> 
  3514                              <1> 	; 24/11/2023
  3515                              <1> 	test	eax, eax
  3516                              <1> 	;jz	_ac97_ih3 ; exit
  3517                              <1> 	; 06/08/2022
  3518                              <1> 	jz	short _ac97_ih5
  3519                              <1> 
  3520                              <1>  	;mov	dx, GLOB_STS_REG
  3521                              <1>         ;add	dx, [NABMBAR]
  3522                              <1> 	out	dx, eax
  3523                              <1> 	
  3524                              <1> 	;jmp	_ac97_ih3 ; exit
  3525                              <1> 	
  3526                              <1> 	; 06/08/2022
  3527                              <1> 	retn
  3528                              <1> 	; 21/11/2023
  3529                              <1> 	;jmp	short _ac97_ih5
  3530                              <1> 
  3531                              <1> _ac97_ih0:
  3532                              <1> 	; 24/11/2023
  3533                              <1> 	;push	eax
  3534                              <1> 	; 09/10/2017
  3535                              <1> 	cmp	byte [audio_play_cmd], 1
  3536                              <1> 	;jb	short _ac97_ih4 ; stop command !
  3537                              <1> 	; 24/11/2023
  3538                              <1> 	jnb	short _ac97_ih4
  3539                              <1> 
  3540                              <1> 	;mov	dx, GLOB_STS_REG
  3541                              <1>         ;add	dx, [NABMBAR]
  3542                              <1> 	out	dx, eax
  3543                              <1> 	;jmp	short _ac97_stop
  3544                              <1> 
  3545                              <1> 	; 24/11/2023
  3546                              <1> ac97_stop: 
  3547                              <1> 	; 28/05/2017
  3548                              <1> 	mov	byte [audio_play_cmd], 0 ; stop !
  3549                              <1> 
  3550                              <1> %else
  3551                              <1> 	; 02/06/2024
  3552                              <1> _ac97_ih0:
  3553 00014AA9 803D[628F0100]01    <1> 	cmp	byte [audio_play_cmd], 1
  3554 00014AB0 7334                <1> 	jnb	short _ac97_ih4	
  3555                              <1> %endif
  3556                              <1> 
  3557                              <1> _ac97_stop: ; 09/10/2017
  3558                              <1> 	; 29/05/2017
  3559                              <1> 	;mov	dx, [NABMBAR]
  3560                              <1> 	;add	dx, PO_CR_REG
  3561                              <1> 	;mov	al, 0
  3562                              <1> 	;out	dx, al
  3563                              <1> 
  3564                              <1> 	; 11/06/2017
  3565 00014AB2 30C0                <1> 	xor	al, al ; 0
  3566 00014AB4 E813000000          <1> 	call	ac97_po_cmd
  3567                              <1> 
  3568                              <1> 	; (Ref: KolibriOS, intelac97.asm, 'stop:')
  3569                              <1> 	; Clear FIFOE, BCIS, LVBCI (Ref: Intel ICH hub manual)
  3570 00014AB9 66B81C00            <1> 	mov     ax, 1Ch
  3571 00014ABD 668B15[2E8F0100]    <1> 	mov     dx, [NABMBAR]
  3572 00014AC4 6683C216            <1> 	add     dx, PO_SR_REG
  3573 00014AC8 66EF                <1> 	out     dx, ax
  3574                              <1> 
  3575                              <1> 	;retn
  3576                              <1> 
  3577                              <1> 	; 11/06/2017
  3578 00014ACA B002                <1> 	mov     al, RR
  3579                              <1> ac97_po_cmd:
  3580                              <1> 	 ;11/06/2017
  3581                              <1> 	; 29/05/2017
  3582 00014ACC 668B15[2E8F0100]    <1> 	mov     dx, [NABMBAR]
  3583 00014AD3 6683C21B            <1>         add     dx, PO_CR_REG		; PCM out control register
  3584 00014AD7 EE                  <1> 	out	dx, al
  3585 00014AD8 C3                  <1> 	retn
  3586                              <1> 
  3587                              <1> ; 02/06/2024
  3588                              <1> %if 1
  3589                              <1> 	; 24/11/2023
  3590                              <1> ac97_stop: 
  3591                              <1> 	; 28/05/2017
  3592 00014AD9 C605[628F0100]00    <1> 	mov	byte [audio_play_cmd], 0 ; stop !
  3593 00014AE0 EBD0                <1> 	jmp	short _ac97_stop
  3594                              <1> %endif
  3595                              <1> 
  3596                              <1> ac97_pause:
  3597                              <1> 	; 11/06/2017
  3598                              <1> 	; 29/05/2017
  3599 00014AE2 B010                <1> 	mov 	al, IOCE
  3600 00014AE4 EBE6                <1> 	jmp	short ac97_po_cmd
  3601                              <1> 
  3602                              <1> _ac97_ih4:
  3603                              <1> 	;mov	byte [audio_busy], 1
  3604                              <1> 
  3605                              <1> ; 02/06/2024
  3606                              <1> %if 1
  3607                              <1> 	; 24/11/2023 (TRDOS386 'audio.s')
  3608 00014AE6 668B15[2E8F0100]    <1>         mov	dx, [NABMBAR]
  3609 00014AED 6683C216            <1> 	add	dx, PO_SR_REG
  3610 00014AF1 66ED                <1> 	in	ax, dx
  3611                              <1> 
  3612 00014AF3 A808                <1> 	test	al, BCIS ; bit 3, 8
  3613 00014AF5 744C                <1> 	jz	short _ac97_ih2	; 02/06/2024
  3614                              <1> 
  3615                              <1> 	; 02/06/2024
  3616 00014AF7 50                  <1> 	push	eax ; *
  3617                              <1> %else
  3618                              <1> 	; 27/05/2024
  3619                              <1> 	; 24/11/2023
  3620                              <1> 	push	eax
  3621                              <1> 
  3622                              <1> 	mov	ax, 1Ch ; FIFOE(=16)+BCIS(=8)+LVBCI(=4)
  3623                              <1> 	mov	dx, PO_SR_REG
  3624                              <1>         add	dx, [NABMBAR]
  3625                              <1> 	out	dx, ax
  3626                              <1> 
  3627                              <1> 	mov	dx, PO_CIV_REG
  3628                              <1>         add	dx, [NABMBAR]
  3629                              <1> 	in	al, dx
  3630                              <1> 
  3631                              <1> 	;cmp	al, [audio_civ] ; [audio_flag]
  3632                              <1> 	;je	short _ac97_ih2
  3633                              <1> 
  3634                              <1> 	; 21/11/2023
  3635                              <1> 	;mov	[audio_civ], al
  3636                              <1> 	; 20/11/2023
  3637                              <1> 	mov	ah, al
  3638                              <1> 	dec	al
  3639                              <1> 	;inc	al ; 11/06/2017
  3640                              <1> 	and	al, 1Fh
  3641                              <1> %endif
  3642                              <1> 	; 02/06/2024
  3643 00014AF8 66BA1400            <1> 	mov	dx, PO_CIV_REG
  3644 00014AFC 660315[2E8F0100]    <1>         add	dx, [NABMBAR]
  3645                              <1> 	;in	ax, dx
  3646                              <1> 	; 03/06/2024
  3647 00014B03 EC                  <1> 	in	al, dx
  3648                              <1> 			; al = CVI, ah = LVI
  3649                              <1> 	;xchg	ah, al
  3650                              <1> 	;		; al = LVI, ah = CVI
  3651                              <1> 	;cmp	al, ah
  3652                              <1> 	;jne	short _ac97_ih5
  3653                              <1> 	; 03/06/2024
  3654 00014B04 88C4                <1> 	mov	ah, al
  3655                              <1> 
  3656 00014B06 FEC8                <1> 	dec	al
  3657 00014B08 241F                <1> 	and	al, 1Fh
  3658                              <1> 
  3659                              <1> 	;mov	dx, PO_LVI_REG
  3660                              <1> 	;add	dx, [NABMBAR]
  3661 00014B0A 6642                <1>         inc	dx	; 02/06/2024	
  3662 00014B0C EE                  <1> 	out	dx, al
  3663                              <1> 
  3664                              <1> 	; 12/10/2017
  3665                              <1> 	;mov	al, [audio_civ]
  3666                              <1> 	;inc	al
  3667                              <1> 	;and	al, 1
  3668                              <1> 	;mov	[audio_flag], al 
  3669                              <1> 	; 27/11/2023
  3670                              <1> 	; 20/11/2023
  3671                              <1> 	;inc	ah
  3672                              <1> _ac97_ih5:	; 02/06/2024
  3673 00014B0D 80E401              <1> 	and	ah, 1
  3674 00014B10 8825[548F0100]      <1> 	mov	[audio_flag], ah
  3675                              <1> 
  3676                              <1> 	;; [audio_flag] : 0 = Buffer 1, 1 = Buffer 2
  3677                              <1> 	;
  3678                              <1> 	; 21/11/2023
  3679                              <1> 	;call	ac97_tuneloop
  3680                              <1> 
  3681                              <1> 	; 24/11/2023
  3682                              <1> ac97_tuneloop:
  3683                              <1> 	; 09/10/2017
  3684 00014B16 8B3D[488F0100]      <1> 	mov	edi, [audio_dma_buff]
  3685                              <1> 	; 04/06/2024
  3686                              <1> 	;mov	ecx, [audio_dmabuff_size]
  3687                              <1> 	;shr	ecx, 1 ; dma buff size / 2 = half buffer size
  3688 00014B1C 8B0D[448F0100]      <1> 	mov	ecx, [audio_buff_size]
  3689 00014B22 80E1F8              <1> 	and	cl, ~7 ; 8 byte aligned
  3690                              <1> 
  3691                              <1> 	; 12/10/2017
  3692 00014B25 803D[548F0100]00    <1> 	cmp 	byte [audio_flag], 0
  3693 00014B2C 7702                <1> 	ja	short _ac97_ih1  ; Playing Half Buffer 2 (Current: FLAG)
  3694                              <1> 	; Playing Half Buffer 1 (Current: EOL)	
  3695 00014B2E 01CF                <1> 	add	edi, ecx
  3696                              <1> _ac97_ih1: 
  3697                              <1> 	; Update half buffer 2 while playing half buffer 1 (next: FLAG)
  3698                              <1> 	; Update half buffer 1 while playing half buffer 2 (next: EOL)
  3699                              <1> 
  3700 00014B30 8B35[408F0100]      <1> 	mov	esi, [audio_p_buffer] ; phy addr of audio buff
  3701 00014B36 C1E902              <1> 	shr	ecx, 2 ; half buff size / 4
  3702 00014B39 F3A5                <1> 	rep	movsd
  3703                              <1> 
  3704                              <1> 	; 10/10/2017
  3705                              <1> 	; switch flag value
  3706 00014B3B 8035[548F0100]01    <1> 	xor	byte [audio_flag], 1
  3707                              <1> 
  3708                              <1> ; 02/06/2024
  3709                              <1> %if 1
  3710                              <1> 	; 02/06/2024
  3711 00014B42 58                  <1> 	pop	eax ; *
  3712                              <1> _ac97_ih2:
  3713                              <1> 	;mov	ax, 1Ch ; FIFOE(=16)+BCIS(=8)+LVBCI(=4)
  3714 00014B43 66BA1600            <1> 	mov	dx, PO_SR_REG
  3715 00014B47 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  3716 00014B4E 66EF                <1> 	out	dx, ax
  3717                              <1> %else
  3718                              <1> 	; 27/11/2023
  3719                              <1> 	; 21/11/2023 - temporary
  3720                              <1> 	;push	ebx
  3721                              <1> 	;mov	ebx, 0B8002h
  3722                              <1> 	;mov	al, [audio_flag]
  3723                              <1> 	;add	al, '1'
  3724                              <1> 	;mov	ah, 0Fh
  3725                              <1> 	;mov	[ebx], ax
  3726                              <1> 	;pop	ebx
  3727                              <1> 	
  3728                              <1> 	; 12/10/2017
  3729                              <1> 	; [audio_flag] = 0 : Playing dma half buffer 2 (even index value)
  3730                              <1> 			   ; Next buffer (to update) is dma half buff 1
  3731                              <1> 	; 	       = 1 : Playing dma half buffer 1 (odd index value)
  3732                              <1> 			   ; Next buffer (to update) is dma half buff 2
  3733                              <1> 	; 24/11/2023
  3734                              <1> 	;retn
  3735                              <1> 
  3736                              <1> 	;
  3737                              <1> 	; 24/11/2023
  3738                              <1> 	pop	eax
  3739                              <1> 	; 24/11/2023
  3740                              <1> 	; 20/11/2023
  3741                              <1> 	;and	eax, 40h
  3742                              <1>         mov	dx, [NABMBAR]
  3743                              <1> 	add	dx, GLOB_STS_REG
  3744                              <1> 	out	dx, eax
  3745                              <1> 
  3746                              <1> 	;; 13/06/2017
  3747                              <1> 	;mov	al, 11h ; IOCE + RPBM
  3748                              <1> 	;mov	dx, PO_CR_REG
  3749                              <1>         ;add	dx, [NABMBAR]
  3750                              <1> 	;out	dx, al
  3751                              <1> 
  3752                              <1> 	; 24/11/2023
  3753                              <1> 	;mov	dx, [NABMBAR]
  3754                              <1> 	;add	dx, PO_SR_REG	; set pointer to Status reg
  3755                              <1> 	;mov	ax, 1Ch
  3756                              <1> 	;out	dx, ax
  3757                              <1> 
  3758                              <1> 	; 24/11/2023
  3759                              <1> _ac97_ih2:
  3760                              <1> 	;mov	byte [audio_busy], 0
  3761                              <1> %endif
  3762                              <1> 
  3763                              <1> _ac97_ih3:
  3764                              <1> 	;pop	edi
  3765                              <1> 	;pop	esi
  3766                              <1> 	;pop	ebx ; * must be restored !
  3767                              <1> 	;pop	ecx
  3768                              <1> 	;pop	edx
  3769                              <1> 	;pop	eax ; * must be restored !
  3770                              <1> 
  3771 00014B50 C3                  <1> 	retn
  3772                              <1> 
  3773                              <1> reset_ac97_controller:
  3774                              <1> 	; 06/06/2024
  3775                              <1> 	; 01/06/2024
  3776                              <1> 	; 27/05/2024
  3777                              <1> 	; 16/05/2024
  3778                              <1> 	; 10/06/2017
  3779                              <1> 	; 29/05/2017
  3780                              <1> 	; 28/05/2017
  3781                              <1> 	; reset AC97 audio controller registers
  3782 00014B51 31C0                <1> 	xor     eax, eax
  3783 00014B53 66BA0B00            <1>         mov	dx, PI_CR_REG
  3784 00014B57 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  3785 00014B5E EE                  <1> 	out     dx, al
  3786                              <1> 
  3787                              <1> 	; 16/05/2024
  3788                              <1> 	;call	delay1_4ms
  3789                              <1> 
  3790 00014B5F 66BA1B00            <1>         mov     dx, PO_CR_REG
  3791 00014B63 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  3792 00014B6A EE                  <1> 	out     dx, al
  3793                              <1> 
  3794                              <1> 	; 16/05/2024
  3795                              <1> 	;call	delay1_4ms
  3796                              <1> 
  3797 00014B6B 66BA2B00            <1>         mov     dx, MC_CR_REG
  3798 00014B6F 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  3799 00014B76 EE                  <1> 	out     dx, al
  3800                              <1> 
  3801                              <1> 	; 16/05/2024
  3802                              <1> 	;call	delay1_4ms
  3803                              <1> 
  3804 00014B77 B002                <1>         mov     al, RR
  3805 00014B79 66BA0B00            <1>         mov     dx, PI_CR_REG
  3806 00014B7D 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  3807 00014B84 EE                  <1> 	out     dx, al
  3808                              <1> 
  3809                              <1> 	; 16/05/2024
  3810                              <1> 	;call	delay1_4ms
  3811                              <1> 
  3812 00014B85 66BA1B00            <1>         mov     dx, PO_CR_REG
  3813 00014B89 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  3814 00014B90 EE                  <1> 	out     dx, al
  3815                              <1> 
  3816                              <1> 	; 16/05/2024
  3817                              <1> 	;call	delay1_4ms
  3818                              <1> 
  3819 00014B91 66BA2B00            <1>         mov     dx, MC_CR_REG
  3820 00014B95 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  3821 00014B9C EE                  <1> 	out     dx, al
  3822                              <1> 
  3823                              <1> 	; 27/05/2024
  3824                              <1> 	; 16/05/2024
  3825                              <1> 	;call	delay1_4ms
  3826                              <1> 
  3827 00014B9D C3                  <1> 	retn
  3828                              <1> 
  3829                              <1> ac97_reset:
  3830                              <1> 	; 27/05/2024 - TRDOS 386 v2.0.8
  3831                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3832                              <1> 	; 10/06/2017
  3833                              <1> 	; 29/05/2017
  3834                              <1> 	; 28/05/2017
  3835 00014B9E E8AEFFFFFF          <1> 	call	reset_ac97_controller
  3836                              <1> 	; 29/05/2017
  3837                              <1> 	;jmp	reset_ac97_codec
  3838                              <1> 	; 27/05/2024
  3839 00014BA3 E80DF6FFFF          <1> 	call	delay_100ms
  3840                              <1> reset_ac97_codec:
  3841                              <1> 	; 28/05/2017 - Erdogan Tan (Ref: KolibriOS, intelac97.asm)
  3842 00014BA8 66BA2C00            <1> 	mov	dx, GLOB_CNT_REG ; 2Ch
  3843 00014BAC 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  3844 00014BB3 ED                  <1> 	in	eax, dx
  3845                              <1> 
  3846                              <1> 	;test	eax, 2
  3847                              <1> 	; 06/08/2022
  3848 00014BB4 A802                <1> 	test	al, 2
  3849 00014BB6 7407                <1> 	jz	short _r_ac97codec_cold
  3850                              <1> 
  3851 00014BB8 E80F000000          <1> 	call	warm_ac97codec_reset
  3852 00014BBD 7308                <1> 	jnc	short _r_ac97codec_ok
  3853                              <1> _r_ac97codec_cold:
  3854 00014BBF E83B000000          <1>         call    cold_ac97codec_reset
  3855 00014BC4 7301                <1>         jnc     short _r_ac97codec_ok
  3856                              <1> 	
  3857                              <1> 	; 16/04/2017
  3858                              <1>         ;xor	eax, eax	; timeout error
  3859                              <1>        	;stc
  3860 00014BC6 C3                  <1> 	retn
  3861                              <1> 
  3862                              <1> _r_ac97codec_ok:
  3863 00014BC7 31C0                <1>         xor     eax, eax
  3864                              <1>         ;mov	al, VIA_ACLINK_C00_READY ; 1
  3865 00014BC9 FEC0                <1>         inc	al
  3866 00014BCB C3                  <1> 	retn
  3867                              <1> 
  3868                              <1> warm_ac97codec_reset:
  3869                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3870                              <1> 	; 28/05/2017 - Erdogan Tan (Ref: KolibriOS, intelac97.asm)
  3871                              <1>         ;mov	eax, 6
  3872                              <1> 	; 06/08/2022
  3873 00014BCC 29C0                <1> 	sub	eax, eax
  3874 00014BCE B006                <1> 	mov	al, 6
  3875 00014BD0 66BA2C00            <1> 	mov	dx, GLOB_CNT_REG ; 2Ch
  3876 00014BD4 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  3877 00014BDB EF                  <1> 	out	dx, eax
  3878                              <1> 
  3879                              <1> 	;mov	ecx, 10	; total 1s
  3880                              <1> 	; 06/08/2022
  3881 00014BDC 31C9                <1> 	xor	ecx, ecx
  3882 00014BDE B10A                <1> 	mov	cl, 10
  3883                              <1> _warm_ac97c_rst_wait:
  3884 00014BE0 51                  <1> 	push	ecx
  3885 00014BE1 E8CFF5FFFF          <1> 	call	delay_100ms
  3886 00014BE6 59                  <1> 	pop	ecx
  3887                              <1> 
  3888 00014BE7 66BA3000            <1> 	mov	dx, GLOB_STS_REG ; 30h
  3889 00014BEB 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  3890 00014BF2 ED                  <1> 	in	eax, dx
  3891                              <1> 
  3892 00014BF3 A900030010          <1> 	test	eax, CTRL_ST_CREADY
  3893 00014BF8 7504                <1> 	jnz	short _warm_ac97c_rst_ok
  3894                              <1> 
  3895 00014BFA 49                  <1>         dec     ecx
  3896 00014BFB 75E3                <1>         jnz     short _warm_ac97c_rst_wait
  3897                              <1> 
  3898                              <1> _warm_ac97c_rst_fail:
  3899 00014BFD F9                  <1>         stc
  3900                              <1> _warm_ac97c_rst_ok:
  3901 00014BFE C3                  <1> 	retn
  3902                              <1> 
  3903                              <1> cold_ac97codec_reset:
  3904                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3905                              <1> 	; 28/05/2017 - Erdogan Tan (Ref: KolibriOS, intelac97.asm)
  3906                              <1>         ;mov	eax, 2
  3907                              <1> 	; 06/08/2022
  3908 00014BFF 31C0                <1> 	xor	eax, eax
  3909 00014C01 B002                <1> 	mov	al, 2
  3910 00014C03 66BA2C00            <1> 	mov	dx, GLOB_CNT_REG ; 2Ch
  3911 00014C07 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  3912 00014C0E EF                  <1> 	out	dx, eax
  3913                              <1> 
  3914 00014C0F E8A1F5FFFF          <1> 	call	delay_100ms 	; wait 100 ms
  3915 00014C14 E89CF5FFFF          <1> 	call	delay_100ms 	; wait 100 ms
  3916 00014C19 E897F5FFFF          <1> 	call	delay_100ms 	; wait 100 ms
  3917 00014C1E E892F5FFFF          <1> 	call	delay_100ms 	; wait 100 ms
  3918                              <1> 
  3919                              <1> 	;mov	ecx, 16	; total 20*100 ms = 2s
  3920                              <1> 	; 06/08/2022
  3921 00014C23 31C9                <1> 	xor	ecx, ecx
  3922 00014C25 B110                <1> 	mov	cl, 16
  3923                              <1> _cold_ac97c_rst_wait:
  3924 00014C27 66BA3000            <1> 	mov	dx, GLOB_STS_REG ; 30h
  3925 00014C2B 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  3926 00014C32 ED                  <1> 	in	eax, dx
  3927                              <1> 
  3928 00014C33 A900030010          <1> 	test	eax, CTRL_ST_CREADY
  3929 00014C38 750B                <1> 	jnz	short _cold_ac97c_rst_ok
  3930                              <1> 
  3931 00014C3A 51                  <1> 	push	ecx
  3932 00014C3B E875F5FFFF          <1> 	call	delay_100ms
  3933 00014C40 59                  <1> 	pop	ecx
  3934                              <1> 
  3935 00014C41 49                  <1>         dec     ecx
  3936 00014C42 75E3                <1>         jnz     short _cold_ac97c_rst_wait
  3937                              <1> 
  3938                              <1> _cold_ac97c_rst_fail:
  3939 00014C44 F9                  <1>         stc
  3940                              <1> _cold_ac97c_rst_ok:
  3941 00014C45 C3                  <1> 	retn
  3942                              <1> 
  3943                              <1> sb16_current_sound_data:
  3944                              <1> 	; 05/06/2024
  3945                              <1> 	; 04/06/2024 - TRDOS 386 v2.0.8
  3946                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3947                              <1> 	; 20/08/2017
  3948                              <1> 	; 24/06/2017
  3949                              <1> 	; 22/06/2017
  3950                              <1> 	; get current sound (PCM out) data for graphics
  3951                              <1> 	; (for Sound Blaster 16)
  3952                              <1> 	; ebx = Physical address (on page boundary)
  3953                              <1> 	; ecx = Byte count
  3954                              <1> 	; [audio_buff_size]
  3955                              <1> 
  3956                              <1> 	;;mov	edi, [audio_buff_size]
  3957                              <1> 	;mov	edi, [audio_dmabuff_size]
  3958                              <1> 	;mov	esi, [audio_dma_buff]
  3959                              <1> 
  3960 00014C46 39CF                <1> 	cmp	edi, ecx
  3961 00014C48 7302                <1> 	jnb	short sb16_gcd_0
  3962 00014C4A 89F9                <1> 	mov	ecx, edi
  3963                              <1> sb16_gcd_0:
  3964                              <1> 	; 06/08/2022
  3965 00014C4C 31C0                <1> 	xor	eax, eax
  3966                              <1> 	; 20/08/2017
  3967 00014C4E 803D[5C8F0100]10    <1> 	cmp	byte [audio_bps], 16
  3968 00014C55 750C                <1> 	jne	short sb16_gcd_1 ; 8 bit DMA channel
  3969 00014C57 E4C6                <1> 	in	al, 0C6h ; DMA channel 5 count register
  3970                              <1> 	;mov	dl, al
  3971                              <1> 	; 06/08/2022
  3972 00014C59 88C4                <1> 	mov	ah, al
  3973 00014C5B E4C6                <1> 	in	al, 0C6h
  3974                              <1> 	;mov	dh, al
  3975                              <1> 	;movzx	eax, dx
  3976                              <1> 	; 06/08/2022
  3977 00014C5D 86E0                <1> 	xchg	ah, al
  3978 00014C5F D1E0                <1> 	shl	eax, 1 ; word count -> byte count
  3979 00014C61 EB4C                <1> 	jmp	short sb16_gcd_2
  3980                              <1> sb16_gcd_1:
  3981 00014C63 E403                <1> 	in	al, 03h ; DMA channel 1 count register
  3982                              <1> 	;mov	dl, al
  3983                              <1> 	; 06/08/2022
  3984 00014C65 88C4                <1> 	mov	ah, al
  3985 00014C67 E403                <1> 	in	al, 03h
  3986                              <1> 	;mov	dh, al
  3987                              <1> 	;movzx	eax, dx
  3988                              <1> 	; 06/08/2022
  3989 00014C69 86E0                <1> 	xchg	ah, al
  3990 00014C6B EB42                <1> 	jmp	short sb16_gcd_2
  3991                              <1> ;sb16_gcd_2:
  3992                              <1> ;	cmp	eax, ecx
  3993                              <1> ;	jnb	short sb16_gcd_3
  3994                              <1> ;	; remain count < graphics bytes
  3995                              <1> ;	mov	eax, ecx ; fix remain count to data size
  3996                              <1> ;sb16_gcd_3:
  3997                              <1> ;	sub	edi, eax
  3998                              <1> ;	jna	short sb16_gcd_4
  3999                              <1> ;	add	esi, edi ; dma buffer offset
  4000                              <1> ;sb16_gcd_4:
  4001                              <1> ;	mov	edi, ebx ; buffer address (for graphics) 
  4002                              <1> ;	mov	[u.r0], ecx
  4003                              <1> ;	rep	movsb
  4004                              <1> ;	retn
  4005                              <1> 
  4006                              <1> get_current_sound_data:
  4007                              <1> 	; 05/06/2024
  4008                              <1> 	; 04/06/2024
  4009                              <1> 	; 24/06/2017
  4010                              <1> 	; 22/06/2017
  4011                              <1> 	; get current sound (PCM out) data for graphics
  4012                              <1> 	;
  4013                              <1> 	; ebx = Physical address (on page boundary)
  4014                              <1> 	; ecx = Byte count
  4015                              <1> 	; [audio_buff_size]
  4016                              <1> 
  4017                              <1> 	;mov	edi, [audio_buff_size]
  4018                              <1> 	;;; 
  4019                              <1> 	; 04/06/2024
  4020                              <1> 	;mov	edi, [audio_dmabuff_size]
  4021                              <1> 	; 05/06/2024
  4022                              <1> 	;mov	edi, [audio_buff_size]
  4023 00014C6D 8B3D[508F0100]      <1> 	mov	edi, [dma_hbuff_size]
  4024                              <1> 	;;;
  4025 00014C73 8B35[488F0100]      <1> 	mov	esi, [audio_dma_buff]
  4026                              <1> 
  4027                              <1> 	;;;
  4028                              <1> 	; 04/06/2024
  4029                              <1> 	;cmp	byte [audio_device], 2
  4030                              <1> 	;jb	short sb16_current_sound_data ; = 1
  4031                              <1> 	;shr	edi, 1
  4032                              <1> 
  4033                              <1> 	; 04/06/2024
  4034 00014C79 803D[298F0100]01    <1> 	cmp	byte [audio_device], 1
  4035 00014C80 7704                <1> 	ja	short gcd_1
  4036 00014C82 D1E7                <1> 	shl	edi, 1 ; [audio_dmabuff_size] = 2 * edi
  4037                              <1> 	; 05/06/2024
  4038                              <1> 	; edi = [dma_hbuff_size] * 2
  4039 00014C84 EBC0                <1> 	jmp	short sb16_current_sound_data
  4040                              <1> gcd_1:
  4041                              <1> 	;;;
  4042                              <1> 
  4043                              <1> ; 04/06/2024
  4044                              <1> %if 0
  4045                              <1> 	cmp	edi, ecx
  4046                              <1> 	jnb	short gcd_0
  4047                              <1> 	mov	ecx, edi
  4048                              <1> gcd_0:
  4049                              <1> %endif
  4050 00014C86 803D[298F0100]03    <1> 	cmp	byte [audio_device], 3
  4051 00014C8D 7237                <1> 	jb	short ac97_current_sound_data ; = 2
  4052                              <1> 	; = 3
  4053                              <1> vt8233_current_sound_data:
  4054                              <1> 	; 05/06/2024
  4055                              <1> 	; 04/06/2024 - TRDOS 386 v2.0.8
  4056                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  4057                              <1> 	; 22/06/2017
  4058                              <1> 	; 21/06/2017
  4059                              <1> 	; get current sound (PCM out) data for graphics
  4060                              <1> 	; (for VT 8233, VT 8237R)
  4061                              <1> 	; ebx = Physical address (on page boundary)
  4062                              <1> 	; ecx = Byte count
  4063                              <1> 	; [audio_buff_size]
  4064                              <1> 	
  4065                              <1> 	;;mov	edi, [audio_buff_size]
  4066                              <1> 	;mov	edi, [audio_dmabuff_size]
  4067                              <1> 	;mov	esi, [audio_dma_buff]
  4068                              <1> 	;shr	edi, 1
  4069                              <1> 	;cmp	edi, ecx
  4070                              <1> 	;jnb	short vt8233_gcd_1
  4071                              <1> 	;mov	ecx, edi
  4072                              <1> 
  4073                              <1> 	;;;
  4074                              <1> 	; 04/06/2024
  4075                              <1> 	; edi = [audio_buff_size]
  4076                              <1> 	; 05/06/2024
  4077                              <1> 	;and	di, ~1	; word alignment
  4078                              <1> 	; edi = [dma_hbuff_size]
  4079 00014C8F 39CF                <1> 	cmp	edi, ecx
  4080 00014C91 7302                <1> 	jnb	short vt8233_gcd_1
  4081 00014C93 89F9                <1> 	mov	ecx, edi
  4082                              <1> 	;;;
  4083                              <1> 
  4084                              <1> vt8233_gcd_1:
  4085                              <1> 	;mov	edx, VIA_REG_OFFSET_CURR_COUNT
  4086                              <1> 	; 06/08/2022
  4087 00014C95 31D2                <1> 	xor	edx, edx
  4088 00014C97 B20C                <1> 	mov	dl, VIA_REG_OFFSET_CURR_COUNT
  4089 00014C99 E877F5FFFF          <1> 	call	ctrl_io_r32
  4090 00014C9E 89C2                <1> 	mov	edx, eax ; remain count (bits 23-0),
  4091                              <1> 			 ; SGD index (bits 31-24) 
  4092 00014CA0 81E200000001        <1> 	and	edx, 1000000h ; SGD index (0 = 1st half)
  4093 00014CA6 7402                <1> 	jz	short vt8233_gcd_2
  4094                              <1> 	; the second half of DMA buffer
  4095 00014CA8 01FE                <1> 	add	esi, edi 
  4096                              <1> vt8233_gcd_2:
  4097 00014CAA 25FFFFFF00          <1> 	and	eax, 0FFFFFFh ; bits 23-0
  4098                              <1> ac97_gcd_2:
  4099                              <1> sb16_gcd_2:
  4100 00014CAF 39C8                <1> 	cmp	eax, ecx
  4101 00014CB1 7302                <1> 	jnb	short vt8233_gcd_3 
  4102                              <1> 	; remain count < graphics bytes
  4103 00014CB3 89C8                <1> 	mov	eax, ecx ; fix remain count to data size
  4104                              <1> vt8233_gcd_3:
  4105 00014CB5 29C7                <1> 	sub	edi, eax
  4106 00014CB7 7602                <1> 	jna	short vt8233_gcd_4
  4107 00014CB9 01FE                <1> 	add	esi, edi ; dma buffer offset
  4108                              <1> vt8233_gcd_4:
  4109 00014CBB 89DF                <1> 	mov	edi, ebx ; buffer address (for graphics)
  4110 00014CBD 890D[AC940100]      <1> 	mov	[u.r0], ecx
  4111 00014CC3 F3A4                <1> 	rep	movsb
  4112                              <1> vt8233_gcd_5:
  4113 00014CC5 C3                  <1> 	retn
  4114                              <1> 
  4115                              <1> ac97_current_sound_data:
  4116                              <1> 	; 05/06/2024
  4117                              <1> 	; 04/06/2024 - TRDOS 386 v2.0.8
  4118                              <1> 	; 23/06/2017
  4119                              <1> 	; 22/06/2017
  4120                              <1> 	; get current sound (PCM out) data for graphics
  4121                              <1> 	; (for AC'97, ICH)
  4122                              <1> 	; ebx = Physical address (on page boundary)
  4123                              <1> 	; ecx = Byte count
  4124                              <1> 	; [audio_buff_size]
  4125                              <1> 	
  4126                              <1> 	;;mov	edi, [audio_buff_size]
  4127                              <1> 	;mov	edi, [audio_dmabuff_size]
  4128                              <1> 	;mov	esi, [audio_dma_buff]
  4129                              <1> 	;shr	edi, 1
  4130                              <1> 	;cmp	edi, ecx
  4131                              <1> 	;jnb	short ac97_gcd_0
  4132                              <1> 	;mov	ecx, edi
  4133                              <1> 
  4134                              <1> 	;;;
  4135                              <1> 	; 04/06/2024
  4136                              <1> 	; edi = [audio_buff_size]
  4137                              <1> 	; 05/06/2024
  4138                              <1> 	;and	di, ~7	; 8 byte alignment
  4139                              <1> 	; edi = [dma_hbuff_size]
  4140 00014CC6 39CF                <1> 	cmp	edi, ecx
  4141 00014CC8 7302                <1> 	jnb	short ac97_gcd_0
  4142 00014CCA 89F9                <1> 	mov	ecx, edi
  4143                              <1> 	;;;
  4144                              <1> 
  4145                              <1> ac97_gcd_0:
  4146 00014CCC 66BA1400            <1> 	mov	dx, PO_CIV_REG ; Position In Current Buff Reg
  4147 00014CD0 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  4148 00014CD7 EC                  <1> 	in	al, dx ; current index value
  4149 00014CD8 A801                <1> 	test	al, 1
  4150 00014CDA 7402                <1> 	jz	short ac97_gcd_1
  4151 00014CDC 01FE                <1> 	add	esi, edi
  4152                              <1> ac97_gcd_1:
  4153 00014CDE 31C0                <1> 	xor	eax, eax
  4154 00014CE0 66BA1800            <1> 	mov	dx, PO_PICB_REG ; Position In Current Buff Reg
  4155 00014CE4 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  4156                              <1> 	;in	ax, dx ; remain dwords
  4157                              <1> 	;shl	eax, 2 ; remain bytes ; 23/06/2017
  4158                              <1> 	;;;
  4159                              <1> 	; 04/06/2024
  4160 00014CEB 66ED                <1> 	in	ax, dx ; remain words
  4161 00014CED D1E0                <1> 	shl	eax, 1 ; remain bytes	
  4162                              <1> 	;;;
  4163 00014CEF EBBE                <1> 	jmp	short ac97_gcd_2
  4164                              <1> ;	cmp	eax, ecx
  4165                              <1> ;	jnb	short ac97_gcd_2 
  4166                              <1> ;	; remain count < graphics bytes
  4167                              <1> ;	mov	eax, ecx ; fix remain count to data size
  4168                              <1> ;ac97_gcd_2:
  4169                              <1> ;	sub	edi, eax
  4170                              <1> ;	jna	short ac97_gcd_3
  4171                              <1> ;	add	esi, edi ; dma buffer offset
  4172                              <1> ;ac97_gcd_3:
  4173                              <1> ;	mov	edi, ebx ; buffer address (for graphics)
  4174                              <1> ;	mov	[u.r0], ecx
  4175                              <1> ;	rep	movsb
  4176                              <1> ;	retn
  4177                              <1> 
  4178                              <1> sb16_get_dma_buff_off:
  4179                              <1> 	; 05/06/2024
  4180                              <1> 	; 04/06/2024 - TRDOS 386 v2.0.8
  4181                              <1> 	; 28/10/2017
  4182                              <1> 	; 24/06/2017
  4183                              <1> 	; 22/06/2017
  4184                              <1> 	; get current (PCM OUT DMA buffer) pointer
  4185                              <1> 	; (for Sound Blaster 16)
  4186                              <1> 
  4187                              <1> 	;mov	ecx, [audio_dmabuff_size]
  4188                              <1> 	;xor	ebx, ebx
  4189                              <1> 	;shr	ecx, 1
  4190                              <1> 	
  4191                              <1> 	;;;
  4192                              <1> 	; 04/06/2024
  4193                              <1> 	; ecx = audio buffer size
  4194                              <1> 	; 05/06/2024
  4195                              <1> 	; ecx = DMA half buffer size
  4196 00014CF1 D1E1                <1> 	shl	ecx, 1 ; * 2
  4197                              <1> 	; ecx = DMA buffer size
  4198                              <1> 	;;;
  4199                              <1> 
  4200                              <1> sb16_gdmabo_0:
  4201                              <1> 	; 28/10/2017
  4202 00014CF3 803D[5C8F0100]10    <1> 	cmp	byte [audio_bps], 16
  4203 00014CFA 750F                <1> 	jne	short sb16_gdmabo_1 ; 8 bit DMA channel
  4204                              <1> 	; 16 bit DMA channel
  4205 00014CFC E4C6                <1> 	in	al, 0C6h ; DMA channel 5 count register
  4206 00014CFE 88C2                <1> 	mov	dl, al	
  4207 00014D00 E4C6                <1> 	in	al, 0C6h
  4208 00014D02 88C6                <1> 	mov     dh, al
  4209 00014D04 0FB7C2              <1> 	movzx	eax, dx
  4210 00014D07 D1E0                <1> 	shl	eax, 1 ; word count -> byte count
  4211 00014D09 EB3A                <1> 	jmp	short sb16_gdmabo_2
  4212                              <1> sb16_gdmabo_1:
  4213 00014D0B E403                <1> 	in	al, 03h ; DMA channel 1 count register
  4214 00014D0D 88C2                <1> 	mov	dl, al	
  4215 00014D0F E403                <1> 	in	al, 03h
  4216 00014D11 88C6                <1> 	mov     dh, al
  4217 00014D13 0FB7C2              <1> 	movzx	eax, dx
  4218 00014D16 EB2D                <1> 	jmp	short sb16_gdmabo_2
  4219                              <1> 
  4220                              <1> get_dma_buffer_offset:
  4221                              <1> 	; 05/06/2024
  4222                              <1> 	; 04/06/2024
  4223                              <1> 	; 24/06/2017
  4224                              <1> 	; 22/06/2017
  4225                              <1> 	; get current sound (PCM out) data for graphics
  4226                              <1> 	;
  4227                              <1> 	; ebx = Physical address (on page boundary)
  4228                              <1> 	; ecx = Byte count
  4229                              <1> 	; [audio_buff_size]
  4230                              <1> 
  4231                              <1> 	;mov	ecx, [audio_dmabuff_size]
  4232                              <1> 	;;;
  4233                              <1> 	; 04/06/2024
  4234                              <1> 	;mov	ecx, [audio_buff_size]
  4235                              <1> 	; 05/06/2024
  4236 00014D18 8B0D[508F0100]      <1> 	mov	ecx, [dma_hbuff_size]
  4237                              <1> 	;;;
  4238 00014D1E 31DB                <1> 	xor	ebx, ebx
  4239                              <1> gdmabo_0:
  4240 00014D20 803D[298F0100]02    <1> 	cmp	byte [audio_device], 2
  4241 00014D27 72C8                <1> 	jb	short sb16_get_dma_buff_off
  4242 00014D29 7427                <1> 	je	short ac97_get_dma_buff_off
  4243                              <1> 
  4244                              <1> vt8233_get_dma_buff_off:
  4245                              <1> 	; 05/06/2024
  4246                              <1> 	; 04/06/2024 - TRDOS 386 v2.0.8
  4247                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  4248                              <1> 	; 24/06/2017
  4249                              <1> 	; 22/06/2017
  4250                              <1> 	; get current (PCM OUT DMA buffer) pointer
  4251                              <1> 	; (for VT 8233, VT 8237R)
  4252                              <1> 	
  4253                              <1> 	;mov	ecx, [audio_dmabuff_size]
  4254                              <1> 	;xor	ebx, ebx
  4255                              <1> 	;;;
  4256                              <1> 	; 04/06/2024
  4257                              <1> 	;shr	ecx, 1
  4258                              <1> 	; 05/06/2024
  4259                              <1> 	;and	cl, ~1
  4260                              <1> 	; ecx = DMA Half Buffer Size (word aligned)
  4261                              <1> 	;;;
  4262                              <1> vt8233_gdmabo_0:
  4263                              <1> 	;mov	edx, VIA_REG_OFFSET_CURR_COUNT
  4264                              <1> 	; 06/08/2022
  4265 00014D2B 31D2                <1> 	xor	edx, edx
  4266 00014D2D B20C                <1> 	mov	dl, VIA_REG_OFFSET_CURR_COUNT
  4267 00014D2F E8E1F4FFFF          <1> 	call	ctrl_io_r32
  4268 00014D34 89C2                <1> 	mov	edx, eax ; remain count (bits 23-0),
  4269                              <1> 			 ; SGD index (bits 31-24) 
  4270 00014D36 81E200000001        <1> 	and	edx, 1000000h ; SGD index (0 = 1st half)
  4271 00014D3C 7402                <1> 	jz	short vt8233_gdmabo_1
  4272                              <1> 	; the second half of DMA buffer
  4273 00014D3E 89CB                <1> 	mov	ebx, ecx
  4274                              <1> vt8233_gdmabo_1:
  4275 00014D40 25FFFFFF00          <1> 	and	eax, 0FFFFFFh ; bits 23-0
  4276                              <1> sb16_gdmabo_2:
  4277                              <1> ac97_gdmabo_2:
  4278 00014D45 29C1                <1> 	sub	ecx, eax
  4279 00014D47 7602                <1> 	jna	short vt8233_gdmabo_2
  4280 00014D49 01CB                <1> 	add	ebx, ecx ; dma buffer offset
  4281                              <1> vt8233_gdmabo_2:
  4282 00014D4B 891D[AC940100]      <1> 	mov	[u.r0], ebx
  4283 00014D51 C3                  <1> 	retn
  4284                              <1> 
  4285                              <1> ac97_get_dma_buff_off:
  4286                              <1> 	; 06/06/2024
  4287                              <1> 	; 05/06/2024
  4288                              <1> 	; 04/06/2024 - TRDOS 386 v2.0.8
  4289                              <1> 	; 24/06/2017
  4290                              <1> 	; 22/06/2017
  4291                              <1> 	; get current (PCM OUT DMA buffer) pointer
  4292                              <1> 	; (for AC'97, ICH)
  4293                              <1> 	; ebx = Physical address (on page boundary)
  4294                              <1> 	; ecx = Byte count
  4295                              <1> 	; [audio_buff_size]
  4296                              <1> 	
  4297                              <1> 	;mov	ecx, [audio_dmabuff_size]
  4298                              <1> 	;xor	ebx, ebx
  4299                              <1> 	;;;
  4300                              <1> 	; 04/06/2024
  4301                              <1> 	;shr	ecx, 1
  4302                              <1> 	; 05/06/2024
  4303                              <1> 	;and	cl, ~7 ; (truncate bytes if out of 8x)
  4304                              <1> 	; ecx = DMA Half Buffer Size (8 byte aligned)
  4305                              <1> 	;;;
  4306                              <1> ac97_gdmabo_0:
  4307 00014D52 66BA1400            <1> 	mov	dx, PO_CIV_REG ; Position In Current Buff Reg
  4308 00014D56 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  4309 00014D5D EC                  <1> 	in	al, dx ; current index value
  4310 00014D5E A801                <1> 	test	al, 1
  4311 00014D60 7402                <1> 	jz	short ac97_gdmabo_1
  4312 00014D62 89CB                <1> 	mov	ebx, ecx
  4313                              <1> ac97_gdmabo_1:
  4314 00014D64 31C0                <1> 	xor	eax, eax
  4315 00014D66 66BA1800            <1> 	mov	dx, PO_PICB_REG ; Position In Current Buff Reg
  4316 00014D6A 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  4317 00014D71 66ED                <1> 	in	ax, dx ; remain words (samples)
  4318                              <1> 	;;;
  4319                              <1> 	; 06/06/2024
  4320                              <1> 	; audio samples are counted as words
  4321                              <1> 	; 04/06/2024 (BugFix)
  4322 00014D73 D1E0                <1> 	shl	eax, 1 ; remain bytes
  4323                              <1> 	;;;
  4324 00014D75 EBCE                <1> 	jmp	short ac97_gdmabo_2
  4325                              <1> 
  4326                              <1> ac97_codec_info:
  4327                              <1> 	; 06/06/2024
  4328                              <1> 	; 05/06/2024 - TRDOS 386 v2.0.8
  4329                              <1> 	; 19/11/2023
  4330                              <1> 	; ENTRY: none
  4331                              <1> 	; RETURN: 
  4332                              <1> 	;	eax = Extended Audio ID (MX28) in ax
  4333                              <1> 	;	 ax bit 0 - VRA bit
  4334                              <1> 	;	 hw of eax = PCM output sample rate (48000)
  4335                              <1> 	;	ebx = VENDOR ID 1, VENDOR ID 2 (bx)
  4336                              <1> 	;	cf = 1 -> error
  4337                              <1> 
  4338                              <1> 	; 06/06/2024
  4339                              <1> 	;;;
  4340 00014D77 66BA3000            <1> 	mov	dx, GLOB_STS_REG ; 30h
  4341 00014D7B 660315[2E8F0100]    <1> 	add	dx, [NABMBAR]
  4342 00014D82 ED                  <1> 	in	eax, dx
  4343                              <1> 
  4344                              <1> 	;cmp	eax, 0FFFFFFFFh ; -1
  4345 00014D83 40                  <1> 	inc	eax
  4346 00014D84 7408                <1> 	jz	short ac97_c_inf_err
  4347 00014D86 48                  <1> 	dec	eax
  4348                              <1> 
  4349 00014D87 2500030010          <1> 	and	eax, CTRL_ST_CREADY
  4350 00014D8C 7502                <1> 	jnz	short ac97_c_inf_1
  4351                              <1> 
  4352                              <1> ac97_c_inf_err:	
  4353 00014D8E F9                  <1> 	stc
  4354 00014D8F C3                  <1> 	retn
  4355                              <1> 	;;;
  4356                              <1> 
  4357                              <1> ac97_c_inf_1:
  4358 00014D90 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  4359 00014D97 6683C22C            <1> 	add	dx, CODEC_PCM_FRONT_DACRATE_REG 
  4360 00014D9B 66ED                <1> 	in	ax, dx	; PCM Output Sample Rate
  4361                              <1> 			; 48000 Hz
  4362 00014D9D C1E010              <1> 	shl	eax, 16
  4363 00014DA0 E810F4FFFF          <1> 	call	delay_100ms
  4364 00014DA5 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  4365 00014DAC 6683C228            <1> 	add	dx, CODEC_EXT_AUDIO_REG ; 28h
  4366 00014DB0 66ED                <1> 	in	ax, dx
  4367 00014DB2 50                  <1> 	push	eax
  4368 00014DB3 E8FDF3FFFF          <1> 	call	delay_100ms
  4369 00014DB8 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  4370 00014DBF 6683C27C            <1> 	add	dx, CODEC_VENDOR_ID1
  4371 00014DC3 66ED                <1> 	in	ax, dx
  4372 00014DC5 C1E010              <1> 	shl	eax, 16
  4373 00014DC8 668B15[2C8F0100]    <1> 	mov	dx, [NAMBAR]
  4374 00014DCF 6683C27E            <1> 	add	dx, CODEC_VENDOR_ID2
  4375 00014DD3 66ED                <1> 	in	ax, dx
  4376 00014DD5 89C3                <1> 	mov	ebx, eax
  4377 00014DD7 58                  <1> 	pop	eax
  4378                              <1> 	;;;;
  4379                              <1> 	; 06/06/2024 (temporary!?)
  4380                              <1> 	; (ALC850 & ALC655 BugFix)
  4381 00014DD8 83FBFF              <1> 	cmp	ebx, 0FFFFFFFFh ; -1
  4382 00014DDB 74B1                <1> 	je	short ac97_c_inf_err ; invalid
  4383 00014DDD 09DB                <1> 	or	ebx, ebx
  4384 00014DDF 74AD                <1> 	jz	short ac97_c_inf_err ; invalid
  4385 00014DE1 81FB90474C41        <1> 	cmp	ebx, 414C4790h ; ALC850
  4386                              <1> 	;je	short ac97_c_inf_2
  4387                              <1> 	;cmp	ebx, 414C4760h ; ALC655
  4388 00014DE7 7505                <1> 	jne	short ac97_c_inf_3	
  4389                              <1> 	;mov	eax, 0BB8009C6h ; AC655 default (Read only)
  4390                              <1> 	;retn
  4391                              <1> ac97_c_inf_2:
  4392                              <1> 	; ref: ALC850 & ALC655 data sheet
  4393 00014DE9 B8C40980BB          <1> 	mov	eax, 0BB8009C4h ; AC850 default (Read only)
  4394                              <1> ac97_c_inf_3:
  4395                              <1> 	;;;;
  4396 00014DEE C3                  <1> 	retn
  4397                              <1> 
  4398                              <1> ; 19/11/2023
  4399                              <1> ; Valid ICH device IDs
  4400                              <1> 
  4401                              <1> valid_ids:
  4402 00014DEF 86801524            <1> dd	(ICH_DID << 16) + INTEL_VID  	 ; 8086h:2415h
  4403 00014DF3 86802524            <1> dd	(ICH0_DID << 16) + INTEL_VID 	 ; 8086h:2425h
  4404 00014DF7 86804524            <1> dd	(ICH2_DID << 16) + INTEL_VID 	 ; 8086h:2445h
  4405 00014DFB 86808524            <1> dd	(ICH3_DID << 16) + INTEL_VID 	 ; 8086h:2485h
  4406 00014DFF 8680C524            <1> dd	(ICH4_DID << 16) + INTEL_VID 	 ; 8086h:24C5h
  4407 00014E03 8680D524            <1> dd	(ICH5_DID << 16) + INTEL_VID 	 ; 8086h:24D5h
  4408 00014E07 86806E26            <1> dd	(ICH6_DID << 16) + INTEL_VID 	 ; 8086h:266Eh
  4409 00014E0B 8680A625            <1> dd	(ESB6300_DID << 16) + INTEL_VID  ; 8086h:25A6h
  4410 00014E0F 86809826            <1> dd	(ESB631X_DID << 16) + INTEL_VID  ; 8086h:2698h
  4411 00014E13 8680DE27            <1> dd	(ICH7_DID << 16) + INTEL_VID 	 ; 8086h:27DEh
  4412 00014E17 86809571            <1> dd	(MX82440_DID << 16) + INTEL_VID  ; 8086h:7195h
  4413 00014E1B 39101270            <1> dd	(SI7012_DID << 16)  + SIS_VID	 ; 1039h:7012h
  4414 00014E1F DE10B101            <1> dd 	(NFORCE_DID << 16)  + NVIDIA_VID ; 10DEh:01B1h
  4415 00014E23 DE106A00            <1> dd 	(NFORCE2_DID << 16) + NVIDIA_VID ; 10DEh:006Ah
  4416 00014E27 22106D74            <1> dd 	(AMD8111_DID << 16) + AMD_VID 	 ; 1022h:746Dh
  4417 00014E2B 22104574            <1> dd 	(AMD768_DID << 16)  + AMD_VID 	 ; 1022h:7445h
  4418 00014E2F DE105900            <1> dd 	(CK804_DID << 16) + NVIDIA_VID	 ; 10DEh:0059h
  4419 00014E33 DE103A00            <1> dd 	(MCP04_DID << 16) + NVIDIA_VID	 ; 10DEh:003Ah
  4420 00014E37 DE108A00            <1> dd 	(CK8_DID << 16) + NVIDIA_VID	 ; 1022h:008Ah
  4421 00014E3B DE10DA00            <1> dd 	(NFORCE3_DID << 16) + NVIDIA_VID ; 10DEh:00DAh
  4422 00014E3F DE10EA00            <1> dd 	(CK8S_DID << 16) + NVIDIA_VID	 ; 10DEh:00EAh
  4423                              <1> 
  4424                              <1> valid_id_count:	equ ($ - valid_ids)>>2 ; 19/11/2023
  3784                                  
  3785 00014E43 90                      align 4
  3786                                  
  3787                                  %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 00014E44 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    31 00014E4D 00000000000000      <1>
    32 00014E54 00000000000000002A- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    32 00014E5D 2A2A2A2A2A2A2A      <1>
    33 00014E64 2A2A2A2A2A2A2A2A2A- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    33 00014E6D 2A2A2A2A2A2A2A      <1>
    34 00014E74 2A2A2A2A2A2A2A2A2A- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    34 00014E7D 2A2A2A2A2A2A2A      <1>
    35 00014E84 2A2A2A2A2A2A2A2A3F- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh
    35 00014E8D 3F3F3F3F3F3F3F      <1>
    36 00014E94 3F3F3F3F3F3F3F3F3F- <1>     db  03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh
    36 00014E9D 3F3F3F3F3F3F3F      <1>
    37 00014EA4 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    37 00014EAD 00000000000000      <1>
    38 00014EB4 00000000000000002A- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    38 00014EBD 2A2A2A2A2A2A2A      <1>
    39 00014EC4 2A2A2A2A2A2A2A2A2A- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    39 00014ECD 2A2A2A2A2A2A2A      <1>
    40 00014ED4 2A2A2A2A2A2A2A2A2A- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    40 00014EDD 2A2A2A2A2A2A2A      <1>
    41 00014EE4 2A2A2A2A2A2A2A2A3F- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh
    41 00014EED 3F3F3F3F3F3F3F      <1>
    42 00014EF4 3F3F3F3F3F3F3F3F3F- <1>     db  03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh
    42 00014EFD 3F3F3F3F3F3F3F      <1>
    43                              <1> palette1: ; (63+1)*3	
    44 00014F04 00000000002A002A00- <1>     db  000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah, 000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah
    44 00014F0D 002A2A2A00002A      <1>
    45 00014F14 002A2A15002A2A2A00- <1>     db  000h, 02ah, 02ah, 015h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah
    45 00014F1D 000000002A002A      <1>
    46 00014F24 00002A2A2A00002A00- <1>     db  000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah, 000h, 02ah, 02ah, 015h, 000h, 02ah, 02ah, 02ah
    46 00014F2D 2A2A15002A2A2A      <1>
    47 00014F34 15151515153F153F15- <1>     db  015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh, 015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh
    47 00014F3D 153F3F3F15153F      <1>
    48 00014F44 153F3F3F153F3F3F15- <1>     db  015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh
    48 00014F4D 151515153F153F      <1>
    49 00014F54 15153F3F3F15153F15- <1>     db  015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh
    49 00014F5D 3F3F3F153F3F3F      <1>
    50 00014F64 00000000002A002A00- <1>     db  000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah, 000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah
    50 00014F6D 002A2A2A00002A      <1>
    51 00014F74 002A2A15002A2A2A00- <1>     db  000h, 02ah, 02ah, 015h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah
    51 00014F7D 000000002A002A      <1>
    52 00014F84 00002A2A2A00002A00- <1>     db  000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah, 000h, 02ah, 02ah, 015h, 000h, 02ah, 02ah, 02ah
    52 00014F8D 2A2A15002A2A2A      <1>
    53 00014F94 15151515153F153F15- <1>     db  015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh, 015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh
    53 00014F9D 153F3F3F15153F      <1>
    54 00014FA4 153F3F3F153F3F3F15- <1>     db  015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh
    54 00014FAD 151515153F153F      <1>
    55 00014FB4 15153F3F3F15153F15- <1>     db  015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh
    55 00014FBD 3F3F3F153F3F3F      <1>
    56                              <1> palette2: ; (63+1)*3
    57 00014FC4 00000000002A002A00- <1>     db  000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah, 000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah
    57 00014FCD 002A2A2A00002A      <1>
    58 00014FD4 002A2A2A002A2A2A00- <1>     db  000h, 02ah, 02ah, 02ah, 000h, 02ah, 02ah, 02ah, 000h, 000h, 015h, 000h, 000h, 03fh, 000h, 02ah
    58 00014FDD 001500003F002A      <1>
    59 00014FE4 15002A3F2A00152A00- <1>     db  015h, 000h, 02ah, 03fh, 02ah, 000h, 015h, 02ah, 000h, 03fh, 02ah, 02ah, 015h, 02ah, 02ah, 03fh
    59 00014FED 3F2A2A152A2A3F      <1>
    60 00014FF4 00150000152A003F00- <1>     db  000h, 015h, 000h, 000h, 015h, 02ah, 000h, 03fh, 000h, 000h, 03fh, 02ah, 02ah, 015h, 000h, 02ah
    60 00014FFD 003F2A2A15002A      <1>
    61 00015004 152A2A3F002A3F2A00- <1>     db  015h, 02ah, 02ah, 03fh, 000h, 02ah, 03fh, 02ah, 000h, 015h, 015h, 000h, 015h, 03fh, 000h, 03fh
    61 0001500D 151500153F003F      <1>
    62 00015014 15003F3F2A15152A15- <1>     db  015h, 000h, 03fh, 03fh, 02ah, 015h, 015h, 02ah, 015h, 03fh, 02ah, 03fh, 015h, 02ah, 03fh, 03fh
    62 0001501D 3F2A3F152A3F3F      <1>
    63 00015024 15000015002A152A00- <1>     db  015h, 000h, 000h, 015h, 000h, 02ah, 015h, 02ah, 000h, 015h, 02ah, 02ah, 03fh, 000h, 000h, 03fh
    63 0001502D 152A2A3F00003F      <1>
    64 00015034 002A3F2A003F2A2A15- <1>     db  000h, 02ah, 03fh, 02ah, 000h, 03fh, 02ah, 02ah, 015h, 000h, 015h, 015h, 000h, 03fh, 015h, 02ah
    64 0001503D 001515003F152A      <1>
    65 00015044 15152A3F3F00153F00- <1>     db  015h, 015h, 02ah, 03fh, 03fh, 000h, 015h, 03fh, 000h, 03fh, 03fh, 02ah, 015h, 03fh, 02ah, 03fh
    65 0001504D 3F3F2A153F2A3F      <1>
    66 00015054 15150015152A153F00- <1>     db  015h, 015h, 000h, 015h, 015h, 02ah, 015h, 03fh, 000h, 015h, 03fh, 02ah, 03fh, 015h, 000h, 03fh
    66 0001505D 153F2A3F15003F      <1>
    67 00015064 152A3F3F003F3F2A15- <1>     db  015h, 02ah, 03fh, 03fh, 000h, 03fh, 03fh, 02ah, 015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh
    67 0001506D 151515153F153F      <1>
    68 00015074 15153F3F3F15153F15- <1>     db  015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh
    68 0001507D 3F3F3F153F3F3F      <1>
    69                              <1> palette3: ; 256*3
    70 00015084 00000000002A002A00- <1>     db  000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah, 000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah
    70 0001508D 002A2A2A00002A      <1>
    71 00015094 002A2A15002A2A2A15- <1>     db  000h, 02ah, 02ah, 015h, 000h, 02ah, 02ah, 02ah, 015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh
    71 0001509D 151515153F153F      <1>
    72 000150A4 15153F3F3F15153F15- <1>     db  015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh
    72 000150AD 3F3F3F153F3F3F      <1>
    73 000150B4 000000050505080808- <1>     db  000h, 000h, 000h, 005h, 005h, 005h, 008h, 008h, 008h, 00bh, 00bh, 00bh, 00eh, 00eh, 00eh, 011h
    73 000150BD 0B0B0B0E0E0E11      <1>
    74 000150C4 11111414141818181C- <1>     db  011h, 011h, 014h, 014h, 014h, 018h, 018h, 018h, 01ch, 01ch, 01ch, 020h, 020h, 020h, 024h, 024h
    74 000150CD 1C1C2020202424      <1>
    75 000150D4 242828282D2D2D3232- <1>     db  024h, 028h, 028h, 028h, 02dh, 02dh, 02dh, 032h, 032h, 032h, 038h, 038h, 038h, 03fh, 03fh, 03fh
    75 000150DD 323838383F3F3F      <1>
    76 000150E4 00003F10003F1F003F- <1>     db  000h, 000h, 03fh, 010h, 000h, 03fh, 01fh, 000h, 03fh, 02fh, 000h, 03fh, 03fh, 000h, 03fh, 03fh
    76 000150ED 2F003F3F003F3F      <1>
    77 000150F4 002F3F001F3F00103F- <1>     db  000h, 02fh, 03fh, 000h, 01fh, 03fh, 000h, 010h, 03fh, 000h, 000h, 03fh, 010h, 000h, 03fh, 01fh
    77 000150FD 00003F10003F1F      <1>
    78 00015104 003F2F003F3F002F3F- <1>     db  000h, 03fh, 02fh, 000h, 03fh, 03fh, 000h, 02fh, 03fh, 000h, 01fh, 03fh, 000h, 010h, 03fh, 000h
    78 0001510D 001F3F00103F00      <1>
    79 00015114 003F00003F10003F1F- <1>     db  000h, 03fh, 000h, 000h, 03fh, 010h, 000h, 03fh, 01fh, 000h, 03fh, 02fh, 000h, 03fh, 03fh, 000h
    79 0001511D 003F2F003F3F00      <1>
    80 00015124 2F3F001F3F00103F1F- <1>     db  02fh, 03fh, 000h, 01fh, 03fh, 000h, 010h, 03fh, 01fh, 01fh, 03fh, 027h, 01fh, 03fh, 02fh, 01fh
    80 0001512D 1F3F271F3F2F1F      <1>
    81 00015134 3F371F3F3F1F3F3F1F- <1>     db  03fh, 037h, 01fh, 03fh, 03fh, 01fh, 03fh, 03fh, 01fh, 037h, 03fh, 01fh, 02fh, 03fh, 01fh, 027h
    81 0001513D 373F1F2F3F1F27      <1>
    82 00015144 3F1F1F3F271F3F2F1F- <1>     db  03fh, 01fh, 01fh, 03fh, 027h, 01fh, 03fh, 02fh, 01fh, 03fh, 037h, 01fh, 03fh, 03fh, 01fh, 037h
    82 0001514D 3F371F3F3F1F37      <1>
    83 00015154 3F1F2F3F1F273F1F1F- <1>     db  03fh, 01fh, 02fh, 03fh, 01fh, 027h, 03fh, 01fh, 01fh, 03fh, 01fh, 01fh, 03fh, 027h, 01fh, 03fh
    83 0001515D 3F1F1F3F271F3F      <1>
    84 00015164 2F1F3F371F3F3F1F37- <1>     db  02fh, 01fh, 03fh, 037h, 01fh, 03fh, 03fh, 01fh, 037h, 03fh, 01fh, 02fh, 03fh, 01fh, 027h, 03fh
    84 0001516D 3F1F2F3F1F273F      <1>
    85 00015174 2D2D3F312D3F362D3F- <1>     db  02dh, 02dh, 03fh, 031h, 02dh, 03fh, 036h, 02dh, 03fh, 03ah, 02dh, 03fh, 03fh, 02dh, 03fh, 03fh
    85 0001517D 3A2D3F3F2D3F3F      <1>
    86 00015184 2D3A3F2D363F2D313F- <1>     db  02dh, 03ah, 03fh, 02dh, 036h, 03fh, 02dh, 031h, 03fh, 02dh, 02dh, 03fh, 031h, 02dh, 03fh, 036h
    86 0001518D 2D2D3F312D3F36      <1>
    87 00015194 2D3F3A2D3F3F2D3A3F- <1>     db  02dh, 03fh, 03ah, 02dh, 03fh, 03fh, 02dh, 03ah, 03fh, 02dh, 036h, 03fh, 02dh, 031h, 03fh, 02dh
    87 0001519D 2D363F2D313F2D      <1>
    88 000151A4 2D3F2D2D3F312D3F36- <1>     db  02dh, 03fh, 02dh, 02dh, 03fh, 031h, 02dh, 03fh, 036h, 02dh, 03fh, 03ah, 02dh, 03fh, 03fh, 02dh
    88 000151AD 2D3F3A2D3F3F2D      <1>
    89 000151B4 3A3F2D363F2D313F00- <1>     db  03ah, 03fh, 02dh, 036h, 03fh, 02dh, 031h, 03fh, 000h, 000h, 01ch, 007h, 000h, 01ch, 00eh, 000h
    89 000151BD 001C07001C0E00      <1>
    90 000151C4 1C15001C1C001C1C00- <1>     db  01ch, 015h, 000h, 01ch, 01ch, 000h, 01ch, 01ch, 000h, 015h, 01ch, 000h, 00eh, 01ch, 000h, 007h
    90 000151CD 151C000E1C0007      <1>
    91 000151D4 1C00001C07001C0E00- <1>     db  01ch, 000h, 000h, 01ch, 007h, 000h, 01ch, 00eh, 000h, 01ch, 015h, 000h, 01ch, 01ch, 000h, 015h
    91 000151DD 1C15001C1C0015      <1>
    92 000151E4 1C000E1C00071C0000- <1>     db  01ch, 000h, 00eh, 01ch, 000h, 007h, 01ch, 000h, 000h, 01ch, 000h, 000h, 01ch, 007h, 000h, 01ch
    92 000151ED 1C00001C07001C      <1>
    93 000151F4 0E001C15001C1C0015- <1>     db  00eh, 000h, 01ch, 015h, 000h, 01ch, 01ch, 000h, 015h, 01ch, 000h, 00eh, 01ch, 000h, 007h, 01ch
    93 000151FD 1C000E1C00071C      <1>
    94 00015204 0E0E1C110E1C150E1C- <1>     db  00eh, 00eh, 01ch, 011h, 00eh, 01ch, 015h, 00eh, 01ch, 018h, 00eh, 01ch, 01ch, 00eh, 01ch, 01ch
    94 0001520D 180E1C1C0E1C1C      <1>
    95 00015214 0E181C0E151C0E111C- <1>     db  00eh, 018h, 01ch, 00eh, 015h, 01ch, 00eh, 011h, 01ch, 00eh, 00eh, 01ch, 011h, 00eh, 01ch, 015h
    95 0001521D 0E0E1C110E1C15      <1>
    96 00015224 0E1C180E1C1C0E181C- <1>     db  00eh, 01ch, 018h, 00eh, 01ch, 01ch, 00eh, 018h, 01ch, 00eh, 015h, 01ch, 00eh, 011h, 01ch, 00eh
    96 0001522D 0E151C0E111C0E      <1>
    97 00015234 0E1C0E0E1C110E1C15- <1>     db  00eh, 01ch, 00eh, 00eh, 01ch, 011h, 00eh, 01ch, 015h, 00eh, 01ch, 018h, 00eh, 01ch, 01ch, 00eh
    97 0001523D 0E1C180E1C1C0E      <1>
    98 00015244 181C0E151C0E111C14- <1>     db  018h, 01ch, 00eh, 015h, 01ch, 00eh, 011h, 01ch, 014h, 014h, 01ch, 016h, 014h, 01ch, 018h, 014h
    98 0001524D 141C16141C1814      <1>
    99 00015254 1C1A141C1C141C1C14- <1>     db  01ch, 01ah, 014h, 01ch, 01ch, 014h, 01ch, 01ch, 014h, 01ah, 01ch, 014h, 018h, 01ch, 014h, 016h
    99 0001525D 1A1C14181C1416      <1>
   100 00015264 1C14141C16141C1814- <1>     db  01ch, 014h, 014h, 01ch, 016h, 014h, 01ch, 018h, 014h, 01ch, 01ah, 014h, 01ch, 01ch, 014h, 01ah
   100 0001526D 1C1A141C1C141A      <1>
   101 00015274 1C14181C14161C1414- <1>     db  01ch, 014h, 018h, 01ch, 014h, 016h, 01ch, 014h, 014h, 01ch, 014h, 014h, 01ch, 016h, 014h, 01ch
   101 0001527D 1C14141C16141C      <1>
   102 00015284 18141C1A141C1C141A- <1>     db  018h, 014h, 01ch, 01ah, 014h, 01ch, 01ch, 014h, 01ah, 01ch, 014h, 018h, 01ch, 014h, 016h, 01ch
   102 0001528D 1C14181C14161C      <1>
   103 00015294 000010040010080010- <1>     db  000h, 000h, 010h, 004h, 000h, 010h, 008h, 000h, 010h, 00ch, 000h, 010h, 010h, 000h, 010h, 010h
   103 0001529D 0C001010001010      <1>
   104 000152A4 000C10000810000410- <1>     db  000h, 00ch, 010h, 000h, 008h, 010h, 000h, 004h, 010h, 000h, 000h, 010h, 004h, 000h, 010h, 008h
   104 000152AD 00001004001008      <1>
   105 000152B4 00100C001010000C10- <1>     db  000h, 010h, 00ch, 000h, 010h, 010h, 000h, 00ch, 010h, 000h, 008h, 010h, 000h, 004h, 010h, 000h
   105 000152BD 00081000041000      <1>
   106 000152C4 001000001004001008- <1>     db  000h, 010h, 000h, 000h, 010h, 004h, 000h, 010h, 008h, 000h, 010h, 00ch, 000h, 010h, 010h, 000h
   106 000152CD 00100C00101000      <1>
   107 000152D4 0C1000081000041008- <1>     db  00ch, 010h, 000h, 008h, 010h, 000h, 004h, 010h, 008h, 008h, 010h, 00ah, 008h, 010h, 00ch, 008h
   107 000152DD 08100A08100C08      <1>
   108 000152E4 100E08101008101008- <1>     db  010h, 00eh, 008h, 010h, 010h, 008h, 010h, 010h, 008h, 00eh, 010h, 008h, 00ch, 010h, 008h, 00ah
   108 000152ED 0E10080C10080A      <1>
   109 000152F4 100808100A08100C08- <1>     db  010h, 008h, 008h, 010h, 00ah, 008h, 010h, 00ch, 008h, 010h, 00eh, 008h, 010h, 010h, 008h, 00eh
   109 000152FD 100E081010080E      <1>
   110 00015304 10080C10080A100808- <1>     db  010h, 008h, 00ch, 010h, 008h, 00ah, 010h, 008h, 008h, 010h, 008h, 008h, 010h, 00ah, 008h, 010h
   110 0001530D 100808100A0810      <1>
   111 00015314 0C08100E081010080E- <1>     db  00ch, 008h, 010h, 00eh, 008h, 010h, 010h, 008h, 00eh, 010h, 008h, 00ch, 010h, 008h, 00ah, 010h
   111 0001531D 10080C10080A10      <1>
   112 00015324 0B0B100C0B100D0B10- <1>     db  00bh, 00bh, 010h, 00ch, 00bh, 010h, 00dh, 00bh, 010h, 00fh, 00bh, 010h, 010h, 00bh, 010h, 010h
   112 0001532D 0F0B10100B1010      <1>
   113 00015334 0B0F100B0D100B0C10- <1>     db  00bh, 00fh, 010h, 00bh, 00dh, 010h, 00bh, 00ch, 010h, 00bh, 00bh, 010h, 00ch, 00bh, 010h, 00dh
   113 0001533D 0B0B100C0B100D      <1>
   114 00015344 0B100F0B10100B0F10- <1>     db  00bh, 010h, 00fh, 00bh, 010h, 010h, 00bh, 00fh, 010h, 00bh, 00dh, 010h, 00bh, 00ch, 010h, 00bh
   114 0001534D 0B0D100B0C100B      <1>
   115 00015354 0B100B0B100C0B100D- <1>     db  00bh, 010h, 00bh, 00bh, 010h, 00ch, 00bh, 010h, 00dh, 00bh, 010h, 00fh, 00bh, 010h, 010h, 00bh
   115 0001535D 0B100F0B10100B      <1>
   116 00015364 0F100B0D100B0C1000- <1>     db  00fh, 010h, 00bh, 00dh, 010h, 00bh, 00ch, 010h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   116 0001536D 00000000000000      <1>
   117 00015374 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   117 0001537D 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 00015384 00000000000000007E- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07eh, 081h, 0a5h, 081h, 0bdh, 099h, 081h, 07eh
   125 0001538D 81A581BD99817E      <1>
   126 00015394 7EFFDBFFC3E7FF7E6C- <1>     db  07eh, 0ffh, 0dbh, 0ffh, 0c3h, 0e7h, 0ffh, 07eh, 06ch, 0feh, 0feh, 0feh, 07ch, 038h, 010h, 000h
   126 0001539D FEFEFE7C381000      <1>
   127 000153A4 10387CFE7C38100038- <1>     db  010h, 038h, 07ch, 0feh, 07ch, 038h, 010h, 000h, 038h, 07ch, 038h, 0feh, 0feh, 07ch, 038h, 07ch
   127 000153AD 7C38FEFE7C387C      <1>
   128 000153B4 1010387CFE7C387C00- <1>     db  010h, 010h, 038h, 07ch, 0feh, 07ch, 038h, 07ch, 000h, 000h, 018h, 03ch, 03ch, 018h, 000h, 000h
   128 000153BD 00183C3C180000      <1>
   129 000153C4 FFFFE7C3C3E7FFFF00- <1>     db  0ffh, 0ffh, 0e7h, 0c3h, 0c3h, 0e7h, 0ffh, 0ffh, 000h, 03ch, 066h, 042h, 042h, 066h, 03ch, 000h
   129 000153CD 3C664242663C00      <1>
   130 000153D4 FFC399BDBD99C3FF0F- <1>     db  0ffh, 0c3h, 099h, 0bdh, 0bdh, 099h, 0c3h, 0ffh, 00fh, 007h, 00fh, 07dh, 0cch, 0cch, 0cch, 078h
   130 000153DD 070F7DCCCCCC78      <1>
   131 000153E4 3C6666663C187E183F- <1>     db  03ch, 066h, 066h, 066h, 03ch, 018h, 07eh, 018h, 03fh, 033h, 03fh, 030h, 030h, 070h, 0f0h, 0e0h
   131 000153ED 333F303070F0E0      <1>
   132 000153F4 7F637F636367E6C099- <1>     db  07fh, 063h, 07fh, 063h, 063h, 067h, 0e6h, 0c0h, 099h, 05ah, 03ch, 0e7h, 0e7h, 03ch, 05ah, 099h
   132 000153FD 5A3CE7E73C5A99      <1>
   133 00015404 80E0F8FEF8E0800002- <1>     db  080h, 0e0h, 0f8h, 0feh, 0f8h, 0e0h, 080h, 000h, 002h, 00eh, 03eh, 0feh, 03eh, 00eh, 002h, 000h
   133 0001540D 0E3EFE3E0E0200      <1>
   134 00015414 183C7E18187E3C1866- <1>     db  018h, 03ch, 07eh, 018h, 018h, 07eh, 03ch, 018h, 066h, 066h, 066h, 066h, 066h, 000h, 066h, 000h
   134 0001541D 66666666006600      <1>
   135 00015424 7FDBDB7B1B1B1B003E- <1>     db  07fh, 0dbh, 0dbh, 07bh, 01bh, 01bh, 01bh, 000h, 03eh, 063h, 038h, 06ch, 06ch, 038h, 0cch, 078h
   135 0001542D 63386C6C38CC78      <1>
   136 00015434 000000007E7E7E0018- <1>     db  000h, 000h, 000h, 000h, 07eh, 07eh, 07eh, 000h, 018h, 03ch, 07eh, 018h, 07eh, 03ch, 018h, 0ffh
   136 0001543D 3C7E187E3C18FF      <1>
   137 00015444 183C7E181818180018- <1>     db  018h, 03ch, 07eh, 018h, 018h, 018h, 018h, 000h, 018h, 018h, 018h, 018h, 07eh, 03ch, 018h, 000h
   137 0001544D 1818187E3C1800      <1>
   138 00015454 00180CFE0C18000000- <1>     db  000h, 018h, 00ch, 0feh, 00ch, 018h, 000h, 000h, 000h, 030h, 060h, 0feh, 060h, 030h, 000h, 000h
   138 0001545D 3060FE60300000      <1>
   139 00015464 0000C0C0C0FE000000- <1>     db  000h, 000h, 0c0h, 0c0h, 0c0h, 0feh, 000h, 000h, 000h, 024h, 066h, 0ffh, 066h, 024h, 000h, 000h
   139 0001546D 2466FF66240000      <1>
   140 00015474 00183C7EFFFF000000- <1>     db  000h, 018h, 03ch, 07eh, 0ffh, 0ffh, 000h, 000h, 000h, 0ffh, 0ffh, 07eh, 03ch, 018h, 000h, 000h
   140 0001547D FFFF7E3C180000      <1>
   141 00015484 000000000000000030- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 030h, 078h, 078h, 030h, 030h, 000h, 030h, 000h
   141 0001548D 78783030003000      <1>
   142 00015494 6C6C6C00000000006C- <1>     db  06ch, 06ch, 06ch, 000h, 000h, 000h, 000h, 000h, 06ch, 06ch, 0feh, 06ch, 0feh, 06ch, 06ch, 000h
   142 0001549D 6CFE6CFE6C6C00      <1>
   143 000154A4 307CC0780CF8300000- <1>     db  030h, 07ch, 0c0h, 078h, 00ch, 0f8h, 030h, 000h, 000h, 0c6h, 0cch, 018h, 030h, 066h, 0c6h, 000h
   143 000154AD C6CC183066C600      <1>
   144 000154B4 386C3876DCCC760060- <1>     db  038h, 06ch, 038h, 076h, 0dch, 0cch, 076h, 000h, 060h, 060h, 0c0h, 000h, 000h, 000h, 000h, 000h
   144 000154BD 60C00000000000      <1>
   145 000154C4 183060606030180060- <1>     db  018h, 030h, 060h, 060h, 060h, 030h, 018h, 000h, 060h, 030h, 018h, 018h, 018h, 030h, 060h, 000h
   145 000154CD 30181818306000      <1>
   146 000154D4 00663CFF3C66000000- <1>     db  000h, 066h, 03ch, 0ffh, 03ch, 066h, 000h, 000h, 000h, 030h, 030h, 0fch, 030h, 030h, 000h, 000h
   146 000154DD 3030FC30300000      <1>
   147 000154E4 000000000030306000- <1>     db  000h, 000h, 000h, 000h, 000h, 030h, 030h, 060h, 000h, 000h, 000h, 0fch, 000h, 000h, 000h, 000h
   147 000154ED 0000FC00000000      <1>
   148 000154F4 000000000030300006- <1>     db  000h, 000h, 000h, 000h, 000h, 030h, 030h, 000h, 006h, 00ch, 018h, 030h, 060h, 0c0h, 080h, 000h
   148 000154FD 0C183060C08000      <1>
   149 00015504 7CC6CEDEF6E67C0030- <1>     db  07ch, 0c6h, 0ceh, 0deh, 0f6h, 0e6h, 07ch, 000h, 030h, 070h, 030h, 030h, 030h, 030h, 0fch, 000h
   149 0001550D 7030303030FC00      <1>
   150 00015514 78CC0C3860CCFC0078- <1>     db  078h, 0cch, 00ch, 038h, 060h, 0cch, 0fch, 000h, 078h, 0cch, 00ch, 038h, 00ch, 0cch, 078h, 000h
   150 0001551D CC0C380CCC7800      <1>
   151 00015524 1C3C6CCCFE0C1E00FC- <1>     db  01ch, 03ch, 06ch, 0cch, 0feh, 00ch, 01eh, 000h, 0fch, 0c0h, 0f8h, 00ch, 00ch, 0cch, 078h, 000h
   151 0001552D C0F80C0CCC7800      <1>
   152 00015534 3860C0F8CCCC7800FC- <1>     db  038h, 060h, 0c0h, 0f8h, 0cch, 0cch, 078h, 000h, 0fch, 0cch, 00ch, 018h, 030h, 030h, 030h, 000h
   152 0001553D CC0C1830303000      <1>
   153 00015544 78CCCC78CCCC780078- <1>     db  078h, 0cch, 0cch, 078h, 0cch, 0cch, 078h, 000h, 078h, 0cch, 0cch, 07ch, 00ch, 018h, 070h, 000h
   153 0001554D CCCC7C0C187000      <1>
   154 00015554 003030000030300000- <1>     db  000h, 030h, 030h, 000h, 000h, 030h, 030h, 000h, 000h, 030h, 030h, 000h, 000h, 030h, 030h, 060h
   154 0001555D 30300000303060      <1>
   155 00015564 183060C06030180000- <1>     db  018h, 030h, 060h, 0c0h, 060h, 030h, 018h, 000h, 000h, 000h, 0fch, 000h, 000h, 0fch, 000h, 000h
   155 0001556D 00FC0000FC0000      <1>
   156 00015574 6030180C1830600078- <1>     db  060h, 030h, 018h, 00ch, 018h, 030h, 060h, 000h, 078h, 0cch, 00ch, 018h, 030h, 000h, 030h, 000h
   156 0001557D CC0C1830003000      <1>
   157 00015584 7CC6DEDEDEC0780030- <1>     db  07ch, 0c6h, 0deh, 0deh, 0deh, 0c0h, 078h, 000h, 030h, 078h, 0cch, 0cch, 0fch, 0cch, 0cch, 000h
   157 0001558D 78CCCCFCCCCC00      <1>
   158 00015594 FC66667C6666FC003C- <1>     db  0fch, 066h, 066h, 07ch, 066h, 066h, 0fch, 000h, 03ch, 066h, 0c0h, 0c0h, 0c0h, 066h, 03ch, 000h
   158 0001559D 66C0C0C0663C00      <1>
   159 000155A4 F86C6666666CF800FE- <1>     db  0f8h, 06ch, 066h, 066h, 066h, 06ch, 0f8h, 000h, 0feh, 062h, 068h, 078h, 068h, 062h, 0feh, 000h
   159 000155AD 6268786862FE00      <1>
   160 000155B4 FE6268786860F0003C- <1>     db  0feh, 062h, 068h, 078h, 068h, 060h, 0f0h, 000h, 03ch, 066h, 0c0h, 0c0h, 0ceh, 066h, 03eh, 000h
   160 000155BD 66C0C0CE663E00      <1>
   161 000155C4 CCCCCCFCCCCCCC0078- <1>     db  0cch, 0cch, 0cch, 0fch, 0cch, 0cch, 0cch, 000h, 078h, 030h, 030h, 030h, 030h, 030h, 078h, 000h
   161 000155CD 30303030307800      <1>
   162 000155D4 1E0C0C0CCCCC7800E6- <1>     db  01eh, 00ch, 00ch, 00ch, 0cch, 0cch, 078h, 000h, 0e6h, 066h, 06ch, 078h, 06ch, 066h, 0e6h, 000h
   162 000155DD 666C786C66E600      <1>
   163 000155E4 F06060606266FE00C6- <1>     db  0f0h, 060h, 060h, 060h, 062h, 066h, 0feh, 000h, 0c6h, 0eeh, 0feh, 0feh, 0d6h, 0c6h, 0c6h, 000h
   163 000155ED EEFEFED6C6C600      <1>
   164 000155F4 C6E6F6DECEC6C60038- <1>     db  0c6h, 0e6h, 0f6h, 0deh, 0ceh, 0c6h, 0c6h, 000h, 038h, 06ch, 0c6h, 0c6h, 0c6h, 06ch, 038h, 000h
   164 000155FD 6CC6C6C66C3800      <1>
   165 00015604 FC66667C6060F00078- <1>     db  0fch, 066h, 066h, 07ch, 060h, 060h, 0f0h, 000h, 078h, 0cch, 0cch, 0cch, 0dch, 078h, 01ch, 000h
   165 0001560D CCCCCCDC781C00      <1>
   166 00015614 FC66667C6C66E60078- <1>     db  0fch, 066h, 066h, 07ch, 06ch, 066h, 0e6h, 000h, 078h, 0cch, 0e0h, 070h, 01ch, 0cch, 078h, 000h
   166 0001561D CCE0701CCC7800      <1>
   167 00015624 FCB4303030307800CC- <1>     db  0fch, 0b4h, 030h, 030h, 030h, 030h, 078h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 0fch, 000h
   167 0001562D CCCCCCCCCCFC00      <1>
   168 00015634 CCCCCCCCCC783000C6- <1>     db  0cch, 0cch, 0cch, 0cch, 0cch, 078h, 030h, 000h, 0c6h, 0c6h, 0c6h, 0d6h, 0feh, 0eeh, 0c6h, 000h
   168 0001563D C6C6D6FEEEC600      <1>
   169 00015644 C6C66C38386CC600CC- <1>     db  0c6h, 0c6h, 06ch, 038h, 038h, 06ch, 0c6h, 000h, 0cch, 0cch, 0cch, 078h, 030h, 030h, 078h, 000h
   169 0001564D CCCC7830307800      <1>
   170 00015654 FEC68C183266FE0078- <1>     db  0feh, 0c6h, 08ch, 018h, 032h, 066h, 0feh, 000h, 078h, 060h, 060h, 060h, 060h, 060h, 078h, 000h
   170 0001565D 60606060607800      <1>
   171 00015664 C06030180C06020078- <1>     db  0c0h, 060h, 030h, 018h, 00ch, 006h, 002h, 000h, 078h, 018h, 018h, 018h, 018h, 018h, 078h, 000h
   171 0001566D 18181818187800      <1>
   172 00015674 10386CC60000000000- <1>     db  010h, 038h, 06ch, 0c6h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh
   172 0001567D 000000000000FF      <1>
   173 00015684 303018000000000000- <1>     db  030h, 030h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 078h, 00ch, 07ch, 0cch, 076h, 000h
   173 0001568D 00780C7CCC7600      <1>
   174 00015694 E060607C6666DC0000- <1>     db  0e0h, 060h, 060h, 07ch, 066h, 066h, 0dch, 000h, 000h, 000h, 078h, 0cch, 0c0h, 0cch, 078h, 000h
   174 0001569D 0078CCC0CC7800      <1>
   175 000156A4 1C0C0C7CCCCC760000- <1>     db  01ch, 00ch, 00ch, 07ch, 0cch, 0cch, 076h, 000h, 000h, 000h, 078h, 0cch, 0fch, 0c0h, 078h, 000h
   175 000156AD 0078CCFCC07800      <1>
   176 000156B4 386C60F06060F00000- <1>     db  038h, 06ch, 060h, 0f0h, 060h, 060h, 0f0h, 000h, 000h, 000h, 076h, 0cch, 0cch, 07ch, 00ch, 0f8h
   176 000156BD 0076CCCC7C0CF8      <1>
   177 000156C4 E0606C766666E60030- <1>     db  0e0h, 060h, 06ch, 076h, 066h, 066h, 0e6h, 000h, 030h, 000h, 070h, 030h, 030h, 030h, 078h, 000h
   177 000156CD 00703030307800      <1>
   178 000156D4 0C000C0C0CCCCC78E0- <1>     db  00ch, 000h, 00ch, 00ch, 00ch, 0cch, 0cch, 078h, 0e0h, 060h, 066h, 06ch, 078h, 06ch, 0e6h, 000h
   178 000156DD 60666C786CE600      <1>
   179 000156E4 703030303030780000- <1>     db  070h, 030h, 030h, 030h, 030h, 030h, 078h, 000h, 000h, 000h, 0cch, 0feh, 0feh, 0d6h, 0c6h, 000h
   179 000156ED 00CCFEFED6C600      <1>
   180 000156F4 0000F8CCCCCCCC0000- <1>     db  000h, 000h, 0f8h, 0cch, 0cch, 0cch, 0cch, 000h, 000h, 000h, 078h, 0cch, 0cch, 0cch, 078h, 000h
   180 000156FD 0078CCCCCC7800      <1>
   181 00015704 0000DC66667C60F000- <1>     db  000h, 000h, 0dch, 066h, 066h, 07ch, 060h, 0f0h, 000h, 000h, 076h, 0cch, 0cch, 07ch, 00ch, 01eh
   181 0001570D 0076CCCC7C0C1E      <1>
   182 00015714 0000DC766660F00000- <1>     db  000h, 000h, 0dch, 076h, 066h, 060h, 0f0h, 000h, 000h, 000h, 07ch, 0c0h, 078h, 00ch, 0f8h, 000h
   182 0001571D 007CC0780CF800      <1>
   183 00015724 10307C303034180000- <1>     db  010h, 030h, 07ch, 030h, 030h, 034h, 018h, 000h, 000h, 000h, 0cch, 0cch, 0cch, 0cch, 076h, 000h
   183 0001572D 00CCCCCCCC7600      <1>
   184 00015734 0000CCCCCC78300000- <1>     db  000h, 000h, 0cch, 0cch, 0cch, 078h, 030h, 000h, 000h, 000h, 0c6h, 0d6h, 0feh, 0feh, 06ch, 000h
   184 0001573D 00C6D6FEFE6C00      <1>
   185 00015744 0000C66C386CC60000- <1>     db  000h, 000h, 0c6h, 06ch, 038h, 06ch, 0c6h, 000h, 000h, 000h, 0cch, 0cch, 0cch, 07ch, 00ch, 0f8h
   185 0001574D 00CCCCCC7C0CF8      <1>
   186 00015754 0000FC983064FC001C- <1>     db  000h, 000h, 0fch, 098h, 030h, 064h, 0fch, 000h, 01ch, 030h, 030h, 0e0h, 030h, 030h, 01ch, 000h
   186 0001575D 3030E030301C00      <1>
   187 00015764 1818180018181800E0- <1>     db  018h, 018h, 018h, 000h, 018h, 018h, 018h, 000h, 0e0h, 030h, 030h, 01ch, 030h, 030h, 0e0h, 000h
   187 0001576D 30301C3030E000      <1>
   188 00015774 76DC00000000000000- <1>     db  076h, 0dch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 000h
   188 0001577D 10386CC6C6FE00      <1>
   189 00015784 78CCC0CC78180C7800- <1>     db  078h, 0cch, 0c0h, 0cch, 078h, 018h, 00ch, 078h, 000h, 0cch, 000h, 0cch, 0cch, 0cch, 07eh, 000h
   189 0001578D CC00CCCCCC7E00      <1>
   190 00015794 1C0078CCFCC078007E- <1>     db  01ch, 000h, 078h, 0cch, 0fch, 0c0h, 078h, 000h, 07eh, 0c3h, 03ch, 006h, 03eh, 066h, 03fh, 000h
   190 0001579D C33C063E663F00      <1>
   191 000157A4 CC00780C7CCC7E00E0- <1>     db  0cch, 000h, 078h, 00ch, 07ch, 0cch, 07eh, 000h, 0e0h, 000h, 078h, 00ch, 07ch, 0cch, 07eh, 000h
   191 000157AD 00780C7CCC7E00      <1>
   192 000157B4 3030780C7CCC7E0000- <1>     db  030h, 030h, 078h, 00ch, 07ch, 0cch, 07eh, 000h, 000h, 000h, 078h, 0c0h, 0c0h, 078h, 00ch, 038h
   192 000157BD 0078C0C0780C38      <1>
   193 000157C4 7EC33C667E603C00CC- <1>     db  07eh, 0c3h, 03ch, 066h, 07eh, 060h, 03ch, 000h, 0cch, 000h, 078h, 0cch, 0fch, 0c0h, 078h, 000h
   193 000157CD 0078CCFCC07800      <1>
   194 000157D4 E00078CCFCC07800CC- <1>     db  0e0h, 000h, 078h, 0cch, 0fch, 0c0h, 078h, 000h, 0cch, 000h, 070h, 030h, 030h, 030h, 078h, 000h
   194 000157DD 00703030307800      <1>
   195 000157E4 7CC6381818183C00E0- <1>     db  07ch, 0c6h, 038h, 018h, 018h, 018h, 03ch, 000h, 0e0h, 000h, 070h, 030h, 030h, 030h, 078h, 000h
   195 000157ED 00703030307800      <1>
   196 000157F4 C6386CC6FEC6C60030- <1>     db  0c6h, 038h, 06ch, 0c6h, 0feh, 0c6h, 0c6h, 000h, 030h, 030h, 000h, 078h, 0cch, 0fch, 0cch, 000h
   196 000157FD 300078CCFCCC00      <1>
   197 00015804 1C00FC607860FC0000- <1>     db  01ch, 000h, 0fch, 060h, 078h, 060h, 0fch, 000h, 000h, 000h, 07fh, 00ch, 07fh, 0cch, 07fh, 000h
   197 0001580D 007F0C7FCC7F00      <1>
   198 00015814 3E6CCCFECCCCCE0078- <1>     db  03eh, 06ch, 0cch, 0feh, 0cch, 0cch, 0ceh, 000h, 078h, 0cch, 000h, 078h, 0cch, 0cch, 078h, 000h
   198 0001581D CC0078CCCC7800      <1>
   199 00015824 00CC0078CCCC780000- <1>     db  000h, 0cch, 000h, 078h, 0cch, 0cch, 078h, 000h, 000h, 0e0h, 000h, 078h, 0cch, 0cch, 078h, 000h
   199 0001582D E00078CCCC7800      <1>
   200 00015834 78CC00CCCCCC7E0000- <1>     db  078h, 0cch, 000h, 0cch, 0cch, 0cch, 07eh, 000h, 000h, 0e0h, 000h, 0cch, 0cch, 0cch, 07eh, 000h
   200 0001583D E000CCCCCC7E00      <1>
   201 00015844 00CC00CCCC7C0CF8C3- <1>     db  000h, 0cch, 000h, 0cch, 0cch, 07ch, 00ch, 0f8h, 0c3h, 018h, 03ch, 066h, 066h, 03ch, 018h, 000h
   201 0001584D 183C66663C1800      <1>
   202 00015854 CC00CCCCCCCC780018- <1>     db  0cch, 000h, 0cch, 0cch, 0cch, 0cch, 078h, 000h, 018h, 018h, 07eh, 0c0h, 0c0h, 07eh, 018h, 018h
   202 0001585D 187EC0C07E1818      <1>
   203 00015864 386C64F060E6FC00CC- <1>     db  038h, 06ch, 064h, 0f0h, 060h, 0e6h, 0fch, 000h, 0cch, 0cch, 078h, 0fch, 030h, 0fch, 030h, 030h
   203 0001586D CC78FC30FC3030      <1>
   204 00015874 F8CCCCFAC6CFC6C70E- <1>     db  0f8h, 0cch, 0cch, 0fah, 0c6h, 0cfh, 0c6h, 0c7h, 00eh, 01bh, 018h, 03ch, 018h, 018h, 0d8h, 070h
   204 0001587D 1B183C1818D870      <1>
   205 00015884 1C00780C7CCC7E0038- <1>     db  01ch, 000h, 078h, 00ch, 07ch, 0cch, 07eh, 000h, 038h, 000h, 070h, 030h, 030h, 030h, 078h, 000h
   205 0001588D 00703030307800      <1>
   206 00015894 001C0078CCCC780000- <1>     db  000h, 01ch, 000h, 078h, 0cch, 0cch, 078h, 000h, 000h, 01ch, 000h, 0cch, 0cch, 0cch, 07eh, 000h
   206 0001589D 1C00CCCCCC7E00      <1>
   207 000158A4 00F800F8CCCCCC00FC- <1>     db  000h, 0f8h, 000h, 0f8h, 0cch, 0cch, 0cch, 000h, 0fch, 000h, 0cch, 0ech, 0fch, 0dch, 0cch, 000h
   207 000158AD 00CCECFCDCCC00      <1>
   208 000158B4 3C6C6C3E007E000038- <1>     db  03ch, 06ch, 06ch, 03eh, 000h, 07eh, 000h, 000h, 038h, 06ch, 06ch, 038h, 000h, 07ch, 000h, 000h
   208 000158BD 6C6C38007C0000      <1>
   209 000158C4 30003060C0CC780000- <1>     db  030h, 000h, 030h, 060h, 0c0h, 0cch, 078h, 000h, 000h, 000h, 000h, 0fch, 0c0h, 0c0h, 000h, 000h
   209 000158CD 0000FCC0C00000      <1>
   210 000158D4 000000FC0C0C0000C3- <1>     db  000h, 000h, 000h, 0fch, 00ch, 00ch, 000h, 000h, 0c3h, 0c6h, 0cch, 0deh, 033h, 066h, 0cch, 00fh
   210 000158DD C6CCDE3366CC0F      <1>
   211 000158E4 C3C6CCDB376FCF0318- <1>     db  0c3h, 0c6h, 0cch, 0dbh, 037h, 06fh, 0cfh, 003h, 018h, 018h, 000h, 018h, 018h, 018h, 018h, 000h
   211 000158ED 18001818181800      <1>
   212 000158F4 003366CC6633000000- <1>     db  000h, 033h, 066h, 0cch, 066h, 033h, 000h, 000h, 000h, 0cch, 066h, 033h, 066h, 0cch, 000h, 000h
   212 000158FD CC663366CC0000      <1>
   213 00015904 228822882288228855- <1>     db  022h, 088h, 022h, 088h, 022h, 088h, 022h, 088h, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah
   213 0001590D AA55AA55AA55AA      <1>
   214 00015914 DB77DBEEDB77DBEE18- <1>     db  0dbh, 077h, 0dbh, 0eeh, 0dbh, 077h, 0dbh, 0eeh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   214 0001591D 18181818181818      <1>
   215 00015924 18181818F818181818- <1>     db  018h, 018h, 018h, 018h, 0f8h, 018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 0f8h, 018h, 018h, 018h
   215 0001592D 18F818F8181818      <1>
   216 00015934 36363636F636363600- <1>     db  036h, 036h, 036h, 036h, 0f6h, 036h, 036h, 036h, 000h, 000h, 000h, 000h, 0feh, 036h, 036h, 036h
   216 0001593D 000000FE363636      <1>
   217 00015944 0000F818F818181836- <1>     db  000h, 000h, 0f8h, 018h, 0f8h, 018h, 018h, 018h, 036h, 036h, 0f6h, 006h, 0f6h, 036h, 036h, 036h
   217 0001594D 36F606F6363636      <1>
   218 00015954 363636363636363600- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h, 0feh, 006h, 0f6h, 036h, 036h, 036h
   218 0001595D 00FE06F6363636      <1>
   219 00015964 3636F606FE00000036- <1>     db  036h, 036h, 0f6h, 006h, 0feh, 000h, 000h, 000h, 036h, 036h, 036h, 036h, 0feh, 000h, 000h, 000h
   219 0001596D 363636FE000000      <1>
   220 00015974 1818F818F800000000- <1>     db  018h, 018h, 0f8h, 018h, 0f8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0f8h, 018h, 018h, 018h
   220 0001597D 000000F8181818      <1>
   221 00015984 181818181F00000018- <1>     db  018h, 018h, 018h, 018h, 01fh, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 0ffh, 000h, 000h, 000h
   221 0001598D 181818FF000000      <1>
   222 00015994 00000000FF18181818- <1>     db  000h, 000h, 000h, 000h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 01fh, 018h, 018h, 018h
   222 0001599D 1818181F181818      <1>
   223 000159A4 00000000FF00000018- <1>     db  000h, 000h, 000h, 000h, 0ffh, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 0ffh, 018h, 018h, 018h
   223 000159AD 181818FF181818      <1>
   224 000159B4 18181F181F18181836- <1>     db  018h, 018h, 01fh, 018h, 01fh, 018h, 018h, 018h, 036h, 036h, 036h, 036h, 037h, 036h, 036h, 036h
   224 000159BD 36363637363636      <1>
   225 000159C4 363637303F00000000- <1>     db  036h, 036h, 037h, 030h, 03fh, 000h, 000h, 000h, 000h, 000h, 03fh, 030h, 037h, 036h, 036h, 036h
   225 000159CD 003F3037363636      <1>
   226 000159D4 3636F700FF00000000- <1>     db  036h, 036h, 0f7h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0f7h, 036h, 036h, 036h
   226 000159DD 00FF00F7363636      <1>
   227 000159E4 363637303736363600- <1>     db  036h, 036h, 037h, 030h, 037h, 036h, 036h, 036h, 000h, 000h, 0ffh, 000h, 0ffh, 000h, 000h, 000h
   227 000159ED 00FF00FF000000      <1>
   228 000159F4 3636F700F736363618- <1>     db  036h, 036h, 0f7h, 000h, 0f7h, 036h, 036h, 036h, 018h, 018h, 0ffh, 000h, 0ffh, 000h, 000h, 000h
   228 000159FD 18FF00FF000000      <1>
   229 00015A04 36363636FF00000000- <1>     db  036h, 036h, 036h, 036h, 0ffh, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0ffh, 018h, 018h, 018h
   229 00015A0D 00FF00FF181818      <1>
   230 00015A14 00000000FF36363636- <1>     db  000h, 000h, 000h, 000h, 0ffh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 03fh, 000h, 000h, 000h
   230 00015A1D 3636363F000000      <1>
   231 00015A24 18181F181F00000000- <1>     db  018h, 018h, 01fh, 018h, 01fh, 000h, 000h, 000h, 000h, 000h, 01fh, 018h, 01fh, 018h, 018h, 018h
   231 00015A2D 001F181F181818      <1>
   232 00015A34 000000003F36363636- <1>     db  000h, 000h, 000h, 000h, 03fh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0ffh, 036h, 036h, 036h
   232 00015A3D 363636FF363636      <1>
   233 00015A44 1818FF18FF18181818- <1>     db  018h, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0f8h, 000h, 000h, 000h
   233 00015A4D 181818F8000000      <1>
   234 00015A54 000000001F181818FF- <1>     db  000h, 000h, 000h, 000h, 01fh, 018h, 018h, 018h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   234 00015A5D FFFFFFFFFFFFFF      <1>
   235 00015A64 00000000FFFFFFFFF0- <1>     db  000h, 000h, 000h, 000h, 0ffh, 0ffh, 0ffh, 0ffh, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h
   235 00015A6D F0F0F0F0F0F0F0      <1>
   236 00015A74 0F0F0F0F0F0F0F0FFF- <1>     db  00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h, 000h, 000h
   236 00015A7D FFFFFF00000000      <1>
   237 00015A84 000076DCC8DC760000- <1>     db  000h, 000h, 076h, 0dch, 0c8h, 0dch, 076h, 000h, 000h, 078h, 0cch, 0f8h, 0cch, 0f8h, 0c0h, 0c0h
   237 00015A8D 78CCF8CCF8C0C0      <1>
   238 00015A94 00FCCCC0C0C0C00000- <1>     db  000h, 0fch, 0cch, 0c0h, 0c0h, 0c0h, 0c0h, 000h, 000h, 0feh, 06ch, 06ch, 06ch, 06ch, 06ch, 000h
   238 00015A9D FE6C6C6C6C6C00      <1>
   239 00015AA4 FCCC603060CCFC0000- <1>     db  0fch, 0cch, 060h, 030h, 060h, 0cch, 0fch, 000h, 000h, 000h, 07eh, 0d8h, 0d8h, 0d8h, 070h, 000h
   239 00015AAD 007ED8D8D87000      <1>
   240 00015AB4 00666666667C60C000- <1>     db  000h, 066h, 066h, 066h, 066h, 07ch, 060h, 0c0h, 000h, 076h, 0dch, 018h, 018h, 018h, 018h, 000h
   240 00015ABD 76DC1818181800      <1>
   241 00015AC4 FC3078CCCC7830FC38- <1>     db  0fch, 030h, 078h, 0cch, 0cch, 078h, 030h, 0fch, 038h, 06ch, 0c6h, 0feh, 0c6h, 06ch, 038h, 000h
   241 00015ACD 6CC6FEC66C3800      <1>
   242 00015AD4 386CC6C66C6CEE001C- <1>     db  038h, 06ch, 0c6h, 0c6h, 06ch, 06ch, 0eeh, 000h, 01ch, 030h, 018h, 07ch, 0cch, 0cch, 078h, 000h
   242 00015ADD 30187CCCCC7800      <1>
   243 00015AE4 00007EDBDB7E000006- <1>     db  000h, 000h, 07eh, 0dbh, 0dbh, 07eh, 000h, 000h, 006h, 00ch, 07eh, 0dbh, 0dbh, 07eh, 060h, 0c0h
   243 00015AED 0C7EDBDB7E60C0      <1>
   244 00015AF4 3860C0F8C060380078- <1>     db  038h, 060h, 0c0h, 0f8h, 0c0h, 060h, 038h, 000h, 078h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 000h
   244 00015AFD CCCCCCCCCCCC00      <1>
   245 00015B04 00FC00FC00FC000030- <1>     db  000h, 0fch, 000h, 0fch, 000h, 0fch, 000h, 000h, 030h, 030h, 0fch, 030h, 030h, 000h, 0fch, 000h
   245 00015B0D 30FC303000FC00      <1>
   246 00015B14 603018306000FC0018- <1>     db  060h, 030h, 018h, 030h, 060h, 000h, 0fch, 000h, 018h, 030h, 060h, 030h, 018h, 000h, 0fch, 000h
   246 00015B1D 3060301800FC00      <1>
   247 00015B24 0E1B1B181818181818- <1>     db  00eh, 01bh, 01bh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0d8h, 0d8h, 070h
   247 00015B2D 18181818D8D870      <1>
   248 00015B34 303000FC0030300000- <1>     db  030h, 030h, 000h, 0fch, 000h, 030h, 030h, 000h, 000h, 076h, 0dch, 000h, 076h, 0dch, 000h, 000h
   248 00015B3D 76DC0076DC0000      <1>
   249 00015B44 386C6C380000000000- <1>     db  038h, 06ch, 06ch, 038h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h
   249 00015B4D 00001818000000      <1>
   250 00015B54 00000000180000000F- <1>     db  000h, 000h, 000h, 000h, 018h, 000h, 000h, 000h, 00fh, 00ch, 00ch, 00ch, 0ech, 06ch, 03ch, 01ch
   250 00015B5D 0C0C0CEC6C3C1C      <1>
   251 00015B64 786C6C6C6C00000070- <1>     db  078h, 06ch, 06ch, 06ch, 06ch, 000h, 000h, 000h, 070h, 018h, 030h, 060h, 078h, 000h, 000h, 000h
   251 00015B6D 18306078000000      <1>
   252 00015B74 00003C3C3C3C000000- <1>     db  000h, 000h, 03ch, 03ch, 03ch, 03ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   252 00015B7D 00000000000000      <1>
   253                              <1> vgafont14:
   254 00015B84 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   254 00015B8D 00000000000000      <1>
   255 00015B94 7E81A58181BD99817E- <1>     db  07eh, 081h, 0a5h, 081h, 081h, 0bdh, 099h, 081h, 07eh, 000h, 000h, 000h, 000h, 000h, 07eh, 0ffh
   255 00015B9D 00000000007EFF      <1>
   256 00015BA4 DBFFFFC3E7FF7E0000- <1>     db  0dbh, 0ffh, 0ffh, 0c3h, 0e7h, 0ffh, 07eh, 000h, 000h, 000h, 000h, 000h, 000h, 06ch, 0feh, 0feh
   256 00015BAD 000000006CFEFE      <1>
   257 00015BB4 FEFE7C381000000000- <1>     db  0feh, 0feh, 07ch, 038h, 010h, 000h, 000h, 000h, 000h, 000h, 000h, 010h, 038h, 07ch, 0feh, 07ch
   257 00015BBD 000010387CFE7C      <1>
   258 00015BC4 381000000000000018- <1>     db  038h, 010h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 03ch, 03ch, 0e7h, 0e7h, 0e7h, 018h, 018h
   258 00015BCD 3C3CE7E7E71818      <1>
   259 00015BD4 3C0000000000183C7E- <1>     db  03ch, 000h, 000h, 000h, 000h, 000h, 018h, 03ch, 07eh, 0ffh, 0ffh, 07eh, 018h, 018h, 03ch, 000h
   259 00015BDD FFFF7E18183C00      <1>
   260 00015BE4 00000000000000183C- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 03ch, 03ch, 018h, 000h, 000h, 000h, 000h, 000h
   260 00015BED 3C180000000000      <1>
   261 00015BF4 FFFFFFFFFFE7C3C3E7- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0e7h, 0c3h, 0c3h, 0e7h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h
   261 00015BFD FFFFFFFFFF0000      <1>
   262 00015C04 00003C664242663C00- <1>     db  000h, 000h, 03ch, 066h, 042h, 042h, 066h, 03ch, 000h, 000h, 000h, 000h, 0ffh, 0ffh, 0ffh, 0ffh
   262 00015C0D 000000FFFFFFFF      <1>
   263 00015C14 C399BDBD99C3FFFFFF- <1>     db  0c3h, 099h, 0bdh, 0bdh, 099h, 0c3h, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h, 01eh, 00eh, 01ah, 032h
   263 00015C1D FF00001E0E1A32      <1>
   264 00015C24 78CCCCCC7800000000- <1>     db  078h, 0cch, 0cch, 0cch, 078h, 000h, 000h, 000h, 000h, 000h, 03ch, 066h, 066h, 066h, 03ch, 018h
   264 00015C2D 003C6666663C18      <1>
   265 00015C34 7E181800000000003F- <1>     db  07eh, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 03fh, 033h, 03fh, 030h, 030h, 030h, 070h, 0f0h
   265 00015C3D 333F30303070F0      <1>
   266 00015C44 E000000000007F637F- <1>     db  0e0h, 000h, 000h, 000h, 000h, 000h, 07fh, 063h, 07fh, 063h, 063h, 063h, 067h, 0e7h, 0e6h, 0c0h
   266 00015C4D 63636367E7E6C0      <1>
   267 00015C54 000000001818DB3CE7- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 0dbh, 03ch, 0e7h, 03ch, 0dbh, 018h, 018h, 000h, 000h, 000h
   267 00015C5D 3CDB1818000000      <1>
   268 00015C64 000080C0E0F8FEF8E0- <1>     db  000h, 000h, 080h, 0c0h, 0e0h, 0f8h, 0feh, 0f8h, 0e0h, 0c0h, 080h, 000h, 000h, 000h, 000h, 000h
   268 00015C6D C0800000000000      <1>
   269 00015C74 02060E3EFE3E0E0602- <1>     db  002h, 006h, 00eh, 03eh, 0feh, 03eh, 00eh, 006h, 002h, 000h, 000h, 000h, 000h, 000h, 018h, 03ch
   269 00015C7D 0000000000183C      <1>
   270 00015C84 7E1818187E3C180000- <1>     db  07eh, 018h, 018h, 018h, 07eh, 03ch, 018h, 000h, 000h, 000h, 000h, 000h, 066h, 066h, 066h, 066h
   270 00015C8D 00000066666666      <1>
   271 00015C94 666600666600000000- <1>     db  066h, 066h, 000h, 066h, 066h, 000h, 000h, 000h, 000h, 000h, 07fh, 0dbh, 0dbh, 0dbh, 07bh, 01bh
   271 00015C9D 007FDBDBDB7B1B      <1>
   272 00015CA4 1B1B1B000000007CC6- <1>     db  01bh, 01bh, 01bh, 000h, 000h, 000h, 000h, 07ch, 0c6h, 060h, 038h, 06ch, 0c6h, 0c6h, 06ch, 038h
   272 00015CAD 60386CC6C66C38      <1>
   273 00015CB4 0CC67C000000000000- <1>     db  00ch, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 0feh, 0feh, 000h
   273 00015CBD 000000FEFEFE00      <1>
   274 00015CC4 00000000183C7E1818- <1>     db  000h, 000h, 000h, 000h, 018h, 03ch, 07eh, 018h, 018h, 018h, 07eh, 03ch, 018h, 07eh, 000h, 000h
   274 00015CCD 187E3C187E0000      <1>
   275 00015CD4 0000183C7E18181818- <1>     db  000h, 000h, 018h, 03ch, 07eh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h, 000h
   275 00015CDD 18180000000000      <1>
   276 00015CE4 1818181818187E3C18- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 07eh, 03ch, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   276 00015CED 00000000000000      <1>
   277 00015CF4 180CFE0C1800000000- <1>     db  018h, 00ch, 0feh, 00ch, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 030h, 060h
   277 00015CFD 00000000003060      <1>
   278 00015D04 FE6030000000000000- <1>     db  0feh, 060h, 030h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0c0h, 0c0h, 0c0h
   278 00015D0D 00000000C0C0C0      <1>
   279 00015D14 FE0000000000000000- <1>     db  0feh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 028h, 06ch, 0feh, 06ch, 028h, 000h
   279 00015D1D 00286CFE6C2800      <1>
   280 00015D24 000000000000001038- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 010h, 038h, 038h, 07ch, 07ch, 0feh, 0feh, 000h, 000h
   280 00015D2D 387C7CFEFE0000      <1>
   281 00015D34 0000000000FEFE7C7C- <1>     db  000h, 000h, 000h, 000h, 000h, 0feh, 0feh, 07ch, 07ch, 038h, 038h, 010h, 000h, 000h, 000h, 000h
   281 00015D3D 38381000000000      <1>
   282 00015D44 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   282 00015D4D 00000000000000      <1>
   283 00015D54 183C3C3C1818001818- <1>     db  018h, 03ch, 03ch, 03ch, 018h, 018h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 066h, 066h, 066h
   283 00015D5D 00000000666666      <1>
   284 00015D64 240000000000000000- <1>     db  024h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 06ch, 06ch, 0feh, 06ch
   284 00015D6D 0000006C6CFE6C      <1>
   285 00015D74 6C6CFE6C6C00000018- <1>     db  06ch, 06ch, 0feh, 06ch, 06ch, 000h, 000h, 000h, 018h, 018h, 07ch, 0c6h, 0c2h, 0c0h, 07ch, 006h
   285 00015D7D 187CC6C2C07C06      <1>
   286 00015D84 86C67C181800000000- <1>     db  086h, 0c6h, 07ch, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 0c2h, 0c6h, 00ch, 018h, 030h, 066h
   286 00015D8D 00C2C60C183066      <1>
   287 00015D94 C60000000000386C6C- <1>     db  0c6h, 000h, 000h, 000h, 000h, 000h, 038h, 06ch, 06ch, 038h, 076h, 0dch, 0cch, 0cch, 076h, 000h
   287 00015D9D 3876DCCCCC7600      <1>
   288 00015DA4 000000303030600000- <1>     db  000h, 000h, 000h, 030h, 030h, 030h, 060h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   288 00015DAD 00000000000000      <1>
   289 00015DB4 00000C183030303030- <1>     db  000h, 000h, 00ch, 018h, 030h, 030h, 030h, 030h, 030h, 018h, 00ch, 000h, 000h, 000h, 000h, 000h
   289 00015DBD 180C0000000000      <1>
   290 00015DC4 30180C0C0C0C0C1830- <1>     db  030h, 018h, 00ch, 00ch, 00ch, 00ch, 00ch, 018h, 030h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   290 00015DCD 00000000000000      <1>
   291 00015DD4 663CFF3C6600000000- <1>     db  066h, 03ch, 0ffh, 03ch, 066h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h
   291 00015DDD 00000000001818      <1>
   292 00015DE4 7E1818000000000000- <1>     db  07eh, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   292 00015DED 00000000000000      <1>
   293 00015DF4 181818300000000000- <1>     db  018h, 018h, 018h, 030h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 000h, 000h, 000h
   293 00015DFD 000000FE000000      <1>
   294 00015E04 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h
   294 00015E0D 00000000181800      <1>
   295 00015E14 0000000002060C1830- <1>     db  000h, 000h, 000h, 000h, 002h, 006h, 00ch, 018h, 030h, 060h, 0c0h, 080h, 000h, 000h, 000h, 000h
   295 00015E1D 60C08000000000      <1>
   296 00015E24 00007CC6CEDEF6E6C6- <1>     db  000h, 000h, 07ch, 0c6h, 0ceh, 0deh, 0f6h, 0e6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h
   296 00015E2D C67C0000000000      <1>
   297 00015E34 18387818181818187E- <1>     db  018h, 038h, 078h, 018h, 018h, 018h, 018h, 018h, 07eh, 000h, 000h, 000h, 000h, 000h, 07ch, 0c6h
   297 00015E3D 00000000007CC6      <1>
   298 00015E44 060C183060C6FE0000- <1>     db  006h, 00ch, 018h, 030h, 060h, 0c6h, 0feh, 000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 006h, 006h
   298 00015E4D 0000007CC60606      <1>
   299 00015E54 3C0606C67C00000000- <1>     db  03ch, 006h, 006h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 00ch, 01ch, 03ch, 06ch, 0cch, 0feh
   299 00015E5D 000C1C3C6CCCFE      <1>
   300 00015E64 0C0C1E0000000000FE- <1>     db  00ch, 00ch, 01eh, 000h, 000h, 000h, 000h, 000h, 0feh, 0c0h, 0c0h, 0c0h, 0fch, 006h, 006h, 0c6h
   300 00015E6D C0C0C0FC0606C6      <1>
   301 00015E74 7C00000000003860C0- <1>     db  07ch, 000h, 000h, 000h, 000h, 000h, 038h, 060h, 0c0h, 0c0h, 0fch, 0c6h, 0c6h, 0c6h, 07ch, 000h
   301 00015E7D C0FCC6C6C67C00      <1>
   302 00015E84 00000000FEC6060C18- <1>     db  000h, 000h, 000h, 000h, 0feh, 0c6h, 006h, 00ch, 018h, 030h, 030h, 030h, 030h, 000h, 000h, 000h
   302 00015E8D 30303030000000      <1>
   303 00015E94 00007CC6C6C67CC6C6- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 07ch, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h
   303 00015E9D C67C0000000000      <1>
   304 00015EA4 7CC6C6C67E06060C78- <1>     db  07ch, 0c6h, 0c6h, 0c6h, 07eh, 006h, 006h, 00ch, 078h, 000h, 000h, 000h, 000h, 000h, 000h, 018h
   304 00015EAD 00000000000018      <1>
   305 00015EB4 180000001818000000- <1>     db  018h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h
   305 00015EBD 00000000181800      <1>
   306 00015EC4 000018183000000000- <1>     db  000h, 000h, 018h, 018h, 030h, 000h, 000h, 000h, 000h, 000h, 006h, 00ch, 018h, 030h, 060h, 030h
   306 00015ECD 00060C18306030      <1>
   307 00015ED4 180C06000000000000- <1>     db  018h, 00ch, 006h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07eh, 000h, 000h, 07eh, 000h
   307 00015EDD 00007E00007E00      <1>
   308 00015EE4 000000000000603018- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 060h, 030h, 018h, 00ch, 006h, 00ch, 018h, 030h, 060h, 000h
   308 00015EED 0C060C18306000      <1>
   309 00015EF4 000000007CC6C60C18- <1>     db  000h, 000h, 000h, 000h, 07ch, 0c6h, 0c6h, 00ch, 018h, 018h, 000h, 018h, 018h, 000h, 000h, 000h
   309 00015EFD 18001818000000      <1>
   310 00015F04 00007CC6C6DEDEDEDC- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0deh, 0deh, 0deh, 0dch, 0c0h, 07ch, 000h, 000h, 000h, 000h, 000h
   310 00015F0D C07C0000000000      <1>
   311 00015F14 10386CC6C6FEC6C6C6- <1>     db  010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h, 000h, 0fch, 066h
   311 00015F1D 0000000000FC66      <1>
   312 00015F24 66667C666666FC0000- <1>     db  066h, 066h, 07ch, 066h, 066h, 066h, 0fch, 000h, 000h, 000h, 000h, 000h, 03ch, 066h, 0c2h, 0c0h
   312 00015F2D 0000003C66C2C0      <1>
   313 00015F34 C0C0C2663C00000000- <1>     db  0c0h, 0c0h, 0c2h, 066h, 03ch, 000h, 000h, 000h, 000h, 000h, 0f8h, 06ch, 066h, 066h, 066h, 066h
   313 00015F3D 00F86C66666666      <1>
   314 00015F44 666CF80000000000FE- <1>     db  066h, 06ch, 0f8h, 000h, 000h, 000h, 000h, 000h, 0feh, 066h, 062h, 068h, 078h, 068h, 062h, 066h
   314 00015F4D 66626878686266      <1>
   315 00015F54 FE0000000000FE6662- <1>     db  0feh, 000h, 000h, 000h, 000h, 000h, 0feh, 066h, 062h, 068h, 078h, 068h, 060h, 060h, 0f0h, 000h
   315 00015F5D 6878686060F000      <1>
   316 00015F64 000000003C66C2C0C0- <1>     db  000h, 000h, 000h, 000h, 03ch, 066h, 0c2h, 0c0h, 0c0h, 0deh, 0c6h, 066h, 03ah, 000h, 000h, 000h
   316 00015F6D DEC6663A000000      <1>
   317 00015F74 0000C6C6C6C6FEC6C6- <1>     db  000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h, 000h
   317 00015F7D C6C60000000000      <1>
   318 00015F84 3C181818181818183C- <1>     db  03ch, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 000h, 01eh, 00ch
   318 00015F8D 00000000001E0C      <1>
   319 00015F94 0C0C0C0CCCCC780000- <1>     db  00ch, 00ch, 00ch, 00ch, 0cch, 0cch, 078h, 000h, 000h, 000h, 000h, 000h, 0e6h, 066h, 06ch, 06ch
   319 00015F9D 000000E6666C6C      <1>
   320 00015FA4 786C6C66E600000000- <1>     db  078h, 06ch, 06ch, 066h, 0e6h, 000h, 000h, 000h, 000h, 000h, 0f0h, 060h, 060h, 060h, 060h, 060h
   320 00015FAD 00F06060606060      <1>
   321 00015FB4 6266FE0000000000C6- <1>     db  062h, 066h, 0feh, 000h, 000h, 000h, 000h, 000h, 0c6h, 0eeh, 0feh, 0feh, 0d6h, 0c6h, 0c6h, 0c6h
   321 00015FBD EEFEFED6C6C6C6      <1>
   322 00015FC4 C60000000000C6E6F6- <1>     db  0c6h, 000h, 000h, 000h, 000h, 000h, 0c6h, 0e6h, 0f6h, 0feh, 0deh, 0ceh, 0c6h, 0c6h, 0c6h, 000h
   322 00015FCD FEDECEC6C6C600      <1>
   323 00015FD4 00000000386CC6C6C6- <1>     db  000h, 000h, 000h, 000h, 038h, 06ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 06ch, 038h, 000h, 000h, 000h
   323 00015FDD C6C66C38000000      <1>
   324 00015FE4 0000FC6666667C6060- <1>     db  000h, 000h, 0fch, 066h, 066h, 066h, 07ch, 060h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h, 000h
   324 00015FED 60F00000000000      <1>
   325 00015FF4 7CC6C6C6C6D6DE7C0C- <1>     db  07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0d6h, 0deh, 07ch, 00ch, 00eh, 000h, 000h, 000h, 000h, 0fch, 066h
   325 00015FFD 0E00000000FC66      <1>
   326 00016004 66667C6C6666E60000- <1>     db  066h, 066h, 07ch, 06ch, 066h, 066h, 0e6h, 000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0c6h, 060h
   326 0001600D 0000007CC6C660      <1>
   327 00016014 380CC6C67C00000000- <1>     db  038h, 00ch, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 07eh, 07eh, 05ah, 018h, 018h, 018h
   327 0001601D 007E7E5A181818      <1>
   328 00016024 18183C0000000000C6- <1>     db  018h, 018h, 03ch, 000h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h
   328 0001602D C6C6C6C6C6C6C6      <1>
   329 00016034 7C0000000000C6C6C6- <1>     db  07ch, 000h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 06ch, 038h, 010h, 000h
   329 0001603D C6C6C66C381000      <1>
   330 00016044 00000000C6C6C6C6D6- <1>     db  000h, 000h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0d6h, 0d6h, 0feh, 07ch, 06ch, 000h, 000h, 000h
   330 0001604D D6FE7C6C000000      <1>
   331 00016054 0000C6C66C3838386C- <1>     db  000h, 000h, 0c6h, 0c6h, 06ch, 038h, 038h, 038h, 06ch, 0c6h, 0c6h, 000h, 000h, 000h, 000h, 000h
   331 0001605D C6C60000000000      <1>
   332 00016064 666666663C1818183C- <1>     db  066h, 066h, 066h, 066h, 03ch, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 000h, 0feh, 0c6h
   332 0001606D 0000000000FEC6      <1>
   333 00016074 8C183060C2C6FE0000- <1>     db  08ch, 018h, 030h, 060h, 0c2h, 0c6h, 0feh, 000h, 000h, 000h, 000h, 000h, 03ch, 030h, 030h, 030h
   333 0001607D 0000003C303030      <1>
   334 00016084 303030303C00000000- <1>     db  030h, 030h, 030h, 030h, 03ch, 000h, 000h, 000h, 000h, 000h, 080h, 0c0h, 0e0h, 070h, 038h, 01ch
   334 0001608D 0080C0E070381C      <1>
   335 00016094 0E060200000000003C- <1>     db  00eh, 006h, 002h, 000h, 000h, 000h, 000h, 000h, 03ch, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch
   335 0001609D 0C0C0C0C0C0C0C      <1>
   336 000160A4 3C00000010386CC600- <1>     db  03ch, 000h, 000h, 000h, 010h, 038h, 06ch, 0c6h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   336 000160AD 00000000000000      <1>
   337 000160B4 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h
   337 000160BD 0000000000FF00      <1>
   338 000160C4 303018000000000000- <1>     db  030h, 030h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   338 000160CD 00000000000000      <1>
   339 000160D4 000000780C7CCCCC76- <1>     db  000h, 000h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 000h, 0e0h, 060h
   339 000160DD 0000000000E060      <1>
   340 000160E4 60786C6666667C0000- <1>     db  060h, 078h, 06ch, 066h, 066h, 066h, 07ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07ch
   340 000160ED 0000000000007C      <1>
   341 000160F4 C6C0C0C67C00000000- <1>     db  0c6h, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 01ch, 00ch, 00ch, 03ch, 06ch, 0cch
   341 000160FD 001C0C0C3C6CCC      <1>
   342 00016104 CCCC76000000000000- <1>     db  0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c6h
   342 0001610D 00007CC6FEC0C6      <1>
   343 00016114 7C0000000000386C64- <1>     db  07ch, 000h, 000h, 000h, 000h, 000h, 038h, 06ch, 064h, 060h, 0f0h, 060h, 060h, 060h, 0f0h, 000h
   343 0001611D 60F0606060F000      <1>
   344 00016124 0000000000000076CC- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 076h, 0cch, 0cch, 0cch, 07ch, 00ch, 0cch, 078h, 000h
   344 0001612D CCCC7C0CCC7800      <1>
   345 00016134 0000E060606C766666- <1>     db  000h, 000h, 0e0h, 060h, 060h, 06ch, 076h, 066h, 066h, 066h, 0e6h, 000h, 000h, 000h, 000h, 000h
   345 0001613D 66E60000000000      <1>
   346 00016144 18180038181818183C- <1>     db  018h, 018h, 000h, 038h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 000h, 006h, 006h
   346 0001614D 00000000000606      <1>
   347 00016154 000E0606060666663C- <1>     db  000h, 00eh, 006h, 006h, 006h, 006h, 066h, 066h, 03ch, 000h, 000h, 000h, 0e0h, 060h, 060h, 066h
   347 0001615D 000000E0606066      <1>
   348 00016164 6C786C66E600000000- <1>     db  06ch, 078h, 06ch, 066h, 0e6h, 000h, 000h, 000h, 000h, 000h, 038h, 018h, 018h, 018h, 018h, 018h
   348 0001616D 00381818181818      <1>
   349 00016174 18183C000000000000- <1>     db  018h, 018h, 03ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ech, 0feh, 0d6h, 0d6h, 0d6h
   349 0001617D 0000ECFED6D6D6      <1>
   350 00016184 C60000000000000000- <1>     db  0c6h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0dch, 066h, 066h, 066h, 066h, 066h, 000h
   350 0001618D DC666666666600      <1>
   351 00016194 000000000000007CC6- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h
   351 0001619D C6C6C67C000000      <1>
   352 000161A4 0000000000DC666666- <1>     db  000h, 000h, 000h, 000h, 000h, 0dch, 066h, 066h, 066h, 07ch, 060h, 060h, 0f0h, 000h, 000h, 000h
   352 000161AD 7C6060F0000000      <1>
   353 000161B4 00000076CCCCCC7C0C- <1>     db  000h, 000h, 000h, 076h, 0cch, 0cch, 0cch, 07ch, 00ch, 00ch, 01eh, 000h, 000h, 000h, 000h, 000h
   353 000161BD 0C1E0000000000      <1>
   354 000161C4 00DC76666060F00000- <1>     db  000h, 0dch, 076h, 066h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07ch
   354 000161CD 0000000000007C      <1>
   355 000161D4 C6701CC67C00000000- <1>     db  0c6h, 070h, 01ch, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 010h, 030h, 030h, 0fch, 030h, 030h
   355 000161DD 00103030FC3030      <1>
   356 000161E4 30361C000000000000- <1>     db  030h, 036h, 01ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch
   356 000161ED 0000CCCCCCCCCC      <1>
   357 000161F4 760000000000000000- <1>     db  076h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 066h, 066h, 066h, 066h, 03ch, 018h, 000h
   357 000161FD 666666663C1800      <1>
   358 00016204 00000000000000C6C6- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 0d6h, 0d6h, 0feh, 06ch, 000h, 000h, 000h
   358 0001620D D6D6FE6C000000      <1>
   359 00016214 0000000000C66C3838- <1>     db  000h, 000h, 000h, 000h, 000h, 0c6h, 06ch, 038h, 038h, 06ch, 0c6h, 000h, 000h, 000h, 000h, 000h
   359 0001621D 6CC60000000000      <1>
   360 00016224 000000C6C6C6C67E06- <1>     db  000h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 07eh, 006h, 00ch, 0f8h, 000h, 000h, 000h, 000h, 000h
   360 0001622D 0CF80000000000      <1>
   361 00016234 00FECC183066FE0000- <1>     db  000h, 0feh, 0cch, 018h, 030h, 066h, 0feh, 000h, 000h, 000h, 000h, 000h, 00eh, 018h, 018h, 018h
   361 0001623D 0000000E181818      <1>
   362 00016244 701818180E00000000- <1>     db  070h, 018h, 018h, 018h, 00eh, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 000h, 018h
   362 0001624D 00181818180018      <1>
   363 00016254 181818000000000070- <1>     db  018h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 070h, 018h, 018h, 018h, 00eh, 018h, 018h, 018h
   363 0001625D 1818180E181818      <1>
   364 00016264 70000000000076DC00- <1>     db  070h, 000h, 000h, 000h, 000h, 000h, 076h, 0dch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   364 0001626D 00000000000000      <1>
   365 00016274 00000000000010386C- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 000h, 000h, 000h, 000h
   365 0001627D C6C6FE00000000      <1>
   366 00016284 00003C66C2C0C0C266- <1>     db  000h, 000h, 03ch, 066h, 0c2h, 0c0h, 0c0h, 0c2h, 066h, 03ch, 00ch, 006h, 07ch, 000h, 000h, 000h
   366 0001628D 3C0C067C000000      <1>
   367 00016294 CCCC00CCCCCCCCCC76- <1>     db  0cch, 0cch, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 00ch, 018h, 030h
   367 0001629D 000000000C1830      <1>
   368 000162A4 007CC6FEC0C67C0000- <1>     db  000h, 07ch, 0c6h, 0feh, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 010h, 038h, 06ch, 000h, 078h
   368 000162AD 000010386C0078      <1>
   369 000162B4 0C7CCCCC7600000000- <1>     db  00ch, 07ch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 000h, 0cch, 0cch, 000h, 078h, 00ch, 07ch
   369 000162BD 00CCCC00780C7C      <1>
   370 000162C4 CCCC76000000006030- <1>     db  0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 060h, 030h, 018h, 000h, 078h, 00ch, 07ch, 0cch, 0cch
   370 000162CD 1800780C7CCCCC      <1>
   371 000162D4 7600000000386C3800- <1>     db  076h, 000h, 000h, 000h, 000h, 038h, 06ch, 038h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 076h, 000h
   371 000162DD 780C7CCCCC7600      <1>
   372 000162E4 0000000000003C6660- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 03ch, 066h, 060h, 066h, 03ch, 00ch, 006h, 03ch, 000h, 000h
   372 000162ED 663C0C063C0000      <1>
   373 000162F4 0010386C007CC6FEC0- <1>     db  000h, 010h, 038h, 06ch, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h
   373 000162FD C67C0000000000      <1>
   374 00016304 CCCC007CC6FEC0C67C- <1>     db  0cch, 0cch, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 060h, 030h, 018h
   374 0001630D 00000000603018      <1>
   375 00016314 007CC6FEC0C67C0000- <1>     db  000h, 07ch, 0c6h, 0feh, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 066h, 066h, 000h, 038h
   375 0001631D 00000066660038      <1>
   376 00016324 181818183C00000000- <1>     db  018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 018h, 03ch, 066h, 000h, 038h, 018h, 018h
   376 0001632D 183C6600381818      <1>
   377 00016334 18183C000000006030- <1>     db  018h, 018h, 03ch, 000h, 000h, 000h, 000h, 060h, 030h, 018h, 000h, 038h, 018h, 018h, 018h, 018h
   377 0001633D 18003818181818      <1>
   378 00016344 3C00000000C6C61038- <1>     db  03ch, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 000h
   378 0001634D 6CC6C6FEC6C600      <1>
   379 00016354 0000386C3800386CC6- <1>     db  000h, 000h, 038h, 06ch, 038h, 000h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 000h, 000h, 000h
   379 0001635D C6FEC6C6000000      <1>
   380 00016364 18306000FE66607C60- <1>     db  018h, 030h, 060h, 000h, 0feh, 066h, 060h, 07ch, 060h, 066h, 0feh, 000h, 000h, 000h, 000h, 000h
   380 0001636D 66FE0000000000      <1>
   381 00016374 0000CC76367ED8D86E- <1>     db  000h, 000h, 0cch, 076h, 036h, 07eh, 0d8h, 0d8h, 06eh, 000h, 000h, 000h, 000h, 000h, 03eh, 06ch
   381 0001637D 00000000003E6C      <1>
   382 00016384 CCCCFECCCCCCCE0000- <1>     db  0cch, 0cch, 0feh, 0cch, 0cch, 0cch, 0ceh, 000h, 000h, 000h, 000h, 010h, 038h, 06ch, 000h, 07ch
   382 0001638D 000010386C007C      <1>
   383 00016394 C6C6C6C67C00000000- <1>     db  0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 000h, 07ch, 0c6h, 0c6h
   383 0001639D 00C6C6007CC6C6      <1>
   384 000163A4 C6C67C000000006030- <1>     db  0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 060h, 030h, 018h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h
   384 000163AD 18007CC6C6C6C6      <1>
   385 000163B4 7C000000003078CC00- <1>     db  07ch, 000h, 000h, 000h, 000h, 030h, 078h, 0cch, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h
   385 000163BD CCCCCCCCCC7600      <1>
   386 000163C4 00000060301800CCCC- <1>     db  000h, 000h, 000h, 060h, 030h, 018h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h
   386 000163CD CCCCCC76000000      <1>
   387 000163D4 0000C6C600C6C6C6C6- <1>     db  000h, 000h, 0c6h, 0c6h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 07eh, 006h, 00ch, 078h, 000h, 000h, 0c6h
   387 000163DD 7E060C780000C6      <1>
   388 000163E4 C6386CC6C6C6C66C38- <1>     db  0c6h, 038h, 06ch, 0c6h, 0c6h, 0c6h, 0c6h, 06ch, 038h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 000h
   388 000163ED 00000000C6C600      <1>
   389 000163F4 C6C6C6C6C6C67C0000- <1>     db  0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 018h, 018h, 03ch, 066h, 060h
   389 000163FD 000018183C6660      <1>
   390 00016404 60663C181800000000- <1>     db  060h, 066h, 03ch, 018h, 018h, 000h, 000h, 000h, 000h, 038h, 06ch, 064h, 060h, 0f0h, 060h, 060h
   390 0001640D 386C6460F06060      <1>
   391 00016414 60E6FC000000000066- <1>     db  060h, 0e6h, 0fch, 000h, 000h, 000h, 000h, 000h, 066h, 066h, 03ch, 018h, 07eh, 018h, 07eh, 018h
   391 0001641D 663C187E187E18      <1>
   392 00016424 1800000000F8CCCCF8- <1>     db  018h, 000h, 000h, 000h, 000h, 0f8h, 0cch, 0cch, 0f8h, 0c4h, 0cch, 0deh, 0cch, 0cch, 0c6h, 000h
   392 0001642D C4CCDECCCCC600      <1>
   393 00016434 0000000E1B1818187E- <1>     db  000h, 000h, 000h, 00eh, 01bh, 018h, 018h, 018h, 07eh, 018h, 018h, 018h, 018h, 0d8h, 070h, 000h
   393 0001643D 18181818D87000      <1>
   394 00016444 0018306000780C7CCC- <1>     db  000h, 018h, 030h, 060h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 00ch
   394 0001644D CC76000000000C      <1>
   395 00016454 18300038181818183C- <1>     db  018h, 030h, 000h, 038h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 018h, 030h, 060h
   395 0001645D 00000000183060      <1>
   396 00016464 007CC6C6C6C67C0000- <1>     db  000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 018h, 030h, 060h, 000h, 0cch
   396 0001646D 000018306000CC      <1>
   397 00016474 CCCCCCCC7600000000- <1>     db  0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 000h, 076h, 0dch, 000h, 0dch, 066h, 066h
   397 0001647D 0076DC00DC6666      <1>
   398 00016484 66666600000076DC00- <1>     db  066h, 066h, 066h, 000h, 000h, 000h, 076h, 0dch, 000h, 0c6h, 0e6h, 0f6h, 0feh, 0deh, 0ceh, 0c6h
   398 0001648D C6E6F6FEDECEC6      <1>
   399 00016494 C6000000003C6C6C3E- <1>     db  0c6h, 000h, 000h, 000h, 000h, 03ch, 06ch, 06ch, 03eh, 000h, 07eh, 000h, 000h, 000h, 000h, 000h
   399 0001649D 007E0000000000      <1>
   400 000164A4 000000386C6C38007C- <1>     db  000h, 000h, 000h, 038h, 06ch, 06ch, 038h, 000h, 07ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   400 000164AD 00000000000000      <1>
   401 000164B4 0000303000303060C6- <1>     db  000h, 000h, 030h, 030h, 000h, 030h, 030h, 060h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h
   401 000164BD C67C0000000000      <1>
   402 000164C4 00000000FEC0C0C000- <1>     db  000h, 000h, 000h, 000h, 0feh, 0c0h, 0c0h, 0c0h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   402 000164CD 00000000000000      <1>
   403 000164D4 0000FE060606000000- <1>     db  000h, 000h, 0feh, 006h, 006h, 006h, 000h, 000h, 000h, 000h, 000h, 0c0h, 0c0h, 0c6h, 0cch, 0d8h
   403 000164DD 0000C0C0C6CCD8      <1>
   404 000164E4 3060DC860C183E0000- <1>     db  030h, 060h, 0dch, 086h, 00ch, 018h, 03eh, 000h, 000h, 0c0h, 0c0h, 0c6h, 0cch, 0d8h, 030h, 066h
   404 000164ED C0C0C6CCD83066      <1>
   405 000164F4 CE9E3E060600000018- <1>     db  0ceh, 09eh, 03eh, 006h, 006h, 000h, 000h, 000h, 018h, 018h, 000h, 018h, 018h, 03ch, 03ch, 03ch
   405 000164FD 180018183C3C3C      <1>
   406 00016504 180000000000000036- <1>     db  018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 036h, 06ch, 0d8h, 06ch, 036h, 000h, 000h, 000h
   406 0001650D 6CD86C36000000      <1>
   407 00016514 000000000000D86C36- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 0d8h, 06ch, 036h, 06ch, 0d8h, 000h, 000h, 000h, 000h, 000h
   407 0001651D 6CD80000000000      <1>
   408 00016524 114411441144114411- <1>     db  011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 055h, 0aah
   408 0001652D 441144114455AA      <1>
   409 00016534 55AA55AA55AA55AA55- <1>     db  055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 0ddh, 077h, 0ddh, 077h
   409 0001653D AA55AADD77DD77      <1>
   410 00016544 DD77DD77DD77DD77DD- <1>     db  0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 018h, 018h, 018h, 018h, 018h, 018h
   410 0001654D 77181818181818      <1>
   411 00016554 181818181818181818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0f8h
   411 0001655D 181818181818F8      <1>
   412 00016564 181818181818181818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 0f8h, 018h, 018h
   412 0001656D 1818F818F81818      <1>
   413 00016574 181818183636363636- <1>     db  018h, 018h, 018h, 018h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0f6h, 036h, 036h, 036h, 036h
   413 0001657D 3636F636363636      <1>
   414 00016584 363600000000000000- <1>     db  036h, 036h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 036h, 036h, 036h, 036h, 036h, 036h
   414 0001658D FE363636363636      <1>
   415 00016594 0000000000F818F818- <1>     db  000h, 000h, 000h, 000h, 000h, 0f8h, 018h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h, 036h, 036h
   415 0001659D 18181818183636      <1>
   416 000165A4 363636F606F6363636- <1>     db  036h, 036h, 036h, 0f6h, 006h, 0f6h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   416 000165AD 36363636363636      <1>
   417 000165B4 363636363636363636- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h, 000h, 000h, 000h, 0feh
   417 000165BD 360000000000FE      <1>
   418 000165C4 06F636363636363636- <1>     db  006h, 0f6h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0f6h, 006h, 0feh
   418 000165CD 36363636F606FE      <1>
   419 000165D4 000000000000363636- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0feh, 000h, 000h
   419 000165DD 36363636FE0000      <1>
   420 000165E4 000000001818181818- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 0f8h, 000h, 000h, 000h, 000h
   420 000165ED F818F800000000      <1>
   421 000165F4 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h
   421 000165FD F8181818181818      <1>
   422 00016604 181818181818181F00- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 01fh, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h
   422 0001660D 00000000001818      <1>
   423 00016614 1818181818FF000000- <1>     db  018h, 018h, 018h, 018h, 018h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   423 0001661D 00000000000000      <1>
   424 00016624 000000FF1818181818- <1>     db  000h, 000h, 000h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   424 0001662D 18181818181818      <1>
   425 00016634 181F18181818181800- <1>     db  018h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh
   425 0001663D 000000000000FF      <1>
   426 00016644 000000000000181818- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0ffh, 018h, 018h
   426 0001664D 18181818FF1818      <1>
   427 00016654 181818181818181818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 01fh, 018h, 01fh, 018h, 018h, 018h, 018h
   427 0001665D 1F181F18181818      <1>
   428 00016664 181836363636363636- <1>     db  018h, 018h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 037h, 036h, 036h, 036h, 036h, 036h, 036h
   428 0001666D 37363636363636      <1>
   429 00016674 363636363637303F00- <1>     db  036h, 036h, 036h, 036h, 036h, 037h, 030h, 03fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   429 0001667D 00000000000000      <1>
   430 00016684 0000003F3037363636- <1>     db  000h, 000h, 000h, 03fh, 030h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   430 0001668D 36363636363636      <1>
   431 00016694 36F700FF0000000000- <1>     db  036h, 0f7h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh
   431 0001669D 000000000000FF      <1>
   432 000166A4 00F736363636363636- <1>     db  000h, 0f7h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 037h, 030h, 037h
   432 000166AD 36363636373037      <1>
   433 000166B4 363636363636000000- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0ffh, 000h, 000h
   433 000166BD 0000FF00FF0000      <1>
   434 000166C4 000000003636363636- <1>     db  000h, 000h, 000h, 000h, 036h, 036h, 036h, 036h, 036h, 0f7h, 000h, 0f7h, 036h, 036h, 036h, 036h
   434 000166CD F700F736363636      <1>
   435 000166D4 36361818181818FF00- <1>     db  036h, 036h, 018h, 018h, 018h, 018h, 018h, 0ffh, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h
   435 000166DD FF000000000000      <1>
   436 000166E4 36363636363636FF00- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   436 000166ED 00000000000000      <1>
   437 000166F4 000000FF00FF181818- <1>     db  000h, 000h, 000h, 0ffh, 000h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   437 000166FD 18181800000000      <1>
   438 00016704 000000FF3636363636- <1>     db  000h, 000h, 000h, 0ffh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   438 0001670D 36363636363636      <1>
   439 00016714 363F00000000000018- <1>     db  036h, 03fh, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 018h, 01fh, 018h, 01fh
   439 0001671D 181818181F181F      <1>
   440 00016724 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 01fh, 018h, 01fh, 018h, 018h
   440 0001672D 00001F181F1818      <1>
   441 00016734 181818180000000000- <1>     db  018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 03fh, 036h, 036h, 036h, 036h
   441 0001673D 00003F36363636      <1>
   442 00016744 363636363636363636- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0ffh, 036h, 036h, 036h, 036h, 036h, 036h
   442 0001674D FF363636363636      <1>
   443 00016754 1818181818FF18FF18- <1>     db  018h, 018h, 018h, 018h, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   443 0001675D 18181818181818      <1>
   444 00016764 1818181818F8000000- <1>     db  018h, 018h, 018h, 018h, 018h, 0f8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   444 0001676D 00000000000000      <1>
   445 00016774 0000001F1818181818- <1>     db  000h, 000h, 000h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   445 0001677D 18FFFFFFFFFFFF      <1>
   446 00016784 FFFFFFFFFFFFFFFF00- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh
   446 0001678D 000000000000FF      <1>
   447 00016794 FFFFFFFFFFFFF0F0F0- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h
   447 0001679D F0F0F0F0F0F0F0      <1>
   448 000167A4 F0F0F0F00F0F0F0F0F- <1>     db  0f0h, 0f0h, 0f0h, 0f0h, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh
   448 000167AD 0F0F0F0F0F0F0F      <1>
   449 000167B4 0F0FFFFFFFFFFFFFFF- <1>     db  00fh, 00fh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   449 000167BD 00000000000000      <1>
   450 000167C4 000000000076DCD8D8- <1>     db  000h, 000h, 000h, 000h, 000h, 076h, 0dch, 0d8h, 0d8h, 0dch, 076h, 000h, 000h, 000h, 000h, 000h
   450 000167CD DC760000000000      <1>
   451 000167D4 00007CC6FCC6C6FCC0- <1>     db  000h, 000h, 07ch, 0c6h, 0fch, 0c6h, 0c6h, 0fch, 0c0h, 0c0h, 040h, 000h, 000h, 000h, 0feh, 0c6h
   451 000167DD C040000000FEC6      <1>
   452 000167E4 C6C0C0C0C0C0C00000- <1>     db  0c6h, 0c0h, 0c0h, 0c0h, 0c0h, 0c0h, 0c0h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 06ch
   452 000167ED 0000000000FE6C      <1>
   453 000167F4 6C6C6C6C6C00000000- <1>     db  06ch, 06ch, 06ch, 06ch, 06ch, 000h, 000h, 000h, 000h, 000h, 0feh, 0c6h, 060h, 030h, 018h, 030h
   453 000167FD 00FEC660301830      <1>
   454 00016804 60C6FE000000000000- <1>     db  060h, 0c6h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07eh, 0d8h, 0d8h, 0d8h, 0d8h
   454 0001680D 00007ED8D8D8D8      <1>
   455 00016814 700000000000000066- <1>     db  070h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 066h, 066h, 066h, 066h, 07ch, 060h, 060h, 0c0h
   455 0001681D 6666667C6060C0      <1>
   456 00016824 00000000000076DC18- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 076h, 0dch, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h
   456 0001682D 18181818000000      <1>
   457 00016834 00007E183C6666663C- <1>     db  000h, 000h, 07eh, 018h, 03ch, 066h, 066h, 066h, 03ch, 018h, 07eh, 000h, 000h, 000h, 000h, 000h
   457 0001683D 187E0000000000      <1>
   458 00016844 386CC6C6FEC6C66C38- <1>     db  038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 06ch, 038h, 000h, 000h, 000h, 000h, 000h, 038h, 06ch
   458 0001684D 0000000000386C      <1>
   459 00016854 C6C6C66C6C6CEE0000- <1>     db  0c6h, 0c6h, 0c6h, 06ch, 06ch, 06ch, 0eeh, 000h, 000h, 000h, 000h, 000h, 01eh, 030h, 018h, 00ch
   459 0001685D 0000001E30180C      <1>
   460 00016864 3E6666663C00000000- <1>     db  03eh, 066h, 066h, 066h, 03ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07eh, 0dbh, 0dbh
   460 0001686D 000000007EDBDB      <1>
   461 00016874 7E0000000000000003- <1>     db  07eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 003h, 006h, 07eh, 0dbh, 0dbh, 0f3h, 07eh, 060h
   461 0001687D 067EDBDBF37E60      <1>
   462 00016884 C000000000001C3060- <1>     db  0c0h, 000h, 000h, 000h, 000h, 000h, 01ch, 030h, 060h, 060h, 07ch, 060h, 060h, 030h, 01ch, 000h
   462 0001688D 607C6060301C00      <1>
   463 00016894 00000000007CC6C6C6- <1>     db  000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h
   463 0001689D C6C6C6C6000000      <1>
   464 000168A4 000000FE0000FE0000- <1>     db  000h, 000h, 000h, 0feh, 000h, 000h, 0feh, 000h, 000h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h
   464 000168AD FE000000000000      <1>
   465 000168B4 0018187E18180000FF- <1>     db  000h, 018h, 018h, 07eh, 018h, 018h, 000h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 030h, 018h
   465 000168BD 00000000003018      <1>
   466 000168C4 0C060C1830007E0000- <1>     db  00ch, 006h, 00ch, 018h, 030h, 000h, 07eh, 000h, 000h, 000h, 000h, 000h, 00ch, 018h, 030h, 060h
   466 000168CD 0000000C183060      <1>
   467 000168D4 30180C007E00000000- <1>     db  030h, 018h, 00ch, 000h, 07eh, 000h, 000h, 000h, 000h, 000h, 00eh, 01bh, 01bh, 018h, 018h, 018h
   467 000168DD 000E1B1B181818      <1>
   468 000168E4 181818181818181818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0d8h, 0d8h
   468 000168ED 1818181818D8D8      <1>
   469 000168F4 700000000000001818- <1>     db  070h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 07eh, 000h, 018h, 018h, 000h, 000h
   469 000168FD 007E0018180000      <1>
   470 00016904 00000000000076DC00- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 076h, 0dch, 000h, 076h, 0dch, 000h, 000h, 000h, 000h, 000h
   470 0001690D 76DC0000000000      <1>
   471 00016914 00386C6C3800000000- <1>     db  000h, 038h, 06ch, 06ch, 038h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   471 0001691D 00000000000000      <1>
   472 00016924 000000001818000000- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   472 0001692D 00000000000000      <1>
   473 00016934 000000180000000000- <1>     db  000h, 000h, 000h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 00fh, 00ch, 00ch, 00ch, 00ch
   473 0001693D 00000F0C0C0C0C      <1>
   474 00016944 0CEC6C3C1C00000000- <1>     db  00ch, 0ech, 06ch, 03ch, 01ch, 000h, 000h, 000h, 000h, 0d8h, 06ch, 06ch, 06ch, 06ch, 06ch, 000h
   474 0001694D D86C6C6C6C6C00      <1>
   475 00016954 0000000000000070D8- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 070h, 0d8h, 030h, 060h, 0c8h, 0f8h, 000h, 000h, 000h
   475 0001695D 3060C8F8000000      <1>
   476 00016964 00000000000000007C- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07ch, 07ch, 07ch, 07ch, 07ch, 07ch, 000h, 000h
   476 0001696D 7C7C7C7C7C0000      <1>
   477 00016974 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   477 0001697D 00000000000000      <1>
   478                              <1> vgafont16:
   479 00016984 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   479 0001698D 00000000000000      <1>
   480 00016994 00007E81A58181BD99- <1>     db  000h, 000h, 07eh, 081h, 0a5h, 081h, 081h, 0bdh, 099h, 081h, 081h, 07eh, 000h, 000h, 000h, 000h
   480 0001699D 81817E00000000      <1>
   481 000169A4 00007EFFDBFFFFC3E7- <1>     db  000h, 000h, 07eh, 0ffh, 0dbh, 0ffh, 0ffh, 0c3h, 0e7h, 0ffh, 0ffh, 07eh, 000h, 000h, 000h, 000h
   481 000169AD FFFF7E00000000      <1>
   482 000169B4 000000006CFEFEFEFE- <1>     db  000h, 000h, 000h, 000h, 06ch, 0feh, 0feh, 0feh, 0feh, 07ch, 038h, 010h, 000h, 000h, 000h, 000h
   482 000169BD 7C381000000000      <1>
   483 000169C4 0000000010387CFE7C- <1>     db  000h, 000h, 000h, 000h, 010h, 038h, 07ch, 0feh, 07ch, 038h, 010h, 000h, 000h, 000h, 000h, 000h
   483 000169CD 38100000000000      <1>
   484 000169D4 000000183C3CE7E7E7- <1>     db  000h, 000h, 000h, 018h, 03ch, 03ch, 0e7h, 0e7h, 0e7h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   484 000169DD 18183C00000000      <1>
   485 000169E4 000000183C7EFFFF7E- <1>     db  000h, 000h, 000h, 018h, 03ch, 07eh, 0ffh, 0ffh, 07eh, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   485 000169ED 18183C00000000      <1>
   486 000169F4 000000000000183C3C- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 018h, 03ch, 03ch, 018h, 000h, 000h, 000h, 000h, 000h, 000h
   486 000169FD 18000000000000      <1>
   487 00016A04 FFFFFFFFFFFFE7C3C3- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0e7h, 0c3h, 0c3h, 0e7h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   487 00016A0D E7FFFFFFFFFFFF      <1>
   488 00016A14 00000000003C664242- <1>     db  000h, 000h, 000h, 000h, 000h, 03ch, 066h, 042h, 042h, 066h, 03ch, 000h, 000h, 000h, 000h, 000h
   488 00016A1D 663C0000000000      <1>
   489 00016A24 FFFFFFFFFFC399BDBD- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0c3h, 099h, 0bdh, 0bdh, 099h, 0c3h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   489 00016A2D 99C3FFFFFFFFFF      <1>
   490 00016A34 00001E0E1A3278CCCC- <1>     db  000h, 000h, 01eh, 00eh, 01ah, 032h, 078h, 0cch, 0cch, 0cch, 0cch, 078h, 000h, 000h, 000h, 000h
   490 00016A3D CCCC7800000000      <1>
   491 00016A44 00003C666666663C18- <1>     db  000h, 000h, 03ch, 066h, 066h, 066h, 066h, 03ch, 018h, 07eh, 018h, 018h, 000h, 000h, 000h, 000h
   491 00016A4D 7E181800000000      <1>
   492 00016A54 00003F333F30303030- <1>     db  000h, 000h, 03fh, 033h, 03fh, 030h, 030h, 030h, 030h, 070h, 0f0h, 0e0h, 000h, 000h, 000h, 000h
   492 00016A5D 70F0E000000000      <1>
   493 00016A64 00007F637F63636363- <1>     db  000h, 000h, 07fh, 063h, 07fh, 063h, 063h, 063h, 063h, 067h, 0e7h, 0e6h, 0c0h, 000h, 000h, 000h
   493 00016A6D 67E7E6C0000000      <1>
   494 00016A74 0000001818DB3CE73C- <1>     db  000h, 000h, 000h, 018h, 018h, 0dbh, 03ch, 0e7h, 03ch, 0dbh, 018h, 018h, 000h, 000h, 000h, 000h
   494 00016A7D DB181800000000      <1>
   495 00016A84 0080C0E0F0F8FEF8F0- <1>     db  000h, 080h, 0c0h, 0e0h, 0f0h, 0f8h, 0feh, 0f8h, 0f0h, 0e0h, 0c0h, 080h, 000h, 000h, 000h, 000h
   495 00016A8D E0C08000000000      <1>
   496 00016A94 0002060E1E3EFE3E1E- <1>     db  000h, 002h, 006h, 00eh, 01eh, 03eh, 0feh, 03eh, 01eh, 00eh, 006h, 002h, 000h, 000h, 000h, 000h
   496 00016A9D 0E060200000000      <1>
   497 00016AA4 0000183C7E1818187E- <1>     db  000h, 000h, 018h, 03ch, 07eh, 018h, 018h, 018h, 07eh, 03ch, 018h, 000h, 000h, 000h, 000h, 000h
   497 00016AAD 3C180000000000      <1>
   498 00016AB4 000066666666666666- <1>     db  000h, 000h, 066h, 066h, 066h, 066h, 066h, 066h, 066h, 000h, 066h, 066h, 000h, 000h, 000h, 000h
   498 00016ABD 00666600000000      <1>
   499 00016AC4 00007FDBDBDB7B1B1B- <1>     db  000h, 000h, 07fh, 0dbh, 0dbh, 0dbh, 07bh, 01bh, 01bh, 01bh, 01bh, 01bh, 000h, 000h, 000h, 000h
   499 00016ACD 1B1B1B00000000      <1>
   500 00016AD4 007CC660386CC6C66C- <1>     db  000h, 07ch, 0c6h, 060h, 038h, 06ch, 0c6h, 0c6h, 06ch, 038h, 00ch, 0c6h, 07ch, 000h, 000h, 000h
   500 00016ADD 380CC67C000000      <1>
   501 00016AE4 0000000000000000FE- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 0feh, 0feh, 0feh, 000h, 000h, 000h, 000h
   501 00016AED FEFEFE00000000      <1>
   502 00016AF4 0000183C7E1818187E- <1>     db  000h, 000h, 018h, 03ch, 07eh, 018h, 018h, 018h, 07eh, 03ch, 018h, 07eh, 000h, 000h, 000h, 000h
   502 00016AFD 3C187E00000000      <1>
   503 00016B04 0000183C7E18181818- <1>     db  000h, 000h, 018h, 03ch, 07eh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   503 00016B0D 18181800000000      <1>
   504 00016B14 000018181818181818- <1>     db  000h, 000h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 07eh, 03ch, 018h, 000h, 000h, 000h, 000h
   504 00016B1D 7E3C1800000000      <1>
   505 00016B24 0000000000180CFE0C- <1>     db  000h, 000h, 000h, 000h, 000h, 018h, 00ch, 0feh, 00ch, 018h, 000h, 000h, 000h, 000h, 000h, 000h
   505 00016B2D 18000000000000      <1>
   506 00016B34 00000000003060FE60- <1>     db  000h, 000h, 000h, 000h, 000h, 030h, 060h, 0feh, 060h, 030h, 000h, 000h, 000h, 000h, 000h, 000h
   506 00016B3D 30000000000000      <1>
   507 00016B44 000000000000C0C0C0- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 0c0h, 0c0h, 0c0h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h
   507 00016B4D FE000000000000      <1>
   508 00016B54 00000000002466FF66- <1>     db  000h, 000h, 000h, 000h, 000h, 024h, 066h, 0ffh, 066h, 024h, 000h, 000h, 000h, 000h, 000h, 000h
   508 00016B5D 24000000000000      <1>
   509 00016B64 000000001038387C7C- <1>     db  000h, 000h, 000h, 000h, 010h, 038h, 038h, 07ch, 07ch, 0feh, 0feh, 000h, 000h, 000h, 000h, 000h
   509 00016B6D FEFE0000000000      <1>
   510 00016B74 00000000FEFE7C7C38- <1>     db  000h, 000h, 000h, 000h, 0feh, 0feh, 07ch, 07ch, 038h, 038h, 010h, 000h, 000h, 000h, 000h, 000h
   510 00016B7D 38100000000000      <1>
   511 00016B84 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   511 00016B8D 00000000000000      <1>
   512 00016B94 0000183C3C3C181818- <1>     db  000h, 000h, 018h, 03ch, 03ch, 03ch, 018h, 018h, 018h, 000h, 018h, 018h, 000h, 000h, 000h, 000h
   512 00016B9D 00181800000000      <1>
   513 00016BA4 006666662400000000- <1>     db  000h, 066h, 066h, 066h, 024h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   513 00016BAD 00000000000000      <1>
   514 00016BB4 0000006C6CFE6C6C6C- <1>     db  000h, 000h, 000h, 06ch, 06ch, 0feh, 06ch, 06ch, 06ch, 0feh, 06ch, 06ch, 000h, 000h, 000h, 000h
   514 00016BBD FE6C6C00000000      <1>
   515 00016BC4 18187CC6C2C07C0606- <1>     db  018h, 018h, 07ch, 0c6h, 0c2h, 0c0h, 07ch, 006h, 006h, 086h, 0c6h, 07ch, 018h, 018h, 000h, 000h
   515 00016BCD 86C67C18180000      <1>
   516 00016BD4 00000000C2C60C1830- <1>     db  000h, 000h, 000h, 000h, 0c2h, 0c6h, 00ch, 018h, 030h, 060h, 0c6h, 086h, 000h, 000h, 000h, 000h
   516 00016BDD 60C68600000000      <1>
   517 00016BE4 0000386C6C3876DCCC- <1>     db  000h, 000h, 038h, 06ch, 06ch, 038h, 076h, 0dch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   517 00016BED CCCC7600000000      <1>
   518 00016BF4 003030306000000000- <1>     db  000h, 030h, 030h, 030h, 060h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   518 00016BFD 00000000000000      <1>
   519 00016C04 00000C183030303030- <1>     db  000h, 000h, 00ch, 018h, 030h, 030h, 030h, 030h, 030h, 030h, 018h, 00ch, 000h, 000h, 000h, 000h
   519 00016C0D 30180C00000000      <1>
   520 00016C14 000030180C0C0C0C0C- <1>     db  000h, 000h, 030h, 018h, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 018h, 030h, 000h, 000h, 000h, 000h
   520 00016C1D 0C183000000000      <1>
   521 00016C24 0000000000663CFF3C- <1>     db  000h, 000h, 000h, 000h, 000h, 066h, 03ch, 0ffh, 03ch, 066h, 000h, 000h, 000h, 000h, 000h, 000h
   521 00016C2D 66000000000000      <1>
   522 00016C34 000000000018187E18- <1>     db  000h, 000h, 000h, 000h, 000h, 018h, 018h, 07eh, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h
   522 00016C3D 18000000000000      <1>
   523 00016C44 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 018h, 030h, 000h, 000h, 000h
   523 00016C4D 18181830000000      <1>
   524 00016C54 00000000000000FE00- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   524 00016C5D 00000000000000      <1>
   525 00016C64 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h
   525 00016C6D 00181800000000      <1>
   526 00016C74 0000000002060C1830- <1>     db  000h, 000h, 000h, 000h, 002h, 006h, 00ch, 018h, 030h, 060h, 0c0h, 080h, 000h, 000h, 000h, 000h
   526 00016C7D 60C08000000000      <1>
   527 00016C84 00003C66C3C3DBDBC3- <1>     db  000h, 000h, 03ch, 066h, 0c3h, 0c3h, 0dbh, 0dbh, 0c3h, 0c3h, 066h, 03ch, 000h, 000h, 000h, 000h
   527 00016C8D C3663C00000000      <1>
   528 00016C94 000018387818181818- <1>     db  000h, 000h, 018h, 038h, 078h, 018h, 018h, 018h, 018h, 018h, 018h, 07eh, 000h, 000h, 000h, 000h
   528 00016C9D 18187E00000000      <1>
   529 00016CA4 00007CC6060C183060- <1>     db  000h, 000h, 07ch, 0c6h, 006h, 00ch, 018h, 030h, 060h, 0c0h, 0c6h, 0feh, 000h, 000h, 000h, 000h
   529 00016CAD C0C6FE00000000      <1>
   530 00016CB4 00007CC606063C0606- <1>     db  000h, 000h, 07ch, 0c6h, 006h, 006h, 03ch, 006h, 006h, 006h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   530 00016CBD 06C67C00000000      <1>
   531 00016CC4 00000C1C3C6CCCFE0C- <1>     db  000h, 000h, 00ch, 01ch, 03ch, 06ch, 0cch, 0feh, 00ch, 00ch, 00ch, 01eh, 000h, 000h, 000h, 000h
   531 00016CCD 0C0C1E00000000      <1>
   532 00016CD4 0000FEC0C0C0FC0606- <1>     db  000h, 000h, 0feh, 0c0h, 0c0h, 0c0h, 0fch, 006h, 006h, 006h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   532 00016CDD 06C67C00000000      <1>
   533 00016CE4 00003860C0C0FCC6C6- <1>     db  000h, 000h, 038h, 060h, 0c0h, 0c0h, 0fch, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   533 00016CED C6C67C00000000      <1>
   534 00016CF4 0000FEC606060C1830- <1>     db  000h, 000h, 0feh, 0c6h, 006h, 006h, 00ch, 018h, 030h, 030h, 030h, 030h, 000h, 000h, 000h, 000h
   534 00016CFD 30303000000000      <1>
   535 00016D04 00007CC6C6C67CC6C6- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   535 00016D0D C6C67C00000000      <1>
   536 00016D14 00007CC6C6C67E0606- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 07eh, 006h, 006h, 006h, 00ch, 078h, 000h, 000h, 000h, 000h
   536 00016D1D 060C7800000000      <1>
   537 00016D24 000000001818000000- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h
   537 00016D2D 18180000000000      <1>
   538 00016D34 000000001818000000- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 018h, 018h, 030h, 000h, 000h, 000h, 000h
   538 00016D3D 18183000000000      <1>
   539 00016D44 000000060C18306030- <1>     db  000h, 000h, 000h, 006h, 00ch, 018h, 030h, 060h, 030h, 018h, 00ch, 006h, 000h, 000h, 000h, 000h
   539 00016D4D 180C0600000000      <1>
   540 00016D54 00000000007E00007E- <1>     db  000h, 000h, 000h, 000h, 000h, 07eh, 000h, 000h, 07eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   540 00016D5D 00000000000000      <1>
   541 00016D64 0000006030180C060C- <1>     db  000h, 000h, 000h, 060h, 030h, 018h, 00ch, 006h, 00ch, 018h, 030h, 060h, 000h, 000h, 000h, 000h
   541 00016D6D 18306000000000      <1>
   542 00016D74 00007CC6C60C181818- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 00ch, 018h, 018h, 018h, 000h, 018h, 018h, 000h, 000h, 000h, 000h
   542 00016D7D 00181800000000      <1>
   543 00016D84 0000007CC6C6DEDEDE- <1>     db  000h, 000h, 000h, 07ch, 0c6h, 0c6h, 0deh, 0deh, 0deh, 0dch, 0c0h, 07ch, 000h, 000h, 000h, 000h
   543 00016D8D DCC07C00000000      <1>
   544 00016D94 000010386CC6C6FEC6- <1>     db  000h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   544 00016D9D C6C6C600000000      <1>
   545 00016DA4 0000FC6666667C6666- <1>     db  000h, 000h, 0fch, 066h, 066h, 066h, 07ch, 066h, 066h, 066h, 066h, 0fch, 000h, 000h, 000h, 000h
   545 00016DAD 6666FC00000000      <1>
   546 00016DB4 00003C66C2C0C0C0C0- <1>     db  000h, 000h, 03ch, 066h, 0c2h, 0c0h, 0c0h, 0c0h, 0c0h, 0c2h, 066h, 03ch, 000h, 000h, 000h, 000h
   546 00016DBD C2663C00000000      <1>
   547 00016DC4 0000F86C6666666666- <1>     db  000h, 000h, 0f8h, 06ch, 066h, 066h, 066h, 066h, 066h, 066h, 06ch, 0f8h, 000h, 000h, 000h, 000h
   547 00016DCD 666CF800000000      <1>
   548 00016DD4 0000FE666268786860- <1>     db  000h, 000h, 0feh, 066h, 062h, 068h, 078h, 068h, 060h, 062h, 066h, 0feh, 000h, 000h, 000h, 000h
   548 00016DDD 6266FE00000000      <1>
   549 00016DE4 0000FE666268786860- <1>     db  000h, 000h, 0feh, 066h, 062h, 068h, 078h, 068h, 060h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h
   549 00016DED 6060F000000000      <1>
   550 00016DF4 00003C66C2C0C0DEC6- <1>     db  000h, 000h, 03ch, 066h, 0c2h, 0c0h, 0c0h, 0deh, 0c6h, 0c6h, 066h, 03ah, 000h, 000h, 000h, 000h
   550 00016DFD C6663A00000000      <1>
   551 00016E04 0000C6C6C6C6FEC6C6- <1>     db  000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   551 00016E0D C6C6C600000000      <1>
   552 00016E14 00003C181818181818- <1>     db  000h, 000h, 03ch, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   552 00016E1D 18183C00000000      <1>
   553 00016E24 00001E0C0C0C0C0CCC- <1>     db  000h, 000h, 01eh, 00ch, 00ch, 00ch, 00ch, 00ch, 0cch, 0cch, 0cch, 078h, 000h, 000h, 000h, 000h
   553 00016E2D CCCC7800000000      <1>
   554 00016E34 0000E666666C78786C- <1>     db  000h, 000h, 0e6h, 066h, 066h, 06ch, 078h, 078h, 06ch, 066h, 066h, 0e6h, 000h, 000h, 000h, 000h
   554 00016E3D 6666E600000000      <1>
   555 00016E44 0000F0606060606060- <1>     db  000h, 000h, 0f0h, 060h, 060h, 060h, 060h, 060h, 060h, 062h, 066h, 0feh, 000h, 000h, 000h, 000h
   555 00016E4D 6266FE00000000      <1>
   556 00016E54 0000C3E7FFFFDBC3C3- <1>     db  000h, 000h, 0c3h, 0e7h, 0ffh, 0ffh, 0dbh, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 000h, 000h, 000h, 000h
   556 00016E5D C3C3C300000000      <1>
   557 00016E64 0000C6E6F6FEDECEC6- <1>     db  000h, 000h, 0c6h, 0e6h, 0f6h, 0feh, 0deh, 0ceh, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   557 00016E6D C6C6C600000000      <1>
   558 00016E74 00007CC6C6C6C6C6C6- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   558 00016E7D C6C67C00000000      <1>
   559 00016E84 0000FC6666667C6060- <1>     db  000h, 000h, 0fch, 066h, 066h, 066h, 07ch, 060h, 060h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h
   559 00016E8D 6060F000000000      <1>
   560 00016E94 00007CC6C6C6C6C6C6- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0d6h, 0deh, 07ch, 00ch, 00eh, 000h, 000h
   560 00016E9D D6DE7C0C0E0000      <1>
   561 00016EA4 0000FC6666667C6C66- <1>     db  000h, 000h, 0fch, 066h, 066h, 066h, 07ch, 06ch, 066h, 066h, 066h, 0e6h, 000h, 000h, 000h, 000h
   561 00016EAD 6666E600000000      <1>
   562 00016EB4 00007CC6C660380C06- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 060h, 038h, 00ch, 006h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   562 00016EBD C6C67C00000000      <1>
   563 00016EC4 0000FFDB9918181818- <1>     db  000h, 000h, 0ffh, 0dbh, 099h, 018h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   563 00016ECD 18183C00000000      <1>
   564 00016ED4 0000C6C6C6C6C6C6C6- <1>     db  000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   564 00016EDD C6C67C00000000      <1>
   565 00016EE4 0000C3C3C3C3C3C3C3- <1>     db  000h, 000h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h, 000h, 000h, 000h, 000h
   565 00016EED 663C1800000000      <1>
   566 00016EF4 0000C3C3C3C3C3DBDB- <1>     db  000h, 000h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 0dbh, 0dbh, 0ffh, 066h, 066h, 000h, 000h, 000h, 000h
   566 00016EFD FF666600000000      <1>
   567 00016F04 0000C3C3663C18183C- <1>     db  000h, 000h, 0c3h, 0c3h, 066h, 03ch, 018h, 018h, 03ch, 066h, 0c3h, 0c3h, 000h, 000h, 000h, 000h
   567 00016F0D 66C3C300000000      <1>
   568 00016F14 0000C3C3C3663C1818- <1>     db  000h, 000h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   568 00016F1D 18183C00000000      <1>
   569 00016F24 0000FFC3860C183060- <1>     db  000h, 000h, 0ffh, 0c3h, 086h, 00ch, 018h, 030h, 060h, 0c1h, 0c3h, 0ffh, 000h, 000h, 000h, 000h
   569 00016F2D C1C3FF00000000      <1>
   570 00016F34 00003C303030303030- <1>     db  000h, 000h, 03ch, 030h, 030h, 030h, 030h, 030h, 030h, 030h, 030h, 03ch, 000h, 000h, 000h, 000h
   570 00016F3D 30303C00000000      <1>
   571 00016F44 00000080C0E070381C- <1>     db  000h, 000h, 000h, 080h, 0c0h, 0e0h, 070h, 038h, 01ch, 00eh, 006h, 002h, 000h, 000h, 000h, 000h
   571 00016F4D 0E060200000000      <1>
   572 00016F54 00003C0C0C0C0C0C0C- <1>     db  000h, 000h, 03ch, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 03ch, 000h, 000h, 000h, 000h
   572 00016F5D 0C0C3C00000000      <1>
   573 00016F64 10386CC60000000000- <1>     db  010h, 038h, 06ch, 0c6h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   573 00016F6D 00000000000000      <1>
   574 00016F74 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 000h
   574 00016F7D 00000000FF0000      <1>
   575 00016F84 303018000000000000- <1>     db  030h, 030h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   575 00016F8D 00000000000000      <1>
   576 00016F94 0000000000780C7CCC- <1>     db  000h, 000h, 000h, 000h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   576 00016F9D CCCC7600000000      <1>
   577 00016FA4 0000E06060786C6666- <1>     db  000h, 000h, 0e0h, 060h, 060h, 078h, 06ch, 066h, 066h, 066h, 066h, 07ch, 000h, 000h, 000h, 000h
   577 00016FAD 66667C00000000      <1>
   578 00016FB4 00000000007CC6C0C0- <1>     db  000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0c0h, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   578 00016FBD C0C67C00000000      <1>
   579 00016FC4 00001C0C0C3C6CCCCC- <1>     db  000h, 000h, 01ch, 00ch, 00ch, 03ch, 06ch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   579 00016FCD CCCC7600000000      <1>
   580 00016FD4 00000000007CC6FEC0- <1>     db  000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   580 00016FDD C0C67C00000000      <1>
   581 00016FE4 0000386C6460F06060- <1>     db  000h, 000h, 038h, 06ch, 064h, 060h, 0f0h, 060h, 060h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h
   581 00016FED 6060F000000000      <1>
   582 00016FF4 000000000076CCCCCC- <1>     db  000h, 000h, 000h, 000h, 000h, 076h, 0cch, 0cch, 0cch, 0cch, 0cch, 07ch, 00ch, 0cch, 078h, 000h
   582 00016FFD CCCC7C0CCC7800      <1>
   583 00017004 0000E060606C766666- <1>     db  000h, 000h, 0e0h, 060h, 060h, 06ch, 076h, 066h, 066h, 066h, 066h, 0e6h, 000h, 000h, 000h, 000h
   583 0001700D 6666E600000000      <1>
   584 00017014 000018180038181818- <1>     db  000h, 000h, 018h, 018h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   584 0001701D 18183C00000000      <1>
   585 00017024 00000606000E060606- <1>     db  000h, 000h, 006h, 006h, 000h, 00eh, 006h, 006h, 006h, 006h, 006h, 006h, 066h, 066h, 03ch, 000h
   585 0001702D 06060666663C00      <1>
   586 00017034 0000E06060666C7878- <1>     db  000h, 000h, 0e0h, 060h, 060h, 066h, 06ch, 078h, 078h, 06ch, 066h, 0e6h, 000h, 000h, 000h, 000h
   586 0001703D 6C66E600000000      <1>
   587 00017044 000038181818181818- <1>     db  000h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   587 0001704D 18183C00000000      <1>
   588 00017054 0000000000E6FFDBDB- <1>     db  000h, 000h, 000h, 000h, 000h, 0e6h, 0ffh, 0dbh, 0dbh, 0dbh, 0dbh, 0dbh, 000h, 000h, 000h, 000h
   588 0001705D DBDBDB00000000      <1>
   589 00017064 0000000000DC666666- <1>     db  000h, 000h, 000h, 000h, 000h, 0dch, 066h, 066h, 066h, 066h, 066h, 066h, 000h, 000h, 000h, 000h
   589 0001706D 66666600000000      <1>
   590 00017074 00000000007CC6C6C6- <1>     db  000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   590 0001707D C6C67C00000000      <1>
   591 00017084 0000000000DC666666- <1>     db  000h, 000h, 000h, 000h, 000h, 0dch, 066h, 066h, 066h, 066h, 066h, 07ch, 060h, 060h, 0f0h, 000h
   591 0001708D 66667C6060F000      <1>
   592 00017094 000000000076CCCCCC- <1>     db  000h, 000h, 000h, 000h, 000h, 076h, 0cch, 0cch, 0cch, 0cch, 0cch, 07ch, 00ch, 00ch, 01eh, 000h
   592 0001709D CCCC7C0C0C1E00      <1>
   593 000170A4 0000000000DC766660- <1>     db  000h, 000h, 000h, 000h, 000h, 0dch, 076h, 066h, 060h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h
   593 000170AD 6060F000000000      <1>
   594 000170B4 00000000007CC66038- <1>     db  000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 060h, 038h, 00ch, 0c6h, 07ch, 000h, 000h, 000h, 000h
   594 000170BD 0CC67C00000000      <1>
   595 000170C4 0000103030FC303030- <1>     db  000h, 000h, 010h, 030h, 030h, 0fch, 030h, 030h, 030h, 030h, 036h, 01ch, 000h, 000h, 000h, 000h
   595 000170CD 30361C00000000      <1>
   596 000170D4 0000000000CCCCCCCC- <1>     db  000h, 000h, 000h, 000h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   596 000170DD CCCC7600000000      <1>
   597 000170E4 0000000000C3C3C3C3- <1>     db  000h, 000h, 000h, 000h, 000h, 0c3h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h, 000h, 000h, 000h, 000h
   597 000170ED 663C1800000000      <1>
   598 000170F4 0000000000C3C3C3DB- <1>     db  000h, 000h, 000h, 000h, 000h, 0c3h, 0c3h, 0c3h, 0dbh, 0dbh, 0ffh, 066h, 000h, 000h, 000h, 000h
   598 000170FD DBFF6600000000      <1>
   599 00017104 0000000000C3663C18- <1>     db  000h, 000h, 000h, 000h, 000h, 0c3h, 066h, 03ch, 018h, 03ch, 066h, 0c3h, 000h, 000h, 000h, 000h
   599 0001710D 3C66C300000000      <1>
   600 00017114 0000000000C6C6C6C6- <1>     db  000h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07eh, 006h, 00ch, 0f8h, 000h
   600 0001711D C6C67E060CF800      <1>
   601 00017124 0000000000FECC1830- <1>     db  000h, 000h, 000h, 000h, 000h, 0feh, 0cch, 018h, 030h, 060h, 0c6h, 0feh, 000h, 000h, 000h, 000h
   601 0001712D 60C6FE00000000      <1>
   602 00017134 00000E181818701818- <1>     db  000h, 000h, 00eh, 018h, 018h, 018h, 070h, 018h, 018h, 018h, 018h, 00eh, 000h, 000h, 000h, 000h
   602 0001713D 18180E00000000      <1>
   603 00017144 000018181818001818- <1>     db  000h, 000h, 018h, 018h, 018h, 018h, 000h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   603 0001714D 18181800000000      <1>
   604 00017154 0000701818180E1818- <1>     db  000h, 000h, 070h, 018h, 018h, 018h, 00eh, 018h, 018h, 018h, 018h, 070h, 000h, 000h, 000h, 000h
   604 0001715D 18187000000000      <1>
   605 00017164 000076DC0000000000- <1>     db  000h, 000h, 076h, 0dch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   605 0001716D 00000000000000      <1>
   606 00017174 0000000010386CC6C6- <1>     db  000h, 000h, 000h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0c6h, 0feh, 000h, 000h, 000h, 000h, 000h
   606 0001717D C6FE0000000000      <1>
   607 00017184 00003C66C2C0C0C0C2- <1>     db  000h, 000h, 03ch, 066h, 0c2h, 0c0h, 0c0h, 0c0h, 0c2h, 066h, 03ch, 00ch, 006h, 07ch, 000h, 000h
   607 0001718D 663C0C067C0000      <1>
   608 00017194 0000CC0000CCCCCCCC- <1>     db  000h, 000h, 0cch, 000h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   608 0001719D CCCC7600000000      <1>
   609 000171A4 000C1830007CC6FEC0- <1>     db  000h, 00ch, 018h, 030h, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   609 000171AD C0C67C00000000      <1>
   610 000171B4 0010386C00780C7CCC- <1>     db  000h, 010h, 038h, 06ch, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   610 000171BD CCCC7600000000      <1>
   611 000171C4 0000CC0000780C7CCC- <1>     db  000h, 000h, 0cch, 000h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   611 000171CD CCCC7600000000      <1>
   612 000171D4 0060301800780C7CCC- <1>     db  000h, 060h, 030h, 018h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   612 000171DD CCCC7600000000      <1>
   613 000171E4 00386C3800780C7CCC- <1>     db  000h, 038h, 06ch, 038h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   613 000171ED CCCC7600000000      <1>
   614 000171F4 000000003C66606066- <1>     db  000h, 000h, 000h, 000h, 03ch, 066h, 060h, 060h, 066h, 03ch, 00ch, 006h, 03ch, 000h, 000h, 000h
   614 000171FD 3C0C063C000000      <1>
   615 00017204 0010386C007CC6FEC0- <1>     db  000h, 010h, 038h, 06ch, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   615 0001720D C0C67C00000000      <1>
   616 00017214 0000C600007CC6FEC0- <1>     db  000h, 000h, 0c6h, 000h, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   616 0001721D C0C67C00000000      <1>
   617 00017224 00603018007CC6FEC0- <1>     db  000h, 060h, 030h, 018h, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   617 0001722D C0C67C00000000      <1>
   618 00017234 000066000038181818- <1>     db  000h, 000h, 066h, 000h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   618 0001723D 18183C00000000      <1>
   619 00017244 00183C660038181818- <1>     db  000h, 018h, 03ch, 066h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   619 0001724D 18183C00000000      <1>
   620 00017254 006030180038181818- <1>     db  000h, 060h, 030h, 018h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   620 0001725D 18183C00000000      <1>
   621 00017264 00C60010386CC6C6FE- <1>     db  000h, 0c6h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   621 0001726D C6C6C600000000      <1>
   622 00017274 386C3800386CC6C6FE- <1>     db  038h, 06ch, 038h, 000h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   622 0001727D C6C6C600000000      <1>
   623 00017284 18306000FE66607C60- <1>     db  018h, 030h, 060h, 000h, 0feh, 066h, 060h, 07ch, 060h, 060h, 066h, 0feh, 000h, 000h, 000h, 000h
   623 0001728D 6066FE00000000      <1>
   624 00017294 00000000006E3B1B7E- <1>     db  000h, 000h, 000h, 000h, 000h, 06eh, 03bh, 01bh, 07eh, 0d8h, 0dch, 077h, 000h, 000h, 000h, 000h
   624 0001729D D8DC7700000000      <1>
   625 000172A4 00003E6CCCCCFECCCC- <1>     db  000h, 000h, 03eh, 06ch, 0cch, 0cch, 0feh, 0cch, 0cch, 0cch, 0cch, 0ceh, 000h, 000h, 000h, 000h
   625 000172AD CCCCCE00000000      <1>
   626 000172B4 0010386C007CC6C6C6- <1>     db  000h, 010h, 038h, 06ch, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   626 000172BD C6C67C00000000      <1>
   627 000172C4 0000C600007CC6C6C6- <1>     db  000h, 000h, 0c6h, 000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   627 000172CD C6C67C00000000      <1>
   628 000172D4 00603018007CC6C6C6- <1>     db  000h, 060h, 030h, 018h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   628 000172DD C6C67C00000000      <1>
   629 000172E4 003078CC00CCCCCCCC- <1>     db  000h, 030h, 078h, 0cch, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   629 000172ED CCCC7600000000      <1>
   630 000172F4 0060301800CCCCCCCC- <1>     db  000h, 060h, 030h, 018h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   630 000172FD CCCC7600000000      <1>
   631 00017304 0000C60000C6C6C6C6- <1>     db  000h, 000h, 0c6h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07eh, 006h, 00ch, 078h, 000h
   631 0001730D C6C67E060C7800      <1>
   632 00017314 00C6007CC6C6C6C6C6- <1>     db  000h, 0c6h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   632 0001731D C6C67C00000000      <1>
   633 00017324 00C600C6C6C6C6C6C6- <1>     db  000h, 0c6h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   633 0001732D C6C67C00000000      <1>
   634 00017334 0018187EC3C0C0C0C3- <1>     db  000h, 018h, 018h, 07eh, 0c3h, 0c0h, 0c0h, 0c0h, 0c3h, 07eh, 018h, 018h, 000h, 000h, 000h, 000h
   634 0001733D 7E181800000000      <1>
   635 00017344 00386C6460F0606060- <1>     db  000h, 038h, 06ch, 064h, 060h, 0f0h, 060h, 060h, 060h, 060h, 0e6h, 0fch, 000h, 000h, 000h, 000h
   635 0001734D 60E6FC00000000      <1>
   636 00017354 0000C3663C18FF18FF- <1>     db  000h, 000h, 0c3h, 066h, 03ch, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   636 0001735D 18181800000000      <1>
   637 00017364 00FC66667C62666F66- <1>     db  000h, 0fch, 066h, 066h, 07ch, 062h, 066h, 06fh, 066h, 066h, 066h, 0f3h, 000h, 000h, 000h, 000h
   637 0001736D 6666F300000000      <1>
   638 00017374 000E1B1818187E1818- <1>     db  000h, 00eh, 01bh, 018h, 018h, 018h, 07eh, 018h, 018h, 018h, 018h, 018h, 0d8h, 070h, 000h, 000h
   638 0001737D 181818D8700000      <1>
   639 00017384 0018306000780C7CCC- <1>     db  000h, 018h, 030h, 060h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   639 0001738D CCCC7600000000      <1>
   640 00017394 000C18300038181818- <1>     db  000h, 00ch, 018h, 030h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   640 0001739D 18183C00000000      <1>
   641 000173A4 00183060007CC6C6C6- <1>     db  000h, 018h, 030h, 060h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   641 000173AD C6C67C00000000      <1>
   642 000173B4 0018306000CCCCCCCC- <1>     db  000h, 018h, 030h, 060h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   642 000173BD CCCC7600000000      <1>
   643 000173C4 000076DC00DC666666- <1>     db  000h, 000h, 076h, 0dch, 000h, 0dch, 066h, 066h, 066h, 066h, 066h, 066h, 000h, 000h, 000h, 000h
   643 000173CD 66666600000000      <1>
   644 000173D4 76DC00C6E6F6FEDECE- <1>     db  076h, 0dch, 000h, 0c6h, 0e6h, 0f6h, 0feh, 0deh, 0ceh, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   644 000173DD C6C6C600000000      <1>
   645 000173E4 003C6C6C3E007E0000- <1>     db  000h, 03ch, 06ch, 06ch, 03eh, 000h, 07eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   645 000173ED 00000000000000      <1>
   646 000173F4 00386C6C38007C0000- <1>     db  000h, 038h, 06ch, 06ch, 038h, 000h, 07ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   646 000173FD 00000000000000      <1>
   647 00017404 0000303000303060C0- <1>     db  000h, 000h, 030h, 030h, 000h, 030h, 030h, 060h, 0c0h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   647 0001740D C6C67C00000000      <1>
   648 00017414 000000000000FEC0C0- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 0feh, 0c0h, 0c0h, 0c0h, 0c0h, 000h, 000h, 000h, 000h, 000h
   648 0001741D C0C00000000000      <1>
   649 00017424 000000000000FE0606- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 0feh, 006h, 006h, 006h, 006h, 000h, 000h, 000h, 000h, 000h
   649 0001742D 06060000000000      <1>
   650 00017434 00C0C0C2C6CC183060- <1>     db  000h, 0c0h, 0c0h, 0c2h, 0c6h, 0cch, 018h, 030h, 060h, 0ceh, 09bh, 006h, 00ch, 01fh, 000h, 000h
   650 0001743D CE9B060C1F0000      <1>
   651 00017444 00C0C0C2C6CC183066- <1>     db  000h, 0c0h, 0c0h, 0c2h, 0c6h, 0cch, 018h, 030h, 066h, 0ceh, 096h, 03eh, 006h, 006h, 000h, 000h
   651 0001744D CE963E06060000      <1>
   652 00017454 00001818001818183C- <1>     db  000h, 000h, 018h, 018h, 000h, 018h, 018h, 018h, 03ch, 03ch, 03ch, 018h, 000h, 000h, 000h, 000h
   652 0001745D 3C3C1800000000      <1>
   653 00017464 0000000000366CD86C- <1>     db  000h, 000h, 000h, 000h, 000h, 036h, 06ch, 0d8h, 06ch, 036h, 000h, 000h, 000h, 000h, 000h, 000h
   653 0001746D 36000000000000      <1>
   654 00017474 0000000000D86C366C- <1>     db  000h, 000h, 000h, 000h, 000h, 0d8h, 06ch, 036h, 06ch, 0d8h, 000h, 000h, 000h, 000h, 000h, 000h
   654 0001747D D8000000000000      <1>
   655 00017484 114411441144114411- <1>     db  011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h
   655 0001748D 44114411441144      <1>
   656 00017494 55AA55AA55AA55AA55- <1>     db  055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah
   656 0001749D AA55AA55AA55AA      <1>
   657 000174A4 DD77DD77DD77DD77DD- <1>     db  0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h
   657 000174AD 77DD77DD77DD77      <1>
   658 000174B4 181818181818181818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   658 000174BD 18181818181818      <1>
   659 000174C4 18181818181818F818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   659 000174CD 18181818181818      <1>
   660 000174D4 1818181818F818F818- <1>     db  018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   660 000174DD 18181818181818      <1>
   661 000174E4 36363636363636F636- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 0f6h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   661 000174ED 36363636363636      <1>
   662 000174F4 00000000000000FE36- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   662 000174FD 36363636363636      <1>
   663 00017504 0000000000F818F818- <1>     db  000h, 000h, 000h, 000h, 000h, 0f8h, 018h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   663 0001750D 18181818181818      <1>
   664 00017514 3636363636F606F636- <1>     db  036h, 036h, 036h, 036h, 036h, 0f6h, 006h, 0f6h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   664 0001751D 36363636363636      <1>
   665 00017524 363636363636363636- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   665 0001752D 36363636363636      <1>
   666 00017534 0000000000FE06F636- <1>     db  000h, 000h, 000h, 000h, 000h, 0feh, 006h, 0f6h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   666 0001753D 36363636363636      <1>
   667 00017544 3636363636F606FE00- <1>     db  036h, 036h, 036h, 036h, 036h, 0f6h, 006h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   667 0001754D 00000000000000      <1>
   668 00017554 36363636363636FE00- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   668 0001755D 00000000000000      <1>
   669 00017564 1818181818F818F800- <1>     db  018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 0f8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   669 0001756D 00000000000000      <1>
   670 00017574 00000000000000F818- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   670 0001757D 18181818181818      <1>
   671 00017584 181818181818181F00- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 01fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   671 0001758D 00000000000000      <1>
   672 00017594 18181818181818FF00- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   672 0001759D 00000000000000      <1>
   673 000175A4 00000000000000FF18- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   673 000175AD 18181818181818      <1>
   674 000175B4 181818181818181F18- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   674 000175BD 18181818181818      <1>
   675 000175C4 00000000000000FF00- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   675 000175CD 00000000000000      <1>
   676 000175D4 18181818181818FF18- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   676 000175DD 18181818181818      <1>
   677 000175E4 18181818181F181F18- <1>     db  018h, 018h, 018h, 018h, 018h, 01fh, 018h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   677 000175ED 18181818181818      <1>
   678 000175F4 363636363636363736- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   678 000175FD 36363636363636      <1>
   679 00017604 363636363637303F00- <1>     db  036h, 036h, 036h, 036h, 036h, 037h, 030h, 03fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   679 0001760D 00000000000000      <1>
   680 00017614 00000000003F303736- <1>     db  000h, 000h, 000h, 000h, 000h, 03fh, 030h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   680 0001761D 36363636363636      <1>
   681 00017624 3636363636F700FF00- <1>     db  036h, 036h, 036h, 036h, 036h, 0f7h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   681 0001762D 00000000000000      <1>
   682 00017634 0000000000FF00F736- <1>     db  000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0f7h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   682 0001763D 36363636363636      <1>
   683 00017644 363636363637303736- <1>     db  036h, 036h, 036h, 036h, 036h, 037h, 030h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   683 0001764D 36363636363636      <1>
   684 00017654 0000000000FF00FF00- <1>     db  000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   684 0001765D 00000000000000      <1>
   685 00017664 3636363636F700F736- <1>     db  036h, 036h, 036h, 036h, 036h, 0f7h, 000h, 0f7h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   685 0001766D 36363636363636      <1>
   686 00017674 1818181818FF00FF00- <1>     db  018h, 018h, 018h, 018h, 018h, 0ffh, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   686 0001767D 00000000000000      <1>
   687 00017684 36363636363636FF00- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   687 0001768D 00000000000000      <1>
   688 00017694 0000000000FF00FF18- <1>     db  000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   688 0001769D 18181818181818      <1>
   689 000176A4 00000000000000FF36- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   689 000176AD 36363636363636      <1>
   690 000176B4 363636363636363F00- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 03fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   690 000176BD 00000000000000      <1>
   691 000176C4 18181818181F181F00- <1>     db  018h, 018h, 018h, 018h, 018h, 01fh, 018h, 01fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   691 000176CD 00000000000000      <1>
   692 000176D4 00000000001F181F18- <1>     db  000h, 000h, 000h, 000h, 000h, 01fh, 018h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   692 000176DD 18181818181818      <1>
   693 000176E4 000000000000003F36- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 03fh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   693 000176ED 36363636363636      <1>
   694 000176F4 36363636363636FF36- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 0ffh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   694 000176FD 36363636363636      <1>
   695 00017704 1818181818FF18FF18- <1>     db  018h, 018h, 018h, 018h, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   695 0001770D 18181818181818      <1>
   696 00017714 18181818181818F800- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 0f8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   696 0001771D 00000000000000      <1>
   697 00017724 000000000000001F18- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   697 0001772D 18181818181818      <1>
   698 00017734 FFFFFFFFFFFFFFFFFF- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   698 0001773D FFFFFFFFFFFFFF      <1>
   699 00017744 00000000000000FFFF- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   699 0001774D FFFFFFFFFFFFFF      <1>
   700 00017754 F0F0F0F0F0F0F0F0F0- <1>     db  0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h
   700 0001775D F0F0F0F0F0F0F0      <1>
   701 00017764 0F0F0F0F0F0F0F0F0F- <1>     db  00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh
   701 0001776D 0F0F0F0F0F0F0F      <1>
   702 00017774 FFFFFFFFFFFFFF0000- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   702 0001777D 00000000000000      <1>
   703 00017784 000000000076DCD8D8- <1>     db  000h, 000h, 000h, 000h, 000h, 076h, 0dch, 0d8h, 0d8h, 0d8h, 0dch, 076h, 000h, 000h, 000h, 000h
   703 0001778D D8DC7600000000      <1>
   704 00017794 000078CCCCCCD8CCC6- <1>     db  000h, 000h, 078h, 0cch, 0cch, 0cch, 0d8h, 0cch, 0c6h, 0c6h, 0c6h, 0cch, 000h, 000h, 000h, 000h
   704 0001779D C6C6CC00000000      <1>
   705 000177A4 0000FEC6C6C0C0C0C0- <1>     db  000h, 000h, 0feh, 0c6h, 0c6h, 0c0h, 0c0h, 0c0h, 0c0h, 0c0h, 0c0h, 0c0h, 000h, 000h, 000h, 000h
   705 000177AD C0C0C000000000      <1>
   706 000177B4 00000000FE6C6C6C6C- <1>     db  000h, 000h, 000h, 000h, 0feh, 06ch, 06ch, 06ch, 06ch, 06ch, 06ch, 06ch, 000h, 000h, 000h, 000h
   706 000177BD 6C6C6C00000000      <1>
   707 000177C4 000000FEC660301830- <1>     db  000h, 000h, 000h, 0feh, 0c6h, 060h, 030h, 018h, 030h, 060h, 0c6h, 0feh, 000h, 000h, 000h, 000h
   707 000177CD 60C6FE00000000      <1>
   708 000177D4 00000000007ED8D8D8- <1>     db  000h, 000h, 000h, 000h, 000h, 07eh, 0d8h, 0d8h, 0d8h, 0d8h, 0d8h, 070h, 000h, 000h, 000h, 000h
   708 000177DD D8D87000000000      <1>
   709 000177E4 000000006666666666- <1>     db  000h, 000h, 000h, 000h, 066h, 066h, 066h, 066h, 066h, 07ch, 060h, 060h, 0c0h, 000h, 000h, 000h
   709 000177ED 7C6060C0000000      <1>
   710 000177F4 0000000076DC181818- <1>     db  000h, 000h, 000h, 000h, 076h, 0dch, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   710 000177FD 18181800000000      <1>
   711 00017804 0000007E183C666666- <1>     db  000h, 000h, 000h, 07eh, 018h, 03ch, 066h, 066h, 066h, 03ch, 018h, 07eh, 000h, 000h, 000h, 000h
   711 0001780D 3C187E00000000      <1>
   712 00017814 000000386CC6C6FEC6- <1>     db  000h, 000h, 000h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 06ch, 038h, 000h, 000h, 000h, 000h
   712 0001781D C66C3800000000      <1>
   713 00017824 0000386CC6C6C66C6C- <1>     db  000h, 000h, 038h, 06ch, 0c6h, 0c6h, 0c6h, 06ch, 06ch, 06ch, 06ch, 0eeh, 000h, 000h, 000h, 000h
   713 0001782D 6C6CEE00000000      <1>
   714 00017834 00001E30180C3E6666- <1>     db  000h, 000h, 01eh, 030h, 018h, 00ch, 03eh, 066h, 066h, 066h, 066h, 03ch, 000h, 000h, 000h, 000h
   714 0001783D 66663C00000000      <1>
   715 00017844 00000000007EDBDBDB- <1>     db  000h, 000h, 000h, 000h, 000h, 07eh, 0dbh, 0dbh, 0dbh, 07eh, 000h, 000h, 000h, 000h, 000h, 000h
   715 0001784D 7E000000000000      <1>
   716 00017854 00000003067EDBDBF3- <1>     db  000h, 000h, 000h, 003h, 006h, 07eh, 0dbh, 0dbh, 0f3h, 07eh, 060h, 0c0h, 000h, 000h, 000h, 000h
   716 0001785D 7E60C000000000      <1>
   717 00017864 00001C3060607C6060- <1>     db  000h, 000h, 01ch, 030h, 060h, 060h, 07ch, 060h, 060h, 060h, 030h, 01ch, 000h, 000h, 000h, 000h
   717 0001786D 60301C00000000      <1>
   718 00017874 0000007CC6C6C6C6C6- <1>     db  000h, 000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   718 0001787D C6C6C600000000      <1>
   719 00017884 00000000FE0000FE00- <1>     db  000h, 000h, 000h, 000h, 0feh, 000h, 000h, 0feh, 000h, 000h, 0feh, 000h, 000h, 000h, 000h, 000h
   719 0001788D 00FE0000000000      <1>
   720 00017894 0000000018187E1818- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 07eh, 018h, 018h, 000h, 000h, 0ffh, 000h, 000h, 000h, 000h
   720 0001789D 0000FF00000000      <1>
   721 000178A4 00000030180C060C18- <1>     db  000h, 000h, 000h, 030h, 018h, 00ch, 006h, 00ch, 018h, 030h, 000h, 07eh, 000h, 000h, 000h, 000h
   721 000178AD 30007E00000000      <1>
   722 000178B4 0000000C1830603018- <1>     db  000h, 000h, 000h, 00ch, 018h, 030h, 060h, 030h, 018h, 00ch, 000h, 07eh, 000h, 000h, 000h, 000h
   722 000178BD 0C007E00000000      <1>
   723 000178C4 00000E1B1B18181818- <1>     db  000h, 000h, 00eh, 01bh, 01bh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   723 000178CD 18181818181818      <1>
   724 000178D4 1818181818181818D8- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0d8h, 0d8h, 0d8h, 070h, 000h, 000h, 000h, 000h
   724 000178DD D8D87000000000      <1>
   725 000178E4 000000001818007E00- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 000h, 07eh, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h
   725 000178ED 18180000000000      <1>
   726 000178F4 000000000076DC0076- <1>     db  000h, 000h, 000h, 000h, 000h, 076h, 0dch, 000h, 076h, 0dch, 000h, 000h, 000h, 000h, 000h, 000h
   726 000178FD DC000000000000      <1>
   727 00017904 00386C6C3800000000- <1>     db  000h, 038h, 06ch, 06ch, 038h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   727 0001790D 00000000000000      <1>
   728 00017914 000000000000001818- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   728 0001791D 00000000000000      <1>
   729 00017924 000000000000000018- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   729 0001792D 00000000000000      <1>
   730 00017934 000F0C0C0C0C0CEC6C- <1>     db  000h, 00fh, 00ch, 00ch, 00ch, 00ch, 00ch, 0ech, 06ch, 06ch, 03ch, 01ch, 000h, 000h, 000h, 000h
   730 0001793D 6C3C1C00000000      <1>
   731 00017944 00D86C6C6C6C6C0000- <1>     db  000h, 0d8h, 06ch, 06ch, 06ch, 06ch, 06ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   731 0001794D 00000000000000      <1>
   732 00017954 0070D83060C8F80000- <1>     db  000h, 070h, 0d8h, 030h, 060h, 0c8h, 0f8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   732 0001795D 00000000000000      <1>
   733 00017964 000000007C7C7C7C7C- <1>     db  000h, 000h, 000h, 000h, 07ch, 07ch, 07ch, 07ch, 07ch, 07ch, 07ch, 000h, 000h, 000h, 000h, 000h
   733 0001796D 7C7C0000000000      <1>
   734 00017974 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   734 0001797D 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
  3788                                  
  3789                                  ; 20/11/2020
  3790                                  vbe2_bochs_vbios:
  3791                                  ;	db "BOCHS/QEMU"
  3792 00017984 424F4348532F51454D-     	db "BOCHS/QEMU/VIRTUALBOX"  ; 26/11/2020
  3792 0001798D 552F5649525455414C-
  3792 00017996 424F58             
  3793                                  ;vbe_vnumber equ vbe2_bochs_vbios + 28 ; "3" or "2"
  3794                                  ; 26/11/2020
  3795                                  vbe_vnumber equ vbe2_bochs_vbios + 30 ; "3" or "2"
  3796                                  ; 15/11/2020
  3797                                  vesa_vbe3_bios_msg:
  3798                                  	;db " VESA VBE version 3 Video BIOS ..."
  3799 00017999 205645534120564245-     	db " VESA VBE3 Video BIOS ..." ; 26/11/2020
  3799 000179A2 3320566964656F2042-
  3799 000179AB 494F53202E2E2E     
  3800 000179B2 0D0A0D0A00              	db 0Dh, 0Ah, 0Dh, 0Ah, 0
  3801                                  
  3802                                  ; 28/02/2021
  3803 000179B7 18                      truecolor: db 24
  3804                                  
  3805                                  align 2
  3806                                  
  3807                                  ; EPOCH Variables
  3808                                  ; 13/04/2015 - Retro UNIX 386 v1 Beginning
  3809                                  ; 09/04/2013 epoch variables
  3810                                  ; Retro UNIX 8086 v1 Prototype: UNIXCOPY.ASM, 10/03/2013
  3811                                  ;
  3812 000179B8 B207                    year: 	dw 1970
  3813 000179BA 0100                    month: 	dw 1
  3814 000179BC 0100                    day: 	dw 1
  3815 000179BE 0000                    hour: 	dw 0
  3816 000179C0 0000                    minute: dw 0
  3817 000179C2 0000                    second: dw 0
  3818                                  
  3819                                  DMonth:
  3820 000179C4 0000                    	dw 0
  3821 000179C6 1F00                    	dw 31
  3822 000179C8 3B00                    	dw 59
  3823 000179CA 5A00                    	dw 90
  3824 000179CC 7800                    	dw 120
  3825 000179CE 9700                    	dw 151
  3826 000179D0 B500                    	dw 181
  3827 000179D2 D400                    	dw 212
  3828 000179D4 F300                    	dw 243
  3829 000179D6 1101                    	dw 273
  3830 000179D8 3001                    	dw 304
  3831 000179DA 4E01                    	dw 334
  3832                                  
  3833                                  ; 15/11/2020
  3834 000179DC 00                      db	0
  3835                                  kernel_version_msg: ; 17/04/2021
  3836                                  ;;;;;;db "TRDOS (386) Kernel v2.0.4 by Erdogan Tan"
  3837                                  ;;;;;db	"TRDOS (386) Kernel v2.0.5 by Erdogan Tan" ; 11/08/2022
  3838                                  ;;;;db	"TRDOS (386) Kernel v2.0.6 by Erdogan Tan" ; 29/08/2023
  3839                                  ;;;db	"TRDOS (386) Kernel v2.0.7 by Erdogan Tan" ; 20/10/2023
  3840                                  ;;db	"TRDOS (386) Kernel v2.0.8 by Erdogan Tan" ; 16/05/2024
  3841                                  ;db	"TRDOS (386) Kernel v2.0.9 by Erdogan Tan" ; 20/08/2024
  3842 000179DD 5452444F5320283338-     db	"TRDOS (386) Kernel v2.0.10 by Erdogan Tan" ; 11/01/2025
  3842 000179E6 3629204B65726E656C-
  3842 000179EF 2076322E302E313020-
  3842 000179F8 6279204572646F6761-
  3842 00017A01 6E2054616E         
  3843 00017A06 00                      db	0
  3844                                  
  3845                                  ; 20/02/2017
  3846                                  KERNELFSIZE  equ $  ; 04/07/2016
  3847                                  
  3848                                  bss_start:
  3849                                  
  3850                                  ABSOLUTE bss_start
  3851                                  
  3852 00017A07 ??                      alignb 8 ; 25/12/2016
  3853                                  
  3854                                  	; 15/04/2016
  3855                                  	; TRDOS 386 (TRDOS v2.0)
  3856                                  	; 	80 interrupts 	
  3857                                  	; 11/03/2015
  3858                                  	; Interrupt Descriptor Table (20/08/2014)
  3859                                  idt:
  3860                                  	;resb	64*8 ; INT 0 to INT 3Fh
  3861                                  	; 15/04/2016
  3862 00017A08 <res 280h>              	resb	80*8 ; INT 0 to INT 4Fh
  3863                                  
  3864                                  idt_end:
  3865                                  
  3866                                  ;alignb 4
  3867                                  
  3868                                  task_state_segment:
  3869                                  	; 24/03/2015
  3870 00017C88 ????                    tss.link:   resw 1
  3871 00017C8A ????                    	    resw 1
  3872                                  ; tss offset 4	
  3873 00017C8C ????????                tss.esp0:   resd 1
  3874 00017C90 ????                    tss.ss0:    resw 1
  3875 00017C92 ????                    	    resw 1	
  3876 00017C94 ????????                tss.esp1:   resd 1
  3877 00017C98 ????                    tss.ss1:    resw 1
  3878 00017C9A ????                    	    resw 1 	
  3879 00017C9C ????????                tss.esp2:   resd 1
  3880 00017CA0 ????                    tss.ss2:    resw 1
  3881 00017CA2 ????                    	    resw 1
  3882                                  ; tss offset 28
  3883 00017CA4 ????????                tss.CR3:    resd 1
  3884 00017CA8 ????????                tss.eip:    resd 1
  3885 00017CAC ????????                tss.eflags: resd 1
  3886                                  ; tss offset 40
  3887 00017CB0 ????????                tss.eax:    resd 1		 		
  3888 00017CB4 ????????                tss.ecx:    resd 1
  3889 00017CB8 ????????                tss.edx:    resd 1
  3890 00017CBC ????????                tss.ebx:    resd 1
  3891 00017CC0 ????????                tss.esp:    resd 1
  3892 00017CC4 ????????                tss.ebp:    resd 1
  3893 00017CC8 ????????                tss.esi:    resd 1
  3894 00017CCC ????????                tss.edi:    resd 1
  3895                                  ; tss offset 72
  3896 00017CD0 ????                    tss.ES:     resw 1
  3897 00017CD2 ????                    	    resw 1	
  3898 00017CD4 ????                    tss.CS:	    resw 1
  3899 00017CD6 ????                    	    resw 1
  3900 00017CD8 ????                    tss.SS:	    resw 1
  3901 00017CDA ????                    	    resw 1
  3902 00017CDC ????                    tss.DS:	    resw 1
  3903 00017CDE ????                    	    resw 1
  3904 00017CE0 ????                    tss.FS:	    resw 1
  3905 00017CE2 ????                    	    resw 1
  3906 00017CE4 ????                    tss.GS:	    resw 1
  3907 00017CE6 ????                    	    resw 1		
  3908 00017CE8 ????                    tss.LDTR:   resw 1
  3909 00017CEA ????                    	    resw 1
  3910                                  ; tss offset 100		
  3911 00017CEC ????                    	    resw 1		
  3912 00017CEE ????                    tss.IOPB:   resw 1
  3913                                  ; tss offset 104 
  3914                                  tss_end:
  3915                                  
  3916 00017CF0 ????????                k_page_dir:  resd 1 ; Kernel's (System) Page Directory address
  3917                                  		    ; (Physical address = Virtual address)	 	
  3918 00017CF4 ????????                memory_size: resd 1 ; memory size in pages
  3919 00017CF8 ????????                free_pages:  resd 1 ; number of free pages		
  3920 00017CFC ????????                next_page:   resd 1 ; offset value in M.A.T. for
  3921                                  		    ; first free page search
  3922 00017D00 ????????                last_page:   resd 1 ; offset value in M.A.T. which
  3923                                  		    ; next free page search will be
  3924                                  		    ; stopped after it. (end of M.A.T.)
  3925 00017D04 ????????                first_page:  resd 1 ; offset value in M.A.T. which
  3926                                  		    ; first free page search
  3927                                  		    ; will be started on it. (for user)
  3928 00017D08 ????????                mat_size:    resd 1 ; Memory Allocation Table size in pages
  3929                                  
  3930                                  ; 20/11/2020
  3931                                  ;vbe2bios:    resw 1 ; VBE2 video bios ID (bochs/qemu)
  3932                                  ;		    ; (0B0C4h or 0B0C5h for bochs/plex86 vgabios)				
  3933                                  
  3934                                  ; 02/09/2014 (Retro UNIX 386 v1)
  3935                                  ; 04/12/2013 (Retro UNIX 8086 v1)
  3936 00017D0C ????                    CRT_START:   resw 1 	  ; starting address in regen buffer
  3937                                  			  ; NOTE: active page only	
  3938 00017D0E <res 10h>               CURSOR_POSN: resw 8 ; cursor positions for video pages
  3939                                  ACTIVE_PAGE: 
  3940 00017D1E ??                      ptty: 	     resb 1 ; current tty
  3941                                  ; 01/07/2015 - 29/01/2016
  3942 00017D1F ??                      ccolor:	     resb 1 ; current color attribute
  3943                                  ; 26/10/2015
  3944                                  ; 07/09/2014
  3945 00017D20 <res 14h>               ttychr:      resw ntty+2 ; Character buffer (multiscreen)
  3946                                  
  3947                                  ; 18/05/2015 (03/06/2013 - Retro UNIX 8086 v1 feature only!)
  3948 00017D34 ????????                p_time:      resd 1     ; present time (for systime & sysmdate)
  3949                                  
  3950                                  ; 18/05/2015 (16/08/2013 - Retro UNIX 8086 v1 feature only !)
  3951                                  ; (open mode locks for pseudo TTYs)
  3952                                  ; [ major tty locks (return error in any conflicts) ]
  3953 00017D38 <res 14h>               ttyl:        resw ntty+2 ; opening locks for TTYs.
  3954                                  
  3955                                  ; 15/04/2015 (Retro UNIX 386 v1)
  3956                                  ; 22/09/2013 (Retro UNIX 8086 v1)
  3957 00017D4C <res Ah>                wlist:       resb ntty+2 ; wait channel list (0 to 9 for TTYs)
  3958                                  ; 15/04/2015 (Retro UNIX 386 v1)
  3959                                  ;; 12/07/2014 -> sp_init set comm. parameters as 0E3h
  3960                                  ;; 0 means serial port is not available 
  3961                                  ;;comprm: ; 25/06/2014
  3962 00017D56 ??                      com1p:       resb 1  ;;0E3h
  3963 00017D57 ??                      com2p:       resb 1  ;;0E3h
  3964                                  
  3965                                  ; 17/11/2015
  3966                                  ; request for response (from the terminal)	
  3967 00017D58 ????                    req_resp:    resw 1 			
  3968                                  ; 07/11/2015
  3969 00017D5A ??                      ccomport:    resb 1 ; current COM (serial) port
  3970                                  		    ; (0= COM1, 1= COM2)
  3971                                  ; 09/11/2015
  3972 00017D5B ??                      comqr:	     resb 1 ; 'query or response' sign (u9.s, 'sndc')
  3973                                  ; 07/11/2015
  3974 00017D5C ????                    rchar:	     resw 1 ; last received char for COM 1 and COM 2		
  3975 00017D5E ????                    schar:	     resw 1 ; last sent char for COM 1 and COM 2
  3976                                  
  3977                                  ; 22/08/2014 (RTC)
  3978                                  ; (Packed BCD)
  3979 00017D60 ??                      time_seconds: resb 1
  3980 00017D61 ??                      time_minutes: resb 1
  3981 00017D62 ??                      time_hours:   resb 1
  3982 00017D63 ??                      date_wday:    resb 1
  3983 00017D64 ??                      date_day:     resb 1
  3984 00017D65 ??                      date_month:   resb 1			
  3985 00017D66 ??                      date_year:    resb 1
  3986 00017D67 ??                      date_century: resb 1
  3987                                  
  3988                                  ; 24/01/2016
  3989 00017D68 ????????                RTC_LH:	       resd 1
  3990 00017D6C ??                      RTC_WAIT_FLAG: resb 1
  3991 00017D6D ??                      USER_FLAG:     resb 1
  3992                                  ; 19/05/2016
  3993                                  ;RTC_second:
  3994 00017D6E ??                      RTC_2Hz:       resb 1 ;  from 2Hz interrupt to 1Hz timer event function	
  3995                                  
  3996                                  %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 00017D6F ??                  <1> alignb 2
    24                              <1> 
    25                              <1> ;----------------------------------------
    26                              <1> ;	TIMER DATA AREA 		:
    27                              <1> ;----------------------------------------
    28                              <1> 
    29                              <1> TIMER_LH:	; 16/02/2015
    30 00017D70 ????                <1> TIMER_LOW:      resw	1               ; LOW WORD OF TIMER COUNT
    31 00017D72 ????                <1> TIMER_HIGH:     resw	1               ; HIGH WORD OF TIMER COUNT
    32 00017D74 ??                  <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 00017D75 ??                  <1> SEEK_STATUS:	resb	1
    39 00017D76 ??                  <1> MOTOR_STATUS:	resb	1
    40 00017D77 ??                  <1> MOTOR_COUNT:	resb	1
    41 00017D78 ??                  <1> DSKETTE_STATUS:	resb	1
    42 00017D79 ??????????????      <1> NEC_STATUS:	resb	7
    43                              <1> 
    44                              <1> ;----------------------------------------
    45                              <1> ;	ADDITIONAL MEDIA DATA		:
    46                              <1> ;----------------------------------------
    47                              <1> 
    48 00017D80 ??                  <1> LASTRATE:	resb 	1
    49 00017D81 ??                  <1> HF_STATUS:	resb 	1
    50                              <1> ; 06/08/2022
    51                              <1> ;HF_ERROR:	resb 	1
    52 00017D82 ??                  <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 00017D83 ????                <1> DSK_STATE:	resb	2 	
    58 00017D85 ????                <1> DSK_TRK:	resb 	2
    59                              <1> 
    60                              <1> ;----------------------------------------
    61                              <1> ;	FIXED DISK DATA AREAS		:
    62                              <1> ;----------------------------------------
    63                              <1> 
    64 00017D87 ??                  <1> DISK_STATUS1:	resb 	1		; FIXED DISK STATUS
    65 00017D88 ??                  <1> HF_NUM:		resb 	1		; COUNT OF FIXED DISK DRIVES
    66 00017D89 ??                  <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 00017D8A ????                <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 00017D8C ????????            <1> HDPM_TBL_VEC:	resd	1 		; Primary master disk param. tbl. pointer
    77 00017D90 ????????            <1> HDPS_TBL_VEC:	resd	1		; Primary slave disk param. tbl. pointer
    78 00017D94 ????????            <1> HDSM_TBL_VEC:	resd	1 		; Secondary master disk param. tbl. pointer
    79 00017D98 ????????            <1> HDSS_TBL_VEC:	resd	1		; Secondary slave disk param. tbl. pointer
    80                              <1> 
    81                              <1> ; 03/01/2015
    82 00017D9C ??                  <1> LBAMode:     	resb	1
    83                              <1> 
    84                              <1> ; *****************************************************************************
  3997                                  
  3998                                  ;;; Real Mode Data (10/07/2015 - BSS)
  3999                                  
  4000                                  ;alignb 2
  4001                                  
  4002                                  ; 10/01/2016
  4003                                  %include 'trdoskx.s'	; UNINITIALIZED KERNEL (Logical Drive & FS) DATA
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.10) - UNINITIALIZED DATA : trdoskx.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 17/07/2025 (Previous: 01/09/2024 - Kernel v2.0.9)
     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 00017D9D ??????              <1> alignb 4
    20                              <1> 
    21                              <1> ; MAINPROG.ASM
    22 00017DA0 ????????            <1> MainProgCfg_FileSize:   resd 1 ; 14/04/2016
    23 00017DA4 ????????            <1> MainProgCfg_LineOffset: resd 1 ; 14/04/2016
    24                              <1> 
    25 00017DA8 ????????            <1> Current_VolSerial: resd 1
    26                              <1> 
    27 00017DAC ????????            <1> Current_Dir_FCluster: resd 1
    28                              <1> 
    29 00017DB0 ??                  <1> Current_Dir_Level: resb 1
    30 00017DB1 ??                  <1> Current_FATType: resb 1
    31 00017DB2 ??                  <1> Current_Drv: resb 1
    32 00017DB3 ??                  <1> Current_Dir_Drv:   resb 1 ; '?'
    33 00017DB4 ??                  <1>                    resb 1 ; ':'
    34 00017DB5 ??                  <1> Current_Dir_Root:  resb 1 ; '/'
    35 00017DB6 <res 5Ah>           <1> Current_Directory: resb 90
    36 00017E10 ??                  <1> End_Of_Current_Dir_Str: resb 1
    37 00017E11 ??                  <1> Current_Dir_StrLen: resb 1
    38                              <1> 
    39 00017E12 ??                  <1> CursorColumn: 	resb 1
    40 00017E13 ??                  <1> CmdArgStart:    resb 1
    41                              <1> 
    42                              <1> ; 03/02/2016
    43 00017E14 <res 4Eh>           <1> Remark:		resb 78
    44                              <1> 
    45 00017E62 <res 50h>           <1> CommandBuffer: 	resb 80
    46                              <1> 
    47                              <1> ;TextBuffer:	;resb 256
    48                              <1> ; 04/07/2025
    49 00017EB2 <res 80h>           <1> TextBuffer:	resb 128
    50 00017F32 <res 80h>           <1> RunPathBuffer:	resb 128
    51                              <1> 
    52                              <1> MasterBootBuff:
    53 00017FB2 <res 1BEh>          <1> MasterBootCode: resb 1BEh
    54 00018170 <res 40h>           <1> PartitionTable: resb 64
    55 000181B0 ????                <1> MBIDCode: resw 1
    56                              <1> 
    57                              <1> PTable_Buffer:
    58 000181B2 <res 40h>           <1> PTable_hd0: resb 64
    59 000181F2 <res 40h>           <1> PTable_hd1: resb 64
    60 00018232 <res 40h>           <1> PTable_hd2: resb 64
    61 00018272 <res 40h>           <1> PTable_hd3: resb 64
    62                              <1> ; 15/07/2020
    63                              <1> ;PTable_ep0: resb 64
    64                              <1> ;PTable_ep1: resb 64
    65                              <1> ;PTable_ep2: resb 64
    66                              <1> ;PTable_ep3: resb 64
    67                              <1> 
    68                              <1> ; 22/05/2024
    69 000182B2 ????????            <1> HD_LBA_yes: resd 1
    70                              <1> ; 13/08/2020
    71 000182B6 ??                  <1> scount: resb 1 ; 16/05/2016 (diskio.s, 'int33h:')
    72                              <1> ; 22/05/2024
    73                              <1> 	;resb 1
    74                              <1> 	;resb 1
    75                              <1> 	;resb 1
    76                              <1> ;HD_LBA_yes: resb 1
    77 000182B7 ??                  <1> PP_Counter: resb 1
    78 000182B8 ??                  <1> EP_Counter: resb 1
    79                              <1> ; 13/08/2020
    80 000182B9 ??                  <1> LD_Counter: resb 1
    81                              <1> 
    82                              <1> ; 30/08/2020
    83 000182BA ????????            <1> MBR_EP_StartSector: resd 1
    84                              <1> 		; Extd partition start sector as in MBR
    85 000182BE ????????            <1> EP_StartSector: resd 1 ; next extd partition start sector
    86                              <1> 	; 15/07/2020
    87                              <1>                 ;resd 1
    88                              <1>                 ;resd 1
    89                              <1> 
    90                              <1> ; 20/07/2020
    91 000182C2 <res 200h>          <1> DOSBootSectorBuff: resb 512
    92                              <1> ; 15/07/2020
    93                              <1> ;DOSBootSectorBuff: resb 446 ; 1BEh
    94                              <1> ;MiniPartitionTable: resb 64 ;  40h
    95                              <1> ;MiniPartitionMagic: resw  1 ;  02h
    96                              <1> 
    97                              <1> FAT_BuffDescriptor:
    98 000184C2 ????????            <1> FAT_CurrentCluster: resd 1
    99 000184C6 ??                  <1> FAT_BuffValidData: resb 1
   100 000184C7 ??                  <1> FAT_BuffDrvName: resb 1
   101 000184C8 ????                <1> FAT_BuffOffset: resw 1
   102 000184CA ????????            <1> FAT_BuffSector: resd 1
   103                              <1> 
   104 000184CE ????????            <1> FAT_ClusterCounter: resd 1
   105 000184D2 ????????            <1> LastCluster: resd 1
   106                              <1> 
   107                              <1> ; 16/05/2016
   108                              <1> ;; 18/03/2016 (TRDOS v2.0)
   109                              <1> ;ClusterBuffer_Valid: resb 1
   110                              <1> 
   111                              <1> ; 29/07/2022
   112                              <1> ;resb 1
   113                              <1> ; 02/12/2023
   114 000184D6 ??                  <1> P_TIMER: resb 1 ; diskette change check (2 seconds)
   115                              <1> 
   116                              <1> Dir_BuffDescriptor:
   117 000184D7 ??                  <1> DirBuff_DRV: resb 1
   118 000184D8 ??                  <1> DirBuff_FATType: resb 1
   119 000184D9 ??                  <1> DirBuff_ValidData: resb 1
   120 000184DA ????                <1> DirBuff_CurrentEntry: resw 1
   121 000184DC ????                <1> DirBuff_LastEntry: resw 1
   122 000184DE ????????            <1> DirBuff_Cluster: resd 1
   123 000184E2 ????                <1> DirBuffer_Size: resw 1
   124                              <1> ;DirBuff_EntryCounter: resw 1
   125                              <1> 
   126                              <1> ; 01/02/2016
   127                              <1> ; these are on (real mode) segment 8000h and later
   128                              <1> ; FAT_Buffer:	resb 1536 ; 3 sectors
   129                              <1> ; Dir_Buffer:	resb 512*32
   130                              <1> ; Logical_DOSDisks:  resb 6656 ; 26 * 256 bytes
   131                              <1> 
   132                              <1> ; 18/01/2016
   133                              <1> 
   134 000184E4 ????????            <1> FreeClusterCount: resd 1
   135                              <1> 
   136 000184E8 ????????            <1> VolSize_Unit1:   resd 1
   137 000184EC ????????            <1> VolSize_Unit2:   resd 1
   138                              <1> 
   139 000184F0 ????????            <1> Vol_Tot_Sec_Str_Start:	    resd 1
   140 000184F4 <res Ah>            <1> Vol_Tot_Sec_Str: 	    resb 10
   141 000184FE ??                  <1> Vol_Tot_Sec_Str_End:	    resb 1
   142 000184FF ??                  <1> resb 1
   143 00018500 ????????            <1> Vol_Free_Sectors_Str_Start: resd 1
   144 00018504 <res Ah>            <1> Vol_Free_Sectors_Str:	    resb 10
   145 0001850E ??                  <1> Vol_Free_Sectors_Str_End:   resb 1
   146                              <1> 
   147                              <1> ; 10/02/2016
   148 0001850F ??                  <1> RUN_CDRV: resb 1 ; CMD_INTR.ASM  ; 09/11/2011
   149                              <1> 
   150                              <1> ; 24/01/2016
   151 00018510 <res 80h>           <1> PATH_Array:     resb 128 ; DIR.ASM ; 09/10/2011
   152                              <1> ; 06/02/2016
   153 00018590 ????????            <1> CCD_DriveDT:	resd 1 ; DIR.ASM ; (word)
   154 00018594 ??                  <1> CCD_Level:	resb 1 ; DIR.ASM
   155 00018595 ??                  <1> Last_Dir_Level:	resb 1 ; DIR.ASM
   156                              <1> ;
   157 00018596 ????                <1> CDLF_AttributesMask: resw 1 ; DIR.ASM
   158 00018598 ????????            <1> CDLF_FNAddress:	resd 1 ; DIR.ASM (word)
   159 0001859C ????                <1> CDLF_DEType:	resw 1 ; DIR.ASM
   160                              <1> ;
   161 0001859E ??                  <1> CD_COMMAND:	resb 1 ; DIR.ASM
   162                              <1> 
   163 0001859F ??                  <1> alignb 4
   164                              <1> 
   165                              <1> ; 29/01/2016
   166 000185A0 ??                  <1> Program_Exit:	resb 1 ; CMD_INTR.ASM  ; 09/11/2011
   167                              <1> 
   168                              <1> ;alignb 4
   169                              <1> ; 23/02/2016
   170 000185A1 ??                  <1> disk_rw_op:	resb 1 ; 0 = disk read, 1 = disk write
   171                              <1> ;disk_rw_spt:	resb 1 ; sectors per track (<= 63) /// (<256)
   172                              <1> ; 31/01/2016
   173 000185A2 ??                  <1> retry_count: 	resb 1 ; DISK_IO.ASM ; 20/07/2011 (CHS_RetryCount)
   174 000185A3 ??                  <1> disk_rw_err: 	resb 1 ; DISK_IO.ASM ; (Disk_IO_err_code)
   175 000185A4 ????????            <1> sector_count:	resd 1 ; DISK_IO.ASM ; (Disk_RW_SectorCount)
   176                              <1> 
   177                              <1> ; 06/02/2016 (long name)
   178 000185A8 ????                <1> FDE_AttrMask:	   resw 1 ; DIR.ASM
   179 000185AA ????                <1> AmbiguousFileName: resw 1 ; DIR.ASM
   180 000185AC ??                  <1> PreviousAttr:	   resb 1 ; DIR.ASM
   181                              <1> ;
   182 000185AD ??                  <1> LongNameFound:   resb 1	  ; DIR.ASM
   183 000185AE ??                  <1> LFN_EntryLength: resb 1   ; DIR.ASM
   184 000185AF ??                  <1> LFN_CheckSum:    resb 1   ; DIR.ASM
   185 000185B0 <res 84h>           <1> LongFileName:    resb 132 ; DIR.ASM
   186                              <1> 
   187                              <1> ;PATH_Array_Ptr: resw 1 ; DIR.ASM
   188 00018634 ??                  <1> PATH_CDLevel:	 resb 1 ; DIR.ASM
   189 00018635 ??                  <1> PATH_Level:	 resb 1 ; DIR.ASM
   190                              <1> 
   191                              <1> ; 07/02/2016
   192 00018636 <res Dh>            <1> Dir_File_Name:	resb 13 ; DIR.ASM ; 09/10/2011
   193                              <1> 
   194                              <1> ; 10/02/2016
   195 00018643 <res Dh>            <1> Dir_Entry_Name:	resb 13 ; DIR.ASM
   196                              <1> 
   197                              <1> alignb 2
   198                              <1> 
   199 00018650 ????                <1> AttributesMask: resw 1 ; CMD_INTR.ASM ; 09/11/2011
   200                              <1> 
   201                              <1> ; 10/02/2016 (128 bytes -> 126 bytes)
   202                              <1> ; 08/02/2016
   203                              <1> ;FFF Structure (128 bytes) ; DIR.ASM ; 09/10/2011
   204 00018652 ??                  <1> FindFile_Drv:		  resb 1
   205 00018653 <res 41h>           <1> FindFile_Directory:	  resb 65
   206 00018694 <res Dh>            <1> FindFile_Name:		  resb 13
   207                              <1> FindFile_LongNameEntryLength:
   208 000186A1 ??                  <1> FindFile_LongNameYes: 	  resb 1 ; Sign for longname procedures
   209                              <1> ;Above 80 bytes form
   210                              <1> ;TR-DOS Source/Destination File FullName Format/Structure
   211 000186A2 ????                <1> FindFile_AttributesMask:  resw 1
   212 000186A4 <res 20h>           <1> FindFile_DirEntry:	  resb 32
   213 000186C4 ????????            <1> FindFile_DirFirstCluster: resd 1
   214 000186C8 ????????            <1> FindFile_DirCluster:	  resd 1
   215 000186CC ????                <1> FindFile_DirEntryNumber:  resw 1
   216 000186CE ????                <1> FindFile_MatchCounter:	  resw 1
   217 000186D0 ????                <1> FindFile_Reserved:	  resw 1 ; 06/03/2016
   218                              <1> 
   219 000186D2 ????????            <1> First_Path_Pos: resd 1	; DIR.ASM ; 09/10/2011
   220 000186D6 ????????            <1> Last_Slash_Pos: resd 1	; DIR.ASM
   221                              <1> 
   222                              <1> ; 10/02/2016
   223 000186DA ????                <1> File_Count:     resw 1 	; DIR.ASM ; 09/10/2011
   224 000186DC ????                <1> Dir_Count:      resw 1
   225 000186DE ????????            <1> Total_FSize:    resd 1
   226 000186E2 ????????            <1> TFS_Dec_Begin:  resd 1
   227 000186E6 <res Ah>            <1>                 resb 10
   228 000186F0 ??                  <1> TFS_Dec_End:    resb 1
   229                              <1> 
   230 000186F1 ??                  <1> PrintDir_RowCounter: resb 1
   231                              <1> 
   232 000186F2 ????                <1> alignb 4
   233                              <1> ; 15/02/2015 ('show' command variables)
   234 000186F4 ????????            <1> Show_FDT:	resd 1
   235 000186F8 ????????            <1> Show_LDDDT:	resd 1
   236 000186FC ????????            <1> Show_Cluster:	resd 1
   237 00018700 ????????            <1> Show_FileSize:	resd 1
   238 00018704 ????????            <1> Show_FilePointer: resd 1
   239 00018708 ????                <1> Show_ClusterPointer: resw 1
   240 0001870A ????                <1> Show_ClusterSize: resw 1
   241 0001870C ??                  <1> Show_RowCount:	resb 1
   242                              <1> 
   243 0001870D ??????              <1> alignb 4
   244                              <1> ; 21/02/2016
   245 00018710 ????????            <1> DelFile_FNPointer:	resd 1 ; ; CMD_INTR.ASM (word) ; 09/11/2011
   246                              <1> ; 27/02/2016
   247                              <1> ; DIR.ASM (09/10/2011)
   248 00018714 ????????            <1> DelFile_FCluster:	resd 1
   249 00018718 ????                <1> DelFile_EntryCounter:	resw 1
   250 0001871A ??                  <1> DelFile_LNEL:		resb 1
   251                              <1> ; 17/07/2025
   252                              <1> ;resb 1
   253                              <1> ; 22/02/2016
   254 0001871B ??                  <1> UPDLMDT_CDirLevel:	resb 1
   255 0001871C ????????            <1> UPDLMDT_CDirFCluster:	resd 1
   256                              <1> 
   257                              <1> ; DIR.ASM
   258 00018720 ????????            <1> mkdir_DirName_Offset: 	resd 1
   259 00018724 ????????            <1> mkdir_FFCluster:	resd 1
   260 00018728 ????????            <1> mkdir_LastDirCluster:	resd 1
   261 0001872C ????????            <1> mkdir_FreeSectors:	resd 1
   262 00018730 ????                <1> mkdir_attrib:		resw 1
   263 00018732 ??                  <1> mkdir_SecPerClust:	resb 1
   264 00018733 ??                  <1> mkdir_add_new_cluster:	resb 1
   265 00018734 <res Dh>            <1> mkdir_Name:		resb 13
   266 00018741 ????                <1> resw 1 ; 01/03/2016
   267                              <1> ; 27/02/2016
   268 00018743 ??                  <1> RmDir_MultiClusters:	resb 1
   269 00018744 ????????            <1> RmDir_DirEntryOffset:	resd 1 ; 01/03/2016 (word -> dword)
   270 00018748 ????????            <1> RmDir_ParentDirCluster: resd 1
   271 0001874C ????????            <1> RmDir_DirLastCluster:   resd 1
   272 00018750 ????????            <1> RmDir_PreviousCluster:  resd 1
   273                              <1> 
   274                              <1> ; 17/07/2025 - TRDOS 386 v2.0.10
   275 00018754 ????????            <1> rmdir_dir_fcluster:	resd 1
   276 00018758 ??                  <1> rmdir_drv:		resb 1
   277                              <1> 
   278 00018759 ??????              <1> alignb 4
   279                              <1> ; DRV_FAT.ASM ; 21/08/2011
   280 0001875C ????????            <1> gffc_next_free_cluster:  resd 1
   281 00018760 ????????            <1> gffc_first_free_cluster: resd 1
   282 00018764 ????????            <1> gffc_last_free_cluster:  resd 1
   283                              <1> 
   284                              <1> ;29/04/2016
   285                              <1> Cluster_Index: ; resd 1
   286                              <1> ; 22/02/2016
   287 00018768 ????????            <1> ClusterValue:	resd 1
   288                              <1> ; 04/03/2016
   289 0001876C ??                  <1> Attributes:	resb 1
   290                              <1> ;;CFS_error:  resb 1 ;; 01/03/2016
   291 0001876D ??                  <1> resb 1
   292 0001876E ??                  <1> CFS_OPType: resb 1
   293 0001876F ??                  <1> CFS_Drv:    resb 1
   294 00018770 ????????            <1> CFS_CC:	    resd 1
   295 00018774 ????????            <1> CFS_FAT32FSINFOSEC: resd 1
   296 00018778 ????????            <1> CFS_FAT32FC: resd 1
   297                              <1> 
   298                              <1> ; 27/02/2016
   299                              <1> ;alignb 4
   300 0001877C ????????            <1> glc_prevcluster: resd 1 ; DRV_FAT.ASM (21/08/2011)
   301                              <1> ; 22/10/2016
   302 00018780 ????????            <1> glc_index:	 resd 1 ; Last Cluster Index (22/10/2016)
   303                              <1> 
   304                              <1> ; DIR.ASM
   305 00018784 ????                <1> DLN_EntryNumber: resw 1
   306 00018786 ??                  <1> DLN_40h:	 resb 1
   307                              <1> ; 28/02/2016
   308 00018787 ??                  <1> TCC_FATErr:	 resb 1 ; DRV_FAT.ASM
   309                              <1> 
   310                              <1> alignb 4
   311                              <1> ; DIR.ASM (09/10/2011)
   312 00018788 ????                <1> LCDE_EntryIndex: resw 1 ; LCDE_EntryOffset
   313 0001878A ????                <1> LCDE_ClusterSN:  resw 1
   314 0001878C ????????            <1> LCDE_Cluster: 	 resd 1
   315 00018790 ????????            <1> LCDE_ByteOffset: resd 1
   316                              <1> 
   317                              <1> ;alignb4
   318                              <1> ; 06/03/2016 (word -> dword)
   319                              <1> ; CMD_INTR.ASM (01/08/2010)
   320 00018794 ????????            <1> SourceFilePath:	     resd 1
   321 00018798 ????????            <1> DestinationFilePath: resd 1
   322                              <1> 
   323                              <1> ;alignb 4
   324                              <1> ; 06/03/2016
   325                              <1> ; FILE.ASM (09/10/2011)
   326                              <1> ;Source File Structure (same with 'Find File' Structure)
   327 0001879C ??                  <1> SourceFile_Drv:			resb 1
   328 0001879D <res 41h>           <1> SourceFile_Directory:		resb 65
   329 000187DE <res Dh>            <1> SourceFile_Name:		resb 13
   330                              <1> SourceFile_LongNameEntryLength: 
   331 000187EB ??                  <1> SourceFile_LongNameYes:		resb 1 ; Sign for longname procedures
   332                              <1> ;Above 80 bytes
   333                              <1> ;is TR-DOS Source File FullName Format/Structure
   334 000187EC ????                <1> SourceFile_AttributesMask:	resw 1
   335 000187EE <res 20h>           <1> SourceFile_DirEntry:		resb 32
   336 0001880E ????????            <1> SourceFile_DirFirstCluster:	resd 1
   337 00018812 ????????            <1> SourceFile_DirCluster:		resd 1
   338 00018816 ????                <1> SourceFile_DirEntryNumber:	resw 1
   339 00018818 ????                <1> SourceFile_MatchCounter:	resw 1
   340                              <1> ; 16/03/2016
   341 0001881A ??                  <1> SourceFile_SecPerClust:		resb 1
   342 0001881B ??                  <1> SourceFile_Reserved:		resb 1
   343                              <1> ; Above is 128 bytes
   344                              <1> 
   345                              <1> ;Destination File Structure (same with 'Find File' Structure)
   346 0001881C ??                  <1> DestinationFile_Drv:		resb 1
   347 0001881D <res 41h>           <1> DestinationFile_Directory: 	resb 65
   348 0001885E <res Dh>            <1> DestinationFile_Name:		resb 13
   349                              <1> DestinationFile_LongNameEntryLength:
   350 0001886B ??                  <1> DestinationFile_LongNameYes:	resb 1 ; Sign for longname procedures
   351                              <1> ;Above 80 bytes
   352                              <1> ;is TR-DOS Destination File FullName Format/Structure
   353 0001886C ????                <1> DestinationFile_AttributesMask: resw 1
   354 0001886E <res 20h>           <1> DestinationFile_DirEntry:	resb 32
   355 0001888E ????????            <1> DestinationFile_DirFirstCluster: resd 1
   356 00018892 ????????            <1> DestinationFile_DirCluster:	resd 1
   357 00018896 ????                <1> DestinationFile_DirEntryNumber: resw 1
   358 00018898 ????                <1> DestinationFile_MatchCounter:	resw 1
   359                              <1> ; 16/03/2016
   360 0001889A ??                  <1> DestinationFile_SecPerClust:	resb 1
   361 0001889B ??                  <1> DestinationFile_Reserved:	resb 1
   362                              <1> ; Above is 128 bytes
   363                              <1> 
   364                              <1> ; 24/04/2016
   365 0001889C ????                <1> resw 1
   366                              <1> 
   367                              <1> ; 10/03/2016
   368                              <1> ; FILE.ASM
   369 0001889E ??                  <1> move_cmd_phase:	   resb 1
   370 0001889F ??                  <1> msftdf_sf_df_drv:  resb 1
   371 000188A0 ????????            <1> msftdf_drv_offset: resd 1
   372                              <1> 
   373                              <1> ; 11/03/2016
   374                              <1> ; DRV_FAT.ASM (21/08/2011)
   375 000188A4 ????????            <1> FAT_anc_LCluster:  resd 1
   376 000188A8 ????????            <1> FAT_anc_FFCluster: resd 1
   377                              <1> 
   378                              <1> ;alignb 4
   379                              <1> 
   380                              <1> ; 14/03/2016
   381                              <1> ; TRDOS 386 = TRDOS v2.0 feature only !
   382                              <1> ; 'allocate_memory_block' in 'memory.s'
   383 000188AC ????????            <1> mem_ipg_count:	resd 1 ; page count (for contiguous allocation)
   384 000188B0 ????????            <1> mem_pg_count:	resd 1 ; page count (for count down)
   385 000188B4 ????????            <1> mem_aperture:	resd 1 ; contiguous free pages (current)
   386 000188B8 ????????            <1> mem_max_aperture: resd 1 ; maximum value of contiguous free pages
   387 000188BC ????????            <1> mem_pg_pos:	resd 1 ; mem. position (page #) of current aperture
   388 000188C0 ????????            <1> mem_max_pg_pos: resd 1 ; mem. position (page #) of max. aperture
   389                              <1> 
   390                              <1> ; 15/03/2016
   391                              <1> ; FILE.ASM ('copy_source_file_to_destination_file')
   392 000188C4 ??                  <1> copy_cmd_phase:       resb 1
   393 000188C5 ??                  <1> csftdf_rw_err:	      resb 1
   394 000188C6 ??                  <1> DestinationFileFound: resb 1
   395 000188C7 ??                  <1> csftdf_cdrv: 	      resb 1
   396 000188C8 ????????            <1> csftdf_filesize:      resd 1
   397                              <1> ; TRDOS386 (TRDOS v2.0)
   398 000188CC ????????            <1> csftdf_sf_mem_addr:   resd 1
   399 000188D0 ????????            <1> csftdf_sf_mem_bsize:  resd 1
   400                              <1> ;
   401                              <1> 
   402 000188D4 ????????            <1> csftdf_sf_cluster:    resd 1 ; 16/03/2016
   403 000188D8 ????????            <1> csftdf_df_cluster:    resd 1
   404                              <1> ; 16/03/2016
   405 000188DC ????????            <1> csftdf_r_size:        resd 1
   406 000188E0 ????????            <1> csftdf_w_size:        resd 1
   407 000188E4 ????????            <1> csftdf_sf_rbytes:     resd 1
   408 000188E8 ????????            <1> csftdf_df_wbytes:     resd 1
   409 000188EC ??                  <1> csftdf_percentage:    resb 1
   410                              <1> ; 17/03/2016
   411 000188ED ??                  <1> csftdf_videopage:     resb 1
   412 000188EE ????                <1> csftdf_cursorpos:     resw 1
   413 000188F0 ????????            <1> csftdf_sf_drv_dt:     resd 1
   414 000188F4 ????????            <1> csftdf_df_drv_dt:     resd 1
   415                              <1> ; 01/09/2024
   416                              <1> ; 29/08/2024
   417                              <1> ;csftdf_df_dclust:    resd 1
   418                              <1> ;csftdf_df_dindex:    resd 1
   419                              <1> 
   420                              <1> ; 21/03/2016
   421                              <1> ; 20/03/2016
   422                              <1> ; FILE.ASM
   423 000188F8 ????????            <1> createfile_Name_Offset:  resd 1
   424 000188FC ????????            <1> createfile_FreeSectors:  resd 1
   425 00018900 ????????            <1> createfile_size:         resd 1
   426 00018904 ????????            <1> createfile_FFCluster:    resd 1 ; 11/03/2016
   427 00018908 ????????            <1> createfile_LastDirCluster: resd 1
   428 0001890C ????????            <1> createfile_Cluster:      resd 1
   429 00018910 ????????            <1> createfile_PCluster:     resd 1
   430 00018914 ??                  <1> createfile_attrib:	 resb 1
   431 00018915 ??                  <1> createfile_SecPerClust:  resb 1
   432 00018916 ????                <1> createfile_DirIndex:     resw 1
   433 00018918 ????????            <1> createfile_CCount:	 resd 1
   434 0001891C ????                <1> createfile_BytesPerSec:	 resw 1 ; 23/03/2016
   435 0001891E ??                  <1> createfile_wfc:	         resb 1
   436 0001891F ??                  <1> createfile_UpdatePDir:	 resb 1 ; 31/03/2016
   437                              <1> 
   438                              <1> ;alignb 4
   439                              <1> 
   440                              <1> ; 11/04/2016
   441 00018920 ????                <1> env_var_length:	resw 1
   442                              <1> 
   443 00018922 ????                <1> alignb 4
   444                              <1> 
   445                              <1> ; 25/04/2016
   446 00018924 ??                  <1> readi.valid:	resb 1 ; valid data (>0 = valid for readi)
   447 00018925 ??                  <1> readi.drv:	resb 1 ; drive number (0, 1,2,3,4..)
   448 00018926 ??                  <1> readi.spc:	resb 1 ; sectors per cluster for 'readi' drive
   449 00018927 ??                  <1> readi.s_index:  resb 1 ; sector index in current cluster (buffer)
   450 00018928 ????????            <1> readi.sector:	resd 1 ; current disk sector
   451 0001892C ????                <1> readi.bpc:	resw 1 ; bytes per cluster - 1
   452 0001892E ????                <1> readi.offset:	resw 1 ; byte offset in cluster buffer
   453 00018930 ????????            <1> readi.cluster:  resd 1 ; current cluster number
   454 00018934 ????????            <1> readi.c_index:	resd 1 ; cluster index of the current cluster (0,1,2,3..)
   455 00018938 ????????            <1> readi.fclust:	resd 1 ; first cluster of the current cluster
   456 0001893C ????????            <1> readi.fs_index: resd 1 ; sector index in disk/file section (for Singlix FS)
   457                              <1> ;readi.buffer:	resd 1 ; readi sector buffer address
   458                              <1> 
   459                              <1> ;alignb 4
   460                              <1> 
   461 00018940 ??                  <1> writei.valid:	resb 1 ; valid data (>0 = valid for writei)
   462 00018941 ??                  <1> writei.drv:	resb 1 ; drive number (0, 1,2,3,4..)
   463 00018942 ??                  <1> writei.spc:	resb 1 ; sectors per cluster for 'writei' drive
   464 00018943 ??                  <1> writei.s_index: resb 1 ; sector index in current cluster (buffer)
   465 00018944 ????????            <1> writei.sector:	resd 1 ; current disk sector
   466 00018948 ????                <1> writei.bpc:	resw 1 ; bytes per cluster - 1
   467 0001894A ????                <1> writei.offset:	resw 1 ; byte offset in cluster buffer
   468 0001894C ????????            <1> writei.cluster: resd 1 ; current cluster number
   469 00018950 ????????            <1> writei.c_index:	resd 1 ; cluster index of the current cluster (0,1,2,3..)
   470 00018954 ????????            <1> writei.fclust:  resd 1 ; first cluster of the current cluster
   471 00018958 ????????            <1> writei.fs_index: resd 1 ; sector index in disk/file section (for Singlix FS)
   472                              <1> ;writei.buffer:	resd 1 ; writei sector buffer address
   473 0001895C ????????            <1> writei.lclust:	resd 1 ; writei last cluster (mget_w) ; 23/10/2016
   474 00018960 ????????            <1> writei.l_index:	resd 1 ; writei last cluster index (mget_w) ; 23/10/2016
   475 00018964 ??                  <1> writei.ofn:	resb 1 ; open file number (to be written) ; 23/10/2016
   476                              <1> 
   477 00018965 ??????              <1> alignb 4
   478                              <1> 
   479                              <1> ; 29/04/2016
   480 00018968 ????????            <1> Run_CDirFC:	resd 1
   481                              <1> ;Run_Auto_Path:	resb 1
   482                              <1> ; 03/07/2025
   483                              <1> Run_Path_Length:
   484 0001896C ????????            <1> 		resd 1
   485 00018970 ????????            <1> Run_Auto_Path:	resd 1
   486                              <1> Run_Manual_Path: 
   487 00018974 ??                  <1> 		resb 1 ; 0 -> auto path sequence needed
   488 00018975 ??                  <1> EXE_ID:		resb 1
   489 00018976 ??                  <1> EXE_dot:	resb 1
   490 00018977 ??                  <1> 		resb 1 ; 03/07/2025
   491                              <1> 
   492                              <1> ; 06/05/2016
   493 00018978 ????????            <1> mainprog_return_addr: resd 1
   494 0001897C ????????            <1> last_error:	resd 1  ; this will be used to return error code to MainProg
   495                              <1> 			; 'lasterror' keyword will be used later to get the
   496                              <1> 			; last error code/number/status.
   497                              <1> ; 12/05/2016
   498 00018980 ????????            <1> video_eax:	resd 1  ; eax return value of video function
   499                              <1> 
   500                              <1> ; 01/06/2016
   501 00018984 ????????            <1> user_buffer:	resd 1  ; 'diskio.s' (INT 33h, Function 08h, floppy disk type)
   502                              <1> 
   503                              <1> ; 21/05/2016 - TRDOS 386 ('swap/switch', 'rswap', [u.pri])
   504 00018988 ??                  <1> priority:	resb 1  ; running priority level of process (0,1,2)
   505                              <1> 			; (run queue which is process comes from)
   506                              <1> ; 22/05/2016 - TRDOS 386 ('set_run_sequence', 'rtc_int', 'u_timer')
   507 00018989 ??                  <1> p_change:	resb 1  ; process change status (for timer events)
   508                              <1> ; 23/05/2016 - TRDOS 386 ('clock')
   509 0001898A ??                  <1> multi_tasking:	resb 1   ; Multi Tasking status (0 = disabled, >0 = enabled)
   510                              <1> 			; (EBX will return with user buffer addr or disk type)
   511                              <1> ; 07/06/2016
   512 0001898B ??                  <1> timer_events:	resb 1  ; number of (active) timer events, <= 16
   513                              <1> 
   514                              <1> ; 24/06/2016
   515 0001898C ??                  <1> w_str_cmd:	resb 1	; WRITE_STRING command (0,1,2,3) ; video.s
   516 0001898D ??                  <1> p_crt_mode:	resb 1  ; previous video mode (=3 or 0), backup mark/sign
   517                              <1> ; 26/06/2016
   518 0001898E ??                  <1> p_crt_page:	resb 1  ; previous active page (for 'set_mode')
   519                              <1> ; 04/07/2016
   520 0001898F ??                  <1> noclearmem:	resb 1  ; if set, 'SET MODE' (INT 31h) function (AH = 4)
   521                              <1> 			; will not clear the video memory
   522                              <1> 			; (usable for graphics modes only)
   523                              <1> alignb 2
   524 00018990 ????                <1> CRT_LEN:	resw 1  ; length of regen buffer in bytes
   525 00018992 <res 10h>           <1> cursor_pposn:	resw 8  ; cursor positions backup
   526                              <1> 
   527                              <1> ; 10/07/2016 ('VGA_FONT_SETUP', INT 43H address for x86 real mode bios)
   528 000189A2 ????????            <1> VGA_INT43H:	resd 1	; 0 = default (not configured by user)
   529                              <1> 			; 0FFFFFFFFh = user defined fonts
   530                              <1> 			; address:
   531                              <1> 			; 	vgafont8
   532                              <1> 			; 	vgafont16
   533                              <1> 			; 	vgafont14
   534                              <1> 
   535                              <1> ; 25/07/2016
   536 000189A6 ??                  <1> VGA_MTYPE:	resb 1  ; 0=CTEXT,1=MTEXT,2=CGA,3=PLANAR1,4=PLANAR4,5=LINEAR
   537                              <1> 
   538                              <1> ; 23/10/2016
   539 000189A7 ??                  <1> setfmod:	resb 1	; update last modification date&time sign (if >0)
   540                              <1> 			; (it is Open File Number + 1, if > 0)
   541                              <1> ; 27/08/2024
   542 000189A8 ??                  <1> setfclust:	resb 1  ; first cluster of file
   543                              <1> 			; (is used by update lmdt proc)
   544 000189A9 ??????              <1> alignb 4
   545                              <1> 
   546                              <1> ; 16/10/2016
   547 000189AC ????????            <1> FFF_UBuffer:	resd 1  ; User's buffer address for FFF & FNF system calls
   548                              <1> ; 15/10/2016
   549 000189B0 ??                  <1> FFF_Valid:	resb 1  ; Find First File Structure validation byte
   550                              <1> 			; 0  = invalid (Find Next File can't use FFF struct)
   551                              <1> 			; >0 = valid, return type for FFF and Find Next File
   552                              <1> 			; 24 = basic parameters, 24 bytes
   553                              <1> 			; 128 = entire FFF structure/table, 128 bytes
   554                              <1> ; 16/10/2016 (FFF_Attrib: resw 1)
   555 000189B1 ??                  <1> FFF_Attrib:	resb 1	; Find First File attributes for Find Next File (LB)
   556 000189B2 ??                  <1> FFF_RType:	resb 1  ; FFF return type (0 = Basic, >0 = complete) (HB)
   557                              <1> ; 16/10/2016 - 05/10/2016 (Set Working Path)
   558 000189B3 ??                  <1> SWP_inv_fname:	resb 1	; Set Working Path - Invalid File Name
   559 000189B4 ????                <1> SWP_Mode:	resw 1	; Set Working Path - Mode
   560 000189B6 ??                  <1> SWP_DRV:	resb 1	; Set Working Path - Drive
   561 000189B7 ??                  <1> SWP_DRV_chg:	resb 1	; Set Working Path - Drive Change
   562                              <1> 
   563                              <1> ; 27/02/2017
   564 000189B8 ??                  <1> fpready:	resb 1	; '80387 fpu is ready' flag
   565                              <1> 
   566                              <1> ; 17/04/2021
   567                              <1> ; (DEVICE parameters is disabled as temporary)
   568                              <1> 
   569                              <1> ; 08/10/2016
   570                              <1> ;device_name:	resb 9  ; capitalized (and zero padded) device name
   571                              <1> 			; (example: "TTY0",0,0,0,0,0")
   572                              <1> 
   573 000189B9 ??????              <1> alignb 4
   574                              <1> 
   575                              <1> ; 08/10/2016
   576                              <1> ; 07/10/2016
   577                              <1> ; Table of kernel devices (which do not use installable device drivers)
   578                              <1> ; has been coded into KERNEL (trdosk9.s)
   579                              <1> ; 07/10/2016
   580                              <1> ; 8 installable device drivers available to install (NUMIDEV)
   581                              <1> ;IDEV_PGDIR: resd NUMIDEV
   582                              <1> 			; Page directories of installable device drivers
   583                              <1> 			;
   584                              <1> 			; Note: Virtual start address is always 400000h
   585                              <1> 			; (end of the 1st 4MB). [org 400000h]
   586                              <1> 			; Segments: KCODE, KDATA
   587                              <1> 			; Method: call 400000h (after changing page dir)
   588                              <1> 			; Query code located at the start (400000h).
   589                              <1> 			; Query code returns with
   590                              <1> 			;   eax = device type and driver version
   591                              <1> 			;         AL = Device Type minor
   592                              <1> 			;         AH = Device Type major
   593                              <1> 			;         Byte 16-23 : Version minor
   594                              <1> 			;	  Byte 24-31 : Version major - 1
   595                              <1> 			;		       (0:0 -> 1.0)
   596                              <1> 			;   ebx = initialization code address
   597                              <1> 			;   ecx = configuration table address
   598                              <1> 			;   edx = description table address
   599                              <1> 			;   esi = device (default) name address (ASCIIZ)
   600                              <1> 			;	 (name has "/DEV/" prefix)
   601                              <1> 			;   edi = dispatch table address
   602                              <1> 			;        (for calling kernel-device functions)
   603                              <1> 			;   ebp = address table address
   604                              <1> 			; Initialization code returns with
   605                              <1> 			;   eax = open code address
   606                              <1> 			;   ecx = close code address
   607                              <1> 			;   ebx = read code address
   608                              <1> 			;   edx = write code address
   609                              <1> 			;   esi = IOCTL code address
   610                              <1> 			;   edi = dispatch table address
   611                              <1> 			;   ebp = address table address
   612                              <1> 			; Address Table:
   613                              <1> 			;    Offset 0  : open code address
   614                              <1> 			;    Offset 4  : read code address
   615                              <1> 			;    Offset 8  : write code address
   616                              <1> 			;    Offset 12 : close code address
   617                              <1> 			;    Offset 16 : IOCTL code address
   618                              <1> 			;    Offset 20 : initialization code address
   619                              <1> 			;    Offset 24 : description table address
   620                              <1> 			;    Offset 28 : configuration table address
   621                              <1> 			;    Offset 32 : device name address
   622                              <1> 			;    Offset 36 : dispatch table address
   623                              <1> 			;          (for calling kernel-device functions)
   624                              <1> 
   625                              <1> ;IDEV_NAME:  resb 8*NUMIDEV
   626                              <1> 			  ; 8 byte names of installable device drivers
   627                              <1> 
   628                              <1> ;IDEV_TYPE:  resb NUMIDEV ; Driver type of installable device drivers
   629                              <1> ;IDEV_FLAGS: resb NUMIDEV ; Device access parameters for installable
   630                              <1>                           ; device drivers (These values are set while
   631                              <1> 			  ; the device driver is being loaded.)
   632                              <1> ;IDEV_OADDR: resd NUMIDEV ; open function addr for installable dev driver
   633                              <1> ;IDEV_CADDR: resd NUMIDEV ; close function addr for installable dev driver
   634                              <1> ;IDEV_RADDR: resd NUMIDEV ; read function addr for installable dev driver
   635                              <1> ;IDEV_WADDR: resd NUMIDEV ; write function addr for installable dev driver
   636                              <1> 
   637                              <1> ; 08/10/2016
   638                              <1> ; 07/10/2016
   639                              <1> ; Device Open and Access parameters
   640                              <1> ;DEV_ACCESS:	resb NUMOFDEVICES    ; bit 0 = accessable by normal users
   641                              <1> 				     ; bit 1 = read access permission
   642                              <1> 				     ; bit 2 = write access permission
   643                              <1> 				     ; bit 3 = IOCTL permission to users
   644                              <1> 				     ; bit 4 = block device if it is set
   645                              <1> 				     ; bit 5 = 16 bit or 1024 byte data
   646                              <1> 				     ; bit 6 = 32 bit or 2048 byte data
   647                              <1> 				     ; bit 7 = installable device driver
   648                              <1> ;DEV_R_OWNER:	resb NUMOFDEVICES    ; Reading owner no (u.uid) of devices
   649                              <1> ;DEV_R_OPENCOUNT: resb NUMOFDEVICES  ; Reading open count
   650                              <1> ;DEV_W_OWNER:	resb NUMOFDEVICES    ; Writing owner no (u.uid) of devices
   651                              <1> ;DEV_W_OPENCOUNT: resb NUMOFDEVICES  ; Writing open count
   652                              <1> ;DEV_DRIVER:	resb NUMOFDEVICES    ; device driver number (1 to 7Fh)
   653                              <1> 				     ; *if bit 7 is set (80 to FFh)
   654                              <1> 				     ; *if it is installable device driver
   655                              <1> 				     ; *index (0 to 7Fh)
   656                              <1> 				     ; otherwise it is kernel device index
   657                              <1> ;DEV_OPENMODE:	resb NUMOFDEVICES    ; 1 = read mode
   658                              <1> 				     ; 2 = write mode
   659                              <1> 				     ; 3 = read & write
   660                              <1> 				     ; 0 = not open (free)
   661                              <1> ;DEV_NAME_PTR:	resd NUMOFDEVICES    ; pointers to name addresses of drivers
   662                              <1> 				     ; Address base: KDEV_NAME+
   663                              <1> 				     ; or IDEV_NAME+
   664                              <1> ;DEV_R_POINTER:	resd NUMOFDEVICES    ; reading pointer, writing pointer
   665                              <1> ;DEV_W_POINTER:	resd NUMOFDEVICES    ; sector number if block device
   666                              <1> 				     ; character offset if char device
   667                              <1> alignb 4
   668                              <1> 
   669                              <1> ; 06/10/2016
   670                              <1> ; Open File Parameters
   671 000189BC <res 80h>           <1> OF_FCLUSTER:	resd OPENFILES  ; First clusters of open files
   672 00018A3C <res 20h>           <1> OF_DRIVE:	resb OPENFILES  ; Logical DOS drive numbers of open files
   673 00018A5C <res 20h>           <1> OF_MODE:	resb OPENFILES  ; Open mode (1 = read, 2 = write, 3 = r&w)
   674 00018A7C <res 20h>           <1> OF_STATUS:	resb OPENFILES  ; (bit 0 = read, bit 1 = write)
   675 00018A9C <res 20h>           <1> OF_OPENCOUNT:	resb OPENFILES  ; Open counts of open files
   676 00018ABC <res 80h>           <1> OF_POINTER:	resd OPENFILES	; File seek/read/write pointer
   677 00018B3C <res 80h>           <1> OF_SIZE:	resd OPENFILES	; File sizes of open files (in bytes)
   678 00018BBC <res 80h>           <1> OF_DIRFCLUSTER:	resd OPENFILES  ; Directory First Clusters of open files
   679 00018C3C <res 80h>           <1> OF_DIRCLUSTER:	resd OPENFILES  ; Directory (Entry) Clusters of open files
   680 00018CBC <res 80h>           <1> OF_VOLUMEID:	resd OPENFILES  ; Vol ID for removable drives of open files
   681 00018D3C <res 80h>           <1> OF_CCLUSTER:	resd OPENFILES  ; Current clusters of open files
   682 00018DBC <res 80h>           <1> OF_CCINDEX:	resd OPENFILES  ; Cluster index numbers of current clusters
   683                              <1> ; 24/10/2016
   684 00018E3C <res 40h>           <1> OF_DIRENTRY:	resw OPENFILES  ; Directory entry index no. in dir cluster
   685                              <1> 				; Sector index = entry index / 16
   686                              <1> ;alignb 2
   687                              <1> 
   688                              <1> DTA:		;resd 24	; Find First File data transfer area
   689 00018E7C <res 18h>           <1> 		resb 24		; 29/07/2022
   690                              <1> 
   691                              <1> ; 19/12/2016
   692 00018E94 ??                  <1> tcallback:	resb 1		; Timer callback method flag for 'systimer'
   693 00018E95 ??                  <1> trtc:		resb 1		; Timer interrupt type flag for 'systimer'
   694                              <1> ; 20/02/2017
   695 00018E96 ??                  <1> no_page_swap:	resb 1		; Swap lock for Signal Response Byte pages
   696                              <1> ;;15/01/2017
   697                              <1> ; 02/01/2017
   698                              <1> ;;intflg:	resb 1		; software interrupt in progress signal
   699                              <1> 				; (for timer interrupt)
   700 00018E97 ??                  <1> alignb 4
   701                              <1> ; 13/04/2017
   702                              <1> ;DEV_INTR:	resb NUMOFDEVICES ; Device Interrupt (IRQ) number + 1
   703                              <1> 				; (0= not available, 1= IRQ 0, 16= IRQ 15)
   704 00018E98 <res 40h>           <1> DEV_INT_HNDLR:	resd 16		; Device Interrupt Handler addr, if > 0
   705                              <1> 
   706                              <1> ;alignb 4
   707                              <1> 
   708                              <1> ; 26/02/2017 ; IRQ Callback parameters ('syscalbac')
   709                              <1> ;Index: ; 0 to 8
   710                              <1> ;	0 = IRQ3, 1 = IRQ4, 2 = IRQ5, 3 = IRQ7
   711                              <1> ;	4 = IRQ9, 5 = IRQ10, 6 = IRQ11, 7 = IRQ12, 8 = IRQ13  
   712 00018ED8 <res 9h>            <1> IRQ.owner:	resb 9		; owner, 0 = free, >0 = [u.uno]
   713 00018EE1 <res 9h>            <1> IRQ.dev:	resb 9		; 0 = default/kernel, >0 = device number
   714 00018EEA <res 9h>            <1> IRQ.method:	resb 9 		; 0 = Signal Response Byte, 1 = Callback
   715 00018EF3 <res 9h>            <1> IRQ.srb:	resb 9 		; Signal Response/Return Byte value
   716 00018EFC <res 24h>           <1> IRQ.addr:	resd 9		; Rignal Response Byte address (physical)
   717                              <1> 				; or Callback service address (virtual)
   718                              <1> ; 28/02/2017
   719 00018F20 ????????            <1> IRQ_cr3:	resd 1		; for saving cr3 register in IRQ handler
   720 00018F24 ??                  <1> IRQnum:		resb 1		; IRQ number for IRQ handler (trdosk8.s)
   721                              <1> 
   722                              <1> ; 10/04/2017
   723                              <1> ; 03/04/2017
   724                              <1> ; UNINITIALIZED AUDIO DATA
   725 00018F25 ??????              <1> alignb 4
   726 00018F28 ??                  <1> audio_pci:	resb 1
   727 00018F29 ??                  <1> audio_device:	resb 1
   728                              <1> ;audio_mode:	resb 1
   729 00018F2A ??                  <1> audio_intr:	resb 1
   730 00018F2B ??                  <1> audio_busy:	resb 1  ; Busy flag for audio irq ; 21/04/2017
   731                              <1> ;audio_reserved: resb 1
   732                              <1> ; 20/11/2023
   733 00018F2C ????                <1> NAMBAR:		resw 1	; Native Audio Mixer Base Address
   734                              <1> NABMBAR:	; 02/10/2023 (NABMBAR = audio_io_base)
   735 00018F2E ????                <1> audio_io_base:	resw 1 	; Base I/O address of audio device
   736 00018F30 ????????            <1> audio_dev_id:	resd 1	; BUS/DEV/FN ; 00000000BBBBBBBBDDDDDFFF00000000
   737 00018F34 ????????            <1> audio_vendor:	resd 1
   738 00018F38 ????????            <1> audio_stats_cmd: resd 1
   739                              <1> ;
   740 00018F3C ????????            <1> audio_buffer:	resd 1	; virtual address of user's audio buffer
   741 00018F40 ????????            <1> audio_p_buffer:	resd 1	; Physical address of user's audio buffer
   742 00018F44 ????????            <1> audio_buff_size: resd 1 ; user's audio buffer size (half buffer size)
   743 00018F48 ????????            <1> audio_dma_buff: resd 1  ; dma buffer address
   744 00018F4C ????????            <1> audio_dmabuff_size: resd 1 ; dma buffer size (2 * half buffer size)
   745                              <1> ; 05/06/2024
   746 00018F50 ????????            <1> dma_hbuff_size: resd 1 ; dma half buffer size
   747                              <1> ;
   748 00018F54 ??                  <1> audio_flag:	resb 1  ; dma buffer flag (1st half = 0, 2nd half = 1)
   749 00018F55 ??                  <1> audio_user:	resb 1	; user number of the owner
   750 00018F56 ??                  <1> audio_cb_mode:	resb 1	; 0 = signal response byte method
   751                              <1> 			; 1 = callback method
   752                              <1> 			; 2 = s.r.b. method with auto increment
   753 00018F57 ??                  <1> audio_srb:	resb 1	; signal response byte value
   754 00018F58 ????????            <1> audio_cb_addr:	resd 1  ; callback service address or s.r.b. address
   755                              <1> 			; (s.r.b. addr is physical, cbs addr is virtual)
   756                              <1> 
   757 00018F5C ??                  <1> audio_bps:	resb 1  ; selected mode: 8 bit, 16 bit
   758 00018F5D ??                  <1> audio_stmo:	resb 1	; selected mode: mono /stereo
   759 00018F5E ????                <1> audio_freq: 	resw 1	; sampling rate
   760                              <1> ; 20/11/2023
   761 00018F60 ??                  <1> VRA:		resb 1
   762 00018F61 ??                  <1> audio_mode:	resb 1
   763                              <1> 
   764                              <1> ; 21/04/2017
   765 00018F62 ??                  <1> audio_play_cmd: resb 1  ; Play/Stop command (1 = play, 0 = stop)
   766                              <1> ; 21/11/2023
   767                              <1> ;audio_civ: ; 28/05/2017 ; Current Buffer Index (AC'97)
   768                              <1> ; 23/05/2024
   769                              <1> LVI:			; AC'97 Last Valid Buffer Index
   770 00018F63 ??                  <1> audio_flag_eol:	resb 1  ; End of Link status (vt8233, EOL/FLAG)
   771                              <1> 
   772                              <1> audio_master_volume:
   773 00018F64 ??                  <1> audio_master_volume_l: resb 1 ; sound volume (lineout) left channel
   774 00018F65 ??                  <1> audio_master_volume_r: resb 1 ; sound volume (lineout) right channel
   775                              <1> 
   776                              <1> ; 24/05/2024
   777                              <1> audio_pcmo_volume:
   778 00018F66 ??                  <1> audio_pcmo_volume_l: resb 1 ; PCM out volume left channel
   779 00018F67 ??                  <1> audio_pcmo_volume_r: resb 1 ; PCM out volume right channel
   780                              <1> 
   781                              <1> ; 02/06/2024
   782                              <1> ;alignb 4
   783                              <1> 
   784                              <1> ; 20/11/2023
   785                              <1> ; 28/05/2017
   786                              <1> ; AC'97 Audio Controller Base Adress Registers
   787                              <1> ;NAMBAR:	resw 1	; Native Audio Mixer Base Address
   788                              <1> ;NABMBAR:	resw 1	; Native Audio Bus Mastering Base Address
   789                              <1> 
   790                              <1> ; 02/06/2024
   791                              <1> alignb 8
   792                              <1> 
   793                              <1> ; 21/04/2017
   794 00018F68 <res 400h>          <1> audio_bdl_buff:	resd 32*8 ; VT8233 (AC97) BDL Buffer Size
   795                              <1> ; 12/05/2017
   796 00019368 ????????            <1> base_addr:	resd 1	; 'direct_memory_access' (memory.s)
   797                              <1> 
   798                              <1> ; 01/06/2024
   799 0001936C ??                  <1> reset:		resb 1	; AC97 init
   800                              <1> 
   801                              <1> ; 28/08/2017
   802                              <1> ; 20/08/2017
   803                              <1> 		;resb 1 ;
   804 0001936D ??                  <1> dma_user:	resb 1	; user number for sysdma
   805 0001936E ??                  <1> dma_channel:	resb 1	; dma channel for sysdma
   806 0001936F ??                  <1> dma_mode:	resb 1  ; dma mode for sysdma
   807 00019370 ????????            <1> dma_addr:	resd 1	; dma buffer physical addr for sysdma
   808 00019374 ????????            <1> dma_size:	resd 1  ; dma buffer size (in bytes) for sysdma
   809 00019378 ????????            <1> dma_start:	resd 1  ; dma start address for sysdma
   810 0001937C ????????            <1> dma_count:	resd 1  ; dma count (in bytes) for sysdma
   811                              <1> 
   812                              <1> ; 04/12/2023
   813                              <1> %if 0
   814                              <1> 
   815                              <1> alignb 65536
   816                              <1> ; 09/08/2017
   817                              <1> ; 12/05/2017
   818                              <1> sb16_dma_buffer: resb 65536 ; DMA buffer for sb16 audio playing.
   819                              <1> 
   820                              <1> %endif
  4004                                  ; 24/01/2016
  4005                                  %include 'ubss.s'	; UNINITIALIZED KERNEL (USER) DATA
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.9) - UNINITIALIZED USER DATA : ubss.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 19/08/2024  (Previous: 07/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> ; 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 00019380 <res 20h>           <1>         p.pid:   resw nproc
    80 000193A0 <res 20h>           <1>         p.ppid:  resw nproc
    81                              <1> 	;p.break: resw nproc ; 12/01/2022 (p.break is not used)
    82 000193C0 <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 000193D0 <res 10h>           <1> 	p.link:	 resb nproc
    86 000193E0 <res 10h>           <1> 	p.stat:	 resb nproc
    87                              <1> 
    88                              <1> 	; 06/05/2015 (Retro UNIX 386 v1 feature only !) 
    89 000193F0 <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 00019430 <res 10h>           <1> 	p.timer: resb nproc ; number of timer events of the processs
    94                              <1> 
    95                              <1> 	; 19/12/2016
    96 00019440 <res 40h>           <1> 	p.tcb:	resd nproc ; timer callback service address (if > 0)
    97                              <1> 
    98                              <1> 	; 18/08/2024 (TRDOS 386 v2.0.9)
    99 00019480 <res 10h>           <1> 	p.exitc: resb nproc ; exit code of the child
   100                              <1> 
   101                              <1> P_SIZE	equ $ - process
   102                              <1> 
   103                              <1> ; fsp table (original UNIX v1)
   104                              <1> ;
   105                              <1> ;Entry
   106                              <1> ;          15                                      0
   107                              <1> ;  1     |---|---------------------------------------|
   108                              <1> ;        |r/w|       i-number of open file           |
   109                              <1> ;        |---|---------------------------------------|
   110                              <1> ;        |               device number               |
   111                              <1> ;        |-------------------------------------------|
   112                              <1> ;    (*) | offset pointer, i.e., r/w pointer to file |
   113                              <1> ;        |-------------------------------------------|
   114                              <1> ;        |  flag that says    | number of processes  |
   115                              <1> ;        |   file deleted     | that have file open  |
   116                              <1> ;        |-------------------------------------------|
   117                              <1> ;  2     |                                           |
   118                              <1> ;        |-------------------------------------------|
   119                              <1> ;        |                                           |
   120                              <1> ;        |-------------------------------------------|
   121                              <1> ;        |                                           |
   122                              <1> ;        |-------------------------------------------|
   123                              <1> ;        |                                           |
   124                              <1> ;        |-------------------------------------------|
   125                              <1> ;  3     |                                           |
   126                              <1> ;        |                                           |
   127                              <1> ;
   128                              <1> ; (*) Retro UNIX 386 v1 modification: 32 bit offset pointer
   129                              <1> 
   130                              <1> ; 27/03/2020 - Retro UNIX 386 v2 - FSP (OPEN FILES) TABLE
   131                              <1> 
   132                              <1> ;Entry
   133                              <1> ;         15                    7                   0
   134                              <1> ;  1     |-------------------------------------------|
   135                              <1> ;        |   	     i-number of open file           |
   136                              <1> ;        |-------------------------------------------|
   137                              <1> ;        |        high word of 32 bit i-number       |
   138                              <1> ;        |-------------------------------------------|
   139                              <1> ;        | open mode & status  |   device number     |
   140                              <1> ;        |-------------------------------------------|
   141                              <1> ;        |    reserved byte    |     open count      |
   142                              <1> ;        |-------------------------------------------|
   143                              <1> ;        | offset pointer, i.e., r/w pointer to file |
   144                              <1> ;        |-------------------------------------------|
   145                              <1> ;        |   64 bit file offset pointer (bit 16-31)  |
   146                              <1> ;        |-------------------------------------------|
   147                              <1> ;        |   64 bit file offset pointer (bit 32-47)  |
   148                              <1> ;        |-------------------------------------------|
   149                              <1> ;        |   64 bit file offset pointer (bit 48-63)  |
   150                              <1> ;        |-------------------------------------------|
   151                              <1> ;  2     |                                           |
   152                              <1> ;        |-------------------------------------------|
   153                              <1> ;        |                                           |
   154                              <1> ;        |-------------------------------------------|
   155                              <1> ;        |                                           |
   156                              <1> ;        |-------------------------------------------|
   157                              <1> ;        |                                           |
   158                              <1> ;        |-------------------------------------------|
   159                              <1> ;        |                                           |
   160                              <1> 
   161                              <1> %if 0
   162                              <1> 
   163                              <1> ; (Retro UNIX 386 v1.2 - ux.s - 15/07/2022)
   164                              <1> ; 22/11/2021
   165                              <1> ; 21/07/2021 - Retro UNIX 386 v2 open file structure revision
   166                              <1> 
   167                              <1> struc file	; open files (fsp) structure ; (*)
   168                              <1>   .inode:  resw 1  ; inode number of open file (32 bit)
   169                              <1>   .i32:	   resw 1  ; higher word of inode number (reserved)
   170                              <1>   .drive:  resb 1  ; logical drive (disk) number
   171                              <1>   .flags:  resb 1  ; open mode and status
   172                              <1>   .count:  resb 1  ; number of processes that have file open
   173                              <1>   ;.rsvd:  resb 1  ; reserved byte (for next versions)
   174                              <1>   .mnt:    resb 1  ; mnttab index+1 (0 = not mounted)
   175                              <1>   .offset: resd 1  ; file offset/pointer (64 bit)
   176                              <1>   .o64:	   resd 1  ; higher 32 bit of file offset
   177                              <1>  .size:  ; = 16
   178                              <1> endstruc 
   179                              <1> 
   180                              <1> %endif
   181                              <1> 
   182                              <1> ; 23/07/2022
   183                              <1> ;fsp:	resb nfiles * 16 ; (*)
   184                              <1> 
   185 00019490 ??                  <1> idev:	resb 1
   186 00019491 ??                  <1> cdev:	resb 1	
   187                              <1> 
   188                              <1> ; 15/04/2015
   189                              <1> ;fsp:	resb nfiles * 10 ; 11/05/2015 (8 -> 10)
   190                              <1> ;idev:	resw 1 ; device number is 1 byte in Retro UNIX 8086 v1 !
   191                              <1> ;cdev:	resw 1 ; device number is 1 byte in Retro UNIX 8086 v1 !
   192                              <1> 
   193                              <1> ; 18/05/2015
   194                              <1> ; 26/04/2013 device/drive parameters (Retro UNIX 8086 v1 feature only!)
   195                              <1> ; 'UNIX' device numbers (as in 'cdev' and 'u.cdrv')
   196                              <1> ;	0 -> root device (which has Retro UNIX 8086 v1 file system)
   197                              <1> ; 	1 -> mounted device (which has Retro UNIX 8086 v1 file system)
   198                              <1> ; 'Retro UNIX 8086 v1' device numbers: (for disk I/O procedures)
   199                              <1> ;	0 -> fd0 (physical drive, floppy disk 1), physical drive number = 0
   200                              <1> ;	1 -> fd1 (physical drive, floppy disk 2), physical drive number = 1
   201                              <1> ;	2 -> hd0 (physical drive, hard disk 1), physical drive number = 80h
   202                              <1> ;	3 -> hd1 (physical drive, hard disk 2), physical drive number = 81h
   203                              <1> ;	4 -> hd2 (physical drive, hard disk 3), physical drive number = 82h
   204                              <1> ;	5 -> hd3 (physical drive, hard disk 4), physical drive number = 83h
   205                              <1> 
   206 00019492 ??                  <1> rdev:	resb 1 ; root device number ; Retro UNIX 8086 v1 feature only!
   207                              <1> 	        ; as above, for physical drives numbers in following table
   208 00019493 ??                  <1> mdev:	resb 1 ; mounted device number ; Retro UNIX 8086 v1 feature only!
   209                              <1> 
   210                              <1> ; 23/07/2022
   211                              <1> ;; 15/04/2015
   212                              <1> ;active: resb 1
   213                              <1> ;	 resb 1 ; 09/06/2015
   214                              <1> 
   215                              <1> ; 23/07/2022
   216                              <1> ;mnti:	 resw 1
   217                              <1> ; 07/08/2022
   218 00019494 ????                <1> mpid:	 resw 1
   219                              <1> ;rootdir: resw 1
   220 00019496 ????????            <1> rootdir: resd 1
   221                              <1> 
   222                              <1> ; 21/05/2016 - TRDOS 386 (TRDOS v2.0) - priority levels, 3 run queues 
   223                              <1> runq:
   224 0001949A ????                <1> runq_event:	 resw 1 ; high priority, 'run for event'            ; 2
   225 0001949C ????                <1> runq_normal:	 resw 1 ; normal/regular priority, 'run as reqular' ; 1
   226 0001949E ????                <1> runq_background: resw 1 ; low priority, 'run on background'         ; 0
   227                              <1> ;
   228                              <1> ; 23/07/2022
   229                              <1> ;imod:	resb 1
   230                              <1> ;smod:	resb 1
   231                              <1> ;mmod:	resb 1
   232 000194A0 ??                  <1> sysflg:	resb 1
   233 000194A1 ??                  <1> 	resb 1
   234                              <1> 
   235 000194A2 ????                <1> alignb 4
   236                              <1> 
   237                              <1> user:
   238                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
   239                              <1> 	; 04/12/2021 - Retro UNIX 386 v1.2
   240                              <1> 	; 13/01/2017
   241                              <1> 	; 19/12/2016
   242                              <1> 	; 21/05/2016 - TRDOS 386 (TRDOS v2.0)
   243                              <1> 	; 	       [u.pri] usage method modification
   244                              <1> 	; 04/12/2015
   245                              <1> 	; 18/10/2015
   246                              <1> 	; 12/10/2015
   247                              <1> 	; 21/09/2015
   248                              <1> 	; 24/07/2015
   249                              <1> 	; 16/06/2015
   250                              <1> 	; 09/06/2015
   251                              <1> 	; 11/05/2015
   252                              <1> 	; 16/04/2015 (Retro UNIX 386 v1 - 32 bit modifications)
   253                              <1> 	; 10/10/2013
   254                              <1> 	; 11/03/2013.
   255                              <1> 	;Derived from UNIX v1 source code 'user' structure (ux).
   256                              <1> 	;u.
   257                              <1> 
   258 000194A4 ????????            <1> 	u.sp:	  resd 1 ; esp (kernel stack at the beginning of 'sysent')
   259 000194A8 ????????            <1> 	u.usp:	  resd 1 ; esp (kernel stack points to user's registers)
   260 000194AC ????????            <1> 	u.r0:	  resd 1 ; eax
   261 000194B0 ????                <1> 	u.cdir:	  resw 1
   262 000194B2 ????                <1> 		  resw 1 ; 23/07/2022
   263 000194B4 ??                  <1> 	u.cdrv:	  resb 1 ; 23/07/2022
   264 000194B5 ??                  <1> 		  resb 1
   265 000194B6 <res Ah>            <1> 	u.fp:	  resb 10
   266                              <1> 	;u.fp:	  resb OPENFILES ; 23/07/202
   267                              <1> 	u.fsp:	  ; 23/07/2022
   268 000194C0 ????????            <1> 	u.fofp:	  resd 1
   269 000194C4 ????????            <1> 	u.dirp:	  resd 1
   270 000194C8 ????????            <1> 	u.namep:  resd 1
   271 000194CC ????????            <1> 	u.off:	  resd 1
   272                              <1> 	;	  resd 1 ; 23/07/2022 (64 bit fptr)
   273 000194D0 ????????            <1> 	u.base:	  resd 1
   274 000194D4 ????????            <1> 	u.count:  resd 1
   275 000194D8 ????????            <1> 	u.nread:  resd 1
   276 000194DC ????????            <1> 	u.break:  resd 1 ; break
   277                              <1> 	; 10/01/2017 (TRDOS 386, relocation and dword alignment)
   278                              <1> 	; tty number (rtty, rcvt, wtty)
   279 000194E0 ????                <1> 	u.ttyp:	  resw 1 
   280 000194E2 ??                  <1> 	u.ttyn:	  resb 1 ; 28/07/2013 - Retro Unix 8086 v1 feature only !
   281 000194E3 ??                  <1> 	u.mode:   resb 1 ; 23/07/2022
   282                              <1> 	;u.resb:  resb 1 ; 10/01/2017 (TRDOS 386, temporary)
   283 000194E4 <res 10h>           <1> 	u.dirbuf: resb 16 ; 04/12/2015 (10 -> 16)
   284                              <1> 	;u.pri:	  resw 1 ; 14/02/2014
   285 000194F4 ??                  <1> 	u.quant:  resb 1 ; Retro UNIX 8086 v1 Feature only ! (uquant)
   286 000194F5 ??                  <1> 		  resb 1 ; 23/07/2022
   287 000194F6 ??                  <1> 	u.pri:	  resb 1 ; Modification: 21/05/2016 (priority levels: 0, 1, 2)
   288 000194F7 ??                  <1> 		  resb 1 ; 23/07/2022
   289 000194F8 ????                <1> 	u.intr:	  resw 1
   290 000194FA ????                <1> 	u.quit:	  resw 1
   291                              <1> 	;u.emt:	  resw 1 ; 10/10/2013
   292                              <1> 	;u.ilgins: resw 1 ; 10/01/2017
   293                              <1> 	;u.cdrv:  resw 1 ; cdev
   294 000194FC ??                  <1> 	u.bsys:	  resb 1
   295 000194FD ??                  <1> 	u.uno:	  resb 1
   296                              <1> 	; 23/07/2022
   297                              <1> 	;u.uid:	  resw 1 ; uid	; 27/03/2021 - Retro UNIX 386 v2
   298                              <1> 	;u.ruid:  resw 1	; 16 bit uid
   299                              <1> 	;u.gid:	  resb 1 ; gid 	; 27/03/2021 - Retro UNIX 386 v2
   300                              <1> 	;u.rgid:  resb 1
   301                              <1> 	; 23/07/2022
   302                              <1> 	;u.procp: resd 1 ; /* pointer to proc structure */
   303 000194FE ??                  <1> 	u.uid:	  resb 1 ; uid
   304 000194FF ??                  <1> 	u.ruid:   resb 1
   305 00019500 ????????            <1>         u.upage:  resd 1 ; 16/04/2015 - Retro Unix 386 v1 feature only !
   306 00019504 ????????            <1> 	u.pgdir:  resd 1 ; 09/03/2015 (page dir addr of process)
   307 00019508 ????????            <1> 	u.ppgdir: resd 1 ; 06/05/2015 (page dir addr of the parent process)
   308 0001950C ????????            <1> 	u.pbase:  resd 1 ; 20/05/2015 (physical base/transfer address)
   309 00019510 ????                <1> 	u.pcount: resw 1 ; 20/05/2015 (byte -transfer- count for page)
   310                              <1> 	;u.pncount: resw 1
   311                              <1> 		; 16/06/2015 (byte -transfer- count for page, 'namei', 'mkdir')
   312                              <1> 	;u.pnbase:  resd 1
   313                              <1> 		; 16/06/2015 (physical base/transfer address, 'namei', 'mkdir')
   314                              <1> 			 ; 09/06/2015
   315 00019512 ??                  <1> 	u.kcall:  resb 1 ; The caller is 'namei' (dskr) or 'mkdir' (dskw) sign
   316 00019513 ??                  <1> 	u.brwdev: resb 1 ; Block device number for direct I/O (bread & bwrite)
   317                              <1> 			 ; 24/07/2015 - 24/06/2015
   318                              <1> 	;u.args:  resd 1 ; arguments list (line) offset from start of [u.upage]
   319                              <1> 			 ; (arg list/line is from offset [u.args] to 4096 in [u.upage])
   320                              <1> 			 ; ([u.args] points to argument count -argc- address offset)
   321                              <1>  			 ; 24/06/2015
   322                              <1> 	;u.core:  resd 1 ; physical start address of user's memory space (for sys exec)
   323                              <1> 	;u.ecore: resd 1 ; physical end address of user's memory space (for sys exec)
   324                              <1> 	;;;
   325                              <1> 	; 19/08/2024	 ; TRDOS 386 v2.0.9 ; STDIN/STDOUT/STDERR 
   326 00019514 ??                  <1> 	u.stdin:  resb 1 ; 0 is tty-r or > 0 is file (redirection)
   327 00019515 ??                  <1> 	u.stdout: resb 1 ; 0 is tty-w or > 0 is file (redirection)
   328 00019516 ??                  <1> 	u.ungetc: resb 1 ; u.getc is valid if u.ungetc > 0	
   329 00019517 ??                  <1> 	u.getc:	  resb 1 ; last char read on stdin	 	
   330                              <1> 	;;;
   331                              <1> 	; last error number
   332 00019518 ????????            <1> 	u.error:  resd 1 ; 28/07/2013 - 09/03/2015 
   333                              <1> 		         ; Retro UNIX 8086/386 v1 feature only!
   334                              <1> 			 ; 21/09/2015 (debugging - page fault analyze)
   335 0001951C ????????            <1> 	u.pfcount: resd 1 ; page fault count for (this) process (for sys geterr)
   336                              <1> 		; 19/12/2016 (TRDOS 386)
   337 00019520 ????????            <1> 	u.tcb:	  resd 1 ; Timer callback address/flag which will be used by timer int
   338                              <1> 		; 13/01/2017 (TRDOS 386)
   339 00019524 ??                  <1> 	u.t_lock: resb 1 ; Timer interrupt (callback) lock (unlocked by 'sysrele')
   340 00019525 ??                  <1> 	u.t_mode: resb 1 ; running mode during timer interrupt (0= system, 0FFh= user)
   341                              <1> 		; 26/02/2017 (TRDOS 386)
   342 00019526 ??                  <1> 	u.irqc:	  resb 1  ; Count of IRQ callback services (IRQs in use)
   343                              <1> 		; 28/02/2017 (TRDOS 386)
   344 00019527 ??                  <1> 	u.irqwait: resb 1 ; IRQ waiting for callback service flag (IRQ number, If > 0)
   345 00019528 ??                  <1> 	u.r_lock: resb 1 ; 'IRQ callback service is in progress' flag (IRQ lock)
   346 00019529 ??                  <1> 	u.r_mode: resb 1 ; running mode during hadware interrupt
   347                              <1> 	; 23/07/2022
   348 0001952A ??                  <1> 	u.exit:	  resb 1 ; exit code
   349                              <1> 	; 27/02/2017 (TRDOS 386)
   350 0001952B ??                  <1> 	u.fpsave: resb 1 ; TRDOS 386, 'save/restore FPU registers' flag
   351                              <1> alignb 4
   352                              <1> 	; !! wrong sizing in TRDOS 386 v2.0.4 (in 'ubss.s', 28/02/2017) !!
   353                              <1> 	;u.fpregs: resb 94 ; 94 byte area for saving and restoring FPU registers
   354                              <1> 	; 23/07/2022
   355 0001952C <res 6Ch>           <1> 	u.fpregs: resb 108 ; 108 byte area for saving and restoring FPU registers
   356                              <1> 
   357                              <1> alignb 4
   358                              <1> 
   359                              <1> U_SIZE	equ $ - user
   360                              <1> 
   361                              <1> ; 18/10/2015 - Retro UNIX 386 v1 (local variables for 'namei' and 'sysexec')
   362 00019598 ????????            <1> pcore:	resd 1  ; physical start address of user's memory space (for sys exec)
   363 0001959C ????????            <1> ecore:	resd 1  ; physical address of user's stack/last page (for sys exec)
   364 000195A0 ????????            <1> nbase:	resd 1	; physical base address for 'namei' & 'sysexec'
   365                              <1> ; 23/07/202 - TRDOS 386 Kernel v2.0.5
   366                              <1> ;ncount: resw 1
   367 000195A4 ????????            <1> ncount: resd 1	; remain byte count in page for 'namei' & 'sysexec'
   368                              <1> ;argc:	resw 1
   369 000195A8 ????????            <1> argc:	resd 1	; argument count for 'sysexec'
   370 000195AC ????????            <1> argv:	resd 1	; argument list (recent) address for 'sysexec'
   371                              <1> 
   372                              <1> ; 03/06/2015 - Retro UNIX 386 v1 Beginning
   373                              <1> ; 07/04/2013 - 31/07/2013 - Retro UNIX 8086 v1
   374 000195B0 ??                  <1> rw:	resb 1 ;; Read/Write sign (iget)
   375                              <1> ; 23/07/2022
   376 000195B1 ??????              <1> 	resb 3
   377                              <1> 
   378                              <1> alignb 4
   379                              <1> 
   380                              <1> ; 24/04/2016
   381 000195B4 ????????            <1> ii:	resd 1 ; first cluster of the program file
   382 000195B8 ????????            <1> i.size:	resd 1 ; size of the program file
  4006                                  
  4007                                  alignb 4
  4008                                  
  4009                                  ; 23/05/2016 (TRDOS 386)
  4010                                  ; 14/10/2015 (Retro UNIX 386 v1, 'unix386.s')
  4011 000195BC ????????                cr3reg:	 resd 1  ; cr3 register content at the beginning of the timer
  4012                                  		 ; (or RTC) interrupt handler.
  4013                                  
  4014                                  ; 10/12/2016 (callback)
  4015                                  ; 10/06/2016
  4016                                  ; 19/05/2016
  4017                                  ; 18/05/2016 - TRDOS 386 feature only !
  4018 000195C0 <res 100h>              timer_set: resd 16*4   ; 256 bytes memory space for 16 timer events
  4019                                  	; Timer Event Structure: (max. 16 timer events, 16*16 bytes)
  4020                                  	;       Owner:	        resb 1 ; 0 = free
  4021                                  	;		  	       ;>0 = process number (u.uno)
  4022                                  	;	Callback:	resb 1 ; 0 = response byte address (phy)
  4023                                  	;				 1 = callback address (virtual)				
  4024                                  	;	Interrupt:      resb 1 ; 0 = Timer interrupt (or none)
  4025                                  	;		   	       ; 1 = Real Time Clock interrupt 
  4026                                  	;	Response:       resb 1 ; 0 to 255, signal return value
  4027                                  	;	Count Limit:	resd 1 ; count of ticks (total/set)
  4028                                  	;	Current Count: 	resd 1 ; count of ticks (current)
  4029                                  	;	Response Addr:  resd 1 ; response byte (pointer) address
  4030                                  	;			       ; (or callback -user service- address)	
  4031                                  
  4032                                  
  4033                                  ; 17/04/2021
  4034                                  ; (memory page swap parameters are disabled as temporary)
  4035                                  ;
  4036                                  ; Memory (swap) Data (11/03/2015)
  4037                                  ; 09/03/2015
  4038                                  ;swpq_count: resw 1 ; count of pages on the swap queue
  4039                                  ;swp_drv:    resd 1 ; logical drive description table address of the swap drive/disk
  4040                                  ;swpd_size:  resd 1 ; size of swap drive/disk (volume) in sectors (512 bytes). 		  				
  4041                                  ;swpd_free:  resd 1 ; free page blocks (4096 bytes) on swap disk/drive (logical)
  4042                                  ;swpd_next:  resd 1 ; next free page block
  4043                                  ;swpd_last:  resd 1 ; last swap page block	
  4044                                  
  4045                                  alignb 4
  4046                                  
  4047                                  ; 10/07/2015
  4048                                  ; 28/08/2014
  4049 000196C0 ????????                error_code:	resd 1
  4050                                  ; 29/08/2014
  4051 000196C4 ????????                FaultOffset: 	resd 1
  4052                                  ; 21/09/2015
  4053 000196C8 ????????                PF_Count:	resd 1	; total page fault count
  4054                                  		       	; (for debugging - page fault analyze)
  4055                                  		 	; 'page_fault_handler' (memory.inc)
  4056                                  			; 'sysgeterr' (u9.s)
  4057                                  
  4058                                  ; 29/04/2016 (TRDOS 386 = TRDOS v2.0)
  4059                                  ; 22/08/2015 (Retro UNIX 386 v1)
  4060                                  buffer: 
  4061 000196CC ????????????????        	resb	8 
  4062                                  readi_buffer:
  4063 000196D4 <res 200h>              	resb 	512
  4064 000198D4 ????????????????        	resb	8
  4065                                  writei_buffer:
  4066 000198DC <res 200h>              	resb	512	
  4067                                  ; 24/10/2016
  4068 00019ADC ????????????????        	resb	8 
  4069                                  rw_buffer:
  4070 00019AE4 <res 800h>              	resb 	2048  ; general purposed, r/w sector buffer
  4071                                  
  4072                                  %if 1
  4073                                  ; 17/01/2021
  4074 0001A2E4 <res 80h>               edid_info:	resb 128 ; VESA EDID (monitor capabilities) info	
  4075                                  ; 28/11/2020
  4076 0001A364 ??                      pmi32:		resb 1	; (>0) use VESA VBE3 protected mode calls 
  4077 0001A365 ??                      vbe_mode_x:	resb 1  ; VESA VBE3 video bios mode set options
  4078 0001A366 ????                    video_mode:	resw 1	; VESA VBE3 video mode (with option flags)
  4079                                  ; 30/11/2020
  4080 0001A368 ????????                vbe3bios_addr:	resd 1	; new (writable mem) address of VBE3 bios
  4081                                  ; 02/12/2020
  4082 0001A36C ????????                pmid_addr:	resd 1	; PMInfoBlock ('PMID') linear address
  4083                                  ; 14/01/2021
  4084                                  ; 06/12/2020		; VESA VBE 3 video state
  4085                                  ;vbe3stbufsize: resw 1	; video regs/dac/bios state buffer size
  4086                                  ;			; block size in bytes
  4087                                  ; 16/01/2021
  4088 0001A370 ????                    vbe3stbsflags: resw 1	; video regs/dac/bios state buffer size
  4089                                  ;			; pointer flags for buffer state options
  4090                                  %endif
  4091                                  
  4092                                  %if 1
  4093                                  ; 10/12/2020
  4094                                  LFB_Info:
  4095 0001A372 <res 10h>               		resb 16	; Linear Frame Buffer info block
  4096                                  
  4097                                  ;24/11/2020 - TRDOS 386 v2.0.3
  4098                                  ; BOCHS/PLEX86 VESA VBE3 MODE INFO extension to TRDOS 386 v2 kernel	
  4099                                  MODE_INFO_LIST:
  4100 0001A382 <res 44h>               		resb 68	; mode + 66 byte VESA vbe3 mode info (4F01h) 
  4101                                  %endif
  4102                                  
  4103                                  ; 05/01/2021
  4104 0001A3C6 ??                      ufont:		resb 1	; (VGA graphics) user font flags
  4105                                  			; bit 7 - permission flag for int 31h
  4106                                  			; bit 4 - 8x16 user font ready/loaded flag  
  4107                                  			; bit 3 - 8x8 user font ready/loaded flag
  4108                                  			; bit 1 - select 8x16 user font (sysvideo)
  4109                                  			; bit 0 - select 8x8 user font (sysvideo)
  4110 0001A3C7 ??                      		resb 1	; 19/01/2021
  4111                                  ; 17/01/2021
  4112 0001A3C8 ??                      srvsf:		resb 1	; 'save restore video state' permission flag
  4113                                  ; 18/01/2021
  4114 0001A3C9 ??                      srvso:		resb 1	; video state buffer save/restore option
  4115 0001A3CA ????????                VideoStateID:	resd 1	; used to verify state saved by same prog
  4116                                  ; 29/01/2021
  4117 0001A3CE ????                    v_width:	resw 1	; screen (display page) width
  4118 0001A3D0 ??                      v_ops:		resb 1	; 'sysvideo' graphics data transfer option	
  4119 0001A3D1 ??                      v_bpp:		resb 1	; bits per pixels ('sysvideo')
  4120 0001A3D2 ????????                v_mem:		resd 1	; video memory ('sysvideo')	
  4121 0001A3D6 ????????                v_siz:		resd 1	; video page size ('sysvideo')
  4122 0001A3DA ????????                v_str:		resd 1	; window start adress ('sysvideo')
  4123 0001A3DE ????????                v_end:		resd 1	; window end (end+1) adress ('sysvideo')
  4124                                  ; 31/01/2021
  4125                                  ; 01/01/2021
  4126                                  ;maskbuff:     ;resd 1	; user's bitmask buffer addr ('sysvideo')
  4127 0001A3E2 ????????                maskcolor:	resd 1	; VGA/SVGA pixel mask color ('sysvideo')
  4128                                  ; 27/02/2021
  4129 0001A3E6 ????????                pixcount:	resd 1	; pixel count ('sysvideo' window ops) 
  4130                                  ; 02/02/2021
  4131 0001A3EA ????????????????        buffer8:	resd 2	; 8 bytes small buffer for 'sysvideo'  
  4132                                  
  4133                                  bss_end:
  4134                                  
  4135                                  ; 27/12/2013
  4136                                  _end:  ; end of kernel code
