     1                                  ; ****************************************************************************
     2                                  ; piano.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'piano.prg')
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; PIANO.PRG ! TEST program !  INT 34h (IOCTL functions) test !
     5                                  ;
     6                                  ; 20/06/2016
     7                                  ;
     8                                  ; [ Last Modification: 20/06/2016 ]
     9                                  ;
    10                                  ; ****************************************************************************
    11                                  
    12                                  ; 29/04/2016
    13                                  ; TRDOS 386 system calls (temporary list!)
    14                                  _ver 	equ 0
    15                                  _exit 	equ 1
    16                                  _fork 	equ 2
    17                                  _read 	equ 3
    18                                  _write	equ 4
    19                                  _open	equ 5
    20                                  _close 	equ 6
    21                                  _wait 	equ 7
    22                                  _creat 	equ 8
    23                                  _link 	equ 9
    24                                  _unlink	equ 10
    25                                  _exec	equ 11
    26                                  _chdir	equ 12
    27                                  _time 	equ 13
    28                                  _mkdir 	equ 14
    29                                  _chmod	equ 15
    30                                  _chown	equ 16
    31                                  _break	equ 17
    32                                  _stat	equ 18
    33                                  _seek	equ 19
    34                                  _tell 	equ 20
    35                                  _mount	equ 21
    36                                  _umount	equ 22
    37                                  _setuid	equ 23
    38                                  _getuid	equ 24
    39                                  _stime	equ 25
    40                                  _quit	equ 26	
    41                                  _intr	equ 27
    42                                  _fstat	equ 28
    43                                  _emt 	equ 29
    44                                  _mdate 	equ 30
    45                                  _stty 	equ 31
    46                                  _gtty	equ 32
    47                                  _ilgins	equ 33
    48                                  _sleep	equ 34
    49                                  _msg    equ 35
    50                                  
    51                                  %macro sys 1-4
    52                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    53                                      ; 03/09/2015	
    54                                      ; 13/04/2015
    55                                      ; Retro UNIX 386 v1 system call.		
    56                                      %if %0 >= 2   
    57                                          mov ebx, %2
    58                                          %if %0 >= 3    
    59                                              mov ecx, %3
    60                                              %if %0 = 4
    61                                                 mov edx, %4   
    62                                              %endif
    63                                          %endif
    64                                      %endif
    65                                      mov eax, %1
    66                                      ;int 30h
    67                                      int 40h ; TRDOS 386 (TRDOS v2.0)		   
    68                                  %endmacro
    69                                  
    70                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    71                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    72                                  
    73                                  [BITS 32] ; We need 32-bit intructions for protected mode
    74                                  
    75                                  [ORG 0] 
    76                                  
    77                                  START_CODE:
    78                                  	sys	_msg, msg_piano, msg_size, msg_color ; INT 40h
    78                              <1> 
    78                              <1> 
    78                              <1> 
    78                              <1> 
    78                              <1>  %if %0 >= 2
    78 00000000 BB[D0000000]        <1>  mov ebx, %2
    78                              <1>  %if %0 >= 3
    78 00000005 B970000000          <1>  mov ecx, %3
    78                              <1>  %if %0 = 4
    78 0000000A BA0B000000          <1>  mov edx, %4
    78                              <1>  %endif
    78                              <1>  %endif
    78                              <1>  %endif
    78 0000000F B823000000          <1>  mov eax, %1
    78                              <1> 
    78 00000014 CD40                <1>  int 40h
    79                                  getchar:
    80                                  	; Getchar by using keyboard interrupt
    81 00000016 B410                    	mov	ah, 10h
    82 00000018 CD32                    	int 	32h ; TRDOS 386 keyboard interrupt
    83                                  		    ; (IBM PC/AT ROMBIOS, INT 16h)			
    84                                  	
    85 0000001A 3C1B                    	cmp	al, 1Bh
    86 0000001C 7457                    	je	short terminate
    87                                  
    88 0000001E 3C31                    	cmp	al, '1'
    89 00000020 725C                    	jb	short error
    90 00000022 3C38                    	cmp	al, '8'
    91 00000024 7758                    	ja	short error
    92                                  
    93 00000026 240F                    	and	al, 0Fh
    94 00000028 FEC8                    	dec	al
    95 0000002A D0E0                    	shl	al, 1 
    96 0000002C 0FB6F0                  	movzx	esi, al
    97 0000002F 81C6[BF000000]          	add	esi, FREQUENCY
    98                                  
    99 00000035 668B1E                  	mov	bx, [esi]
   100                                  	
   101 00000038 B401                    	mov	ah, 1 ; write port
   102 0000003A 88E0                    	mov	al, ah ; 1
   103 0000003C 66BA6100                	mov	dx, 61h ; I/O port number
   104 00000040 CD34                    	int	34h ; TRDOS 386 IOCTL interrupt
   105                                  	 
   106 00000042 B0B6                    	mov	al, 0B6h
   107 00000044 66BA4300                	mov	dx, 43h
   108 00000048 CD34                    	int	34h ; TRDOS 386 IOCTL interrupt
   109                                  
   110 0000004A 88D8                    	mov	al, bl
   111                                  	;mov	dx, 42h
   112 0000004C 664A                    	dec	dx
   113 0000004E CD34                    	int	34h ; TRDOS 386 IOCTL interrupt
   114                                  
   115 00000050 88F8                    	mov	al, bh
   116                                  	;mov	dx, 42h
   117 00000052 CD34                    	int	34h ; TRDOS 386 IOCTL interrupt
   118                                  
   119 00000054 66BA6100                	mov	dx, 61h
   120 00000058 28E4                    	sub	ah, ah ; 0 -> read port
   121 0000005A CD34                    	int	34h ; TRDOS 386 IOCTL interrupt
   122                                  	
   123 0000005C 0C03                    	or	al, 3
   124                                  
   125 0000005E FEC4                    	inc 	ah ; mov ah, 1 ; write port
   126                                  	;mov	dx, 61h
   127 00000060 CD34                    	int	34h ; TRDOS 386 IOCTL interrupt
   128                                  
   129 00000062 E846000000              	call	delay
   130                                  
   131 00000067 66BA6100                	mov	dx, 61h
   132                                  	;sub	ah, ah ; 0 -> read port
   133 0000006B CD34                    	int	34h ; TRDOS 386 IOCTL interrupt	
   134                                  
   135 0000006D 24FC                    	and	al, 0FCh
   136 0000006F FEC4                    	inc 	ah ; mov ah, 1 ; write port
   137                                  	;mov	dx, 61h
   138 00000071 CD34                    	int	34h ; TRDOS 386 IOCTL interrupt
   139                                  
   140 00000073 EBA1                    	jmp	short getchar 
   141                                  
   142                                  terminate:
   143                                  	sys 	_exit			   ; INT 40h
   143                              <1> 
   143                              <1> 
   143                              <1> 
   143                              <1> 
   143                              <1>  %if %0 >= 2
   143                              <1>  mov ebx, %2
   143                              <1>  %if %0 >= 3
   143                              <1>  mov ecx, %3
   143                              <1>  %if %0 = 4
   143                              <1>  mov edx, %4
   143                              <1>  %endif
   143                              <1>  %endif
   143                              <1>  %endif
   143 00000075 B801000000          <1>  mov eax, %1
   143                              <1> 
   143 0000007A CD40                <1>  int 40h
   144                                  here:
   145 0000007C EBFE                    	jmp	short here
   146                                  
   147                                  error:
   148 0000007E 3C2B                    	cmp	al, '+'
   149 00000080 7508                    	jne	short _0
   150 00000082 FE05[CF000000]          	inc	 byte [delaym]
   151 00000088 EB0A                    	jmp	short _1
   152                                  _0:
   153 0000008A 3C2D                    	cmp	al, '-'
   154 0000008C 7506                    	jne	short _1
   155 0000008E FE0D[CF000000]          	dec	byte [delaym]
   156                                  _1:
   157 00000094 BE[09010000]            	mov 	esi, msg_piano_keys
   158                                  	;
   159 00000099 BB0F000000              	mov	ebx, 0Fh       ; white characters (bl)
   160                                  		               ; video page 0 (bh)
   161 0000009E B40E                    	mov	ah, 0Eh  ; teletype output (write tty)
   162 000000A0 AC                      	lodsb
   163                                  _2:
   164 000000A1 CD31                    	int	31h	 ; TRDOS 386 video interrupt
   165 000000A3 AC                      	lodsb
   166 000000A4 20C0                    	and	al, al
   167 000000A6 75F9                    	jnz	short _2
   168                                  	;
   169 000000A8 E969FFFFFF              	jmp	getchar
   170                                  
   171                                  delay:
   172 000000AD B8FFFF0000              	mov	eax, 0FFFFh
   173 000000B2 8A0D[CF000000]          	mov	cl, [delaym]
   174 000000B8 D3E0                    	shl	eax, cl
   175                                  dl0:	
   176 000000BA 90                      	nop
   177 000000BB 48                      	dec	eax
   178 000000BC 75FC                    	jnz	short dl0
   179 000000BE C3                      	retn
   180                                  
   181                                  FREQUENCY:
   182 000000BF E808EF071107AD06F1-     	dw	2280, 2031, 1809, 1709, 1521, 1355, 1207, 1139 
   182 000000C8 054B05B7047304     
   183                                  
   184                                  delaym:
   185 000000CF 04                      	db 	4
   186                                  
   187                                  ;-----------------------------------------------------------------
   188                                  ;  message
   189                                  ;-----------------------------------------------------------------
   190                                  
   191                                  msg_color	equ 0Bh ; ligth cyan
   192                                  
   193 000000D0 0D0A                    msg_piano:	db 0Dh, 0Ah
   194 000000D2 5452444F5320333836-     		db 'TRDOS 386 IOCTL (INT 34h) Test Program by Erdogan Tan'
   194 000000DB 20494F43544C202849-
   194 000000E4 4E5420333468292054-
   194 000000ED 6573742050726F6772-
   194 000000F6 616D20627920457264-
   194 000000FF 6F67616E2054616E   
   195 00000107 0D0A                    		db 0Dh, 0Ah
   196                                  msg_piano_keys:
   197 00000109 5069616E6F20284265-     		db 'Piano (Beep) keys: "1" to "8" (Press ESC key to exit)'
   197 00000112 657029206B6579733A-
   197 0000011B 2022312220746F2022-
   197 00000124 382220285072657373-
   197 0000012D 20455343206B657920-
   197 00000136 746F206578697429   
   198 0000013E 0D0A                    		db 0Dh, 0Ah
   199                                  msg_size equ    $ - msg_piano
   200 00000140 00                      		db 0
   201 00000141 32302F30362F323031-     db '20/06/2016'
   201 0000014A 36                 
