     1                                  ; ****************************************************************************
     2                                  ; pftest.s - TRDOS 386 (TRDOS v2.0) Kernel - PAGE FAULT address test
     3                                  ; ----------------------------------------------------------------------------
     4                                  ;
     5                                  ; 22/09/2024
     6                                  ;
     7                                  ; [ Last Modification: 22/09/2024 ]
     8                                  ;
     9                                  ; ****************************************************************************
    10                                  
    11                                  ; 20/08/2024 ; TRDOS 386 v2.0.9 (exit code)
    12                                  ; 20/08/2017
    13                                  ; 01/03/2017
    14                                  ; 16/10/2016
    15                                  ; 29/04/2016
    16                                  ; TRDOS 386 system calls (temporary list!)
    17                                  _ver 	equ 0
    18                                  _exit 	equ 1
    19                                  _fork 	equ 2
    20                                  _read 	equ 3
    21                                  _write	equ 4
    22                                  _open	equ 5
    23                                  _close 	equ 6
    24                                  _wait 	equ 7
    25                                  _creat 	equ 8
    26                                  _link 	equ 9
    27                                  _unlink	equ 10 ; _delete
    28                                  _exec	equ 11
    29                                  _chdir	equ 12
    30                                  _time 	equ 13
    31                                  _mkdir 	equ 14
    32                                  _chmod	equ 15
    33                                  _chown	equ 16
    34                                  _break	equ 17
    35                                  _stat	equ 18
    36                                  _seek	equ 19
    37                                  _tell 	equ 20
    38                                  _mount	equ 21
    39                                  _umount	equ 22
    40                                  _setuid	equ 23
    41                                  _getuid	equ 24
    42                                  _stime	equ 25
    43                                  _quit	equ 26
    44                                  _intr	equ 27
    45                                  _fstat	equ 28
    46                                  _emt 	equ 29
    47                                  _mdate 	equ 30
    48                                  _video 	equ 31
    49                                  _audio	equ 32
    50                                  _timer	equ 33
    51                                  _sleep	equ 34
    52                                  _msg    equ 35
    53                                  _geterr	equ 36
    54                                  _fpsave	equ 37
    55                                  _pri	equ 38
    56                                  _rele	equ 39
    57                                  _fff	equ 40
    58                                  _fnf	equ 41
    59                                  _alloc	equ 42
    60                                  _dalloc equ 43
    61                                  _calbac equ 44
    62                                  _dma	equ 45
    63                                  _stdio  equ 46	;  TRDOS 386 v2.0.9
    64                                  
    65                                  %macro sys 1-4
    66                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
    67                                      ; 03/09/2015
    68                                      ; 13/04/2015
    69                                      ; Retro UNIX 386 v1 system call.
    70                                      %if %0 >= 2   
    71                                          mov ebx, %2
    72                                          %if %0 >= 3
    73                                              mov ecx, %3
    74                                              %if %0 = 4
    75                                                 mov edx, %4
    76                                              %endif
    77                                          %endif
    78                                      %endif
    79                                      mov eax, %1
    80                                      ;int 30h
    81                                      int 40h ; TRDOS 386 (TRDOS v2.0) 
    82                                  %endmacro
    83                                  
    84                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    85                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    86                                  
    87                                  ;========================================================================
    88                                  ; PAGE FAULT TEST
    89                                  ;========================================================================
    90                                  
    91                                  ;; In TRDOS 386, user's address space starts at the end of 1st 4MB.
    92                                  ;; So, 0 is at 4MB and last usable virtual address is 4GB-4MB 
    93                                  ;; If an addr beyond 0FFBFFFFFh is used in the code, a page fault is expected.
    94                                  
    95                                  [BITS 32] ; 32-bit intructions
    96                                  
    97                                  [ORG 0] 
    98                                  START_CODE:
    99 00000000 E9FB000000              	jmp	skip
   100 00000005 FF<rep FBh>             	times	256-($-START_CODE) db 0FFh	 
   101                                  skip:  
   102 00000100 BC0000BEFF              	mov	esp, 0FFBE0000h
   103 00000105 31FF                    	xor	edi, edi ; not necessary
   104 00000107 B940000000              	mov	ecx, 256/4
   105 0000010C 31C0                    	xor	eax, eax ; not necessary
   106 0000010E F3AB                    	rep	stosd
   107                                  	;;;
   108 00000110 48                      	dec	eax
   109 00000111 BF0000BEFF              	mov	edi, 0FFBE0000h
   110 00000116 B900400000              	mov	ecx, 65536/4
   111 0000011B F3AB                    	rep	stosd
   112                                  	
   113                                  wloop:
   114 0000011D 89F8                    	mov	eax, edi
   115 0000011F E88F000000              	call	calchex
   116 00000124 8915[0F020000]          	mov	[hexnum], edx
   117 0000012A A3[13020000]            	mov	[hexnum+4], eax
   118                                  	sys	_msg, hexstr, 255, 0Fh
    66                              <1> 
    67                              <1> 
    68                              <1> 
    69                              <1> 
    70                              <1>  %if %0 >= 2
    71 0000012F BB[0D020000]        <1>  mov ebx, %2
    72                              <1>  %if %0 >= 3
    73 00000134 B9FF000000          <1>  mov ecx, %3
    74                              <1>  %if %0 = 4
    75 00000139 BA0F000000          <1>  mov edx, %4
    76                              <1>  %endif
    77                              <1>  %endif
    78                              <1>  %endif
    79 0000013E B823000000          <1>  mov eax, %1
    80                              <1> 
    81 00000143 CD40                <1>  int 40h
   119 00000145 890F                    	mov	[edi], ecx
   120 00000147 90                      	nop
   121 00000148 81C700100000            	add	edi, 4096
   122 0000014E 81FF0000C0FF            	cmp	edi, 0FFC00000h
   123 00000154 7302                    	jnb	short wloop_ok
   124 00000156 EBC5                    	jmp	short wloop
   125                                  
   126                                  wloop_ok:
   127 00000158 89F8                    	mov	eax, edi
   128 0000015A E854000000              	call	calchex
   129 0000015F 8915[0F020000]          	mov	[hexnum], edx
   130 00000165 A3[13020000]            	mov	[hexnum+4], eax
   131                                  	sys	_msg, hexstr, 255, 0Ch
    66                              <1> 
    67                              <1> 
    68                              <1> 
    69                              <1> 
    70                              <1>  %if %0 >= 2
    71 0000016A BB[0D020000]        <1>  mov ebx, %2
    72                              <1>  %if %0 >= 3
    73 0000016F B9FF000000          <1>  mov ecx, %3
    74                              <1>  %if %0 = 4
    75 00000174 BA0C000000          <1>  mov edx, %4
    76                              <1>  %endif
    77                              <1>  %endif
    78                              <1>  %endif
    79 00000179 B823000000          <1>  mov eax, %1
    80                              <1> 
    81 0000017E CD40                <1>  int 40h
   132                                  
   133 00000180 B8FFFFFFFF              	mov	eax, -1
   134 00000185 AB                      	stosd
   135 00000186 90                      	nop
   136                                  
   137 00000187 81FF00FFFFFF            	cmp	edi, 0FFFFFF00h
   138 0000018D 72C9                    	jb	short wloop_ok
   139                                  
   140                                  	sys	_msg, _ok, 255, 07h
    66                              <1> 
    67                              <1> 
    68                              <1> 
    69                              <1> 
    70                              <1>  %if %0 >= 2
    71 0000018F BB[19020000]        <1>  mov ebx, %2
    72                              <1>  %if %0 >= 3
    73 00000194 B9FF000000          <1>  mov ecx, %3
    74                              <1>  %if %0 = 4
    75 00000199 BA07000000          <1>  mov edx, %4
    76                              <1>  %endif
    77                              <1>  %endif
    78                              <1>  %endif
    79 0000019E B823000000          <1>  mov eax, %1
    80                              <1> 
    81 000001A3 CD40                <1>  int 40h
   141                                  
   142                                  	; if we are here, there was no page fault above
   143                                  	sys	_exit, 0
    66                              <1> 
    67                              <1> 
    68                              <1> 
    69                              <1> 
    70                              <1>  %if %0 >= 2
    71 000001A5 BB00000000          <1>  mov ebx, %2
    72                              <1>  %if %0 >= 3
    73                              <1>  mov ecx, %3
    74                              <1>  %if %0 = 4
    75                              <1>  mov edx, %4
    76                              <1>  %endif
    77                              <1>  %endif
    78                              <1>  %endif
    79 000001AA B801000000          <1>  mov eax, %1
    80                              <1> 
    81 000001AF CD40                <1>  int 40h
   144                                  
   145                                  hang:
   146 000001B1 EBFE                    	jmp	short hang
   147                                  
   148                                  calchex:
   149                                  dwordtohex:
   150                                  	; INPUT ->
   151                                  	; 	EAX = dword (binary number)
   152                                  	; OUTPUT ->
   153                                  	;	EDX:EAX = hexadecimal string
   154                                  	;
   155 000001B3 50                      	push	eax
   156 000001B4 C1E810                  	shr	eax, 16
   157 000001B7 E803000000              	call	wordtohex
   158 000001BC 89C2                    	mov	edx, eax
   159 000001BE 58                      	pop	eax
   160                                  wordtohex:
   161                                  	; INPUT ->
   162                                  	; 	AX = word (binary number)
   163                                  	; OUTPUT ->
   164                                  	;	EAX = hexadecimal string
   165                                  	;
   166 000001BF 53                      	push	ebx
   167 000001C0 31DB                    	xor	ebx, ebx
   168 000001C2 86C4                    	xchg	ah, al
   169 000001C4 6650                    	push	ax ; * save ax
   170 000001C6 88E3                    	mov	bl, ah
   171 000001C8 C0EB04                  	shr	bl, 4
   172 000001CB 8A83[FD010000]          	mov	al, [ebx+hexchrs]
   173 000001D1 88E3                    	mov	bl, ah
   174 000001D3 80E30F                  	and	bl, 0Fh
   175 000001D6 8AA3[FD010000]          	mov	ah, [ebx+hexchrs]
   176 000001DC C1E010                  	shl	eax, 16 ; ax -> hw of eax
   177 000001DF 6658                    	pop	ax ; * restore ax 
   178 000001E1 5B                      	pop	ebx
   179                                  bytetohex:
   180                                  	; INPUT ->
   181                                  	; 	AL = byte (binary number)
   182                                  	; OUTPUT ->
   183                                  	;	AX = hexadecimal string
   184                                  	;
   185 000001E2 53                      	push	ebx
   186 000001E3 31DB                    	xor	ebx, ebx
   187 000001E5 88C3                    	mov	bl, al
   188 000001E7 C0EB04                  	shr	bl, 4
   189 000001EA 8A9B[FD010000]          	mov	bl, [ebx+hexchrs] 	 	
   190 000001F0 86C3                    	xchg	bl, al
   191 000001F2 80E30F                  	and	bl, 0Fh
   192 000001F5 8AA3[FD010000]          	mov	ah, [ebx+hexchrs] 
   193 000001FB 5B                      	pop	ebx	
   194 000001FC C3                      	retn
   195                                  hexchrs:
   196 000001FD 303132333435363738-     	db '0123456789ABCDEF'
   196 00000206 39414243444546     
   197                                  
   198                                  hexstr:
   199 0000020D 0D0A                    	db 0Dh,0Ah
   200                                  hexnum:
   201 0000020F 303030303030303068-     	db "00000000h",0
   201 00000218 00                 
   202                                  _ok:
   203 00000219 0D0A4F4B2E0D0A00        	db 0Dh,0Ah,"OK.", 0Dh,0Ah,0
