     1                                  ; ****************************************************************************
     2                                  ; ttydemo.s (args.s) - Retro Unix 386 v1 - tty output (digital) scroll demo
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; RETRO UNIX 386 (Retro Unix == Turkish Rational Unix)
     5                                  ; Operating System Project (v0.2) by ERDOGAN TAN (Beginning: 24/12/2013)
     6                                  ;
     7                                  ; [ Last Modification: 11/11/2015 ]
     8                                  ;
     9                                  ; ****************************************************************************
    10                                  ; Assembler: NASM 2.11
    11                                  
    12                                  ; 11/11/2015
    13                                  
    14                                  ; UNIX v1 system calls
    15                                  _rele 	equ 0
    16                                  _exit 	equ 1
    17                                  _fork 	equ 2
    18                                  _read 	equ 3
    19                                  _write	equ 4
    20                                  _open	equ 5
    21                                  _close 	equ 6
    22                                  _wait 	equ 7
    23                                  _creat 	equ 8
    24                                  _link 	equ 9
    25                                  _unlink	equ 10
    26                                  _exec	equ 11
    27                                  _chdir	equ 12
    28                                  _time 	equ 13
    29                                  _mkdir 	equ 14
    30                                  _chmod	equ 15
    31                                  _chown	equ 16
    32                                  _break	equ 17
    33                                  _stat	equ 18
    34                                  _seek	equ 19
    35                                  _tell 	equ 20
    36                                  _mount	equ 21
    37                                  _umount	equ 22
    38                                  _setuid	equ 23
    39                                  _getuid	equ 24
    40                                  _stime	equ 25
    41                                  _quit	equ 26	
    42                                  _intr	equ 27
    43                                  _fstat	equ 28
    44                                  _emt 	equ 29
    45                                  _mdate 	equ 30
    46                                  _stty 	equ 31
    47                                  _gtty	equ 32
    48                                  _ilgins	equ 33
    49                                  _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
    50                                  _msg	equ 35 ; Retro UNIX 386 v1 feature only !
    51                                  _geterr	equ 36 ; Retro UNIX 386 v1 feature only !
    52                                  
    53                                  %macro sys 1-4
    54                                      ; Retro UNIX 386 v1 system call.		
    55                                      %if %0 >= 2   
    56                                          mov ebx, %2
    57                                          %if %0 >= 3    
    58                                              mov ecx, %3
    59                                              %if %0 = 4
    60                                                 mov edx, %4   
    61                                              %endif
    62                                          %endif
    63                                      %endif
    64                                      mov eax, %1
    65                                      int 30h	   
    66                                  %endmacro
    67                                  
    68                                  ESC equ 1Bh
    69                                  CR  equ 0Dh
    70                                  
    71                                  ; Retro UNIX 386 v1 system call format:
    72                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    73                                  
    74                                  [BITS 32] ; 32-bit intructions (80386 protected mode)
    75                                  
    76                                  [ORG 0] 
    77                                  
    78                                  START_CODE:
    79                                  	sys _write, 1, header, headersize
    80                              <1> 
    81                              <1>  %if %0 >= 2
    82 00000000 BB01000000          <1>  mov ebx, %2
    83                              <1>  %if %0 >= 3
    84 00000005 B9[E6010000]        <1>  mov ecx, %3
    85                              <1>  %if %0 = 4
    86 0000000A BA53000000          <1>  mov edx, %4
    87                              <1>  %endif
    88                              <1>  %endif
    89                              <1>  %endif
    90 0000000F B804000000          <1>  mov eax, %1
    91 00000014 CD30                <1>  int 30h
    92 00000016 891D[3A020000]          	mov [counter], ebx
    93 0000001C 66891D[40020000]        	mov [shiftbit], bx
    94 00000023 C605[43020000]0D        	mov byte [line], CR
    95                                  	sys _time
    96                              <1> 
    97                              <1>  %if %0 >= 2
    98                              <1>  mov ebx, %2
    99                              <1>  %if %0 >= 3
   100                              <1>  mov ecx, %3
   101                              <1>  %if %0 = 4
   102                              <1>  mov edx, %4
   103                              <1>  %endif
   104                              <1>  %endif
   105                              <1>  %endif
   106 0000002A B80D000000          <1>  mov eax, %1
   107 0000002F CD30                <1>  int 30h
   108 00000031 66A3[3E020000]          	mov [timeword], ax
   109                                  waitf1s:
   110                                  	sys _time
   111                              <1> 
   112                              <1>  %if %0 >= 2
   113                              <1>  mov ebx, %2
   114                              <1>  %if %0 >= 3
   115                              <1>  mov ecx, %3
   116                              <1>  %if %0 = 4
   117                              <1>  mov edx, %4
   118                              <1>  %endif
   119                              <1>  %endif
   120                              <1>  %endif
   121 00000037 B80D000000          <1>  mov eax, %1
   122 0000003C CD30                <1>  int 30h
   123 0000003E D005[40020000]          	rol byte [shiftbit], 1
   124 00000044 663B05[3E020000]        	cmp ax, [timeword]
   125 0000004B 74EA                            je short waitf1s
   126 0000004D 66A3[3E020000]          	mov [timeword], ax
   127                                  	sys _time
   128                              <1> 
   129                              <1>  %if %0 >= 2
   130                              <1>  mov ebx, %2
   131                              <1>  %if %0 >= 3
   132                              <1>  mov ecx, %3
   133                              <1>  %if %0 = 4
   134                              <1>  mov edx, %4
   135                              <1>  %endif
   136                              <1>  %endif
   137                              <1>  %endif
   138 00000053 B80D000000          <1>  mov eax, %1
   139 00000058 CD30                <1>  int 30h
   140                                  waitf2s:
   141                                  	sys _time
   142                              <1> 
   143                              <1>  %if %0 >= 2
   144                              <1>  mov ebx, %2
   145                              <1>  %if %0 >= 3
   146                              <1>  mov ecx, %3
   147                              <1>  %if %0 = 4
   148                              <1>  mov edx, %4
   149                              <1>  %endif
   150                              <1>  %endif
   151                              <1>  %endif
   152 0000005A B80D000000          <1>  mov eax, %1
   153 0000005F CD30                <1>  int 30h
   154 00000061 663B05[3E020000]        	cmp ax, [timeword]
   155 00000068 7508                    	jne short delaycalc
   156 0000006A FF05[3A020000]          	inc dword [counter]
   157 00000070 EBE8                    	jmp short waitf2s
   158                                  delaycalc:
   159 00000072 A1[3A020000]            	mov eax, [counter]
   160 00000077 30D2                    	xor dl, dl
   161 00000079 B314                    	mov bl, 20
   162 0000007B F7F3                    	div ebx
   163 0000007D A3[3A020000]            	mov [counter], eax
   164                                  nextline:
   165 00000082 66FF05[3E020000]        	inc word [timeword]	
   166                                  	;
   167 00000089 BF[44020000]            	mov edi, text
   168                                  	;
   169 0000008E 6689C2                  	mov dx, ax
   170                                  nextstr:
   171 00000091 8A0D[42020000]          	mov cl, [char]
   172 00000097 00C8                    	add al, cl
   173 00000099 0225[3E020000]          	add ah, [timeword]
   174                                  	;
   175 0000009F 2401                    	and al, 1
   176 000000A1 0430                    	add al, '0'
   177 000000A3 AA                      	stosb ; +0
   178 000000A4 28C0                    	sub al, al
   179 000000A6 66D1CA                  	ror dx, 1
   180 000000A9 1430                    	adc al, '0'
   181 000000AB AA                      	stosb ; +1
   182 000000AC 88D0                    	mov al, dl
   183 000000AE 30E0                    	xor al, ah
   184 000000B0 8A0D[40020000]          	mov cl, [shiftbit]
   185 000000B6 20C8                    	and al, cl
   186 000000B8 7402                    	jz  short _0
   187 000000BA B001                    	mov al, 1	
   188                                  _0:
   189 000000BC 0430                    	add al, '0'
   190 000000BE AA                      	stosb ; +2
   191 000000BF 81FF[94020000]          	cmp edi, text+80
   192 000000C5 0F838D000000                    jnb writeline 
   193 000000CB 08D4                    	or  ah, dl
   194 000000CD 20CC                    	and ah, cl
   195 000000CF 7402                    	jz  short _1
   196 000000D1 B401                    	mov ah, 1
   197                                  _1:	
   198 000000D3 88E0                    	mov al, ah
   199 000000D5 0430                    	add al, '0'
   200 000000D7 AA                      	stosb ; +3
   201 000000D8 6689D0                  	mov ax, dx
   202 000000DB 30E0                    	xor al, ah
   203 000000DD 2401                    	and al, 1
   204 000000DF 0430                    	add al, '0'
   205 000000E1 AA                      	stosb ; +4
   206 000000E2 30C0                    	xor al, al
   207 000000E4 D0CA                    	ror dl, 1
   208 000000E6 1430                    	adc al, '0'
   209 000000E8 AA                      	stosb ; +5
   210 000000E9 28C0                    	sub al, al
   211 000000EB D0CA                    	ror dl, 1
   212 000000ED 1430                    	adc al, '0'
   213 000000EF AA                      	stosb ; +6
   214 000000F0 30C0                    	xor al, al
   215 000000F2 D0CE                    	ror dh, 1
   216 000000F4 1430                    	adc al, '0'
   217 000000F6 AA                      	stosb ; +7
   218 000000F7 668B15[3E020000]        	mov dx, [timeword]
   219 000000FE FE0D[41020000]          	dec byte [negative]
   220 00000104 7834                    	js short _4
   221 00000106 66F7DA                  	neg dx
   222 00000109 668915[3E020000]        	mov [timeword], dx
   223                                  _2:
   224 00000110 B030                    	mov al, '0'
   225 00000112 D0EC                    	shr ah, 1
   226 00000114 1400                    	adc al, 0
   227 00000116 AA                      	stosb ; +8
   228 00000117 80E401                  	and ah, 1
   229 0000011A B055                    	mov al, 01010101b
   230 0000011C 20C8                    	and al, cl
   231 0000011E 7402                    	jz short _3
   232 00000120 B001                    	mov al, 1
   233                                  _3:
   234 00000122 30E0                    	xor al, ah
   235 00000124 B430                            mov ah, '0'
   236 00000126 00E0                    	add al, ah
   237 00000128 AA                      	stosb ; +9
   238 00000129 88D0                    	mov al, dl
   239 0000012B 3207                    	xor al, [edi]
   240 0000012D 2401                    	and al, 1
   241 0000012F 00E0                    	add al, ah
   242 00000131 AA                      	stosb ; +10
   243 00000132 D0C1                    	rol cl, 1
   244 00000134 880D[40020000]          	mov [shiftbit], cl		  	
   245                                  _4:
   246 0000013A FE05[41020000]          	inc byte [negative]
   247 00000140 6689D0                  	mov ax, dx
   248 00000143 74CB                    	jz short _2
   249 00000145 66D10D[3E020000]        	ror word [timeword], 1
   250 0000014C 668B15[3E020000]        	mov dx, [timeword]
   251 00000153 E939FFFFFF                      jmp nextstr
   252                                  writeline:
   253                                  	sys _gtty, 0, 0
   254                              <1> 
   255                              <1>  %if %0 >= 2
   256 00000158 BB00000000          <1>  mov ebx, %2
   257                              <1>  %if %0 >= 3
   258 0000015D B900000000          <1>  mov ecx, %3
   259                              <1>  %if %0 = 4
   260                              <1>  mov edx, %4
   261                              <1>  %endif
   262                              <1>  %endif
   263                              <1>  %endif
   264 00000162 B820000000          <1>  mov eax, %1
   265 00000167 CD30                <1>  int 30h
   266 00000169 6609DB                  	or bx, bx
   267 0000016C 7426                    	jz short _5
   268                                  	sys _read, 0, char, 1
   269                              <1> 
   270                              <1>  %if %0 >= 2
   271 0000016E BB00000000          <1>  mov ebx, %2
   272                              <1>  %if %0 >= 3
   273 00000173 B9[42020000]        <1>  mov ecx, %3
   274                              <1>  %if %0 = 4
   275 00000178 BA01000000          <1>  mov edx, %4
   276                              <1>  %endif
   277                              <1>  %endif
   278                              <1>  %endif
   279 0000017D B803000000          <1>  mov eax, %1
   280 00000182 CD30                <1>  int 30h
   281 00000184 803D[42020000]1B        	cmp byte [char], ESC
   282 0000018B 7507                            jne short _5
   283                                  	sys _exit
   284                              <1> 
   285                              <1>  %if %0 >= 2
   286                              <1>  mov ebx, %2
   287                              <1>  %if %0 >= 3
   288                              <1>  mov ecx, %3
   289                              <1>  %if %0 = 4
   290                              <1>  mov edx, %4
   291                              <1>  %endif
   292                              <1>  %endif
   293                              <1>  %endif
   294 0000018D B801000000          <1>  mov eax, %1
   295 00000192 CD30                <1>  int 30h
   296                                  _5:
   297                                  	sys _write, 1, line, 81
   298                              <1> 
   299                              <1>  %if %0 >= 2
   300 00000194 BB01000000          <1>  mov ebx, %2
   301                              <1>  %if %0 >= 3
   302 00000199 B9[43020000]        <1>  mov ecx, %3
   303                              <1>  %if %0 = 4
   304 0000019E BA51000000          <1>  mov edx, %4
   305                              <1>  %endif
   306                              <1>  %endif
   307                              <1>  %endif
   308 000001A3 B804000000          <1>  mov eax, %1
   309 000001A8 CD30                <1>  int 30h
   310                                  delay:
   311 000001AA 8B0D[3A020000]          	mov ecx, [counter]
   312                                  _6:
   313 000001B0 FF0D[3A020000]                  dec dword [counter]
   314 000001B6 79F8                    	jns short _6
   315 000001B8 890D[3A020000]          	mov [counter], ecx
   316                                  _7:
   317 000001BE 66D10D[3E020000]        	ror word [timeword], 1
   318 000001C5 66A1[3E020000]          	mov ax, [timeword]
   319 000001CB FE0D[41020000]          	dec byte [negative]
   320 000001D1 0F89ABFEFFFF            	jns nextline
   321 000001D7 FE05[41020000]          	inc byte [negative]
   322 000001DD 66F7D0                  	not ax
   323 000001E0 E99DFEFFFF              	jmp nextline
   324                                  	
   325 000001E5 90                      align 2
   326                                  
   327                                  header:
   328 000001E6 0D                      	db 0Dh
   329 000001E7 2A2A2A20526574726F-     	db '*** Retro UNIX 386 v1 - TTY (DIGITS SCROLL) DEMO by Erdogan Tan - 11/11/2015 ***'
   330 000001F0 20554E495820333836-
   331 000001F9 207631202D20545459-
   332 00000202 202844494749545320-
   333 0000020B 5343524F4C4C292044-
   334 00000214 454D4F206279204572-
   335 0000021D 646F67616E2054616E-
   336 00000226 202D2031312F31312F-
   337 0000022F 32303135202A2A2A   
   338 00000237 0D                      	db 0Dh
   339 00000238 0A                      	db 0Ah
   340                                  
   341                                  headersize equ    $ - header
   342                                  
   343 00000239 00                      	db 0
   344                                  
   345                                  align 2
   346                                  
   347                                  bss_start:
   348                                  
   349                                  absolute bss_start
   350                                  
   351 0000023A <res 00000004>          counter: resd 1
   352                                  ;	
   353 0000023E <res 00000002>          timeword: resw 1
   354 00000240 <res 00000001>          shiftbit: resb 1
   355 00000241 <res 00000001>          negative: resb 1
   356                                  ;
   357 00000242 <res 00000001>          char:   resb 1
   358 00000243 <res 00000001>          line:  	resb 1
   359 00000244 <res 00000050>          text:	resb 80
   360                                  
   361                                  bss_end:
