     1                                  ; ****************************************************************************
     2                                  ; hello2.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'hello2.prg')
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; HELLO2.PRG ! TEST program !  INT 31h (Video BIOS) test !
     5                                  ;
     6                                  ; 12/05/2016
     7                                  ;
     8                                  ; Derived from 'hello.s' source code for Retro UNIX 386 v1 & TRDOS 386
     9                                  ;
    10                                  ; [ Last Modification: 13/05/2016 ]
    11                                  ;
    12                                  ; ****************************************************************************
    13                                  ;
    14                                  ; hello.s (01/05/2016, TRDOS v2.0)
    15                                  ; hello.s (28/08/2015, Retro UNIX 386 v1, NASM 2.11, 32 bit version)
    16                                  ; HELLO.ASM, 18/11/2013 (Retro UNIX 8086 v1, MASM 6.11) 
    17                                  
    18                                  ; 29/04/2016
    19                                  ; TRDOS 386 system calls (temporary list!)
    20                                  _ver 	equ 0
    21                                  _exit 	equ 1
    22                                  _fork 	equ 2
    23                                  _read 	equ 3
    24                                  _write	equ 4
    25                                  _open	equ 5
    26                                  _close 	equ 6
    27                                  _wait 	equ 7
    28                                  _creat 	equ 8
    29                                  _link 	equ 9
    30                                  _unlink	equ 10
    31                                  _exec	equ 11
    32                                  _chdir	equ 12
    33                                  _time 	equ 13
    34                                  _mkdir 	equ 14
    35                                  _chmod	equ 15
    36                                  _chown	equ 16
    37                                  _break	equ 17
    38                                  _stat	equ 18
    39                                  _seek	equ 19
    40                                  _tell 	equ 20
    41                                  _mount	equ 21
    42                                  _umount	equ 22
    43                                  _setuid	equ 23
    44                                  _getuid	equ 24
    45                                  _stime	equ 25
    46                                  _quit	equ 26	
    47                                  _intr	equ 27
    48                                  _fstat	equ 28
    49                                  _emt 	equ 29
    50                                  _mdate 	equ 30
    51                                  _stty 	equ 31
    52                                  _gtty	equ 32
    53                                  _ilgins	equ 33
    54                                  _sleep	equ 34
    55                                  _msg    equ 35
    56                                  
    57                                  %macro sys 1-4
    58                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    59                                      ; 03/09/2015	
    60                                      ; 13/04/2015
    61                                      ; Retro UNIX 386 v1 system call.		
    62                                      %if %0 >= 2   
    63                                          mov ebx, %2
    64                                          %if %0 >= 3    
    65                                              mov ecx, %3
    66                                              %if %0 = 4
    67                                                 mov edx, %4   
    68                                              %endif
    69                                          %endif
    70                                      %endif
    71                                      mov eax, %1
    72                                      ;int 30h
    73                                      int 40h ; TRDOS 386 (TRDOS v2.0)		   
    74                                  %endmacro
    75                                  
    76                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    77                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    78                                  
    79                                  [BITS 32] ; We need 32-bit intructions for protected mode
    80                                  
    81                                  [ORG 0] 
    82                                  
    83                                  START_CODE:
    84                                  	;mov	eax, 417
    85                                  	;int	30h ; 'INVALID SYSTEM CALL' test!
    86                                  	;
    87                                  	sys 	_ver ; get TRDOS version   ; INT 40h
    87                              <1> 
    87                              <1> 
    87                              <1> 
    87                              <1> 
    87                              <1>  %if %0 >= 2
    87                              <1>  mov ebx, %2
    87                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    87                              <1>  %if %0 = 4
    87                              <1>  mov edx, %4
    87                              <1>  %endif
    87                              <1>  %endif
    87                              <1>  %endif
    87 00000000 B800000000          <1>  mov eax, %1
    87                              <1> 
    87 00000005 CD40                <1>  int 40h
    88 00000007 66053030                	add	ax, '00'
    89 0000000B 8825[7F000000]          	mov	[ver_str_major], ah
    90 00000011 A2[81000000]            	mov	[ver_str_minor], al
    91                                  	
    92                                  	sys	_msg, msg_Hello, msg_size, msg_color ; INT 40h
    92                              <1> 
    92                              <1> 
    92                              <1> 
    92                              <1> 
    92                              <1>  %if %0 >= 2
    92 00000016 BB[4F000000]        <1>  mov ebx, %2
    92                              <1>  %if %0 >= 3
    92 0000001B B956000000          <1>  mov ecx, %3
    92                              <1>  %if %0 = 4
    92 00000020 BA0A000000          <1>  mov edx, %4
    92                              <1>  %endif
    92                              <1>  %endif
    92                              <1>  %endif
    92 00000025 B823000000          <1>  mov eax, %1
    92                              <1> 
    92 0000002A CD40                <1>  int 40h
    93                                  
    94 0000002C BE[A6000000]            	mov	esi, msg_int31h
    95 00000031 E809000000              	call	print_msg		   ; INT 31h
    96                                  
    97                                  	sys 	_exit			   ; INT 40h
    97                              <1> 
    97                              <1> 
    97                              <1> 
    97                              <1> 
    97                              <1>  %if %0 >= 2
    97                              <1>  mov ebx, %2
    97                              <1>  %if %0 >= 3
    97                              <1>  mov ecx, %3
    97                              <1>  %if %0 = 4
    97                              <1>  mov edx, %4
    97                              <1>  %endif
    97                              <1>  %endif
    97                              <1>  %endif
    97 00000036 B801000000          <1>  mov eax, %1
    97                              <1> 
    97 0000003B CD40                <1>  int 40h
    98                                  here:
    99 0000003D EBFE                    	jmp	short here
   100                                  
   101                                  print_msg:
   102 0000003F BB0E000000              	mov	ebx, 0Eh       ; yellow characters (bl)
   103                                  		               ; video page 0 (bh)
   104                                  	;mov	ah, 0Eh ; teletype output (write tty)
   105 00000044 88DC                    	mov	ah, bl
   106 00000046 AC                      	lodsb
   107                                  _1:
   108 00000047 CD31                    	int	31h
   109 00000049 AC                      	lodsb
   110 0000004A 20C0                    	and	al, al
   111 0000004C 75F9                    	jnz	short _1
   112                                  _2:
   113 0000004E C3                      	retn
   114                                  
   115                                  ;-----------------------------------------------------------------
   116                                  ;  message
   117                                  ;-----------------------------------------------------------------
   118                                  
   119                                  msg_color	equ 0Ah ; ligth green
   120                                  
   121 0000004F 07                      msg_Hello:	db 07h ; beep
   122 00000050 0D0A                    		db 0Dh, 0Ah
   123 00000052 48656C6C6F20776F72-     		db 'Hello world !'
   123 0000005B 6C642021           
   124 0000005F 0D0A                    		db 0Dh, 0Ah
   125 00000061 546869732069732054-     		db 'This is Turkish Rational DOS v'
   125 0000006A 75726B697368205261-
   125 00000073 74696F6E616C20444F-
   125 0000007C 532076             
   126 0000007F 30                      ver_str_major:	db '0'
   127 00000080 2E                      		db '.'
   128 00000081 30                      ver_str_minor:  db '0'
   129 00000082 20746573742070726F-                     db ' test program ! (INT 40h, sysmsg)'
   129 0000008B 6772616D2021202849-
   129 00000094 4E54203430682C2073-
   129 0000009D 79736D736729       
   130 000000A3 0D0A                    		db 0Dh, 0Ah
   131                                  msg_size equ    $ - msg_Hello
   132 000000A5 00                      		db 0
   133                                  msg_int31h:
   134 000000A6 2854686973206D6573-     		db '(This message has been written by using INT 31h teletype function!)'
   134 000000AF 736167652068617320-
   134 000000B8 6265656E2077726974-
   134 000000C1 74656E206279207573-
   134 000000CA 696E6720494E542033-
   134 000000D3 31682074656C657479-
   134 000000DC 70652066756E637469-
   134 000000E5 6F6E2129           
   135 000000E9 0D0A00                  		db 0Dh, 0Ah, 0
