     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) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    85                                  
    86                                  ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    87                                  ; ;;	This file is generated by The Interactive Disassembler (IDA)	   ;;
    88                                  ; ;;	Copyright (c) 2010 by Hex-Rays SA, <support@hex-rays.com>	   ;;
    89                                  ; ;;			 Licensed to: Freeware version			   ;;
    90                                  ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    91                                  ;
    92                                  ; File Name   :	C:\Documents and Settings\Erdoan 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
