     1                                  ; ****************************************************************************
     2                                  ; scanc386.s (Retro Unix 386 v1) - 'scancode', prints character codes
     3                                  ; ----------------------------------------------------------------------------
     4                                  ;
     5                                  ; RETRO UNIX 386 (Retro Unix == Turkish Rational Unix)
     6                                  ; Operating System Project (v0.2) by ERDOGAN TAN (Beginning: 24/12/2013)
     7                                  ;
     8                                  ; Retro UNIX 8086 v1 - 'scanc.asm' file
     9                                  ;
    10                                  ; Derived from 'Retro UNIX 8086 v1' source code by Erdogan Tan
    11                                  ; (v0.1 - Beginning: 11/07/2012)
    12                                  ;
    13                                  ; [ Last Modification: 23/11/2015 ]
    14                                  ;
    15                                  ; Derived from UNIX Operating System (v1.0 for PDP-11) 
    16                                  ; (Original) Source Code by Ken Thompson (Bell Laboratories, 1971-1972)
    17                                  ; ****************************************************************************
    18                                  ;
    19                                  ; scanc1.s (23/11/2015) 
    20                                  ; scanc0.s (17/10/2015, Retro UNIX 386 v1, NASM 2.11, 32 bit version)
    21                                  ; scanc.asm (SCANCODE.ASM), 20/01/2014 (Retro UNIX 8086 v1, MASM 6.11) 
    22                                  ; (The first SCANCODE.ASM -  01/02/1998, DOS program)
    23                                  
    24                                  ; 17/10/2015
    25                                  
    26                                  ; UNIX v1 system calls
    27                                  _rele 	equ 0
    28                                  _exit 	equ 1
    29                                  _fork 	equ 2
    30                                  _read 	equ 3
    31                                  _write	equ 4
    32                                  _open	equ 5
    33                                  _close 	equ 6
    34                                  _wait 	equ 7
    35                                  _creat 	equ 8
    36                                  _link 	equ 9
    37                                  _unlink	equ 10
    38                                  _exec	equ 11
    39                                  _chdir	equ 12
    40                                  _time 	equ 13
    41                                  _mkdir 	equ 14
    42                                  _chmod	equ 15
    43                                  _chown	equ 16
    44                                  _break	equ 17
    45                                  _stat	equ 18
    46                                  _seek	equ 19
    47                                  _tell 	equ 20
    48                                  _mount	equ 21
    49                                  _umount	equ 22
    50                                  _setuid	equ 23
    51                                  _getuid	equ 24
    52                                  _stime	equ 25
    53                                  _quit	equ 26	
    54                                  _intr	equ 27
    55                                  _fstat	equ 28
    56                                  _emt 	equ 29
    57                                  _mdate 	equ 30
    58                                  _stty 	equ 31
    59                                  _gtty	equ 32
    60                                  _ilgins	equ 33
    61                                  _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
    62                                  _msg    equ 35 ; Retro UNIX 386 v1 feature only !
    63                                  
    64                                  %macro sys 1-4
    65                                      ; 03/09/2015	
    66                                      ; 13/04/2015
    67                                      ; Retro UNIX 386 v1 system call.		
    68                                      %if %0 >= 2   
    69                                          mov ebx, %2
    70                                          %if %0 >= 3    
    71                                              mov ecx, %3
    72                                              %if %0 = 4
    73                                                 mov edx, %4   
    74                                              %endif
    75                                          %endif
    76                                      %endif
    77                                      mov eax, %1
    78                                      int 30h	   
    79                                  %endmacro
    80                                  
    81                                  ; Retro UNIX 386 v1 system call format:
    82                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    83                                  
    84                                  [BITS 32] ; We need 32-bit intructions for protected mode
    85                                  
    86                                  [ORG 0] 
    87                                  
    88                                  START_CODE:
    89                                  		; (c) Erdogan TAN 1998
    90                                  		; Scancode, prints character codes
    91                                  		; 01/02/1998
    92                                  		; NASM version: 01/12/2014
    93                                  
    94 00000000 BE[FD000000]                            mov     esi, BossMsg
    95 00000005 E8DA000000                              call    proc_printmsg
    96                                  sc0:
    97                                  		sys	_gtty, 0, 0
    98                              <1> 
    99                              <1> 
   100                              <1> 
   101                              <1>  %if %0 >= 2
   102 0000000A BB00000000          <1>  mov ebx, %2
   103                              <1>  %if %0 >= 3
   104 0000000F B900000000          <1>  mov ecx, %3
   105                              <1>  %if %0 = 4
   106                              <1>  mov edx, %4
   107                              <1>  %endif
   108                              <1>  %endif
   109                              <1>  %endif
   110 00000014 B820000000          <1>  mov eax, %1
   111 00000019 CD30                <1>  int 30h
   112 0000001B 7256                    		jc	short exit
   113 0000001D 6621DB                  		and	bx, bx
   114 00000020 74E8                    		jz	short sc0
   115 00000022 3C08                    		cmp	al, 8  ; tty number 
   116 00000024 722C                    		jb	short sc2 ; pseudo tty
   117                                  		; serial port (tyy8 or tty9)
   118 00000026 66C705[5D010000]30-       		mov     word [Reg_ScanCode], 3030h ; '0'
   119 0000002E 30                 
   120                                  sp_sc:
   121 0000002F E849000000              		call	write_line
   122 00000034 723D                    		jc	short exit
   123 00000036 3C0D                    		cmp	al, 0Dh ; ENTER (Carriage Return)		
   124 00000038 7439                    		je	short exit
   125 0000003A EBF3                    		jmp	short sp_sc
   126                                  sc1:	
   127                                  		sys	_gtty, 0, 0
   128                              <1> 
   129                              <1> 
   130                              <1> 
   131                              <1>  %if %0 >= 2
   132 0000003C BB00000000          <1>  mov ebx, %2
   133                              <1>  %if %0 >= 3
   134 00000041 B900000000          <1>  mov ecx, %3
   135                              <1>  %if %0 = 4
   136                              <1>  mov edx, %4
   137                              <1>  %endif
   138                              <1>  %endif
   139                              <1>  %endif
   140 00000046 B820000000          <1>  mov eax, %1
   141 0000004B CD30                <1>  int 30h
   142 0000004D 6621DB                  		and	bx, bx
   143 00000050 74EA                    		jz	short sc1
   144                                  sc2:    
   145 00000052 80FB0D                    		cmp     bl, 0Dh
   146 00000055 7406                                    je      short sc3
   147 00000057 881D[4B010000]          		mov	[Character], bl
   148                                  sc3:    
   149 0000005D 88F8                                    mov     al, bh
   150 0000005F E85F000000                              call    proc_hex
   151 00000064 66A3[5D010000]                          mov     [Reg_ScanCode], ax
   152 0000006A E80E000000              		call	write_line
   153 0000006F 3C0D                    		cmp 	al, 0Dh
   154 00000071 75C9                                    jne 	short sc1
   155                                  exit:
   156                                  		sys	_exit
   157                              <1> 
   158                              <1> 
   159                              <1> 
   160                              <1>  %if %0 >= 2
   161                              <1>  mov ebx, %2
   162                              <1>  %if %0 >= 3
   163                              <1>  mov ecx, %3
   164                              <1>  %if %0 = 4
   165                              <1>  mov edx, %4
   166                              <1>  %endif
   167                              <1>  %endif
   168                              <1>  %endif
   169 00000073 B801000000          <1>  mov eax, %1
   170 00000078 CD30                <1>  int 30h
   171                                  never_come_here:
   172 0000007A 90                      		nop
   173 0000007B EBFD                                    jmp     short never_come_here
   174                                  write_line:
   175                                    		sys	_read, 0, Character, 1
   176                              <1> 
   177                              <1> 
   178                              <1> 
   179                              <1>  %if %0 >= 2
   180 0000007D BB00000000          <1>  mov ebx, %2
   181                              <1>  %if %0 >= 3
   182 00000082 B9[4B010000]        <1>  mov ecx, %3
   183                              <1>  %if %0 = 4
   184 00000087 BA01000000          <1>  mov edx, %4
   185                              <1>  %endif
   186                              <1>  %endif
   187                              <1>  %endif
   188 0000008C B803000000          <1>  mov eax, %1
   189 00000091 CD30                <1>  int 30h
   190 00000093 722D                    		jc	short sc5
   191 00000095 8A1D[4B010000]          		mov	bl, [Character]
   192 0000009B 88D8                                  	mov	al, bl
   193 0000009D E821000000                              call    proc_hex
   194 000000A2 66A3[72010000]                          mov     [Reg_AsciiCode], ax
   195 000000A8 80FB0D                  		cmp 	bl, 0Dh ; ENTER (CR) key
   196 000000AB 7507                    		jne	short sc4
   197 000000AD C605[4B010000]20                        mov     byte [Character], 20h         
   198                                  sc4:		
   199 000000B4 6653                    		push 	bx
   200 000000B6 BE[3F010000]                            mov     esi,  ScancodeMsg
   201 000000BB E824000000                              call    proc_printmsg
   202 000000C0 6658                    		pop	ax
   203                                  sc5:
   204 000000C2 C3                      		retn
   205                                  proc_hex:
   206 000000C3 88C4                                    mov     ah, al
   207 000000C5 80E40F                                  and     ah, 0Fh
   208 000000C8 80C430                                  add     ah, 30h
   209 000000CB 80FC39                                  cmp     ah, 39h
   210 000000CE 7603                                    jna     short sc6
   211 000000D0 80C407                                  add     ah, 07h
   212                                  sc6:
   213 000000D3 D0E8                                    shr     al, 1
   214 000000D5 D0E8                                    shr     al, 1
   215 000000D7 D0E8                                    shr     al, 1
   216 000000D9 D0E8                                    shr     al, 1
   217 000000DB 0430                                    add     al, 30h
   218 000000DD 3C39                                    cmp     al, 39h
   219 000000DF 7602                                    jna     short sc7
   220 000000E1 0407                                    add     al, 07h
   221                                  sc7:
   222 000000E3 C3                                      retn
   223                                  proc_printmsg:
   224 000000E4 89F1                    		mov	ecx, esi
   225 000000E6 31D2                    		xor	edx, edx
   226                                  sc8:
   227 000000E8 AC                      		lodsb
   228 000000E9 20C0                    		and	al, al
   229 000000EB 7403                    		jz	short sc9
   230 000000ED 42                      		inc	edx
   231 000000EE EBF8                    		jmp	short sc8
   232                                  sc9:          
   233 000000F0 BB01000000              		mov	ebx, 1
   234                                  		sys	_write
   235                              <1> 
   236                              <1> 
   237                              <1> 
   238                              <1>  %if %0 >= 2
   239                              <1>  mov ebx, %2
   240                              <1>  %if %0 >= 3
   241                              <1>  mov ecx, %3
   242                              <1>  %if %0 = 4
   243                              <1>  mov edx, %4
   244                              <1>  %endif
   245                              <1>  %endif
   246                              <1>  %endif
   247 000000F5 B804000000          <1>  mov eax, %1
   248 000000FA CD30                <1>  int 30h
   249 000000FC C3                      		retn
   250                                  
   251                                  BossMsg:
   252 000000FD 0D0A                                    db 0Dh, 0Ah
   253 000000FF 5B2028632920457264-                     db '[ (c) Erdogan TAN  1998-2015 ]  Press a key to scan code...'
   254 00000108 6F67616E2054414E20-
   255 00000111 20313939382D323031-
   256 0000011A 35205D202050726573-
   257 00000123 732061206B65792074-
   258 0000012C 6F207363616E20636F-
   259 00000135 64652E2E2E         
   260 0000013A 0D0A                                    db 0Dh, 0Ah
   261 0000013C 0D0A00                                  db 0Dh, 0Ah, 0h
   262                                  ScancodeMsg:
   263 0000013F 436861726163746572-                     db 'Character : '
   264 00000148 203A20             
   265 0000014B 3F                      Character:      db '?'
   266 0000014C 20202020205363616E-                     db '     Scan Code : '
   267 00000155 20436F6465203A20   
   268 0000015D 3F3F                    Reg_ScanCode:   dw '??'
   269 0000015F 68                                      db 'h'
   270 00000160 202020202041534349-                     db '     ASCII Code : '
   271 00000169 4920436F6465203A20 
   272 00000172 3F3F                    Reg_AsciiCode:  dw '??'
   273 00000174 68                                      db 'h'
   274 00000175 0D0A00                                  db 0Dh, 0Ah, 0h
