     1                                  ; ****************************************************************************
     2                                  ; pr5.s (pr8086.s) - print file - by Erdogan Tan - 25/06/2022
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Retro UNIX 8086 v1 - file print utility 
     5                                  ;
     6                                  ; [ Last Modification: 10/07/2022 ]
     7                                  
     8                                  ; Derived from disassembled source code of unix v2 '/bin/pr' 
     9                                  ;
    10                                  ; ****************************************************************************
    11                                  ; [ s2-bits.gz - bin/pr (archive date: 17-01-1972) ]
    12                                  
    13                                  ; Assembler: NASM v2.15
    14                                  ; ((nasm pr5.s -l pr5.txt -o pr5 -Z error.txt))
    15                                  
    16                                  ; pr0.s (29/06/2022, Retro UNIX 8086 v1)
    17                                  ; pr1.s (26/06/2022, Retro UNIX 386 v1 & v1.1)
    18                                  ; pr2.s (26/06/2022, Retro UNIX 386 v1.2)
    19                                  ; pr3.s (10/07/2022, Retro UNIX 386 v1 & v1.1) ; (LF -> CRLF)
    20                                  ; pr4.s (10/07/2022, Retro UNIX 386 v1.2) ; (LF -> CRLF)
    21                                  ; pr5.s (10/07/2022, Retro UNIX 8086 v1) ; (LF -> CRLF)
    22                                  
    23                                  ; UNIX v1 system calls
    24                                  _rele 	equ 0
    25                                  _exit 	equ 1
    26                                  _fork 	equ 2
    27                                  _read 	equ 3
    28                                  _write	equ 4
    29                                  _open	equ 5
    30                                  _close 	equ 6
    31                                  _wait 	equ 7
    32                                  _creat 	equ 8
    33                                  _link 	equ 9
    34                                  _unlink	equ 10
    35                                  _exec	equ 11
    36                                  _chdir	equ 12
    37                                  _time 	equ 13
    38                                  _mkdir 	equ 14
    39                                  _chmod	equ 15
    40                                  _chown	equ 16
    41                                  _break	equ 17
    42                                  _stat	equ 18
    43                                  _seek	equ 19
    44                                  _tell 	equ 20
    45                                  _mount	equ 21
    46                                  _umount	equ 22
    47                                  _setuid	equ 23
    48                                  _getuid	equ 24
    49                                  _stime	equ 25
    50                                  _quit	equ 26	
    51                                  _intr	equ 27
    52                                  _fstat	equ 28
    53                                  _emt 	equ 29
    54                                  _mdate 	equ 30
    55                                  _stty 	equ 31
    56                                  _gtty	equ 32
    57                                  _ilgins	equ 33
    58                                  _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
    59                                  _msg    equ 35 ; Retro UNIX 386 v1 feature only !
    60                                  _geterr	equ 36 ; Retro UNIX 386 v1 feature only !
    61                                  ; 12/01/2022 - Retro UNIX 386 v1.2
    62                                  ; Retro UNIX 386 v2 system calls
    63                                  _setgid	equ 37
    64                                  _getgid	equ 38
    65                                  _sysver	equ 39 ; (get) Retro Unix 386 version
    66                                  
    67                                  ;;;
    68                                  ESCKey equ 1Bh
    69                                  EnterKey equ 0Dh
    70                                  
    71                                  %macro sys 1-4
    72                                      ; Retro UNIX 8086 v1 system call.
    73                                      %if %0 >= 2   
    74                                          mov bx, %2
    75                                          %if %0 >= 3
    76                                              mov cx, %3
    77                                              %if %0 >= 4
    78                                                 mov dx, %4
    79                                              %endif
    80                                          %endif
    81                                      %endif
    82                                      mov ax, %1
    83                                      int 20h
    84                                  %endmacro
    85                                  
    86                                  ; 25/06/2022
    87                                  struc stat
    88                                  	; Note: This is for Retro UNIX v1 'sysstat' output !!!
    89                                  	; (34 bytes)
    90 00000000 ????                    	.inode:  resw 1	
    91 00000002 ????                    	.mode:	 resw 1
    92 00000004 ??                      	.nlinks: resb 1
    93 00000005 ??                      	.uid:	 resb 1
    94 00000006 ????                    	.size:	 resw 1
    95 00000008 <res 10h>               	.dskptr: resw 8
    96 00000018 ????????                	.ctime:	 resd 1
    97 0000001C ????????                	.mtime:	 resd 1
    98 00000020 ????                    	.rsvd:   resw 1
    99                                  	.strucsize:
   100                                  endstruc 
   101                                  
   102                                  ; Retro UNIX 8086 v1 system call format:
   103                                  ; sys systemcall (ax) <arg1 (bx)>, <arg2 (cx)>, <arg3 (dx)>
   104                                  
   105                                  ;-----------------------------------------------------------------
   106                                  ;  code
   107                                  ;-----------------------------------------------------------------
   108                                  
   109                                  [BITS 16] ; 16-bit intructions (for 8086 or x86 real mode)
   110                                  
   111                                  [ORG 0] 
   112                                  
   113                                  START_CODE:
   114                                  	; 29/06/2022
   115                                  	; 26/06/2022 (16 bit version, pr0.s)
   116                                  	; 25/06/2022 (32 bit version, pr1.s)
   117 00000000 59                      	pop	cx ; cx = number of arguments
   118                                  	;
   119 00000001 58                      	pop	ax ; ax = argument 0 = executable file name
   120                                  	;
   121                                  	;mov	bp, program_msg
   122                                  	;
   123                                  	;dec	cx
   124 00000002 FEC9                    	dec	cl
   125 00000004 7E60                    	jng	short prn_0
   126                                  
   127 00000006 880E[A405]              	mov	[argc], cl
   128                                  
   129                                  	sys	_open, lpt1, 1  ; open /dev/lpr for write
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 0000000A BB[3704]            <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76 0000000D B90100              <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78                              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 00000010 B80500              <1>  mov ax, %1
    83 00000013 CD20                <1>  int 20h
   130 00000015 7309                    	jnc	short prn_1
   131                                  
   132 00000017 B8[6B05]                	mov	ax, printer_err_msg
   133 0000001A E8CB01                  	call	print_msg
   134 0000001D E98B00                  	jmp	hang	
   135                                  prn_1:
   136 00000020 A3[B005]                	mov	[prnfnum], ax
   137                                  
   138                                  prn_2:
   139 00000023 5F                      	pop	di
   140                                  
   141 00000024 8A05                    	mov	al, [di]	
   142                                  
   143 00000026 3C2D                    	cmp	al, '-' ; option ?	
   144                                  	;jne	short prn_4
   145 00000028 7403                    	je	short case_l
   146 0000002A E98500                  	jmp	prn_4
   147                                  case_l:
   148 0000002D 47                      	inc	di
   149 0000002E 8A05                    	mov	al, [di]
   150                                  
   151 00000030 3C6C                    	cmp	al, 'l'
   152 00000032 7507                    	jne	short case_r 
   153 00000034 C606[A205]4E            	mov	byte [rows], 78
   154 00000039 EB1E                    	jmp	short prn_3
   155                                  case_r:
   156 0000003B 3C72                    	cmp	al, 'r'
   157 0000003D 7507                    	jne	short case_m
   158 0000003F C606[A205]42            	mov	byte [rows], 66
   159 00000044 EB13                    	jmp	short prn_3
   160                                  case_m:
   161 00000046 3C6D                    	cmp	al, 'm'
   162 00000048 7507                    	jne	short case_c
   163 0000004A C606[A305]00            	mov	byte [cdatef], 0
   164 0000004F EB08                    	jmp	short prn_3
   165                                  case_c:
   166 00000051 3C63                    	cmp	al, 'c'
   167 00000053 75FC                    	jne	short case_c
   168                                  	;mov	byte [cdatef], 1
   169 00000055 FE06[A305]              	inc	byte [cdatef]
   170                                  
   171                                  prn_3:
   172 00000059 FE0E[A405]              	dec	byte [argc]
   173 0000005D 7FC4                    	jg	short prn_2
   174                                  
   175                                  	; print usage message on /dev/tty
   176 0000005F 803E[A505]00            	cmp	byte [files], 0
   177 00000064 771E                    	ja	short fclose_exit
   178                                  prn_0:
   179                                  	; print usage message on stdout
   180                                  	sys	_write, 1, program_msg, size_pmsg
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 00000066 BB0100              <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76 00000069 B9[4004]            <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78 0000006C BA4000              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 0000006F B80400              <1>  mov ax, %1
    83 00000072 CD20                <1>  int 20h
   181                                  	;sys	_msg, program_msg, size_pmsg, 0Fh 
   182                                  
   183                                  	sys	_write, 1, usage_msg, size_umsg
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 00000074 BB0100              <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76 00000077 B9[8104]            <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78 0000007A BAE900              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 0000007D B80400              <1>  mov ax, %1
    83 00000080 CD20                <1>  int 20h
   184 00000082 EB27                    	jmp	short hang
   185                                  
   186                                  fclose_exit:
   187                                  	sys	_write, 1, nextline, 2
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 00000084 BB0100              <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76 00000087 B9[6805]            <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78 0000008A BA0200              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 0000008D B80400              <1>  mov ax, %1
    83 00000090 CD20                <1>  int 20h
   188                                  
   189 00000092 803E[B205]00            	cmp	byte [txtfnum], 0
   190 00000097 7609                    	jna	short pclose_exit
   191                                  p_err_exit:
   192                                  	sys	_close, [txtfnum]
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 00000099 8B1E[B205]          <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78                              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 0000009D B80600              <1>  mov ax, %1
    83 000000A0 CD20                <1>  int 20h
   193                                  	;jmp	short pclose_exit
   194                                  
   195                                  pclose_exit:
   196                                  	sys	_close, [prnfnum]
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 000000A2 8B1E[B005]          <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78                              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000000A6 B80600              <1>  mov ax, %1
    83 000000A9 CD20                <1>  int 20h
   197                                  hang:
   198                                  	sys	_exit
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78                              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000000AB B80100              <1>  mov ax, %1
    83 000000AE CD20                <1>  int 20h
   199 000000B0 EBF9                    	jmp	short hang
   200                                  
   201                                  prn_4:
   202 000000B2 FE06[A505]              	inc	byte [files]
   203                                  
   204                                  	; di = txt file name address
   205                                  
   206                                  	sys	_open, di, 0 ; open for read
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 000000B6 89FB                <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76 000000B8 B90000              <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78                              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000000BB B80500              <1>  mov ax, %1
    83 000000BE CD20                <1>  int 20h
   207 000000C0 7308                    	jnc	short prn_5
   208                                  
   209                                  f_err_exit:
   210 000000C2 B8[7F05]                	mov	ax, file_err_msg
   211 000000C5 E82001                  	call	print_msg
   212 000000C8 EB8F                    	jmp	prn_3
   213                                  
   214                                  prn_5:
   215 000000CA A3[B205]                	mov	[txtfnum], ax
   216                                  
   217 000000CD F606[A305]FF            	test	byte [cdatef], 0FFh
   218 000000D2 7407                    	jz	short prn_6
   219                                  	sys	_time
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78                              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000000D4 B80D00              <1>  mov ax, %1
    83 000000D7 CD20                <1>  int 20h
   220 000000D9 EB11                    	jmp	short prn_7
   221                                  prn_6:
   222                                  	sys	_fstat, ax, stbuf
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 000000DB 89C3                <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76 000000DD B9[3806]            <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78                              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000000E0 B81C00              <1>  mov ax, %1
    83 000000E3 CD20                <1>  int 20h
   223                                  	; 26/06/2022
   224 000000E5 A1[5406]                	mov	ax, [stbuf+stat.mtime]
   225 000000E8 8B16[5606]              	mov	dx, [stbuf+stat.mtime+2]
   226                                  prn_7:
   227 000000EC A3[AC05]                	mov	[mtime], ax
   228 000000EF 8916[AE05]              	mov	[mtime+2], dx
   229                                  
   230                                  write_pages:
   231 000000F3 31C0                    	xor	ax, ax ; 0
   232 000000F5 A3[A605]                	mov	[pgnumber], ax
   233 000000F8 A2[A805]                	mov	[eof], al
   234 000000FB A2[A905]                	mov	[cchar], al	
   235                                  write_next_page:	
   236 000000FE E82201                  	call	readf
   237 00000101 731C                    	jnc	short prn_8
   238                                  
   239                                  	sys	_close, [txtfnum]
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 00000103 8B1E[B205]          <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78                              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 00000107 B80600              <1>  mov ax, %1
    83 0000010A CD20                <1>  int 20h
   240                                  
   241 0000010C FE0E[A405]              	dec	byte [argc]
   242                                  	;jng	short pclose_exit
   243 00000110 7F02                    	jg	short p_next_file
   244 00000112 EB8E                    	jmp	pclose_exit
   245                                  
   246                                  p_next_file:
   247 00000114 29C0                    	sub	ax, ax
   248                                  
   249 00000116 A2[B205]                	mov	[txtfnum], al ; 0 ; open file number
   250                                  	;mov	[fbuf], ax ; 0	  ; open file number
   251                                  	; 26/06/2022
   252 00000119 A3[B405]                	mov	[fbuf+2], ax ; 0 ; character count
   253                                  
   254 0000011C E904FF                  	jmp	prn_2
   255                                  
   256                                  prn_8:
   257                                  	sys	_write, [prnfnum], EmptyLines, 4 ;  2 rows
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 0000011F 8B1E[B005]          <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76 00000123 B9[9005]            <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78 00000126 BA0400              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 00000129 B80400              <1>  mov ax, %1
    83 0000012C CD20                <1>  int 20h
   258 0000012E 723F                    	jc	short prn_err
   259                                  
   260                                  	; 26/06/2022
   261 00000130 A1[AC05]                	mov	ax, [mtime]
   262 00000133 8B16[AE05]              	mov	dx, [mtime+2]
   263 00000137 57                      	push	di
   264 00000138 E85901                  	call	ctime
   265 0000013B 5F                      	pop	di
   266                                  	; cbuf = date&time string (26 bytes)
   267                                  	
   268                                  	sys	_write, [prnfnum], cbuf, 26
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 0000013C 8B1E[B005]          <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76 00000140 B9[1C04]            <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78 00000143 BA1A00              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 00000146 B80400              <1>  mov ax, %1
    83 00000149 CD20                <1>  int 20h
   269 0000014B 7222                    	jc	short prn_err
   270                                  	
   271                                  	sys	_write, [prnfnum], PageHeader-2, 2
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 0000014D 8B1E[B005]          <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76 00000151 B9[9A05]            <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78 00000154 BA0200              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 00000157 B80400              <1>  mov ax, %1
    83 0000015A CD20                <1>  int 20h
   272 0000015C 7211                    	jc	short prn_err
   273                                  
   274 0000015E FF06[A605]              	inc	word [pgnumber]
   275                                  
   276 00000162 89FE                    	mov	si, di ; file name address (on stack)
   277                                  
   278 00000164 31D2                    	xor	dx, dx
   279                                  prn_9:	
   280 00000166 AC                      	lodsb
   281 00000167 08C0                    	or	al, al
   282 00000169 740D                    	jz	short prn_10
   283 0000016B FEC2                    	inc	dl
   284 0000016D EBF7                    	jmp	short prn_9
   285                                  
   286                                  prn_err:
   287 0000016F B8[6B05]                	mov	ax, printer_err_msg
   288 00000172 E87300                  	call	print_msg	
   289 00000175 E921FF                  	jmp	p_err_exit
   290                                  
   291                                  prn_10:
   292 00000178 89F9                    	mov	cx, di
   293                                  	;sys	_write, [prnfnum], di, dx
   294                                  	sys	_write
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78                              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 0000017A B80400              <1>  mov ax, %1
    83 0000017D CD20                <1>  int 20h
   295 0000017F 72EE                    	jc	short prn_err
   296                                  
   297 00000181 B9[9C05]                	mov	cx, PageHeader
   298 00000184 B206                    	mov	dl, 6
   299                                  	;sys	_write, [prnfnum], PageHeader, dx
   300                                  	sys	_write
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78                              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 00000186 B80400              <1>  mov ax, %1
    83 00000189 CD20                <1>  int 20h
   301 0000018B 72E2                    	jc	short prn_err
   302                                  
   303 0000018D A1[A605]                	mov	ax, [pgnumber]
   304 00000190 31D2                    	xor	dx, dx ; 29/06/2022
   305 00000192 E89D00                  	call	write_pg_num
   306 00000195 72D8                    	jc	short prn_err	
   307                                  
   308                                  	; 26/06/2022
   309                                  	sys	_write, [prnfnum], EmptyLines, 8 ; 4 rows
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 00000197 8B1E[B005]          <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76 0000019B B9[9005]            <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78 0000019E BA0800              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000001A1 B80400              <1>  mov ax, %1
    83 000001A4 CD20                <1>  int 20h
   310 000001A6 72C7                    	jc	short prn_err
   311                                  
   312 000001A8 8A16[A205]              	mov	dl, [rows]
   313 000001AC 80EA0B                  	sub	dl, 11
   314 000001AF 89D5                    	mov	bp, dx
   315                                  
   316                                  write_next_char:
   317                                  prn_11:
   318 000001B1 E84C00                  	call	getchar
   319                                  
   320                                  	; 10/07/2022
   321 000001B4 88C4                    	mov	ah, al
   322 000001B6 8626[AB05]              	xchg	ah, [pchr] ; previous character
   323 000001BA 3C0A                    	cmp	al, 0Ah
   324 000001BC 750C                    	jne	short prn_13
   325 000001BE 80FC0D                  	cmp	ah, 0Dh
   326 000001C1 7407                    	je	short prn_13
   327 000001C3 B00D                    	mov	al, 0Dh
   328 000001C5 E87F00                  	call	writechar
   329 000001C8 B00A                    	mov	al, 10 ; 0Ah
   330                                  	;
   331                                  prn_13:
   332 000001CA E87A00                  	call	writechar
   333 000001CD 3C0A                    	cmp	al, 10 ; lf character, nextline
   334 000001CF 75E0                    	jne	short prn_11
   335 000001D1 4D                      	dec	bp
   336 000001D2 75DD                    	jnz	short prn_11
   337                                  	
   338                                  	sys	_write, [prnfnum], EmptyLines, 10 ; 5 rows
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 000001D4 8B1E[B005]          <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76 000001D8 B9[9005]            <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78 000001DB BA0A00              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000001DE B80400              <1>  mov ax, %1
    83 000001E1 CD20                <1>  int 20h
   339 000001E3 728A                    	jc	short prn_err
   340                                  prn_12:
   341 000001E5 E916FF                  	jmp	write_next_page
   342                                  
   343                                  ;-----------------------------------------------------------------
   344                                  ; 29/06/2022
   345                                  
   346                                  print_msg:
   347                                  	; ax = asciiz string address
   348 000001E8 89C7                    	mov	di, ax
   349 000001EA 4F                      	dec	di
   350                                  nextchr:
   351 000001EB 47                      	inc	di
   352 000001EC 803D00                  	cmp	byte [di], 0
   353 000001EF 77FA                    	ja	short nextchr
   354                                  	;cmp	[di], 0Dh
   355                                  	;ja	short nextchr
   356 000001F1 29C7                    	sub	di, ax
   357                                  	; di = asciiz string length
   358                                  	;
   359                                  	sys	_write, 1, ax, di
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 000001F3 BB0100              <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76 000001F6 89C1                <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78 000001F8 89FA                <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000001FA B80400              <1>  mov ax, %1
    83 000001FD CD20                <1>  int 20h
   360 000001FF C3                      	retn
   361                                  
   362                                  ; 25/06/2022
   363                                  ;-----------------------------------------------------------------
   364                                  
   365                                  getchar:
   366 00000200 A0[A905]                	mov	al, [cchar]
   367 00000203 08C0                    	or	al, al
   368 00000205 7406                    	jz	short getchar_1
   369 00000207 C606[A905]00            	mov	byte [cchar], 0
   370 0000020C C3                      	retn
   371                                  getchar_1:
   372 0000020D F606[A805]FF            	test	byte [eof], 0FFh
   373 00000212 7403                    	jz	short getchar_2
   374 00000214 B00A                    	mov	al, 10 ; lf, nextline
   375 00000216 C3                      	retn
   376                                  getchar_2:
   377 00000217 E84300                  	call	getc
   378 0000021A 7306                    	jnc	short getchar_ok
   379 0000021C FE06[A805]              	inc	byte [eof]
   380 00000220 EBDE                    	jmp	short getchar
   381                                  getchar_ok:
   382                                  readf_ok:
   383 00000222 C3                      	retn
   384                                  
   385                                  ; 25/06/2022
   386                                  ;-----------------------------------------------------------------
   387                                  
   388                                  readf:
   389 00000223 E8DAFF                  	call	getchar
   390 00000226 A2[A905]                	mov	[cchar], al
   391 00000229 F606[A805]FF            	test	byte [eof], 0FFh
   392 0000022E 74F2                    	jz	short readf_ok
   393                                  readf_err:
   394 00000230 F9                      	stc
   395 00000231 C3                      	retn
   396                                  
   397                                  ; 26/06/2022
   398                                  ;-----------------------------------------------------------------
   399                                  
   400                                  write_pg_num:
   401                                  	; ax = page number
   402 00000232 B90A00                  	mov	cx, 10
   403                                  w_pnum_1:
   404                                  	; dx:ax = 32 bit dividend
   405                                  	; cx = 16 bit divisor
   406                                  
   407 00000235 E84B01                  	call	div32  ; in 'ctime.s'
   408                                  
   409                                  	; dx:ax = 32 bit quotient
   410                                  	; bx = 16 bit remainder
   411                                  
   412 00000238 53                      	push	bx
   413 00000239 21D2                    	and	dx, dx
   414 0000023B 7504                    	jnz	short w_pnum_2
   415 0000023D 21C0                    	and	ax, ax
   416 0000023F 7403                    	jz	short w_pnum_3
   417                                  w_pnum_2:
   418 00000241 E8EEFF                  	call	write_pg_num
   419                                  w_pnum_3:	
   420 00000244 58                      	pop	ax
   421 00000245 0430                    	add	al, '0'
   422                                  writechar:
   423 00000247 A2[AA05]                	mov	[chr], al
   424                                  	sys	_write, [prnfnum], chr, 1
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 0000024A 8B1E[B005]          <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76 0000024E B9[AA05]            <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78 00000251 BA0100              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 00000254 B80400              <1>  mov ax, %1
    83 00000257 CD20                <1>  int 20h
   425 00000259 A0[AA05]                	mov	al, [chr]
   426 0000025C C3                      	retn		
   427                                  	
   428                                  ; 25/06/2022
   429                                  ;-----------------------------------------------------------------
   430                                  ; get characters from input file
   431                                  
   432                                  getc:
   433 0000025D A1[B405]                	mov	ax, [fbuf+2] ; character count
   434 00000260 21C0                    	and	ax, ax
   435 00000262 751A                    	jnz	short gch1
   436                                  gch0:
   437 00000264 8B1E[B205]              	mov	bx, [fbuf] ; file descriptor/number
   438 00000268 B9[B805]                	mov	cx, fbuf + 6 ; read buffer address
   439 0000026B 890E[B605]              	mov 	[fbuf+4], cx ; character offset
   440 0000026F 29D2                    	sub	dx, dx
   441 00000271 B280                    	mov	dl, 128
   442                                  	sys	_read ; sys _read, bx, cx, dx
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov bx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov cx, %3
    77                              <1>  %if %0 >= 4
    78                              <1>  mov dx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 00000273 B80300              <1>  mov ax, %1
    83 00000276 CD20                <1>  int 20h
   443 00000278 7216                    	jc	short gch2
   444 0000027A 09C0                    	or	ax, ax
   445 0000027C 7414                    	jz	short gch3
   446                                  gch1:
   447 0000027E 48                      	dec	ax
   448 0000027F A3[B405]                	mov	[fbuf+2], ax ; character count in buffer
   449 00000282 8B1E[B605]              	mov	bx, [fbuf+4] ; current character offset
   450 00000286 30E4                    	xor	ah, ah
   451 00000288 8A07                    	mov	al, [bx]
   452 0000028A 43                      	inc	bx
   453 0000028B 891E[B605]              	mov	[fbuf+4], bx ; next character offset
   454 0000028F C3                      	retn 	
   455                                  gch2:
   456 00000290 31C0                    	xor	ax, ax
   457                                  gch3:
   458 00000292 F9                      	stc
   459 00000293 C3                      	retn
   460                                  
   461                                  ; 26/06/2022
   462                                  ;=================================================================
   463                                  %include 'ctime.s'
   464                              <1> ; ****************************************************************************
   465                              <1> ;
   466                              <1> ; CTIME.INC  (Retro Unix 8086 v1 - /bin/ls - list file or directory)
   467                              <1> ; ----------------------------------------------------------------------------
   468                              <1> ;
   469                              <1> ; RETRO UNIX 8086 (Retro Unix == Turkish Rational Unix)
   470                              <1> ; Operating System Project (v0.1) by ERDOGAN TAN (Beginning: 11/07/2012) 
   471                              <1> ; Retro UNIX 8086 v1 - /bin/ls file
   472                              <1> ;
   473                              <1> ; [ Last Modification: 02/06/2022 ]
   474                              <1> ;
   475                              <1> ; Derivation from UNIX Operating System (v1.0 for PDP-11) 
   476                              <1> ; (Original) Source Code by Ken Thompson (Bell Laboratories, 1971-1972)
   477                              <1> ;
   478                              <1> ; ****************************************************************************
   479                              <1> ;
   480                              <1> ; Derived from 'ctime.c' file of original UNIX v5 (usr/source/s3/ctime.c)
   481                              <1> ;
   482                              <1> ; LS0.ASM, 19/11/2013 - 24/11/2013
   483                              <1> ; include ctime.inc
   484                              <1> ;
   485                              <1> ; ****************************************************************************
   486                              <1> ; ctime1.s (02/06/2022 NASM version of 'ctime1.asm') -NASM 2.15- 
   487                              <1> ; ctime1.asm (26/02/2022) -MASM 6.14-
   488                              <1> ; ctime0.asm (28/11/2013)
   489                              <1> 
   490                              <1> ; .8086
   491                              <1> 
   492                              <1> ;timezone equ 5*60*60
   493                              <1> 
   494                              <1> 
   495                              <1> ctime:  ; ctime(at)
   496                              <1> 	; int *at;
   497                              <1> 	; {
   498                              <1> 	; 	return(asctime(localtime(at)));
   499                              <1> 	; }
   500                              <1> 
   501                              <1> 	; DX:AX = unix epoch time (in seconds)
   502                              <1> 
   503                              <1> 	;call	localtime
   504                              <1> 	;call	asctime
   505                              <1> 
   506                              <1> 	;retn
   507                              <1>   
   508                              <1> localtime:
   509                              <1> 	; localtime(tim)
   510                              <1> 	; int tim[];
   511                              <1> 	; 	{
   512                              <1> 	;	register int *t, *ct, dayno;
   513                              <1> 	;	int daylbegin, daylend;
   514                              <1> 	;	int copyt[2];
   515                              <1> 	;	t = copyt;
   516                              <1> 	;	t[0] = tim[0];
   517                              <1> 	;	t[1] = tim[1];
   518                              <1> 	;	dpadd(t, -timezone);
   519                              <1> 	;	ct = gmtime(t);
   520                              <1> 	;	dayno = ct[YDAY];
   521                              <1> 	;	if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 ||
   522                              <1> 	;	    dayno==5 && ct[HOUR]>=2))) {
   523                              <1> 	;		daylight =| 1;
   524                              <1> 	;		daylbegin = -1;
   525                              <1> 	;		daylend = 367;
   526                              <1> 	;	} else {
   527                              <1> 	;		daylbegin = sunday(ct, 119);	/* last Sun in Apr */
   528                              <1> 	;		daylend = sunday(ct, 303);	/* last Sun in Oct */
   529                              <1> 	;	}
   530                              <1> 	;	if (daylight &&
   531                              <1> 	;	    (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) &&
   532                              <1> 	;	    (dayno<daylend || (dayno==daylend && ct[HOUR]<1))) {
   533                              <1> 	;		dpadd(t, 1*60*60);
   534                              <1> 	;		ct = gmtime(t);
   535                              <1> 	;		ct[ISDAY]++;
   536                              <1> 	;	}
   537                              <1> 	;	return(ct);
   538                              <1> 	;	}
   539                              <1> 
   540                              <1> 	;sub	ax, timezone	
   541                              <1> 	;sbb	dx, 0
   542                              <1> 	
   543                              <1> 	;push	dx
   544                              <1> 	;push	ax
   545                              <1> 
   546 00000294 E85D00              <1> 	call	gmtime
   547                              <1> 
   548                              <1> ; if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 ||
   549                              <1> ;     dayno==5 && ct[HOUR]>=2))) {
   550                              <1> 	;cmp	byte [nixonflg], 0
   551                              <1> 	;jna	short lt1
   552                              <1> 	;cmp	word [year], 1974
   553                              <1> 	;jb	short lt1
   554                              <1> 	;ja	short lt0
   555                              <1> 	;cmp	word [yday], 5
   556                              <1> 	;jb	short lt1
   557                              <1> 	;ja	short lt0 
   558                              <1> 	;cmp	word [hour], 2
   559                              <1> 	;jb	short lt1
   560                              <1> ; nixonflag > 0
   561                              <1> ;lt0:
   562                              <1> 	;mov	word [daylight], 1
   563                              <1> 	;mov	word [daylbegin], -1
   564                              <1> 	;mov	word [daylend], 367
   565                              <1> ;	;jmp	short lt2
   566                              <1> 
   567                              <1> ; } else {
   568                              <1> ;lt1:
   569                              <1> ;	mov	cx, 119
   570                              <1> ;	call	sunday ; sunday(ct, 119); /* last Sun in Apr */
   571                              <1> ;	mov	word [daylbegin], cx
   572                              <1> ;	mov	cx, 303
   573                              <1> ;	call	sunday ; sunday(ct, 303); /* last Sun in Oct */	
   574                              <1> ;	mov	word [daylend], cx
   575                              <1> ;lt2:
   576                              <1> ; if (daylight &&
   577                              <1> ;    (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) &&
   578                              <1> ;    (dayno<daylend || (dayno==daylend && ct[HOUR]<1))) {
   579                              <1> 
   580                              <1> ;	pop	ax
   581                              <1> ;	pop	dx
   582                              <1> 
   583                              <1> 	;cmp	byte [daylight], 0
   584                              <1> 	;jna	short lt5
   585                              <1> 	
   586                              <1> 	;mov	cx, word [yday]
   587                              <1> 
   588                              <1> 	;cmp	cx, word [daylbegin]
   589                              <1> 	;jb	short lt5
   590                              <1> 	;ja	short lt3
   591                              <1> 	;cmp	word [hour], 2
   592                              <1> 	;jb	short lt5
   593                              <1> 	;jmp	short lt4
   594                              <1> ;lt3:
   595                              <1> 	;cmp	cx, word [daylend]
   596                              <1> 	;jb	short lt4
   597                              <1> 	;ja	short lt5
   598                              <1> 	;cmp	word [hour], 1
   599                              <1> 	;jnb	short lt5
   600                              <1> ;lt4:
   601                              <1> 	;add	ax, 1*60*60
   602                              <1> 	;adc	dx, 0
   603                              <1> 	;call	gmtime
   604                              <1> 	;inc	word [isday]
   605                              <1> ;lt5:
   606                              <1> ;	}
   607                              <1> ;	return(ct);
   608                              <1> ;	}
   609                              <1> 
   610                              <1> 	;retn
   611                              <1> 
   612                              <1> 	; 26/02/2022 (Retro UNIX 8086 v1, 2022 modification)
   613                              <1> asctime:
   614                              <1> 	; asctime(t)
   615                              <1> 	;int *t;
   616                              <1> 	;{
   617                              <1> 	;	register char *cp, *ncp;
   618                              <1> 	;	register int *tp;
   619                              <1> 	;
   620                              <1> 	;	cp = cbuf;
   621                              <1> 	;	for (ncp = "Day Mon 00 00:00:00 1900\n"; *cp++ = *ncp++;);
   622                              <1> 	;	ncp = &"SunMonTueWedThuFriSat"[3*t[6]];
   623                              <1> 	;	cp = cbuf;
   624                              <1> 	;	*cp++ = *ncp++;
   625                              <1> 	;	*cp++ = *ncp++;
   626                              <1> 	;	*cp++ = *ncp++;
   627                              <1> 	;	cp++;
   628                              <1> 	;	tp = &t[4];
   629                              <1> 	;	ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[(*tp)*3];
   630                              <1> 	;	*cp++ = *ncp++;
   631                              <1> 	;	*cp++ = *ncp++;
   632                              <1> 	;	*cp++ = *ncp++;
   633                              <1> 	;	cp = numb(cp, *--tp);
   634                              <1> 	;	cp = numb(cp, *--tp+100);
   635                              <1> 	;	cp = numb(cp, *--tp+100);
   636                              <1> 	;	cp = numb(cp, *--tp+100);
   637                              <1> 	;	cp =+ 2;
   638                              <1> 	;	cp = numb(cp, t[YEAR]);
   639                              <1> 	;	return(cbuf);
   640                              <1> 	;}
   641                              <1> 	
   642                              <1> 	;;mov	di, cbuf
   643                              <1> 	;;mov	si, ncp0
   644                              <1> 	;;mov	cx, 13
   645                              <1> 	;;movsw	
   646                              <1> 	;
   647 00000297 BF[1C04]            <1> 	mov	di, cbuf	
   648                              <1> 	;mov	si, word [wday]
   649                              <1> 	;shl	si, 1
   650                              <1> 	;shl	si, 1
   651                              <1> 	;add	si, ncp1
   652                              <1> 	;movsw
   653                              <1> 	;movsw
   654 0000029A 8B36[B203]          <1> 	mov	si, word [month]
   655 0000029E D1E6                <1> 	shl	si, 1
   656 000002A0 D1E6                <1> 	shl	si, 1
   657 000002A2 81C6[E803]          <1> 	add	si, ncp2 - 4
   658 000002A6 A5                  <1> 	movsw
   659 000002A7 A5                  <1> 	movsw
   660 000002A8 A1[B003]            <1> 	mov	ax, word [day]
   661                              <1> 	;mov	cx, 10
   662 000002AB B10A                <1> 	mov	cl, 10
   663 000002AD E8E200              <1> 	call	numb
   664 000002B0 B020                <1>  	mov	al, 20h
   665 000002B2 AA                  <1> 	stosb
   666                              <1> 	;
   667 000002B3 A1[B403]            <1> 	mov	ax, word [year]
   668 000002B6 B564                <1> 	mov	ch, 100
   669 000002B8 F6F5                <1> 	div	ch
   670 000002BA 50                  <1> 	push	ax ;
   671 000002BB 98                  <1> 	cbw	; century (19, 20)
   672 000002BC E8D300              <1> 	call	numb
   673 000002BF 58                  <1> 	pop	ax
   674 000002C0 88E0                <1> 	mov	al, ah
   675 000002C2 98                  <1> 	cbw	; year (0 to 99)
   676 000002C3 E8CC00              <1> 	call	numb
   677 000002C6 B020                <1> 	mov	al, 20h
   678 000002C8 AA                  <1> 	stosb
   679                              <1> 	;
   680 000002C9 8B36[B603]          <1> 	mov	si, word [wday]
   681 000002CD D1E6                <1> 	shl	si, 1
   682 000002CF D1E6                <1> 	shl	si, 1
   683 000002D1 81C6[D003]          <1> 	add	si, ncp1
   684 000002D5 A5                  <1> 	movsw
   685 000002D6 A5                  <1> 	movsw
   686                              <1> 	;
   687 000002D7 A1[AE03]            <1> 	mov	ax, word [hour]
   688 000002DA E8B500              <1> 	call	numb
   689 000002DD B03A                <1>  	mov	al, ':'
   690 000002DF AA                  <1> 	stosb
   691 000002E0 A1[AC03]            <1> 	mov	ax, word [minute]
   692 000002E3 E8AC00              <1> 	call	numb
   693 000002E6 B03A                <1>  	mov	al, ':'
   694 000002E8 AA                  <1> 	stosb
   695 000002E9 A1[AA03]            <1> 	mov	ax, word [second]
   696 000002EC E8A300              <1> 	call	numb
   697 000002EF B020                <1>  	mov	al, 20h
   698 000002F1 AA                  <1> 	stosb
   699                              <1> 	;mov	ax, word [year]
   700                              <1> 	;mov	ch, 100
   701                              <1> 	;div	ch
   702                              <1> 	;push	ax ;
   703                              <1> 	;cbw	; century (19, 20)
   704                              <1> 	;call	numb
   705                              <1> 	;pop	ax
   706                              <1> 	;mov	al, ah
   707                              <1> 	;cbw	; year (0 to 99)
   708                              <1> 	;call	numb
   709                              <1> 	;mov	al, 20h
   710                              <1> 	;stosb
   711                              <1> 	;xor	al, al
   712                              <1> 	;stosb
   713                              <1> 
   714                              <1> 	; 26/02/2022
   715 000002F2 AA                  <1> 	stosb
   716                              <1> 
   717 000002F3 C3                  <1> 	retn
   718                              <1> 
   719                              <1> gmtime:
   720                              <1> 	; 24/11/2013 (yday, wday)
   721                              <1> 	; Retro UNIX 8086 v1 - UNIX.ASM (20/06/2013)
   722                              <1> 	; Retro UNIX 8086 v1 feature/procedure only!
   723                              <1> 	; 'convert_from_epoch' procedure prototype: 
   724                              <1> 	; 	            UNIXCOPY.ASM, 10/03/2013
   725                              <1> 	; 30/11/2012
   726                              <1> 	; Derived from DALLAS Semiconductor
   727                              <1> 	; Application Note 31 (DS1602/DS1603)
   728                              <1> 	; 6 May 1998
   729                              <1> 	;
   730                              <1> 	; INPUT:
   731                              <1> 	; DX:AX = Unix (Epoch) Time
   732                              <1> 	;
   733                              <1> 	; ((Modified registers: AX, DX, CX, BX))  
   734                              <1> 	;
   735 000002F4 B93C00              <1> 	mov	cx, 60
   736 000002F7 E88900              <1> 	call	div32
   737                              <1> 	;mov	word [imin], ax	  ; whole minutes
   738                              <1> 	;mov	word [imin]+2, dx ; since 1/1/1970
   739 000002FA 891E[AA03]          <1> 	mov	word [second], bx ; leftover seconds
   740                              <1> 	;mov	cx, 60
   741 000002FE E88200              <1> 	call	div32
   742                              <1> 	;mov	word [ihrs], ax   ; whole hours
   743                              <1> 	;mov	word [ihrs]+2, dx ; since 1/1/1970
   744 00000301 891E[AC03]          <1> 	mov	word [minute], bx ; leftover minutes
   745                              <1> 	;mov	cx, 24
   746 00000305 B118                <1> 	mov	cl, 24
   747 00000307 E87900              <1> 	call	div32
   748                              <1> 	;mov	word [iday], ax	  ; whole days
   749                              <1> 				  ; since 1/1/1970
   750 0000030A A3[B603]            <1> 	mov	word [wday], ax	  ; 24/11/2013	
   751                              <1> 	;mov	word [iday]+2, dx ; DX = 0
   752 0000030D 891E[AE03]          <1> 	mov	word [hour], bx   ; leftover hours
   753 00000311 05DB02              <1> 	add	ax, 365+366	  ; whole day since
   754                              <1> 				  ; 1/1/1968 	
   755                              <1> 	;adc	dx, 0	          ; DX = 0
   756                              <1> 	;mov	word [iday], ax
   757 00000314 50                  <1> 	push	ax
   758 00000315 B9B505              <1> 	mov	cx, (4*365)+1	  ; 4 years = 1461 days
   759 00000318 E86800              <1> 	call	div32
   760 0000031B 59                  <1> 	pop	cx
   761                              <1> 	;mov	word [lday], ax	  ; count of quadyrs (4 years)
   762 0000031C 53                  <1> 	push	bx
   763                              <1> 	;mov	word [qday], bx	  ;  days since quadyr began
   764 0000031D 83FB3C              <1> 	cmp	bx, 31 + 29	  ; if past feb 29 then
   765 00000320 F5                  <1> 	cmc			  ; add	this quadyr's leap day
   766 00000321 83D000              <1> 	adc	ax, 0		  ; to # of qadyrs (leap days)
   767                              <1> 	;mov	word [lday], ax	; since 1968			  
   768                              <1> 	;mov	cx, word [iday]
   769 00000324 91                  <1> 	xchg	cx, ax		  ; CX = lday, AX = iday		  
   770 00000325 29C8                <1> 	sub	ax, cx		  ; iday - lday
   771 00000327 B96D01              <1> 	mov	cx, 365
   772                              <1> 	;xor	dx, dx		  ; DX  = 0
   773                              <1> 	; AX = iday-lday, DX = 0
   774 0000032A E85600              <1> 	call	div32
   775                              <1> 	;mov	word [iyrs], ax   ; whole years since 1968
   776                              <1> 	; jday = iday - (iyrs*365) - lday
   777                              <1> 	;mov	word [jday], bx	  ; days since 1/1 of current year
   778 0000032D 05B007              <1> 	add	ax, 1968	  ; compute year
   779 00000330 A3[B403]            <1> 	mov	word [year], ax
   780 00000333 89C2                <1> 	mov	dx, ax		
   781                              <1> 	;mov	ax, word [qday]
   782 00000335 58                  <1> 	pop ax
   783 00000336 3D6D01              <1> 	cmp	ax, 365		  ; if qday <= 365 and qday >= 60	
   784 00000339 7707                <1> 	ja	short gmt_1	  ; jday = jday +1
   785 0000033B 83F83C              <1> 	cmp	ax, 60	          ; if past 2/29 and leap year then
   786 0000033E F5                  <1>         cmc			  ; add	a leap day to the # of whole
   787 0000033F 83D300              <1> 	adc	bx, 0		  ; days since 1/1 of current year
   788                              <1> gmt_1:
   789                              <1> 	;mov	word [jday], bx
   790                              <1> 	;mov	word [yday], bx	; 24/11/2013	
   791 00000342 B90C00              <1> 	mov	cx, 12		  ; estimate month
   792 00000345 87CB                <1> 	xchg	cx, bx		  ; CX = jday, BX = month 	
   793 00000347 B86E01              <1> 	mov	ax, 366		  ; mday, max. days since 1/1 is 365
   794 0000034A 83E203              <1> 	and	dx, 11b		  ; year mod 4 (and dx, 3) 
   795                              <1> gmt_2:	; Month calculation	  ; 0 to 11 (11 to 0)	
   796 0000034D 39C1                <1> 	cmp	cx, ax		  ; mday = # of days passed from 1/1
   797 0000034F 7315                <1> 	jnb	short gmt_3
   798 00000351 4B                  <1> 	dec	bx		  ; month = month - 1
   799 00000352 D1E3                <1> 	shl	bx, 1 
   800 00000354 8B87[B803]          <1> 	mov	ax, word DMonth[BX] ; # elapsed days at 1st of month
   801 00000358 D1EB                <1> 	shr	bx, 1		  ; bx = month - 1 (0 to 11)
   802 0000035A 83FB01              <1> 	cmp	bx, 1		  ; if month > 2 and year mod 4  = 0	
   803 0000035D 76EE                <1> 	jna	short gmt_2	  ; then mday = mday + 1
   804 0000035F 08D2                <1> 	or	dl, dl		  ; if past 2/29 and leap year then
   805 00000361 75EA                <1> 	jnz	short gmt_2	  ; add	leap day (to mday)
   806 00000363 40                  <1> 	inc	ax		  ; mday = mday + 1
   807 00000364 EBE7                <1> 	jmp	short gmt_2
   808                              <1> gmt_3:
   809 00000366 43                  <1> 	inc	bx		  ; -> bx = month, 1 to 12
   810 00000367 891E[B203]          <1> 	mov	word [month], bx
   811 0000036B 29C1                <1> 	sub	cx, ax		  ; day = jday - mday + 1	
   812 0000036D 41                  <1> 	inc	cx 			  
   813 0000036E 890E[B003]          <1> 	mov	word [day], cx
   814                              <1> 	
   815                              <1> 	; ax, bx, cx, dx is changed at return
   816                              <1> 	; output ->
   817                              <1> 	; [year], [month], [day], [hour], [minute], [second]
   818                              <1> 	; [yday] -> 24/11/2013
   819                              <1> 	; [wday] -> 24/11/2013
   820                              <1> 	;
   821                              <1> 	; 24/11/2013
   822 00000372 A1[B603]            <1> 	mov	ax, word [wday]	  ; [iday]
   823 00000375 30D2                <1> 	xor	dl, dl ; xor dx, dx
   824                              <1> 	; dx = 0	
   825 00000377 83C004              <1> 	add	ax, 4
   826                              <1> 	; NOTE: January 1, 1970 was THURSDAY
   827                              <1> 	; ch = 0
   828 0000037A B107                <1> 	mov	cl, 7
   829 0000037C F7F1                <1> 	div	cx
   830 0000037E 8916[B603]          <1> 	mov	word [wday], dx	  ; week of the day,  0 to 6 
   831                              <1> 	; 0 = sunday ... 6 = saturday
   832                              <1> 	;mov	word [isday], 0
   833                              <1> 
   834 00000382 C3                  <1> 	retn
   835                              <1> 
   836                              <1> div32:
   837                              <1> 	; Input:
   838                              <1> 	;	DX:AX = 32 bit dividend
   839                              <1> 	;          CX = 16 bit divisor
   840                              <1> 	; Output:
   841                              <1> 	;	DX:AX = 32 bit quotient
   842                              <1> 	;          BX = 16 bit remainder
   843 00000383 89D3                <1> 	mov	bx, dx
   844 00000385 93                  <1> 	xchg	ax, bx
   845 00000386 31D2                <1> 	xor	dx, dx
   846 00000388 F7F1                <1> 	div	cx 	; at first, divide DX
   847 0000038A 93                  <1> 	xchg	ax, bx	; remainder is in DX
   848                              <1> 			; now, BX has quotient
   849                              <1> 			; save remainder
   850 0000038B F7F1                <1> 	div	cx	; so, DX_AX divided and
   851                              <1> 			; AX has quotient
   852                              <1> 			; DX has remainder
   853 0000038D 87D3                <1> 	xchg	dx, bx	; finally, BX has remainder
   854                              <1> 
   855 0000038F C3                  <1> 	retn
   856                              <1> 
   857                              <1> ;sunday:
   858                              <1> 	; sunday(at, ad)
   859                              <1> 	; 	int *at;
   860                              <1> 	;	 {
   861                              <1> 	; 	register int *t, d;
   862                              <1> 	; 	t = at;
   863                              <1> 	; 	d = ad;
   864                              <1> 	; 	d = ad + dysize(t[YEAR]) - 365;
   865                              <1> 	; 	return(d - (d - t[YDAY] + t[WDAY] + 700) % 7);
   866                              <1> 	; 	}
   867                              <1> 
   868                              <1> 	;mov	dx, word [year]
   869                              <1> 	;call	dysize
   870                              <1> 	;sub	ax, 365
   871                              <1> 	;add	cx, ax
   872                              <1> ;	test	word [year], 11b
   873                              <1> ;	jnz	short @f
   874                              <1> 	; CX = 119 (77h) or CX = 303 (12Fh)
   875                              <1> 	;inc	cx
   876                              <1> ;	inc	cl
   877                              <1> ;@@:
   878                              <1> ;	mov	ax, cx
   879                              <1> ;	add	ax, word [wday]
   880                              <1> 	;adc	ax, 700
   881                              <1> ;	add	ax, 700
   882                              <1> ;	sub	ax, word [yday]
   883                              <1> 	;xor	dx, dx
   884                              <1> ;	mov	bx, 7
   885                              <1> 	;div	bx
   886                              <1> ;	div	bl
   887                              <1> ;	sub	cx, bx
   888                              <1> ;	retn
   889                              <1> 
   890                              <1> ;dysize:
   891                              <1> ; dysize(y)
   892                              <1> ;	{
   893                              <1> ;	if((y%4) == 0)
   894                              <1> ;		return(366);
   895                              <1> ;	return(365);
   896                              <1> ;	}
   897                              <1> 
   898                              <1> ;	mov	ax, 365	
   899                              <1> ;	test 	dx, 11b
   900                              <1> ;	jnz 	short @f
   901                              <1> ;	;inc 	ax
   902 00000390 FEC0                <1> 	inc 	al			
   903                              <1> ;@@:	
   904                              <1> ;	retn 
   905                              <1> 		
   906                              <1> 
   907                              <1> numb:   ; AX = 0 to 99
   908                              <1> 	;
   909                              <1> 	; numb(acp, n)
   910                              <1> 	; {
   911                              <1> 	;	register char *cp;
   912                              <1> 	;
   913                              <1> 	;	cp = acp;
   914                              <1> 	;	cp++;
   915                              <1> 	;	if (n>=10)
   916                              <1> 	;	   *cp++ = (n/10)%10 + '0';
   917                              <1> 	;	else
   918                              <1> 	;	   *cp++ = ' ';
   919                              <1> 	;	*cp++ = n%10 + '0';
   920                              <1> 	;	return(cp);
   921                              <1> 	; }
   922                              <1> 	;
   923                              <1> 	;mov	cl, 10
   924 00000392 83F80A              <1> 	cmp	ax, 10
   925 00000395 7306                <1> 	jnb	short nb1
   926 00000397 88C4                <1> 	mov	ah, al
   927 00000399 30C0                <1> 	xor	al, al ; 0
   928 0000039B EB04                <1> 	jmp	short nb2
   929                              <1> nb1:	
   930 0000039D F6F1                <1> 	div	cl
   931 0000039F 88E2                <1> 	mov	dl, ah
   932                              <1> nb2:	
   933 000003A1 0430                <1> 	add	al, '0'
   934 000003A3 AA                  <1> 	stosb	; digit 1
   935 000003A4 88E0                <1> 	mov	al, ah
   936 000003A6 0430                <1> 	add	al, '0'
   937 000003A8 AA                  <1> 	stosb	; digit 2
   938 000003A9 C3                  <1> 	retn
   939                              <1> 
   940                              <1> 
   941                              <1> ;;; DATA
   942                              <1> 
   943                              <1> ;daylight: db 1 ; int daylight 1; /* Allow daylight conversion */
   944                              <1> ;nixonflg: db 0 ; int nixonflg 0; /* Daylight time all year around */
   945                              <1> ;daylbegin: dw 0
   946                              <1> ;daylend:  dw 0
   947                              <1> 
   948                              <1> ct:
   949                              <1> ; 24/11/2013 (re-order)
   950                              <1> ;
   951                              <1> ; Retro UNIX 8086 v1 - UNIX.ASM
   952                              <1> ; 09/04/2013 epoch variables
   953                              <1> ; Retro UNIX 8086 v1 Prototype: UNIXCOPY.ASM, 10/03/2013
   954                              <1> ;
   955                              <1> 
   956 000003AA 0000                <1> second: dw 0
   957 000003AC 0000                <1> minute: dw 0
   958 000003AE 0000                <1> hour:	dw 0
   959 000003B0 0100                <1> day:	dw 1
   960 000003B2 0100                <1> month:	dw 1
   961 000003B4 B207                <1> year:	dw 1970
   962 000003B6 0000                <1> wday:	dw 0 ; 24/11/2013
   963                              <1> ;yday:	dw 0 ; 24/11/2013
   964                              <1> ;isday:	dw 0 ; 24/11/2013
   965                              <1> 
   966                              <1> DMonth:
   967 000003B8 0000                <1> dw 0
   968 000003BA 1F00                <1> dw 31
   969 000003BC 3B00                <1> dw 59
   970 000003BE 5A00                <1> dw 90
   971 000003C0 7800                <1> dw 120
   972 000003C2 9700                <1> dw 151
   973 000003C4 B500                <1> dw 181
   974 000003C6 D400                <1> dw 212
   975 000003C8 F300                <1> dw 243
   976 000003CA 1101                <1> dw 273
   977 000003CC 3001                <1> dw 304
   978 000003CE 4E01                <1> dw 334
   979                              <1> 
   980                              <1> ;ncp0:	db "Day Mon 00 00:00:00 1970", 0, 0
   981 000003D0 53756E204D6F6E2054- <1> ncp1:	db "Sun Mon Tue Wed Thu Fri Sat "
   981 000003D9 756520576564205468- <1>
   981 000003E2 752046726920536174- <1>
   981 000003EB 20                  <1>
   982 000003EC 4A616E20466562204D- <1> ncp2:	db "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec "
   982 000003F5 617220417072204D61- <1>
   982 000003FE 79204A756E204A756C- <1>
   982 00000407 204175672053657020- <1>
   982 00000410 4F6374204E6F762044- <1>
   982 00000419 656320              <1>
   983                              <1> 
   984                              <1> cbuf:	; char cbuf[26]
   985 0000041C 00<rep 1Ah>         <1> 	times 26 db 0
   986 00000436 00                  <1> 	db 0	; 02/06/2022
   987                              <1> 
   988                              <1> ;; ctime.c (Unix v5)
   989                              <1> ;
   990                              <1> ;#
   991                              <1> ;/*
   992                              <1> ; * This routine converts time as follows.
   993                              <1> ; * The epoch is 0000 Jan 1 1970 GMT.
   994                              <1> ; * The argument time is in seconds since then.
   995                              <1> ; * The localtime(t) entry returns a pointer to an array
   996                              <1> ; * containing
   997                              <1> ; *  seconds (0-59)
   998                              <1> ; *  minutes (0-59)
   999                              <1> ; *  hours (0-23)
  1000                              <1> ; *  day of month (1-31)
  1001                              <1> ; *  month (0-11)
  1002                              <1> ; *  year-1970
  1003                              <1> ; *  weekday (0-6, Sun is 0)
  1004                              <1> ; *  day of the year
  1005                              <1> ; *  daylight savings flag
  1006                              <1> ; *
  1007                              <1> ; * The routine corrects for daylight saving
  1008                              <1> ; * time and will work in any time zone provided
  1009                              <1> ; * "timezone" is adjusted to the difference between
  1010                              <1> ; * Greenwich and local standard time (measured in seconds).
  1011                              <1> ; * In places like Michigan "daylight" must
  1012                              <1> ; * be initialized to 0 to prevent the conversion
  1013                              <1> ; * to daylight time.
  1014                              <1> ; *
  1015                              <1> ; * "nixonflg,", if set to 1, will
  1016                              <1> ; * cause daylight savings time all year around
  1017                              <1> ; * independently of "daylight".
  1018                              <1> ; *
  1019                              <1> ; * The routine does not work
  1020                              <1> ; * in Saudi Arabia which runs on Solar time.
  1021                              <1> ; *
  1022                              <1> ; * asctime(tvec))
  1023                              <1> ; * where tvec is produced by localtime
  1024                              <1> ; * returns a ptr to a character string
  1025                              <1> ; * that has the ascii time in the form
  1026                              <1> ; *	Thu Jan 01 00:00:00 1970n0\; *	01234567890123456789012345
  1028                              <1> ; *	0	  1	    2
  1029                              <1> ; *
  1030                              <1> ; * ctime(t) just calls localtime, then asctime.
  1031                              <1> ; */
  1032                              <1> ;char	cbuf[26];
  1033                              <1> ;int	dmsize[12]
  1034                              <1> ;{
  1035                              <1> ;	31,
  1036                              <1> ;	28,
  1037                              <1> ;	31,
  1038                              <1> ;	30,
  1039                              <1> ;	31,
  1040                              <1> ;	30,
  1041                              <1> ;	31,
  1042                              <1> ;	31,
  1043                              <1> ;	30,
  1044                              <1> ;	31,
  1045                              <1> ;	30,
  1046                              <1> ;	31
  1047                              <1> ;};
  1048                              <1> ;
  1049                              <1> ;int timezone	5*60*60;
  1050                              <1> ;int tzname[]
  1051                              <1> ;{
  1052                              <1> ;	"EST",
  1053                              <1> ;	"EDT",
  1054                              <1> ;};
  1055                              <1> ;int	daylight 1;	/* Allow daylight conversion */
  1056                              <1> ;int	nixonflg 0;	/* Daylight time all year around */
  1057                              <1> ;
  1058                              <1> ;#define SEC	0
  1059                              <1> ;#define MIN	1
  1060                              <1> ;#define HOUR	2
  1061                              <1> ;#define MDAY	3 
  1062                              <1> ;#define MON	4
  1063                              <1> ;#define YEAR	5
  1064                              <1> ;#define WDAY	6
  1065                              <1> ;#define YDAY	7
  1066                              <1> ;#define ISDAY	8
  1067                              <1> ;
  1068                              <1> ;ctime(at)
  1069                              <1> ;int *at;
  1070                              <1> ;{
  1071                              <1> ;	return(asctime(localtime(at)));
  1072                              <1> ;}
  1073                              <1> ;
  1074                              <1> ;localtime(tim)
  1075                              <1> ;int tim[];
  1076                              <1> ;{
  1077                              <1> ;	register int *t, *ct, dayno;
  1078                              <1> ;	int daylbegin, daylend;
  1079                              <1> ;	int copyt[2];
  1080                              <1> ;
  1081                              <1> ;	t = copyt;
  1082                              <1> ;	t[0] = tim[0];
  1083                              <1> ;	t[1] = tim[1];
  1084                              <1> ;	dpadd(t, -timezone);
  1085                              <1> ;	ct = gmtime(t);
  1086                              <1> ;	dayno = ct[YDAY];
  1087                              <1> ;	if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 ||
  1088                              <1> ;	    dayno==5 && ct[HOUR]>=2))) {
  1089                              <1> ;		daylight =| 1;
  1090                              <1> ;		daylbegin = -1;
  1091                              <1> ;		daylend = 367;
  1092                              <1> ;	} else {
  1093                              <1> ;		daylbegin = sunday(ct, 119);	/* last Sun in Apr */
  1094                              <1> ;		daylend = sunday(ct, 303);	/* last Sun in Oct */
  1095                              <1> ;	}
  1096                              <1> ;	if (daylight &&
  1097                              <1> ;	    (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) &&
  1098                              <1> ;	    (dayno<daylend || (dayno==daylend && ct[HOUR]<1))) {
  1099                              <1> ;		dpadd(t, 1*60*60);
  1100                              <1> ;		ct = gmtime(t);
  1101                              <1> ;		ct[ISDAY]++;
  1102                              <1> ;	}
  1103                              <1> ;	return(ct);
  1104                              <1> ;}
  1105                              <1> ;
  1106                              <1> ;sunday(at, ad)
  1107                              <1> ;int *at;
  1108                              <1> ;{
  1109                              <1> ;	register int *t, d;
  1110                              <1> ;
  1111                              <1> ;	t = at;
  1112                              <1> ;	d = ad;
  1113                              <1> ;	d = ad + dysize(t[YEAR]) - 365;
  1114                              <1> ;	return(d - (d - t[YDAY] + t[WDAY] + 700) % 7);
  1115                              <1> ;}
  1116                              <1> ;
  1117                              <1> ;gmtime(tim)
  1118                              <1> ;int tim[];
  1119                              <1> ;{
  1120                              <1> ;	register int d0, d1;
  1121                              <1> ;	register *tp;
  1122                              <1> ;	static xtime[9];
  1123                              <1> ;	extern int ldivr;
  1124                              <1> ;
  1125                              <1> ;	/*
  1126                              <1> ;	 * break initial number into
  1127                              <1> ;	 * multiples of 8 hours.
  1128                              <1> ;	 * (28800 = 60*60*8)
  1129                              <1> ;	 */
  1130                              <1> ;
  1131                              <1> ;	d0 = ldiv(tim[0], tim[1], 28800);
  1132                              <1> ;	d1 = ldivr;
  1133                              <1> ;	tp = &xtime[0];
  1134                              <1> ;
  1135                              <1> ;	/*
  1136                              <1> ;	 * generate hours:minutes:seconds
  1137                              <1> ;	 */
  1138                              <1> ;
  1139                              <1> ;	*tp++ = d1%60;
  1140                              <1> ;	d1 =/ 60;
  1141                              <1> ;	*tp++ = d1%60;
  1142                              <1> ;	d1 =/ 60;
  1143                              <1> ;	d1 =+ (d0%3)*8;
  1144                              <1> ;	d0 =/ 3;
  1145                              <1> ;	*tp++ = d1;
  1146                              <1> ;
  1147                              <1> ;	/*
  1148                              <1> ;	 * d0 is the day number.
  1149                              <1> ;	 * generate day of the week.
  1150                              <1> ;	 */
  1151                              <1> ;
  1152                              <1> ;	xtime[WDAY] = (d0+4)%7;
  1153                              <1> ;
  1154                              <1> ;	/*
  1155                              <1> ;	 * year number
  1156                              <1> ;	 */
  1157                              <1> ;	for(d1=70; d0 >= dysize(d1); d1++)
  1158                              <1> ;		d0 =- dysize(d1);
  1159                              <1> ;	xtime[YEAR] = d1;
  1160                              <1> ;	xtime[YDAY] = d0;
  1161                              <1> ;
  1162                              <1> ;	/*
  1163                              <1> ;	 * generate month
  1164                              <1> ;	 */
  1165                              <1> ;
  1166                              <1> ;	if (dysize(d1)==366)
  1167                              <1> ;		dmsize[1] = 29;
  1168                              <1> ;	for(d1=0; d0 >= dmsize[d1]; d1++)
  1169                              <1> ;		d0 =- dmsize[d1];
  1170                              <1> ;	dmsize[1] = 28;
  1171                              <1> ;	*tp++ = d0+1;
  1172                              <1> ;	*tp++ = d1;
  1173                              <1> ;	xtime[ISDAY] = 0;
  1174                              <1> ;	return(xtime);
  1175                              <1> ;}
  1176                              <1> ;
  1177                              <1> ;asctime(t)
  1178                              <1> ;int *t;
  1179                              <1> ;{
  1180                              <1> ;	register char *cp, *ncp;
  1181                              <1> ;	register int *tp;
  1182                              <1> ;
  1183                              <1> ;	cp = cbuf;
  1184                              <1> ;	for (ncp = "Day Mon 00 00:00:00 1900\n"; *cp++ = *ncp++;);
  1185                              <1> ;	ncp = &"SunMonTueWedThuFriSat"[3*t[6]];
  1186                              <1> ;	cp = cbuf;
  1187                              <1> ;	*cp++ = *ncp++;
  1188                              <1> ;	*cp++ = *ncp++;
  1189                              <1> ;	*cp++ = *ncp++;
  1190                              <1> ;	cp++;
  1191                              <1> ;	tp = &t[4];
  1192                              <1> ;	ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[(*tp)*3];
  1193                              <1> ;	*cp++ = *ncp++;
  1194                              <1> ;	*cp++ = *ncp++;
  1195                              <1> ;	*cp++ = *ncp++;
  1196                              <1> ;	cp = numb(cp, *--tp);
  1197                              <1> ;	cp = numb(cp, *--tp+100);
  1198                              <1> ;	cp = numb(cp, *--tp+100);
  1199                              <1> ;	cp = numb(cp, *--tp+100);
  1200                              <1> ;	cp =+ 2;
  1201                              <1> ;	cp = numb(cp, t[YEAR]);
  1202                              <1> ;	return(cbuf);
  1203                              <1> ;}
  1204                              <1> ;
  1205                              <1> ;dysize(y)
  1206                              <1> ;{
  1207                              <1> ;	if((y%4) == 0)
  1208                              <1> ;		return(366);
  1209                              <1> ;	return(365);
  1210                              <1> ;}
  1211                              <1> ;
  1212                              <1> ;
  1213                              <1> ;numb:
  1214                              <1> ;	
  1215                              <1> ;
  1216                              <1> ;numb(acp, n)
  1217                              <1> ;{
  1218                              <1> ;	register char *cp;
  1219                              <1> ;	cp = acp;
  1220                              <1> ;	cp++;
  1221                              <1> ;	if (n>=10)
  1222                              <1> ;		*cp++ = (n/10)%10 + '0';
  1223                              <1> ;	else
  1224                              <1> ;		*cp++ = ' ';
  1225                              <1> ;	*cp++ = n%10 + '0';
  1226                              <1> ;	return(cp);
  1227                              <1> ;}
  1228                              <1> ;
   464                                  ;=================================================================
   465                                  
   466                                  ;-----------------------------------------------------------------
   467                                  ;  data - initialized data
   468                                  ;-----------------------------------------------------------------
   469                                  
   470                                  lpt1:
   471 00000437 2F6465762F6C707200      	db '/dev/lpr', 0
   472                                  
   473                                  program_msg:
   474 00000440 0D0A                    	db  0Dh, 0Ah
   475 00000442 526574726F20554E49-     	db  'Retro UNIX 8086 v1 PRINT Utility by Erdogan TAN - 10/07/2022'
   475 0000044B 582038303836207631-
   475 00000454 205052494E54205574-
   475 0000045D 696C69747920627920-
   475 00000466 4572646F67616E2054-
   475 0000046F 414E202D2031302F30-
   475 00000478 372F32303232       
   476 0000047E 0D0A00                  	db  0Dh, 0Ah, 0
   477                                  usage_msg:
   478 00000481 0D0A                    	db  0Dh, 0Ah
   479 00000483 55736167653A207072-     	db  'Usage: pr [ -rlcm ] filename1 ... '
   479 0000048C 205B202D726C636D20-
   479 00000495 5D2066696C656E616D-
   479 0000049E 6531202E2E2E20     
   480 000004A5 0D0A                    	db  0Dh, 0Ah
   481 000004A7 09202020204F707469-     	db  '	    Options: '
   481 000004B0 6F6E733A20         
   482 000004B5 0D0A                    	db  0Dh, 0Ah
   483 000004B7 202020202020202020-     	db  '             -r : 66 lines per page (default option)'
   483 000004C0 202020202D72203A20-
   483 000004C9 3636206C696E657320-
   483 000004D2 706572207061676520-
   483 000004DB 2864656661756C7420-
   483 000004E4 6F7074696F6E29     
   484 000004EB 0D0A                    	db  0Dh, 0Ah	
   485 000004ED 202020202020202020-     	db  '             -l : 78 lines per page'
   485 000004F6 202020202D6C203A20-
   485 000004FF 3738206C696E657320-
   485 00000508 7065722070616765   
   486 00000510 0D0A                    	db  0Dh, 0Ah
   487 00000512 202020202020202020-     	db  '             -m : modification date (default option)'
   487 0000051B 202020202D6D203A20-
   487 00000524 6D6F64696669636174-
   487 0000052D 696F6E206461746520-
   487 00000536 2864656661756C7420-
   487 0000053F 6F7074696F6E29     
   488 00000546 0D0A                    	db  0Dh, 0Ah
   489 00000548 202020202020202020-     	db  '             -c : current date'
   489 00000551 202020202D63203A20-
   489 0000055A 63757272656E742064-
   489 00000563 617465             
   490 00000566 0D0A                    	db  0Dh, 0Ah
   491                                  nextline:
   492 00000568 0D0A00                  	db  0Dh, 0Ah, 0
   493                                  
   494                                  size_pmsg equ usage_msg-(program_msg+1)
   495                                  
   496                                  printer_err_msg:
   497 0000056B 0D0A                    	db 0Dh, 0Ah	
   498 0000056D 5072696E7465722045-     	db "Printer Error !"
   498 00000576 72726F722021       
   499 0000057C 0D0A00                   	db 0Dh, 0Ah, 0  		
   500                                  
   501                                  size_umsg equ printer_err_msg-(usage_msg+1)
   502                                  
   503                                  file_err_msg:
   504 0000057F 0D0A                    	db 0Dh, 0Ah	
   505 00000581 46696C65204572726F-     	db "File Error !"
   505 0000058A 722021             
   506 0000058D 0D0A00                   	db 0Dh, 0Ah, 0  
   507                                  
   508                                  EmptyLines:
   509 00000590 0D0A0D0A0D0A0D0A0D-     	db 0Dh, 0Ah, 0Dh, 0Ah, 0Dh, 0Ah, 0Dh, 0Ah, 0Dh, 0Ah
   509 00000599 0A                 
   510 0000059A 2020                    	db 20h, 20h
   511                                  PageHeader:
   512 0000059C 205061676520            	db " Page "
   513                                  
   514 000005A2 42                      rows:	db 66
   515 000005A3 00                      cdatef:	db 0
   516                                  
   517                                  ;-----------------------------------------------------------------
   518                                  ;  bss - uninitialized data
   519                                  ;-----------------------------------------------------------------	
   520                                  
   521                                  align 2
   522                                  
   523                                  bss_start:
   524                                  
   525                                  ABSOLUTE bss_start
   526                                  
   527 000005A4 ??                      argc:	 resb 1
   528 000005A5 ??                      files:	 resb 1
   529 000005A6 ????                    pgnumber: resw 1
   530 000005A8 ??                      eof:	 resb 1
   531 000005A9 ??                      cchar:	 resb 1
   532 000005AA ??                      chr:	 resb 1
   533 000005AB ??                      pchr:	 resb 1 ; 10/07/2022
   534 000005AC ????????                mtime:	 resd 1	
   535                                  
   536                                  ; 26/06/2022
   537 000005B0 ????                    prnfnum: resw 1
   538                                  
   539                                  fbuf:
   540                                  txtfnum: 
   541 000005B2 <res 86h>               	resb 128+6
   542                                  stbuf:
   543 00000638 <res 22h>               	resb 34
   544                                  
   545                                  bss_end:
   546                                  
   547                                  ;-----------------------------------------------------------------
   548                                  ; 25/06/2022
   549                                  ;-----------------------------------------------------------------
   550                                  ; Original UNIX v2 - pr (utility) disassembled source code
   551                                  ;-----------------------------------------------------------------
   552                                  
   553                                  ;
   554                                  ; +-------------------------------------------------------------------------+
   555                                  ; |   This file	has been generated by The Interactive Disassembler (IDA)    |
   556                                  ; |	      Copyright	(c) 2013 Hex-Rays, <support@hex-rays.com>	    |
   557                                  ; +-------------------------------------------------------------------------+
   558                                  ;
   559                                  ; File Name   :	C:\Users\Erdoan\Desktop\s2.tar\bin\pr
   560                                  ; Format      :	Binary file
   561                                  ; Base Address:	0000h Range: 4000h - 448Eh Loaded length: 0000048Eh
   562                                  
   563                                  ; Processor	  : PDP11
   564                                  ; Target assembler: Macro-11 Assembler
   565                                  
   566                                  ;.macro .array of,type,cnt,val
   567                                  ;.rept  cnt
   568                                  ; type  val
   569                                  ;.endr
   570                                  ;.endm .array
   571                                  
   572                                  ; ===========================================================================
   573                                  
   574                                  ;; Segment type:	Regular
   575                                  ;.PSECT RAM
   576                                  ;byte_0:		.blkb  40000
   577                                  ;; ---------------------------------------------------------------------------
   578                                  ;
   579                                  ;loc_40000:
   580                                  ;		br	loc_40014
   581                                  ;; ---------------------------------------------------------------------------
   582                                  ;		.word 2216
   583                                  ;		.word 0
   584                                  ;		.word 0
   585                                  ;		.word 0
   586                                  ;		.word 0
   587                                  ;; ---------------------------------------------------------------------------
   588                                  ;
   589                                  ;loc_40014:				
   590                                  ;		trap	33
   591                                  ;; ---------------------------------------------------------------------------
   592                                  ;		.word intr_loc
   593                                  ;; ---------------------------------------------------------------------------
   594                                  ;		mov	(SP)+, argc
   595                                  ;		tst	(SP)+
   596                                  ;		clr	R0
   597                                  ;		trap	34
   598                                  ;; ---------------------------------------------------------------------------
   599                                  ;		.word fnum
   600                                  ;; ---------------------------------------------------------------------------
   601                                  ;		bit	#1, statbuf
   602                                  ;		beq	chmod_err
   603                                  ;		trap	22
   604                                  ;; ---------------------------------------------------------------------------
   605                                  ;		.word ttyx		; "/dev/tty0"
   606                                  ;		.word statbuf
   607                                  ;; ---------------------------------------------------------------------------
   608                                  ;		mov	fnum, R0
   609                                  ;		sub	statbuf, R0
   610                                  ;		add	#60, R0	; '0'
   611                                  ;		movb	R0, ttyx+10
   612                                  ;		trap	17
   613                                  ;; ---------------------------------------------------------------------------
   614                                  ;		.word ttyx		; "/dev/tty0"
   615                                  ;		.word 14
   616                                  ;; ---------------------------------------------------------------------------
   617                                  ;		bcs	chmod_err
   618                                  ;		inc	chmodflg
   619                                  ;
   620                                  ;chmod_err:				
   621                                  ;		clr	fnum
   622                                  ;
   623                                  ;err_cf:					
   624                                  ;		mov	fnum, R0
   625                                  ;		beq	err_cf_next
   626                                  ;		trap	6
   627                                  ;		clr	fnum
   628                                  ;
   629                                  ;err_cf_next:				
   630                                  ;		dec	argc
   631                                  ;		bgt	next_arg
   632                                  ;		jmp	intr_loc
   633                                  ;; ---------------------------------------------------------------------------
   634                                  ;
   635                                  ;next_arg:				
   636                                  ;		mov	(SP)+, R0
   637                                  ;		mov	R0, fname_ptr
   638                                  ;		cmpb	(R0)+, #55 ; '-'
   639                                  ;		bne	open_txt_file
   640                                  ;		cmpb	@R0, #154 ; 'l'
   641                                  ;		bne	case_r
   642                                  ;		mov	#78., rows
   643                                  ;		br	err_cf
   644                                  ;; ---------------------------------------------------------------------------
   645                                  ;
   646                                  ;case_r:					
   647                                  ;		cmpb	@R0, #162 ; 'r'
   648                                  ;		bne	case_m
   649                                  ;		mov	#66., rows
   650                                  ;		br	err_cf
   651                                  ;; ---------------------------------------------------------------------------
   652                                  ;
   653                                  ;case_m:					
   654                                  ;		cmpb	@R0, #155 ; 'm'
   655                                  ;		bne	case_c
   656                                  ;		clr	cdateflg
   657                                  ;		br	err_cf
   658                                  ;; ---------------------------------------------------------------------------
   659                                  ;
   660                                  ;case_c:					
   661                                  ;		cmpb	@R0, #143 ; 'c'
   662                                  ;		bne	open_txt_file
   663                                  ;		inc	cdateflg
   664                                  ;		br	err_cf
   665                                  ;; ---------------------------------------------------------------------------
   666                                  ;
   667                                  ;open_txt_file:				
   668                                  ;		mov	fname_ptr, R0
   669                                  ;		jsr	R5, fopen
   670                                  ;; ---------------------------------------------------------------------------
   671                                  ;		.word fnum
   672                                  ;; ---------------------------------------------------------------------------
   673                                  ;		bcs	err_cf
   674                                  ;		tst	cdateflg
   675                                  ;		beq	get_fmod_time
   676                                  ;		trap	15
   677                                  ;		mov	@#word_177304, mtime_l
   678                                  ;		mov	@#word_177302, mtime_h
   679                                  ;		br	write_pages
   680                                  ;; ---------------------------------------------------------------------------
   681                                  ;
   682                                  ;get_fmod_time:				
   683                                  ;		mov	fnum, R0
   684                                  ;		trap	34
   685                                  ;; ---------------------------------------------------------------------------
   686                                  ;		.word fstatbuf
   687                                  ;; ---------------------------------------------------------------------------
   688                                  ;		mov	i_mtime_l, mtime_l
   689                                  ;		mov	i_mtime_h, mtime_h
   690                                  ;
   691                                  ;write_pages:				
   692                                  ;		clr	pagenumber
   693                                  ;		clr	eof
   694                                  ;		clr	cchar
   695                                  ;
   696                                  ;write_next_page:			
   697                                  ;		call	readf
   698                                  ;		br	err_cf
   699                                  ;; ---------------------------------------------------------------------------
   700                                  ;		mov	#1, R0
   701                                  ;		trap	4
   702                                  ;; ---------------------------------------------------------------------------
   703                                  ;		.word EmptyLines	; "\n\n\n\n\n"
   704                                  ;		.word 2
   705                                  ;; ---------------------------------------------------------------------------
   706                                  ;		mov	#1, R0
   707                                  ;		mov	mtime_l, @#word_177304
   708                                  ;		mov	mtime_h, @#word_177302
   709                                  ;		call	write_hdr_date
   710                                  ;		mov	#1, R0
   711                                  ;		trap	4
   712                                  ;; ---------------------------------------------------------------------------
   713                                  ;		.word PageHeader	; "   Page "
   714                                  ;		.word 2
   715                                  ;; ---------------------------------------------------------------------------
   716                                  ;		inc	pagenumber
   717                                  ;		mov	fname_ptr, R1
   718                                  ;		mov	R1, f_name_ptr
   719                                  ;		mov	#-1, R0
   720                                  ;
   721                                  ;strlen:					
   722                                  ;		inc	R0
   723                                  ;		tstb	(R1)+
   724                                  ;		bne	strlen
   725                                  ;		mov	R0, charcount
   726                                  ;		mov	#1, R0
   727                                  ;		trap	4
   728                                  ;; ---------------------------------------------------------------------------
   729                                  ;f_name_ptr:	.word 40000		
   730                                  ;charcount:	.word 40000		
   731                                  ;; ---------------------------------------------------------------------------
   732                                  ;		mov	#1, R0
   733                                  ;		trap	4
   734                                  ;; ---------------------------------------------------------------------------
   735                                  ;		.word PageHeader+2
   736                                  ;		.word 6
   737                                  ;; ---------------------------------------------------------------------------
   738                                  ;		mov	pagenumber, @#word_177304
   739                                  ;		call	write_pg_num
   740                                  ;		mov	#1, R0
   741                                  ;		trap	4
   742                                  ;; ---------------------------------------------------------------------------
   743                                  ;		.word EmptyLines	; "\n\n\n\n\n"
   744                                  ;		.word 4
   745                                  ;; ---------------------------------------------------------------------------
   746                                  ;		mov	rows, R1
   747                                  ;		sub	#11., R1
   748                                  ;
   749                                  ;write_next_char:			
   750                                  ;		call	get_char
   751                                  ;		call	write_char
   752                                  ;		cmp	R0, #10.
   753                                  ;		bne	write_next_char
   754                                  ;		dec	R1
   755                                  ;		bne	write_next_char
   756                                  ;		mov	#1, R0
   757                                  ;		trap	4
   758                                  ;; ---------------------------------------------------------------------------
   759                                  ;		.word EmptyLines	; "\n\n\n\n\n"
   760                                  ;		.word 5
   761                                  ;; ---------------------------------------------------------------------------
   762                                  ;		br	write_next_page
   763                                  ;; ---------------------------------------------------------------------------
   764                                  ;
   765                                  ;intr_loc:				
   766                                  ;					
   767                                  ;		tst	chmodflg
   768                                  ;		beq	_exit
   769                                  ;		trap	17
   770                                  ;; ---------------------------------------------------------------------------
   771                                  ;		.word ttyx		; "/dev/tty0"
   772                                  ;		.word 15
   773                                  ;; ---------------------------------------------------------------------------
   774                                  ;
   775                                  ;_exit:					
   776                                  ;		trap	1
   777                                  ;
   778                                  ;; =============== SUBROUTINE ================================================
   779                                  ;
   780                                  ;
   781                                  ;write_pg_num:				
   782                                  ;					
   783                                  ;		clr	@#word_177302
   784                                  ;		mov	#10., @#word_177300
   785                                  ;		mov	@#word_177302, -(SP)
   786                                  ;		tst	@#word_177304
   787                                  ;		beq	wrt_pg_num_1
   788                                  ;		call	write_pg_num
   789                                  ;
   790                                  ;wrt_pg_num_1:				
   791                                  ;		mov	(SP)+, R0
   792                                  ;		add	#60, R0	; '0'
   793                                  ;
   794                                  ;write_char:				
   795                                  ;		mov	R0, pn_chr
   796                                  ;		mov	#1, R0
   797                                  ;		trap	4
   798                                  ;; End of function write_pg_num
   799                                  ;
   800                                  ;; ---------------------------------------------------------------------------
   801                                  ;		.word pn_chr
   802                                  ;		.word 1
   803                                  ;; ---------------------------------------------------------------------------
   804                                  ;		mov	pn_chr, R0
   805                                  ;		return
   806                                  ;
   807                                  ;; =============== SUBROUTINE ================================================
   808                                  ;
   809                                  ;
   810                                  ;get_char:				
   811                                  ;					
   812                                  ;		mov	cchar, R0
   813                                  ;		beq	get_char_1
   814                                  ;		clr	cchar
   815                                  ;		return
   816                                  ;; ---------------------------------------------------------------------------
   817                                  ;
   818                                  ;get_char_1:				
   819                                  ;		tst	eof
   820                                  ;		beq	get_next_char
   821                                  ;		mov	#10., R0
   822                                  ;		return
   823                                  ;; ---------------------------------------------------------------------------
   824                                  ;
   825                                  ;get_next_char:				
   826                                  ;		jsr	R5, getc
   827                                  ;; End of function get_char
   828                                  ;
   829                                  ;; ---------------------------------------------------------------------------
   830                                  ;		.word fnum
   831                                  ;; ---------------------------------------------------------------------------
   832                                  ;		bcc	getc_ok
   833                                  ;		mov	PC, eof
   834                                  ;		br	get_char
   835                                  ;; ---------------------------------------------------------------------------
   836                                  ;
   837                                  ;getc_ok:				
   838                                  ;		return
   839                                  ;
   840                                  ;; =============== SUBROUTINE ================================================
   841                                  ;
   842                                  ;
   843                                  ;readf:				
   844                                  ;		call	get_char
   845                                  ;		mov	R0, cchar
   846                                  ;		tst	eof
   847                                  ;		bne	readf_err
   848                                  ;		add	#2, @SP
   849                                  ;
   850                                  ;readf_err:				
   851                                  ;		return
   852                                  ;; End of function readf
   853                                  ;
   854                                  ;; ---------------------------------------------------------------------------
   855                                  ;EmptyLines:	.ascii <12>		
   856                                  ;		.ascii <12>
   857                                  ;		.ascii <12>
   858                                  ;		.ascii <12><12>
   859                                  ;PageHeader:	.ascii \   Page \       
   860                                  ;ttyx:		.ascii \/dev/tty0\<0>   
   861                                  ;		.byte	 0 ;
   862                                  ;rows:		.word 102		
   863                                  ;mtime_l:	.word 0			
   864                                  ;mtime_h:	.word 0			
   865                                  ;argc:		.word 0			
   866                                  ;					
   867                                  ;eof:		.word 0			
   868                                  ;					
   869                                  ;cchar:		.word 0			
   870                                  ;pn_chr:	.word 0			
   871                                  ;					
   872                                  ;pagenumber:	.word 0			
   873                                  ;					
   874                                  ;fnum:		.word 0			
   875                                  ;statbuf:	.word 0			
   876                                  ;		.word 0
   877                                  ;		.word 0
   878                                  ;		.word 0
   879                                  ;fstatbuf:	.word 0			
   880                                  ;		.word 0
   881                                  ;		.word 0
   882                                  ;		.word 0
   883                                  ;		.word 0
   884                                  ;		.word 0
   885                                  ;		.word 0
   886                                  ;		.word 0
   887                                  ;		.word 0
   888                                  ;		.word 0
   889                                  ;		.word 0
   890                                  ;		.word 0
   891                                  ;		.word 0
   892                                  ;		.word 0
   893                                  ;i_mtime_h:	.word 0			
   894                                  ;i_mtime_l:	.word 0			
   895                                  ;i_rsvd:	.word 0
   896                                  ;		.array of .bytes cnt=132 val=0
   897                                  ;chmodflg:	.word 0			
   898                                  ;fname_ptr:	.word 0			
   899                                  ;					
   900                                  ;cdateflg:	.word 0			
   901                                  ;; ---------------------------------------------------------------------------
   902                                  ;
   903                                  ;write_hdr_date:				
   904                                  ;		mov	R1, -(SP)
   905                                  ;		sub	#20, SP
   906                                  ;		mov	R0, R1
   907                                  ;		mov	SP, R0
   908                                  ;		call	calc_date
   909                                  ;		mov	R0, datebufptr
   910                                  ;		mov	R1, R0
   911                                  ;		trap	4
   912                                  ;; ---------------------------------------------------------------------------
   913                                  ;datebufptr:	.word 40000		
   914                                  ;		.word 15.
   915                                  ;; ---------------------------------------------------------------------------
   916                                  ;		add	#16., SP
   917                                  ;		mov	(SP)+, R1
   918                                  ;		return
   919                                  ;; ---------------------------------------------------------------------------
   920                                  ;
   921                                  ;calc_date:				
   922                                  ;		mov	R2, -(SP)
   923                                  ;		mov	R3, -(SP)
   924                                  ;		cmp	@#word_177302, word_41700
   925                                  ;		bcs	loc_41372
   926                                  ;		bhi	loc_41340
   927                                  ;		cmp	@#word_177304, word_41702
   928                                  ;		bcs	loc_41372
   929                                  ;
   930                                  ;loc_41340:				
   931                                  ;		mov	@#word_177302, -(SP)
   932                                  ;		sub	word_41702, @#word_177304
   933                                  ;		sbc	@SP
   934                                  ;		sub	word_41700, @SP
   935                                  ;		mov	(SP)+, @#word_177302
   936                                  ;		mov	#29., february
   937                                  ;
   938                                  ;loc_41372:				
   939                                  ;		mov	#-4, @#word_177314
   940                                  ;		mov	#32274,	@#word_177300
   941                                  ;		mov	@#word_177304, R3
   942                                  ;		mov	@#word_177302, @#word_177304
   943                                  ;		mov	#2, @#word_177314
   944                                  ;		mov	#15., @#word_177300
   945                                  ;		add	#15., R0
   946                                  ;		jsr	R5, divide
   947                                  ;; ---------------------------------------------------------------------------
   948                                  ;		.word 10.
   949                                  ;; ---------------------------------------------------------------------------
   950                                  ;		jsr	R5, divide
   951                                  ;		.word 6
   952                                  ;; ---------------------------------------------------------------------------
   953                                  ;		movb	#72, -(R0) ; ':'
   954                                  ;		jsr	R5, divide
   955                                  ;; ---------------------------------------------------------------------------
   956                                  ;		.word 10.
   957                                  ;; ---------------------------------------------------------------------------
   958                                  ;		jsr	R5, divide
   959                                  ;; ---------------------------------------------------------------------------
   960                                  ;		.word 6
   961                                  ;; ---------------------------------------------------------------------------
   962                                  ;		movb	#72, -(R0) ; ':'
   963                                  ;		mov	R3, @#word_177304
   964                                  ;		mov	#30, @#word_177300
   965                                  ;		mov	@#word_177304, R3
   966                                  ;		mov	@#word_177302, @#word_177304
   967                                  ;		jsr	R5, divide
   968                                  ;; ---------------------------------------------------------------------------
   969                                  ;		.word 10.
   970                                  ;; ---------------------------------------------------------------------------
   971                                  ;		jsr	R5, divide
   972                                  ;; ---------------------------------------------------------------------------
   973                                  ;		.word 10.
   974                                  ;; ---------------------------------------------------------------------------
   975                                  ;		mov	#mdays,	R2
   976                                  ;
   977                                  ;loc_41544:
   978                                  ;		cmp	@R2, R3
   979                                  ;		bgt	loc_41554
   980                                  ;		sub	(R2)+, R3
   981                                  ;		br	loc_41544
   982                                  ;; ---------------------------------------------------------------------------
   983                                  ;
   984                                  ;loc_41554:
   985                                  ;		movb	#40, -(R0) ; ' '
   986                                  ;		sub	#mdays,	R2
   987                                  ;		asl	R2
   988                                  ;		add	#byte_41740, R2
   989                                  ;		inc	R3
   990                                  ;		mov	R3, @#word_177304
   991                                  ;		jsr	R5, divide
   992                                  ;; ---------------------------------------------------------------------------
   993                                  ;		.word 10.
   994                                  ;; ---------------------------------------------------------------------------
   995                                  ;		tst	@#word_177304
   996                                  ;		beq	loc_41630
   997                                  ;		add	#60, @#word_177304 ; '0'
   998                                  ;		movb	@#word_177304, -(R0)
   999                                  ;		br	loc_41634
  1000                                  ;; ---------------------------------------------------------------------------
  1001                                  ;
  1002                                  ;loc_41630:				
  1003                                  ;		movb	#40, -(R0) ; ' '
  1004                                  ;
  1005                                  ;loc_41634:				
  1006                                  ;		movb	#40, -(R0) ; ' '
  1007                                  ;		movb	-(R2), -(R0)
  1008                                  ;		movb	-(R2), -(R0)
  1009                                  ;		movb	-(R2), -(R0)
  1010                                  ;		mov	(SP)+, R3
  1011                                  ;		mov	(SP)+, R2
  1012                                  ;		return
  1013                                  ;
  1014                                  ;; =============== SUBROUTINE ================================================
  1015                                  ;
  1016                                  ;
  1017                                  ;divide:					
  1018                                  ;		clr	@#word_177302
  1019                                  ;		mov	(R5)+, @#word_177300
  1020                                  ;		add	#60, @#word_177302 ; '0'
  1021                                  ;		movb	@#word_177302, -(R0)
  1022                                  ;		rts	R5
  1023                                  ;; End of function divide
  1024                                  ;
  1025                                  ;; ---------------------------------------------------------------------------
  1026                                  ;word_41700:	.word 70310		
  1027                                  ;word_41702:	.word 11000		
  1028                                  ;mdays:		.word 31.
  1029                                  ;february:	.word 28.		
  1030                                  ;		.word 31.
  1031                                  ;		.word 30.
  1032                                  ;		.word 31.
  1033                                  ;		.word 30.
  1034                                  ;		.word 31.
  1035                                  ;		.word 31.
  1036                                  ;		.word 30.
  1037                                  ;		.word 31.
  1038                                  ;		.word 30.
  1039                                  ;		.word 999.
  1040                                  ;		.byte 0
  1041                                  ;Jan:		.ascii \Jan;byte_41740:	.byte 0
  1043                                  ;Feb:		.ascii \Feb\<0>
  1044                                  ;Mar:		.ascii \Mar\<0>
  1045                                  ;Apr:		.ascii \Apr\<0>
  1046                                  ;May:		.ascii \May\<0>
  1047                                  ;Jun:		.ascii \Jun\<0>
  1048                                  ;Jul:		.ascii \Jul\<0>
  1049                                  ;Aug:		.ascii \Aug\<0>
  1050                                  ;Sep:		.ascii \Sep\<0>
  1051                                  ;Oct:		.ascii \Oct\<0>
  1052                                  ;Nov:		.ascii \Nov\<0>
  1053                                  ;Dec:		.ascii \Dec;; ---------------------------------------------------------------------------
  1055                                  ;
  1056                                  ;fopen:					
  1057                                  ;		mov	R1, -(SP)
  1058                                  ;		mov	(R5)+, R1
  1059                                  ;		mov	R0, fnameptr
  1060                                  ;		trap	5
  1061                                  ;; ---------------------------------------------------------------------------
  1062                                  ;fnameptr:	.word 40000		
  1063                                  ;		.word 0
  1064                                  ;; ---------------------------------------------------------------------------
  1065                                  ;		bcs	fopen_err
  1066                                  ;		mov	R0, (R1)+
  1067                                  ;		clr	(R1)+
  1068                                  ;		mov	(SP)+, R1
  1069                                  ;		rts	R5
  1070                                  ;; ---------------------------------------------------------------------------
  1071                                  ;
  1072                                  ;fopen_err:				
  1073                                  ;		mov	#-1, @R1
  1074                                  ;		mov	(SP)+, R1
  1075                                  ;		sec
  1076                                  ;		rts	R5
  1077                                  ;; ---------------------------------------------------------------------------
  1078                                  ;		mov	@R5, fbuf
  1079                                  ;		mov	(R5)+, word_42072
  1080                                  ;		jsr	R5, getc
  1081                                  ;; ---------------------------------------------------------------------------
  1082                                  ;word_42072:	.word 40000		
  1083                                  ;; ---------------------------------------------------------------------------
  1084                                  ;		bcc	getw
  1085                                  ;		rts	R5
  1086                                  ;; ---------------------------------------------------------------------------
  1087                                  ;
  1088                                  ;getw:					
  1089                                  ;		mov	R0, -(SP)
  1090                                  ;		jsr	R5, getc
  1091                                  ;; ---------------------------------------------------------------------------
  1092                                  ;fbuf:		.word 40000		
  1093                                  ;; ---------------------------------------------------------------------------
  1094                                  ;		swab	R0
  1095                                  ;		bis	(SP)+, R0
  1096                                  ;		rts	R5
  1097                                  ;; ---------------------------------------------------------------------------
  1098                                  ;
  1099                                  ;getc:					
  1100                                  ;					
  1101                                  ;		mov	R1, -(SP)
  1102                                  ;		mov	(R5)+, R1
  1103                                  ;		dec	2(R1)
  1104                                  ;		bge	getcbuf
  1105                                  ;		mov	R1, R0
  1106                                  ;		add	#6, R0
  1107                                  ;		mov	R0, bufoff
  1108                                  ;		mov	R0, 4(R1)
  1109                                  ;		mov	@R1, R0
  1110                                  ;		trap	3
  1111                                  ;; ---------------------------------------------------------------------------
  1112                                  ;bufoff:	.word 40000		
  1113                                  ;		.word 128.
  1114                                  ;; ---------------------------------------------------------------------------
  1115                                  ;		bcs	getw_err
  1116                                  ;		tst	R0
  1117                                  ;		bne	getw_ok
  1118                                  ;
  1119                                  ;getw_err:				
  1120                                  ;		mov	(SP)+, R1
  1121                                  ;		sec
  1122                                  ;		rts	R5
  1123                                  ;; ---------------------------------------------------------------------------
  1124                                  ;
  1125                                  ;getw_ok:				
  1126                                  ;		dec	R0
  1127                                  ;		mov	R0, 2(R1)
  1128                                  ;
  1129                                  ;getcbuf:				
  1130                                  ;		clr	R0
  1131                                  ;		bisb	@4(R1),	R0
  1132                                  ;		inc	4(R1)
  1133                                  ;		mov	(SP)+, R1
  1134                                  ;		rts	R5
  1135                                  ;; ---------------------------------------------------------------------------
  1136                                  ;
  1137                                  ;; end of 'RAM'
  1138                                  ;
  1139                                  ;		.END
