1 ; **************************************************************************** 2 ; ctrlbk.s - TRDOS 386 (TRDOS v2.0) Kernel - CTRL+BRK test 3 ; ---------------------------------------------------------------------------- 4 ; 5 ; 23/08/2024 6 ; 7 ; [ Last Modification: 23/08/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 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 ; EXEC TEST - CODE 89 ;======================================================================== 90 91 [BITS 32] ; 32-bit intructions 92 93 [ORG 0] 94 95 START_CODE: 96 sys _msg, program, len0, 0Bh 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 00000000 BB[56020000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 00000005 B92D000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 0000000A BA0B000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 0000000F B823000000 <1> mov eax, %1 80 <1> 81 00000014 CD40 <1> int 40h 97 sys _msg, owner, 255, 0Ch 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 00000016 BB[84020000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 0000001B B9FF000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 00000020 BA0C000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 00000025 B823000000 <1> mov eax, %1 80 <1> 81 0000002A CD40 <1> int 40h 98 99 sys _intr, 0 ; disable CTRL+BREAK terminate function 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 0000002C 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 00000031 B81B000000 <1> mov eax, %1 80 <1> 81 00000036 CD40 <1> int 40h 100 101 sys _msg, ctrlbrk_def, len1, 07h 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 00000038 BB[9F020000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 0000003D B925000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 00000042 BA07000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 00000047 B823000000 <1> mov eax, %1 80 <1> 81 0000004C CD40 <1> int 40h 102 sys _msg, ctrlbrk, len2, 0Fh 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 0000004E BB[C5020000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 00000053 B92D000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 00000058 BA0F000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 0000005D B823000000 <1> mov eax, %1 80 <1> 81 00000062 CD40 <1> int 40h 103 sys _msg, ctrlbrk_skip, len3, 07h 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 00000064 BB[F3020000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 00000069 B92B000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 0000006E BA07000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 00000073 B823000000 <1> mov eax, %1 80 <1> 81 00000078 CD40 <1> int 40h 104 105 ;sys _time, 0 ; get time in unix epoch format 106 ;mov [time], eax 107 0000007A EB23 jmp short getchar_@@@ 108 109 getchar_@: 110 0000007C 803D[A5030000]01 cmp byte [stage], 1 111 00000083 751A jne short getchar_@@@ 112 getchar_@@: 113 sys _quit 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 <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 00000085 B81A000000 <1> mov eax, %1 80 <1> 81 0000008A CD40 <1> int 40h 114 0000008C 83F8FF cmp eax, -1 ; quit 115 0000008F 750E jne short getchar_@@@ 116 00000091 803D[A5030000]01 cmp byte [stage], 1 117 00000098 7205 jb short getchar_@@@ 118 0000009A E916010000 jmp quit_request 119 120 getchar_@@@: 121 ; getchar 122 ;mov ah, 10h 123 ;int 32h 124 125 ; stdio getchar (TRTDOS 386 Kernel v2.0.9 and later) 126 ;mov bl, 7 ; read character (ascii and scancode) on stdin 127 ; -no redirection, no wait- 128 sys _stdio, 7 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 0000009F BB07000000 <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 000000A4 B82E000000 <1> mov eax, %1 80 <1> 81 000000A9 CD40 <1> int 40h 129 130 000000AB 21C0 and eax, eax 131 000000AD 74D6 jz short getchar_@@ 132 133 000000AF 3C20 cmp al, 20h 134 000000B1 7451 je short skip_stage_@ 135 136 ;sys _time, 0 ; get time in unix epoch format 137 138 ;cmp eax, [time] 139 ;je short getchar_@ ; same second 140 141 000000B3 31C0 xor eax, eax 142 000000B5 8A1D[A4030000] mov bl, [counter] 143 000000BB FE05[A4030000] inc byte [counter] 144 000000C1 80E303 and bl, 3 145 000000C4 B006 mov al, len4 146 000000C6 F6E3 mul bl 147 000000C8 05[A6030000] add eax, _one_two_three_four 148 print_1234: 149 sys _msg, eax, len4, 07h 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 000000CD 89C3 <1> mov ebx, %2 72 <1> %if %0 >= 3 73 000000CF B906000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 000000D4 BA07000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 000000D9 B823000000 <1> mov eax, %1 80 <1> 81 000000DE CD40 <1> int 40h 150 000000E0 F605[A4030000]03 test byte [counter], 3 151 000000E7 7593 jnz short getchar_@ 152 print_crlf: 153 sys _msg, crlf, 2, 07h 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 000000E9 BB[1C030000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 000000EE B902000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 000000F3 BA07000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 000000F8 B823000000 <1> mov eax, %1 80 <1> 81 000000FD CD40 <1> int 40h 154 000000FF E978FFFFFF jmp getchar_@ 155 156 skip_stage_@: 157 00000104 FE05[A5030000] inc byte [stage] 158 0000010A 803D[A5030000]01 cmp byte [stage], 1 159 00000111 7741 ja short enable_ctrlbrk 160 sys _msg, sysquit_msg, 255, 0Ah 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 00000113 BB[1F030000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 00000118 B9FF000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 0000011D BA0A000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 00000122 B823000000 <1> mov eax, %1 80 <1> 81 00000127 CD40 <1> int 40h 161 sys _msg, ctrlbrk_skip, len3, 07h 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 00000129 BB[F3020000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 0000012E B92B000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 00000133 BA07000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 00000138 B823000000 <1> mov eax, %1 80 <1> 81 0000013D CD40 <1> int 40h 162 skip_stage_@@: 163 0000013F F605[A4030000]03 test byte [counter], 3 164 00000146 C605[A4030000]00 mov byte [counter], 0 165 0000014D 749A jz short print_crlf 166 0000014F E931FFFFFF jmp getchar_@@ 167 168 enable_ctrlbrk: 169 00000154 803D[A5030000]02 cmp byte [stage], 2 170 ;ja short _ok 171 0000015B 7605 jna short enable_ctrlbrk_@ 172 0000015D E9B9000000 jmp _ok 173 enable_ctrlbrk_@: 174 sys _intr, 1 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 00000162 BB01000000 <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 00000167 B81B000000 <1> mov eax, %1 80 <1> 81 0000016C CD40 <1> int 40h 175 sys _msg, ctrlbrk_enabled, 255, 0Eh 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 0000016E BB[7B030000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 00000173 B9FF000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 00000178 BA0E000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 0000017D B823000000 <1> mov eax, %1 80 <1> 81 00000182 CD40 <1> int 40h 176 sys _msg, ctrlbrk, len2, 0Fh 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 00000184 BB[C5020000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 00000189 B92D000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 0000018E BA0F000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 00000193 B823000000 <1> mov eax, %1 80 <1> 81 00000198 CD40 <1> int 40h 177 sys _msg, ctrlbrk_skip, len3, 07h 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 0000019A BB[F3020000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 0000019F B92B000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 000001A4 BA07000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 000001A9 B823000000 <1> mov eax, %1 80 <1> 81 000001AE CD40 <1> int 40h 178 000001B0 E9EAFEFFFF jmp getchar_@@@ 179 180 quit_request: 181 sys _msg, quit_question, 255, 0Fh 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 000001B5 BB[43030000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 000001BA B9FF000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 000001BF BA0F000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 000001C4 B823000000 <1> mov eax, %1 80 <1> 81 000001C9 CD40 <1> int 40h 182 quit_request_@: 183 ; getchar 184 ;mov ah, 10h 185 ;int 32h 186 187 ; stdio getchar (TRTDOS 386 Kernel v2.0.9 and later) 188 ;mov bl, 6 ; read character (ascii and scancode) on stdin 189 ; -no redirection, wait- 190 sys _stdio, 6 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 000001CB BB06000000 <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 000001D0 B82E000000 <1> mov eax, %1 80 <1> 81 000001D5 CD40 <1> int 40h 191 192 000001D7 24DF and al, ~20h ; 0DFh ; capitalize letter 193 000001D9 3C59 cmp al, 'Y' 194 000001DB 7426 je short print_yes 195 000001DD 3C4E cmp al, 'N' 196 000001DF 75EA jne short quit_request_@ 197 print_no: 198 000001E1 C605[A4030000]00 mov byte [counter], 0 199 sys _msg, msg_no, 4, 07h 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 000001E8 BB[C4030000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 000001ED B904000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 000001F2 BA07000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 000001F7 B823000000 <1> mov eax, %1 80 <1> 81 000001FC CD40 <1> int 40h 200 000001FE E982FEFFFF jmp getchar_@@ 201 202 print_yes: 203 sys _msg, msg_yes, 5, 07h 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 00000203 BB[BE030000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 00000208 B905000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 0000020D BA07000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 00000212 B823000000 <1> mov eax, %1 80 <1> 81 00000217 CD40 <1> int 40h 204 00000219 EB16 jmp short terminate 205 206 _ok: 207 sys _msg, msg_ok, 255, 07h 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 0000021B BB[C9030000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 00000220 B9FF000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 00000225 BA07000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 0000022A B823000000 <1> mov eax, %1 80 <1> 81 0000022F CD40 <1> int 40h 208 209 terminate: 210 sys _msg, crlf, 2, 07h 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 00000231 BB[1C030000] <1> mov ebx, %2 72 <1> %if %0 >= 3 73 00000236 B902000000 <1> mov ecx, %3 74 <1> %if %0 = 4 75 0000023B BA07000000 <1> mov edx, %4 76 <1> %endif 77 <1> %endif 78 <1> %endif 79 00000240 B823000000 <1> mov eax, %1 80 <1> 81 00000245 CD40 <1> int 40h 211 212 sys _exit, 0 ; ebx = exit code 66 <1> 67 <1> 68 <1> 69 <1> 70 <1> %if %0 >= 2 71 00000247 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 0000024C B801000000 <1> mov eax, %1 80 <1> 81 00000251 CD40 <1> int 40h 213 ;sys _exit 214 here: 215 00000253 90 nop 216 00000254 EBFD jmp short here 217 218 ;----------------------------------------------------------------- 219 ; messages 220 ;----------------------------------------------------------------- 221 222 program: 223 00000256 0D0A db 0Dh, 0Ah 224 00000258 5452444F5320333836- db "TRDOS 386 v2.0.9 - CTRL+BRK Function Test" 224 00000261 2076322E302E39202D- 224 0000026A 204354524C2B42524B- 224 00000273 2046756E6374696F6E- 224 0000027C 2054657374 225 00000281 0D0A db 0Dh, 0Ah 226 len0 equ $-program 227 00000283 00 db 0 228 owner: 229 00000284 4572646F67616E2054- db "Erdogan Tan - 23/08/2024" 229 0000028D 616E202D2032332F30- 229 00000296 382F32303234 230 0000029C 0D0A00 db 0Dh, 0Ah, 0 231 232 ctrlbrk_def: 233 0000029F 0D0A db 0Dh, 0Ah 234 000002A1 44656661756C742043- db "Default CTRL+BRK function disabled." 234 000002AA 54524C2B42524B2066- 234 000002B3 756E6374696F6E2064- 234 000002BC 697361626C65642E 235 len1 equ $-ctrlbrk_def 236 000002C4 00 db 0 237 ctrlbrk: 238 000002C5 0D0A db 0Dh, 0Ah 239 000002C7 507265737320435452- db "Press CTRL+BREAK keys (together) to test." 239 000002D0 4C2B425245414B206B- 239 000002D9 6579732028746F6765- 239 000002E2 746865722920746F20- 239 000002EB 746573742E 240 000002F0 0D0A db 0Dh, 0Ah 241 len2 equ $-ctrlbrk 242 000002F2 00 db 0 243 ctrlbrk_skip: 244 000002F3 0D0A db 0Dh, 0Ah 245 000002F5 507265737320535041- db "Press SPACEBAR to skip this test stage." 245 000002FE 434542415220746F20- 245 00000307 736B69702074686973- 245 00000310 207465737420737461- 245 00000319 67652E 246 crlf: 247 0000031C 0D0A db 0Dh, 0Ah 248 len3 equ $-ctrlbrk_skip 249 0000031E 00 db 0 250 251 sysquit_msg: 252 0000031F 0D0A db 0Dh, 0Ah 253 00000321 535953515549542043- db "SYSQUIT CTRL+BRK handling test." 253 0000032A 54524C2B42524B2068- 253 00000333 616E646C696E672074- 253 0000033C 6573742E 254 00000340 0D0A00 db 0Dh, 0Ah, 0 255 quit_question: 256 00000343 0D0A db 0Dh, 0Ah 257 00000345 535953515549542043- db "SYSQUIT CTRL+BREAK" 257 0000034E 54524C2B425245414B 258 00000357 0D0A db 0Dh, 0Ah 259 00000359 446F20796F75207761- db "Do you want to quit/break (Y/N)? " 259 00000362 6E7420746F20717569- 259 0000036B 742F627265616B2028- 259 00000374 592F4E293F20 260 0000037A 00 db 0 261 ctrlbrk_enabled: 262 0000037B 0D0A db 0Dh, 0Ah 263 0000037D 44656661756C742043- db "Default CTRL+BRK function ENABLED." 263 00000386 54524C2B42524B2066- 263 0000038F 756E6374696F6E2045- 263 00000398 4E41424C45442E 264 0000039F 00 db 0 265 266 000003A0 00000000 time: dd 0 267 000003A4 00 counter: db 0 268 000003A5 00 stage: db 0 269 270 _one_two_three_four: 271 000003A6 4F4E45202020 db "ONE " 272 len4 equ $ - _one_two_three_four 273 000003AC 54574F202020 db "TWO " 274 000003B2 544852454520 db "THREE " 275 000003B8 464F55522020 db "FOUR " 276 277 000003BE 5965730D0A00 msg_yes: db "Yes", 0Dh, 0Ah, 0 278 000003C4 4E6F0D0A00 msg_no: db "No", 0Dh, 0Ah, 0 279 280 msg_ok: 281 000003C9 0D0A db 0Dh, 0Ah 282 000003CB 4F4B2E20 db "OK. " 283 000003CF 00 db 0