     1                                  ; ****************************************************************************
     2                                  ; prntst86.s (/dev/lpr printer test) - by Erdogan Tan - 13/06/2022
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Retro UNIX 8086 v1 - /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                                      ; Retro UNIX 8086 v1 system call.
    60                                      %if %0 >= 2   
    61                                          mov bx, %2
    62                                          %if %0 >= 3
    63                                              mov cx, %3
    64                                              %if %0 >= 4
    65                                                 mov dx, %4
    66                                              %endif
    67                                          %endif
    68                                      %endif
    69                                      mov ax, %1
    70                                      int 20h
    71                                  %endmacro
    72                                  
    73                                  ; Retro UNIX 8086 v1 system call format:
    74                                  ; sys systemcall (ax) <arg1 (bx)>, <arg2 (cx)>, <arg3 (dx)>
    75                                  
    76                                  [BITS 16] ; 16-bit intructions (for 8086 & 80386 real mode)
    77                                  
    78                                  [ORG 0] 
    79                                  
    80                                  START_CODE:
    81                                  	; 13/06/2022
    82 00000000 59                      	pop	cx ; cx = number of arguments
    83                                  	;
    84 00000001 58                      	pop	ax ; ax = argument 0 = executable file name
    85                                  	;
    86 00000002 BD[E000]                	mov	bp, program_msg
    87                                  	;
    88                                  	;cmp	cx, 2
    89 00000005 80F902                  	cmp	cl, 2
    90 00000008 7247                    	jb	short prntst1
    91                                  
    92 0000000A 5F                      	pop	di ; argument 1 = txt file name
    93                                  
    94                                  	sys	_stat, di, stbuf
    59                              <1> 
    60                              <1>  %if %0 >= 2
    61 0000000B 89FB                <1>  mov bx, %2
    62                              <1>  %if %0 >= 3
    63 0000000D B9[A601]            <1>  mov cx, %3
    64                              <1>  %if %0 >= 4
    65                              <1>  mov dx, %4
    66                              <1>  %endif
    67                              <1>  %endif
    68                              <1>  %endif
    69 00000010 B81200              <1>  mov ax, %1
    70 00000013 CD20                <1>  int 20h
    95 00000015 7234                    	jc	short prntst0
    96                                  	
    97 00000017 8B36[AC01]              	mov	si, [stbuf+6] ; file size
    98                                  	
    99                                  	; (character count or buffer size must not over
   100                                  	; available free space in current segment)
   101 0000001B 89E1                    	mov	cx, sp ; top of stack
   102 0000001D 81E9[EA01]              	sub	cx, fbuf+32 ; fbuf location +32 bytes for stack 
   103 00000021 39F1                    	cmp	cx, si ; cx contains max. available free space
   104 00000023 7302                    	jnb	short prntst6
   105                                  	; si (buffer size) must not be more/greater than cx
   106 00000025 89CE                    	mov	si, cx 
   107                                  prntst6:
   108                                  	sys	_open, di, 0 ; open for read
    59                              <1> 
    60                              <1>  %if %0 >= 2
    61 00000027 89FB                <1>  mov bx, %2
    62                              <1>  %if %0 >= 3
    63 00000029 B90000              <1>  mov cx, %3
    64                              <1>  %if %0 >= 4
    65                              <1>  mov dx, %4
    66                              <1>  %endif
    67                              <1>  %endif
    68                              <1>  %endif
    69 0000002C B80500              <1>  mov ax, %1
    70 0000002F CD20                <1>  int 20h
   109 00000031 7218                    	jc	short prntst0
   110                                  
   111                                  	;sys	_read, ax, fbuf, 1024
   112                                  
   113                                  	sys	_read, ax, fbuf, si
    59                              <1> 
    60                              <1>  %if %0 >= 2
    61 00000033 89C3                <1>  mov bx, %2
    62                              <1>  %if %0 >= 3
    63 00000035 B9[CA01]            <1>  mov cx, %3
    64                              <1>  %if %0 >= 4
    65 00000038 89F2                <1>  mov dx, %4
    66                              <1>  %endif
    67                              <1>  %endif
    68                              <1>  %endif
    69 0000003A B80300              <1>  mov ax, %1
    70 0000003D CD20                <1>  int 20h
   114                                  	
   115 0000003F 833E[CA01]00            	cmp	word [fbuf], 0
   116 00000044 760B                    	jna	short prntst1
   117                                  
   118 00000046 BD[CA01]                	mov	bp, fbuf
   119 00000049 EB06                    	jmp	short prntst1
   120                                  prntst0:
   121 0000004B B8[6A01]                	mov	ax, f_not_found
   122 0000004E E86E00                  	call	print_msg
   123                                  prntst1:
   124 00000051 31FF                    	xor	di, di
   125                                  	sys	_open, lpt1, 1  ; open /dev/lpr for write
    59                              <1> 
    60                              <1>  %if %0 >= 2
    61 00000053 BB[D700]            <1>  mov bx, %2
    62                              <1>  %if %0 >= 3
    63 00000056 B90100              <1>  mov cx, %3
    64                              <1>  %if %0 >= 4
    65                              <1>  mov dx, %4
    66                              <1>  %endif
    67                              <1>  %endif
    68                              <1>  %endif
    69 00000059 B80500              <1>  mov ax, %1
    70 0000005C CD20                <1>  int 20h
   126 0000005E 7318                    	jnc	short prntst2
   127                                  
   128                                  prntst_err:
   129 00000060 B8[4001]                	mov	ax, err_msg
   130                                  pr_ok_exit:
   131 00000063 E85900                  	call	print_msg
   132 00000066 21FF                    	and	di, di ; file descriptor
   133 00000068 7407                    	jz	short hang
   134                                  	sys	_close, di
    59                              <1> 
    60                              <1>  %if %0 >= 2
    61 0000006A 89FB                <1>  mov bx, %2
    62                              <1>  %if %0 >= 3
    63                              <1>  mov cx, %3
    64                              <1>  %if %0 >= 4
    65                              <1>  mov dx, %4
    66                              <1>  %endif
    67                              <1>  %endif
    68                              <1>  %endif
    69 0000006C B80600              <1>  mov ax, %1
    70 0000006F CD20                <1>  int 20h
   135                                  hang:
   136                                  	sys	_exit
    59                              <1> 
    60                              <1>  %if %0 >= 2
    61                              <1>  mov bx, %2
    62                              <1>  %if %0 >= 3
    63                              <1>  mov cx, %3
    64                              <1>  %if %0 >= 4
    65                              <1>  mov dx, %4
    66                              <1>  %endif
    67                              <1>  %endif
    68                              <1>  %endif
    69 00000071 B80100              <1>  mov ax, %1
    70 00000074 CD20                <1>  int 20h
   137 00000076 EBF9                    	jmp	short hang
   138                                  prntst2:
   139 00000078 89C7                    	mov	di, ax ; /dev/lpr file descriptor
   140                                  
   141 0000007A 81FD[E000]              	cmp	bp, program_msg
   142 0000007E 7529                    	jne	short prntst4
   143                                  
   144 00000080 B8[7F01]                	mov	ax, p_p_msg
   145 00000083 E83900                  	call	print_msg
   146                                  
   147                                  	; print program message on paper (on LPT1)
   148                                  	sys	_write, di, program_msg, size_pmsg
    59                              <1> 
    60                              <1>  %if %0 >= 2
    61 00000086 89FB                <1>  mov bx, %2
    62                              <1>  %if %0 >= 3
    63 00000088 B9[E000]            <1>  mov cx, %3
    64                              <1>  %if %0 >= 4
    65 0000008B BA3F00              <1>  mov dx, %4
    66                              <1>  %endif
    67                              <1>  %endif
    68                              <1>  %endif
    69 0000008E B80400              <1>  mov ax, %1
    70 00000091 CD20                <1>  int 20h
   149 00000093 72CB                    	jc	short prntst_err
   150                                  
   151                                  	sys	_write, di, usage_msg, size_umsg
    59                              <1> 
    60                              <1>  %if %0 >= 2
    61 00000095 89FB                <1>  mov bx, %2
    62                              <1>  %if %0 >= 3
    63 00000097 B9[2001]            <1>  mov cx, %3
    64                              <1>  %if %0 >= 4
    65 0000009A BA1F00              <1>  mov dx, %4
    66                              <1>  %endif
    67                              <1>  %endif
    68                              <1>  %endif
    69 0000009D B80400              <1>  mov ax, %1
    70 000000A0 CD20                <1>  int 20h
   152 000000A2 72BC                    	jc	short prntst_err
   153                                  prntst3:
   154 000000A4 B8[6301]                	mov	ax, ok_msg
   155 000000A7 EBBA                    	jmp	short pr_ok_exit
   156                                  
   157                                  prntst4:
   158 000000A9 B8[5401]                	mov	ax, p_f_msg
   159 000000AC E81000                  	call	print_msg
   160                                  
   161                                  ;	mov	cx, bss_end-fbuf ; 1024
   162                                  ;	mov	si, fbuf
   163                                  ;	sub	dx, dx
   164                                  ;prntst5:
   165                                  ;	lodsb
   166                                  ;	or	al, al
   167                                  ;	jz	short prntst6
   168                                  ;	inc	dx
   169                                  ;	loop	prntst5
   170                                  ;prntst6:
   171                                  	;;dx  = character count to be printed
   172                                  	;sys	_write, di, fbuf
   173                                  	sys	_write, di, fbuf, si ; si = file size
    59                              <1> 
    60                              <1>  %if %0 >= 2
    61 000000AF 89FB                <1>  mov bx, %2
    62                              <1>  %if %0 >= 3
    63 000000B1 B9[CA01]            <1>  mov cx, %3
    64                              <1>  %if %0 >= 4
    65 000000B4 89F2                <1>  mov dx, %4
    66                              <1>  %endif
    67                              <1>  %endif
    68                              <1>  %endif
    69 000000B6 B80400              <1>  mov ax, %1
    70 000000B9 CD20                <1>  int 20h
   174 000000BB 73E7                    	jnc	short prntst3
   175 000000BD EBA1                    	jmp	prntst_err
   176                                  
   177                                  ;-----------------------------------------------------------------
   178                                  
   179                                  print_msg:
   180                                  	; ax = asciiz string address
   181 000000BF 89C3                    	mov	bx, ax
   182 000000C1 4B                      	dec	bx
   183                                  nextchr:
   184 000000C2 43                      	inc	bx
   185 000000C3 803F00                  	cmp	byte [bx], 0
   186 000000C6 77FA                    	ja	short nextchr
   187                                  	;cmp	[bx], 0Dh
   188                                  	;ja	short nextchr
   189 000000C8 29C3                    	sub	bx, ax
   190 000000CA 89DA                    	mov	dx, bx
   191                                  	; dx = asciiz string length
   192                                  	;
   193                                  	sys	_write, 1, ax
    59                              <1> 
    60                              <1>  %if %0 >= 2
    61 000000CC BB0100              <1>  mov bx, %2
    62                              <1>  %if %0 >= 3
    63 000000CF 89C1                <1>  mov cx, %3
    64                              <1>  %if %0 >= 4
    65                              <1>  mov dx, %4
    66                              <1>  %endif
    67                              <1>  %endif
    68                              <1>  %endif
    69 000000D1 B80400              <1>  mov ax, %1
    70 000000D4 CD20                <1>  int 20h
   194                                  	;
   195 000000D6 C3                      	retn
   196                                  
   197                                  ;-----------------------------------------------------------------
   198                                  ;  data - initialized data
   199                                  ;-----------------------------------------------------------------
   200                                  
   201                                  lpt1:
   202 000000D7 2F6465762F6C707200      	db	'/dev/lpr', 0
   203                                  
   204                                  program_msg:
   205 000000E0 0D0A                    	db  0Dh, 0Ah
   206 000000E2 526574726F20554E49-     	db  'Retro UNIX 8086 v1 PRINTER Test by Erdogan TAN - 13/06/2022'
   206 000000EB 582038303836207631-
   206 000000F4 205052494E54455220-
   206 000000FD 546573742062792045-
   206 00000106 72646F67616E205441-
   206 0000010F 4E202D2031332F3036-
   206 00000118 2F32303232         
   207 0000011D 0D0A00                  	db  0Dh, 0Ah, 0
   208                                  usage_msg:
   209 00000120 0D0A                    	db  0Dh, 0Ah
   210 00000122 55736167653A207072-     	db  'Usage: prntest textfilename'
   210 0000012B 6E7465737420746578-
   210 00000134 7466696C656E616D65 
   211                                  nextline:
   212 0000013D 0D0A00                  	db  0Dh, 0Ah, 0
   213                                  
   214                                  size_pmsg equ usage_msg-(program_msg+1)
   215                                  	
   216                                  err_msg:
   217 00000140 0D0A                    	db 0Dh, 0Ah	
   218 00000142 5072696E7465722045-     	db "Printer Error !"	
   218 0000014B 72726F722021       
   219 00000151 0D0A00                   	db 0Dh, 0Ah, 0  		
   220                                  
   221                                  size_umsg equ err_msg-(usage_msg+1)
   222                                  
   223                                  p_f_msg:
   224 00000154 0D0A                    	db 0Dh, 0Ah	
   225 00000156 5072696E74696E6720-     	db "Printing .. "
   225 0000015F 2E2E20             
   226 00000162 00                      	db 0
   227                                  ok_msg:
   228                                  	;db 0Dh, 0Ah
   229 00000163 4F4B2E20                	db 'OK. '
   230 00000167 0D0A00                  	db 0Dh, 0Ah, 0
   231                                  f_not_found:
   232 0000016A 0D0A                    	db 0Dh, 0Ah	
   233 0000016C 46696C65206E6F7420-     	db "File not found !"
   233 00000175 666F756E642021     
   234 0000017C 0D0A00                  	db 0Dh, 0Ah, 0
   235                                  p_p_msg:
   236 0000017F 0D0A                    	db 0Dh, 0Ah	
   237 00000181 5072696E74696E6720-     	db "Printing program message on LPT1 .. "
   237 0000018A 70726F6772616D206D-
   237 00000193 657373616765206F6E-
   237 0000019C 204C505431202E2E20 
   238 000001A5 00                      	db 0
   239                                  
   240                                  ;-----------------------------------------------------------------
   241                                  ;  bss - uninitialized data
   242                                  ;-----------------------------------------------------------------	
   243                                  
   244                                  align 2
   245                                  
   246                                  bss_start:
   247                                  
   248                                  ABSOLUTE bss_start
   249                                  
   250 000001A6 <res 22h>               stbuf:	resb 34	 ; stat buffer
   251 000001C8 ????                    	resb 2	
   252                                  
   253 000001CA <res 400h>              fbuf:	resb 1024 ; file buffer
   254                                  
   255                                  bss_end:
   256                                  
   257                                  ;-----------------------------------------------------------------
