1 ; **************************************************************************** 2 ; flame.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'flame.prg') 3 ; ---------------------------------------------------------------------------- 4 ; FLAME.PRG ! TEST program ! TRDOS 386 VGA Functionality test ! 5 ; 6 ; 10/08/2016 7 ; 8 ; [ Last Modification: 11/08/2016 ] 9 ; 10 ; Derived from disassembly of 'flame.com' file (188 bytes) 11 ; 12 ; Assembler: NASM 2.11 13 14 ; Original code disassembler: IDA Pro Free (MASM syntax) 15 ; 16 ; (Original -msdos- code has been modifed for TRDOS 386 system calls and 17 ; other protected mode (TRDOS 386) interrupts.) 18 ; **************************************************************************** 19 20 ; 19/05/2016 21 ; 29/04/2016 22 ; TRDOS 386 system calls (temporary list!) 23 _ver equ 0 24 _exit equ 1 25 _fork equ 2 26 _read equ 3 27 _write equ 4 28 _open equ 5 29 _close equ 6 30 _wait equ 7 31 _creat equ 8 32 _link equ 9 33 _unlink equ 10 34 _exec equ 11 35 _chdir equ 12 36 _time equ 13 37 _mkdir equ 14 38 _chmod equ 15 39 _chown equ 16 40 _break equ 17 41 _stat equ 18 42 _seek equ 19 43 _tell equ 20 44 _mount equ 21 45 _umount equ 22 46 _setuid equ 23 47 _getuid equ 24 48 _stime equ 25 49 _quit equ 26 50 _intr equ 27 51 _fstat equ 28 52 _emt equ 29 53 _mdate equ 30 54 _video equ 31 55 _audio equ 32 56 _ilgins equ 33 57 _sleep equ 34 58 _msg equ 35 59 _geterr equ 36 60 _rsrvd1 equ 37 61 _pri equ 38 62 _rele equ 39 63 64 %macro sys 1-4 65 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 66 ; 03/09/2015 67 ; 13/04/2015 68 ; Retro UNIX 386 v1 system call. 69 %if %0 >= 2 70 mov ebx, %2 71 %if %0 >= 3 72 mov ecx, %3 73 %if %0 = 4 74 mov edx, %4 75 %endif 76 %endif 77 %endif 78 mov eax, %1 79 ;int 30h 80 int 40h ; TRDOS 386 (TRDOS v2.0) 81 %endmacro 82 83 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 84 ; sys systemcall (eax) , , 85 86 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 87 ; ;; This file is generated by The Interactive Disassembler (IDA) ;; 88 ; ;; Copyright (c) 2010 by Hex-Rays SA, ;; 89 ; ;; Licensed to: Freeware version ;; 90 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 91 ; 92 ; File Name : C:\Documents and Settings\Erdošan Tan\Desktop\FLAME.COM 93 ; Format : MS-DOS COM-file 94 ; Base Address: 1000h Range: 10100h-101BCh Loaded length: BCh 95 96 ; NOTE: Assembly source code of FLAME.COM (by IDA, in MASM syntax) 97 ; has been modified to NASM syntax (for 386 protected mode & for TRDOS 386) 98 ; by Erdogan Tan. (10/08/2016) 99 100 [BITS 32] ; We need 32-bit intructions for protected mode 101 102 [ORG 0] 103 104 start: 105 ; DIRECT VGA MEMORY ACCESS 106 ;xor ebx, ebx 107 00000000 B705 mov bh, 5 ; Direct access/map to VGA memory (0A0000h) 108 ;mov eax, _video ; 1Fh 109 00000002 B01F mov al, 1Fh ; sys _video ; TRDOS 386 Video functions 110 00000004 CD40 int 40h ; TRDOS 386 system call 111 112 ; eax = 0A0000h 113 00000006 21C0 and eax, eax 114 00000008 0F84F2000000 jz terminate ; error (eax = 0) 115 116 ; ah = 0 117 0000000E B013 mov al, 13h ; set video mode to 13h 118 ;int 10h ; - VIDEO - 119 00000010 CD31 int 31h ; TRDOS 386 - VIDEO Interrupt 120 121 00000012 B03F mov al, 3Fh 122 00000014 66B90003 mov cx, 300h 123 00000018 BFC0000A00 mov edi, 0A00C0h 124 0000001D F3AA rep stosb 125 0000001F BEBF000A00 mov esi, 0A00BFh 126 00000024 30E4 xor ah, ah 127 00000026 E8DE000000 call sub_101A8 128 0000002B B401 mov ah, 1 129 0000002D E8D7000000 call sub_101A8 130 00000032 BEBE000A00 mov esi, 0A00BEh 131 00000037 E8CD000000 call sub_101A8 132 0000003C BE00000A00 mov esi, 0A0000h 133 00000041 E8C3000000 call sub_101A8 134 135 00000046 6631DB xor bx, bx 136 00000049 66B81210 mov ax, 1012h 137 0000004D B1FF mov cl, 0FFh 138 0000004F BA00000A00 mov edx, 0A0000h 139 ;int 10h ; - VIDEO - SET BLOCK OF DAC REGISTERS (EGA, VGA/MCGA) 140 ; BX = starting color register, CX = number of registers to set 141 ; ES:DX -> table of 3*CX bytes where each 3 byte group represents one 142 ; byte each of red, green and blue (0-63) 143 00000054 CD31 int 31h ; TRDOS 386 - VIDEO Interrupt 144 loc_10133: 145 00000056 66B94001 mov cx, 140h 146 0000005A BF[45010000] mov edi, _1BAh 147 0000005F 30E4 xor ah, ah 148 00000061 B364 mov bl, 64h 149 loc_1013E: 150 00000063 8A877F020000 mov al, [edi+27Fh] 151 00000069 8A9780020000 mov dl, [edi+280h] 152 ; dh = 0 153 0000006F 6601D0 add ax, dx 154 00000072 8A9781020000 mov dl, [edi+281h] 155 00000078 6601D0 add ax, dx 156 0000007B 8A9700050000 mov dl, [edi+500h] 157 00000081 6601D0 add ax, dx 158 00000084 66C1E802 shr ax, 2 159 00000088 7402 jz short loc_1015B 160 0000008A FEC8 dec al 161 loc_1015B: 162 0000008C 8807 mov [edi], al 163 0000008E 8A9700050000 mov dl, [edi+500h] 164 00000094 6601D0 add ax, dx 165 00000097 66D1E8 shr ax, 1 166 0000009A 888740010000 mov [edi+140h], al 167 000000A0 47 inc edi 168 000000A1 E2C0 loop loc_1013E 169 000000A3 66B94001 mov cx, 140h 170 000000A7 01CF add edi, ecx 171 000000A9 FECB dec bl 172 000000AB 75B6 jnz short loc_1013E 173 000000AD BF00000A00 mov edi, 0A0000h 174 000000B2 BE[45010000] mov esi, _1BAh 175 000000B7 66B9603B mov cx, 3B60h 176 000000BB F3A5 rep movsd 177 000000BD BF[05FA0000] mov edi, 0F8C0h + _1BAh ;_FA7Ah 178 000000C2 66B93C01 mov cx, 13Ch 179 loc_10185: 180 ;in al, 40h ; Timer 8253-5 (AT: 8254.2). 181 182 000000C6 88E3 mov bl, ah 183 ; TRDOS 386 - IOCTL Interrupt (for ring 3) 184 000000C8 B400 mov ah, 0 ; in (byte) 185 000000CA 66BA4000 mov dx, 40h 186 ; al = data byte 187 ; dx = port number 188 000000CE CD34 int 34h ; TRDOS 386 - IOCTL 189 000000D0 88DC mov ah, bl 190 191 000000D2 660305[43010000] add ax, [word_101B8] 192 000000D9 660105[43010000] add [word_101B8], ax 193 000000E0 88C4 mov ah, al 194 000000E2 668907 mov [edi], ax 195 000000E5 66894702 mov [edi+2], ax 196 000000E9 83C704 add edi, 4 197 000000EC 6649 dec cx 198 000000EE 75D6 jnz short loc_10185 199 000000F0 B401 mov ah, 1 200 ;int 16h ; KEYBOARD - CHECK BUFFER, DO NOT CLEAR 201 ; Return: ZF clear if character in buffer 202 ; AH = scan code, AL = character 203 ; ZF set if no character in buffer 204 000000F2 CD32 int 32h ; TRDOS 386 - KEYBOARD Interrupt 205 000000F4 0F845CFFFFFF jz loc_10133 206 000000FA 66B80300 mov ax, 3 207 ;int 10h ; - VIDEO - SET VIDEO MODE 208 ; AL = mode 209 000000FE CD31 int 31h ; TRDOS 386 - VIDEO Interrupt 210 terminate: 211 sys _exit ; INT 40h 212 <1> 213 <1> 214 <1> 215 <1> 216 <1> %if %0 >= 2 217 <1> mov ebx, %2 218 <1> %if %0 >= 3 219 <1> mov ecx, %3 220 <1> %if %0 = 4 221 <1> mov edx, %4 222 <1> %endif 223 <1> %endif 224 <1> %endif 225 00000100 B801000000 <1> mov eax, %1 226 <1> 227 00000105 CD40 <1> int 40h 228 here: 229 00000107 EBFE jmp short here 230 231 ; ------------- S U B R O U T I N E --------------------------------------- 232 233 sub_101A8: 234 00000109 B140 mov cl, 40h 235 0000010B 30C0 xor al, al 236 loc_101AC: 237 0000010D 8806 mov [esi], al 238 0000010F 00E0 add al, ah 239 00000111 83C603 add esi, 3 240 00000114 E2F7 loop loc_101AC 241 00000116 C3 retn 242 243 ; --------------------------------------------------------------------------- 244 00000117 00 db 0 245 00000118 5452444F5320333836 db 'TRDOS 386' 246 00000121 00 db 0 247 00000122 464C414D452E505247 db 'FLAME.PRG' 248 0000012B 00 db 0 249 0000012C 4552444F47414E2054- db 'ERDOGAN TAN' 250 00000135 414E 251 00000137 00 db 0 252 00000138 31312F30382F323031- db '11/08/2016' 253 00000141 36 254 00000142 00 db 0 255 256 00000143 8D00 word_101B8: dw 8Dh 257 _1BAh: 258 00000145 00 db 0 259 00000146 00 db 0