     1                                  ; ****************************************************************************
     2                                  ; prntst32.s (/dev/lpr printer test) - by Erdogan Tan - 13/06/2022
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Retro UNIX 386 v1 (& v1.1) - /dev/lpt -- printer test (LPT1) 
     5                                  ;
     6                                  ; [ Last Modification: 13/06/2022 ]
     7                                  ;
     8                                  ; ****************************************************************************
     9                                  
    10                                  ; UNIX v1 system calls
    11                                  _rele 	equ 0
    12                                  _exit 	equ 1
    13                                  _fork 	equ 2
    14                                  _read 	equ 3
    15                                  _write	equ 4
    16                                  _open	equ 5
    17                                  _close 	equ 6
    18                                  _wait 	equ 7
    19                                  _creat 	equ 8
    20                                  _link 	equ 9
    21                                  _unlink	equ 10
    22                                  _exec	equ 11
    23                                  _chdir	equ 12
    24                                  _time 	equ 13
    25                                  _mkdir 	equ 14
    26                                  _chmod	equ 15
    27                                  _chown	equ 16
    28                                  _break	equ 17
    29                                  _stat	equ 18
    30                                  _seek	equ 19
    31                                  _tell 	equ 20
    32                                  _mount	equ 21
    33                                  _umount	equ 22
    34                                  _setuid	equ 23
    35                                  _getuid	equ 24
    36                                  _stime	equ 25
    37                                  _quit	equ 26	
    38                                  _intr	equ 27
    39                                  _fstat	equ 28
    40                                  _emt 	equ 29
    41                                  _mdate 	equ 30
    42                                  _stty 	equ 31
    43                                  _gtty	equ 32
    44                                  _ilgins	equ 33
    45                                  _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
    46                                  _msg    equ 35 ; Retro UNIX 386 v1 feature only !
    47                                  _geterr	equ 36 ; Retro UNIX 386 v1 feature only !
    48                                  ; 12/01/2022 - Retro UNIX 386 v1.2
    49                                  ; Retro UNIX 386 v2 system calls
    50                                  _setgid	equ 37
    51                                  _getgid	equ 38
    52                                  _sysver	equ 39 ; (get) Retro Unix 386 version
    53                                  
    54                                  ;;;
    55                                  ESCKey equ 1Bh
    56                                  EnterKey equ 0Dh
    57                                  
    58                                  %macro sys 1-4
    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                                  %endmacro
    74                                  
    75                                  ; Retro UNIX 386 v1 system call format:
    76                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    77                                  
    78                                  [BITS 32] ; 32-bit intructions (for 80386 protected mode)
    79                                  
    80                                  [ORG 0] 
    81                                  
    82                                  START_CODE:
    83                                  	; 13/06/2022
    84 00000000 59                      	pop	ecx ; ecx = number of arguments
    85                                  	;
    86 00000001 58                      	pop	eax ; eax = argument 0 = executable file name
    87                                  	;
    88 00000002 BD[1C010000]            	mov	ebp, program_msg
    89                                  	;
    90                                  	;cmp	ecx, 2
    91 00000007 80F902                  	cmp	cl, 2
    92 0000000A 7252                    	jb	short prntst1
    93                                  
    94 0000000C 5F                      	pop	edi ; argument 1 = txt file name
    95                                  
    96                                  	sys	_stat, edi, stbuf
    59                              <1> 
    60                              <1> 
    61                              <1> 
    62                              <1>  %if %0 >= 2
    63 0000000D 89FB                <1>  mov ebx, %2
    64                              <1>  %if %0 >= 3
    65 0000000F B9[E4010000]        <1>  mov ecx, %3
    66                              <1>  %if %0 = 4
    67                              <1>  mov edx, %4
    68                              <1>  %endif
    69                              <1>  %endif
    70                              <1>  %endif
    71 00000014 B812000000          <1>  mov eax, %1
    72 00000019 CD30                <1>  int 30h
    97 0000001B 7237                    	jc	short prntst0
    98                                  	
    99                                  	;movzx	esi, word [stbuf+6] ; file size
   100 0000001D 668B35[EA010000]        	mov	si, [stbuf+6] ; file size
   101                                  	
   102                                  	sys	_open, edi, 0 ; open for read
    59                              <1> 
    60                              <1> 
    61                              <1> 
    62                              <1>  %if %0 >= 2
    63 00000024 89FB                <1>  mov ebx, %2
    64                              <1>  %if %0 >= 3
    65 00000026 B900000000          <1>  mov ecx, %3
    66                              <1>  %if %0 = 4
    67                              <1>  mov edx, %4
    68                              <1>  %endif
    69                              <1>  %endif
    70                              <1>  %endif
    71 0000002B B805000000          <1>  mov eax, %1
    72 00000030 CD30                <1>  int 30h
   103 00000032 7220                    	jc	short prntst0
   104                                  
   105                                  	;sys	_read, eax, fbuf, 1024
   106                                  
   107                                  	sys	_read, eax, fbuf, esi
    59                              <1> 
    60                              <1> 
    61                              <1> 
    62                              <1>  %if %0 >= 2
    63 00000034 89C3                <1>  mov ebx, %2
    64                              <1>  %if %0 >= 3
    65 00000036 B9[0C020000]        <1>  mov ecx, %3
    66                              <1>  %if %0 = 4
    67 0000003B 89F2                <1>  mov edx, %4
    68                              <1>  %endif
    69                              <1>  %endif
    70                              <1>  %endif
    71 0000003D B803000000          <1>  mov eax, %1
    72 00000042 CD30                <1>  int 30h
   108                                  	
   109 00000044 833D[0C020000]00        	cmp	dword [fbuf], 0
   110 0000004B 7611                    	jna	short prntst1
   111                                  
   112 0000004D BD[0C020000]            	mov	ebp, fbuf
   113 00000052 EB0A                    	jmp	short prntst1
   114                                  prntst0:
   115 00000054 B8[A5010000]            	mov	eax, f_not_found
   116 00000059 E89B000000              	call	print_msg
   117                                  prntst1:
   118 0000005E 31FF                    	xor	edi, edi
   119                                  	sys	_open, lpt1, 1  ; open /dev/lpr for write
    59                              <1> 
    60                              <1> 
    61                              <1> 
    62                              <1>  %if %0 >= 2
    63 00000060 BB[13010000]        <1>  mov ebx, %2
    64                              <1>  %if %0 >= 3
    65 00000065 B901000000          <1>  mov ecx, %3
    66                              <1>  %if %0 = 4
    67                              <1>  mov edx, %4
    68                              <1>  %endif
    69                              <1>  %endif
    70                              <1>  %endif
    71 0000006A B805000000          <1>  mov eax, %1
    72 0000006F CD30                <1>  int 30h
   120 00000071 7320                    	jnc	short prntst2
   121                                  
   122                                  prntst_err:
   123 00000073 B8[7B010000]            	mov	eax, err_msg
   124                                  pr_ok_exit:
   125 00000078 E87C000000              	call	print_msg
   126 0000007D 21FF                    	and	edi, edi ; file descriptor
   127 0000007F 7409                    	jz	short hang
   128                                  	sys	_close, edi
    59                              <1> 
    60                              <1> 
    61                              <1> 
    62                              <1>  %if %0 >= 2
    63 00000081 89FB                <1>  mov ebx, %2
    64                              <1>  %if %0 >= 3
    65                              <1>  mov ecx, %3
    66                              <1>  %if %0 = 4
    67                              <1>  mov edx, %4
    68                              <1>  %endif
    69                              <1>  %endif
    70                              <1>  %endif
    71 00000083 B806000000          <1>  mov eax, %1
    72 00000088 CD30                <1>  int 30h
   129                                  hang:
   130                                  	sys	_exit
    59                              <1> 
    60                              <1> 
    61                              <1> 
    62                              <1>  %if %0 >= 2
    63                              <1>  mov ebx, %2
    64                              <1>  %if %0 >= 3
    65                              <1>  mov ecx, %3
    66                              <1>  %if %0 = 4
    67                              <1>  mov edx, %4
    68                              <1>  %endif
    69                              <1>  %endif
    70                              <1>  %endif
    71 0000008A B801000000          <1>  mov eax, %1
    72 0000008F CD30                <1>  int 30h
   131 00000091 EBF7                    	jmp	short hang
   132                                  prntst2:
   133 00000093 89C7                    	mov	edi, eax ; /dev/lpr file descriptor
   134                                  
   135 00000095 81FD[1C010000]          	cmp	ebp, program_msg
   136 0000009B 753B                    	jne	short prntst4
   137                                  
   138 0000009D B8[BA010000]            	mov	eax, p_p_msg
   139 000000A2 E852000000              	call	print_msg
   140                                  
   141                                  	; print program message on paper (on LPT1)
   142                                  	sys	_write, edi, program_msg, size_pmsg
    59                              <1> 
    60                              <1> 
    61                              <1> 
    62                              <1>  %if %0 >= 2
    63 000000A7 89FB                <1>  mov ebx, %2
    64                              <1>  %if %0 >= 3
    65 000000A9 B9[1C010000]        <1>  mov ecx, %3
    66                              <1>  %if %0 = 4
    67 000000AE BA3E000000          <1>  mov edx, %4
    68                              <1>  %endif
    69                              <1>  %endif
    70                              <1>  %endif
    71 000000B3 B804000000          <1>  mov eax, %1
    72 000000B8 CD30                <1>  int 30h
   143 000000BA 72B7                    	jc	short prntst_err
   144                                  
   145                                  	sys	_write, edi, usage_msg, size_umsg
    59                              <1> 
    60                              <1> 
    61                              <1> 
    62                              <1>  %if %0 >= 2
    63 000000BC 89FB                <1>  mov ebx, %2
    64                              <1>  %if %0 >= 3
    65 000000BE B9[5B010000]        <1>  mov ecx, %3
    66                              <1>  %if %0 = 4
    67 000000C3 BA1F000000          <1>  mov edx, %4
    68                              <1>  %endif
    69                              <1>  %endif
    70                              <1>  %endif
    71 000000C8 B804000000          <1>  mov eax, %1
    72 000000CD CD30                <1>  int 30h
   146 000000CF 72A2                    	jc	short prntst_err
   147                                  prntst3:
   148 000000D1 B8[9E010000]            	mov	eax, ok_msg
   149 000000D6 EBA0                    	jmp	short pr_ok_exit
   150                                  
   151                                  prntst4:
   152 000000D8 B8[8F010000]            	mov	eax, p_f_msg
   153 000000DD E817000000              	call	print_msg
   154                                  
   155                                  ;	mov	ecx, bss_end-fbuf ; 1024
   156                                  ;	mov	esi, fbuf
   157                                  ;	sub	edx, edx
   158                                  ;prntst5:
   159                                  ;	lodsb
   160                                  ;	or	al, al
   161                                  ;	jz	short prntst6
   162                                  ;	inc	edx
   163                                  ;	loop	prntst5
   164                                  ;prntst6:
   165                                  	;;edx  = character count to be printed
   166                                  	;sys	_write, edi, fbuf
   167                                  	sys	_write, edi, fbuf, esi ; esi = file size
    59                              <1> 
    60                              <1> 
    61                              <1> 
    62                              <1>  %if %0 >= 2
    63 000000E2 89FB                <1>  mov ebx, %2
    64                              <1>  %if %0 >= 3
    65 000000E4 B9[0C020000]        <1>  mov ecx, %3
    66                              <1>  %if %0 = 4
    67 000000E9 89F2                <1>  mov edx, %4
    68                              <1>  %endif
    69                              <1>  %endif
    70                              <1>  %endif
    71 000000EB B804000000          <1>  mov eax, %1
    72 000000F0 CD30                <1>  int 30h
   168 000000F2 73DD                    	jnc	short prntst3
   169 000000F4 E97AFFFFFF              	jmp	prntst_err
   170                                  
   171                                  ;-----------------------------------------------------------------
   172                                  
   173                                  print_msg:
   174                                  	; 08/05/2022
   175                                  	; eax = asciiz string address
   176 000000F9 89C2                    	mov	edx, eax
   177 000000FB 4A                      	dec	edx
   178                                  nextchr:
   179 000000FC 42                      	inc	edx
   180 000000FD 803A00                  	cmp	byte [edx], 0
   181 00000100 77FA                    	ja	short nextchr
   182                                  	;cmp	[edx], 0Dh
   183                                  	;ja	short nextchr
   184 00000102 29C2                    	sub	edx, eax
   185                                  	; edx = asciiz string length
   186                                  	;
   187                                  	sys	_write, 1, eax
    59                              <1> 
    60                              <1> 
    61                              <1> 
    62                              <1>  %if %0 >= 2
    63 00000104 BB01000000          <1>  mov ebx, %2
    64                              <1>  %if %0 >= 3
    65 00000109 89C1                <1>  mov ecx, %3
    66                              <1>  %if %0 = 4
    67                              <1>  mov edx, %4
    68                              <1>  %endif
    69                              <1>  %endif
    70                              <1>  %endif
    71 0000010B B804000000          <1>  mov eax, %1
    72 00000110 CD30                <1>  int 30h
   188                                  	;
   189 00000112 C3                      	retn
   190                                  
   191                                  ;-----------------------------------------------------------------
   192                                  ;  data - initialized data
   193                                  ;-----------------------------------------------------------------
   194                                  
   195                                  lpt1:
   196 00000113 2F6465762F6C707200      	db	'/dev/lpr', 0
   197                                  
   198                                  program_msg:
   199 0000011C 0D0A                    	db  0Dh, 0Ah
   200 0000011E 526574726F20554E49-     	db  'Retro UNIX 386 v1 PRINTER Test by Erdogan TAN - 13/06/2022'
   200 00000127 582033383620763120-
   200 00000130 5052494E5445522054-
   200 00000139 657374206279204572-
   200 00000142 646F67616E2054414E-
   200 0000014B 202D2031332F30362F-
   200 00000154 32303232           
   201 00000158 0D0A00                  	db  0Dh, 0Ah, 0
   202                                  usage_msg:
   203 0000015B 0D0A                    	db  0Dh, 0Ah
   204 0000015D 55736167653A207072-     	db  'Usage: prntest textfilename'
   204 00000166 6E7465737420746578-
   204 0000016F 7466696C656E616D65 
   205                                  nextline:
   206 00000178 0D0A00                  	db  0Dh, 0Ah, 0
   207                                  
   208                                  size_pmsg equ usage_msg-(program_msg+1)
   209                                  	
   210                                  err_msg:
   211 0000017B 0D0A                    	db 0Dh, 0Ah	
   212 0000017D 5072696E7465722045-     	db "Printer Error !"	
   212 00000186 72726F722021       
   213 0000018C 0D0A00                   	db 0Dh, 0Ah, 0  		
   214                                  
   215                                  size_umsg equ err_msg-(usage_msg+1)
   216                                  
   217                                  p_f_msg:
   218 0000018F 0D0A                    	db 0Dh, 0Ah	
   219 00000191 5072696E74696E6720-     	db "Printing .. "
   219 0000019A 2E2E20             
   220 0000019D 00                      	db 0
   221                                  ok_msg:
   222                                  	;db 0Dh, 0Ah
   223 0000019E 4F4B2E20                	db 'OK. '
   224 000001A2 0D0A00                  	db 0Dh, 0Ah, 0
   225                                  f_not_found:
   226 000001A5 0D0A                    	db 0Dh, 0Ah	
   227 000001A7 46696C65206E6F7420-     	db "File not found !"
   227 000001B0 666F756E642021     
   228 000001B7 0D0A00                  	db 0Dh, 0Ah, 0
   229                                  p_p_msg:
   230 000001BA 0D0A                    	db 0Dh, 0Ah	
   231 000001BC 5072696E74696E6720-     	db "Printing program message on LPT1 .. "
   231 000001C5 70726F6772616D206D-
   231 000001CE 657373616765206F6E-
   231 000001D7 204C505431202E2E20 
   232 000001E0 00                      	db 0
   233                                  
   234                                  ;-----------------------------------------------------------------
   235                                  ;  bss - uninitialized data
   236                                  ;-----------------------------------------------------------------	
   237                                  
   238 000001E1 90<rep 3h>              align 4
   239                                  
   240                                  bss_start:
   241                                  
   242                                  ABSOLUTE bss_start
   243                                  
   244 000001E4 <res 22h>               stbuf:	resb 34	 ; stat buffer
   245 00000206 ????????????            	resb 6	
   246                                  
   247 0000020C <res 400h>              fbuf:	resb 1024 ; file buffer
   248                                  
   249                                  bss_end:
   250                                  
   251                                  ;-----------------------------------------------------------------
