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) , , 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 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