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) , , 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