     1                                  ; ****************************************************************************
     2                                  ; pr4.s (pr386.s) - print file - by Erdogan Tan - 25/06/2022
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Retro UNIX 386 v1.2 - 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 pr4.s -l pr4.txt -o pr4 -Z error.txt))
    15                                  
    16                                  ; pr1.s (26/06/2022, Retro UNIX 386 v1 & v1.1)
    17                                  ; pr2.s (26/06/2022, Retro UNIX 386 v1.2)
    18                                  ; pr3.s (10/07/2022, Retro UNIX 386 v1 & v1.1) ; (LF -> CRLF)
    19                                  ; pr4.s (10/07/2022, Retro UNIX 386 v1.2) ; (LF -> CRLF)
    20                                  
    21                                  ; UNIX v1 system calls
    22                                  _rele 	equ 0
    23                                  _exit 	equ 1
    24                                  _fork 	equ 2
    25                                  _read 	equ 3
    26                                  _write	equ 4
    27                                  _open	equ 5
    28                                  _close 	equ 6
    29                                  _wait 	equ 7
    30                                  _creat 	equ 8
    31                                  _link 	equ 9
    32                                  _unlink	equ 10
    33                                  _exec	equ 11
    34                                  _chdir	equ 12
    35                                  _time 	equ 13
    36                                  _mkdir 	equ 14
    37                                  _chmod	equ 15
    38                                  _chown	equ 16
    39                                  _break	equ 17
    40                                  _stat	equ 18
    41                                  _seek	equ 19
    42                                  _tell 	equ 20
    43                                  _mount	equ 21
    44                                  _umount	equ 22
    45                                  _setuid	equ 23
    46                                  _getuid	equ 24
    47                                  _stime	equ 25
    48                                  _quit	equ 26	
    49                                  _intr	equ 27
    50                                  _fstat	equ 28
    51                                  _emt 	equ 29
    52                                  _mdate 	equ 30
    53                                  _stty 	equ 31
    54                                  _gtty	equ 32
    55                                  _ilgins	equ 33
    56                                  _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
    57                                  _msg    equ 35 ; Retro UNIX 386 v1 feature only !
    58                                  _geterr	equ 36 ; Retro UNIX 386 v1 feature only !
    59                                  ; 12/01/2022 - Retro UNIX 386 v1.2
    60                                  ; Retro UNIX 386 v2 system calls
    61                                  _setgid	equ 37
    62                                  _getgid	equ 38
    63                                  _sysver	equ 39 ; (get) Retro Unix 386 version
    64                                  
    65                                  ;;;
    66                                  ESCKey equ 1Bh
    67                                  EnterKey equ 0Dh
    68                                  
    69                                  %macro sys 1-4
    70                                      ; 03/09/2015	
    71                                      ; 13/04/2015
    72                                      ; Retro UNIX 386 v1 system call.		
    73                                      %if %0 >= 2   
    74                                  	mov ebx, %2
    75                                  	%if %0 >= 3    
    76                                  	    mov ecx, %3
    77                                  	    %if %0 = 4
    78                                  	       mov edx, %4   
    79                                  	    %endif
    80                                  	%endif
    81                                      %endif
    82                                      mov eax, %1
    83                                      int 30h	   
    84                                  %endmacro
    85                                  
    86                                  ; 26/06/2022
    87                                  struc stat
    88                                     ; Retro UNIX v1.2 'sysstat' output !
    89                                     ; (66 bytes)
    90 00000000 ????                       .inode:  resw 1	
    91 00000002 ????                       .mode:   resw 1
    92 00000004 ????                       .nlinks: resw 1 
    93 00000006 ????                       .uid:    resw 1
    94 00000008 ??                         .gid:    resb 1
    95 00000009 ??                         .size_h: resb 1
    96 0000000A ????????                   .size:   resd 1
    97 0000000E <res 28h>                  .dskptr: resd 10
    98 00000036 ????????                   .atime:  resd 1
    99 0000003A ????????                   .mtime:  resd 1
   100 0000003E ????????                   .ctime:  resd 1
   101                                     .strucsize:
   102                                  endstruc  
   103                                  
   104                                  ; Retro UNIX 386 v1 system call format:
   105                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   106                                  
   107                                  ;-----------------------------------------------------------------
   108                                  ;  code
   109                                  ;-----------------------------------------------------------------
   110                                  
   111                                  [BITS 32] ; 32-bit intructions (for 80386 protected mode)
   112                                  
   113                                  [ORG 0] 
   114                                  
   115                                  START_CODE:
   116                                  	; 26/06/2022 (pr2.s - Retro UNIX 386 v1.2)
   117                                  	; 25/06/2022 (pr1.s - Retro UNIX 386 v1 & v1.1)
   118 00000000 59                      	pop	ecx ; ecx = number of arguments
   119                                  	;
   120 00000001 58                      	pop	eax ; eax = argument 0 = executable file name
   121                                  	;
   122 00000002 BD[6C050000]            	mov	ebp, program_msg
   123                                  	;
   124                                  	;dec	ecx
   125 00000007 FEC9                    	dec	cl
   126 00000009 7E7E                    	jng	short prn_0
   127                                  
   128 0000000B 880D[D4060000]          	mov	[argc], cl
   129                                  
   130                                  	sys	_open, lpt1, 1  ; open /dev/lpr for write
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 00000011 BB[63050000]        <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76 00000016 B901000000          <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 0000001B B805000000          <1>  mov eax, %1
    83 00000020 CD30                <1>  int 30h
   131 00000022 730F                    	jnc	short prn_1
   132                                  
   133 00000024 B8[98060000]            	mov	eax, printer_err_msg
   134 00000029 E869020000              	call	print_msg
   135 0000002E E9BD000000              	jmp	hang	
   136                                  prn_1:
   137 00000033 A3[E0060000]            	mov	[prnfnum], eax
   138                                  
   139                                  prn_2:
   140 00000038 5F                      	pop	edi
   141                                  
   142 00000039 8A07                    	mov	al, [edi]	
   143                                  
   144 0000003B 3C2D                    	cmp	al, '-' ; option ?	
   145                                  	;jne	short prn_4
   146 0000003D 7405                    	je	short case_l
   147 0000003F E9B5000000              	jmp	prn_4
   148                                  case_l:
   149 00000044 47                      	inc	edi
   150 00000045 8A07                    	mov	al, [edi]
   151                                  
   152 00000047 3C6C                    	cmp	al, 'l'
   153 00000049 7509                    	jne	short case_r 
   154 0000004B C605[CF060000]4E        	mov	byte [rows], 78
   155 00000052 EB24                    	jmp	short prn_3
   156                                  case_r:
   157 00000054 3C72                    	cmp	al, 'r'
   158 00000056 7509                    	jne	short case_m
   159 00000058 C605[CF060000]42        	mov	byte [rows], 66
   160 0000005F EB17                    	jmp	short prn_3
   161                                  case_m:
   162 00000061 3C6D                    	cmp	al, 'm'
   163 00000063 7509                    	jne	short case_c
   164 00000065 C605[D0060000]00        	mov	byte [cdatef], 0
   165 0000006C EB0A                    	jmp	short prn_3
   166                                  case_c:
   167 0000006E 3C63                    	cmp	al, 'c'
   168 00000070 75FC                    	jne	short case_c
   169                                  	;mov	byte [cdatef], 1
   170 00000072 FE05[D0060000]          	inc	byte [cdatef]
   171                                  
   172                                  prn_3:
   173 00000078 FE0D[D4060000]          	dec	byte [argc]
   174 0000007E 7FB8                    	jg	short prn_2
   175                                  
   176                                  	; print usage message on /dev/tty
   177 00000080 803D[D5060000]00        	cmp	byte [files], 0
   178 00000087 772E                    	ja	short fclose_exit
   179                                  prn_0:
   180                                  	; print usage message on stdout
   181                                  	;sys	_write, 1, program_msg, size_pmsg
   182                                  	sys	_msg, program_msg, size_pmsg, 0Fh 
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 00000089 BB[6C050000]        <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76 0000008E B941000000          <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78 00000093 BA0F000000          <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 00000098 B823000000          <1>  mov eax, %1
    83 0000009D CD30                <1>  int 30h
   183                                  
   184                                  	sys	_write, 1, usage_msg, size_umsg
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 0000009F BB01000000          <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76 000000A4 B9[AE050000]        <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78 000000A9 BAE9000000          <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000000AE B804000000          <1>  mov eax, %1
    83 000000B3 CD30                <1>  int 30h
   185 000000B5 EB39                    	jmp	short hang
   186                                  
   187                                  fclose_exit:
   188                                  	sys	_write, 1, nextline, 2
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 000000B7 BB01000000          <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76 000000BC B9[95060000]        <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78 000000C1 BA02000000          <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000000C6 B804000000          <1>  mov eax, %1
    83 000000CB CD30                <1>  int 30h
   189                                  
   190 000000CD 803D[E4060000]00        	cmp	byte [txtfnum], 0
   191 000000D4 760D                    	jna	short pclose_exit
   192                                  p_err_exit:
   193                                  	sys	_close, [txtfnum]
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 000000D6 8B1D[E4060000]      <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000000DC B806000000          <1>  mov eax, %1
    83 000000E1 CD30                <1>  int 30h
   194                                  	;jmp	short pclose_exit
   195                                  
   196                                  pclose_exit:
   197                                  	sys	_close, [prnfnum]
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 000000E3 8B1D[E0060000]      <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000000E9 B806000000          <1>  mov eax, %1
    83 000000EE CD30                <1>  int 30h
   198                                  hang:
   199                                  	sys	_exit
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000000F0 B801000000          <1>  mov eax, %1
    83 000000F5 CD30                <1>  int 30h
   200 000000F7 EBF7                    	jmp	short hang
   201                                  
   202                                  prn_4:
   203 000000F9 FE05[D5060000]          	inc	byte [files]
   204                                  
   205                                  	; edi = txt file name address
   206                                  
   207                                  	sys	_open, edi, 0 ; open for read
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 000000FF 89FB                <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76 00000101 B900000000          <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 00000106 B805000000          <1>  mov eax, %1
    83 0000010B CD30                <1>  int 30h
   208 0000010D 730F                    	jnc	short prn_5
   209                                  
   210                                  f_err_exit:
   211 0000010F B8[AC060000]            	mov	eax, file_err_msg
   212 00000114 E87E010000              	call	print_msg
   213 00000119 E95AFFFFFF              	jmp	prn_3
   214                                  
   215                                  prn_5:
   216 0000011E A3[E4060000]            	mov	[txtfnum], eax
   217                                  
   218 00000123 F605[D0060000]FF        	test	byte [cdatef], 0FFh
   219 0000012A 7409                    	jz	short prn_6
   220                                  	sys	_time
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 0000012C B80D000000          <1>  mov eax, %1
    83 00000131 CD30                <1>  int 30h
   221 00000133 EB13                    	jmp	short prn_7
   222                                  prn_6:
   223                                  	sys	_fstat, eax, stbuf
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 00000135 89C3                <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76 00000137 B9[70070000]        <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 0000013C B81C000000          <1>  mov eax, %1
    83 00000141 CD30                <1>  int 30h
   224 00000143 A1[AA070000]            	mov	eax, [stbuf+stat.mtime]
   225                                  prn_7:
   226 00000148 A3[DC060000]            	mov	[mtime], eax
   227                                  
   228                                  write_pages:
   229 0000014D 31C0                    	xor	eax, eax ; 0
   230 0000014F 66A3[D6060000]          	mov	[pgnumber], ax
   231 00000155 A2[D8060000]            	mov	[eof], al
   232 0000015A A2[D9060000]            	mov	[cchar], al	
   233                                  write_next_page:	
   234 0000015F E87A010000              	call	readf
   235 00000164 732B                    	jnc	short prn_8
   236                                  
   237                                  	sys	_close, [txtfnum]
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 00000166 8B1D[E4060000]      <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 0000016C B806000000          <1>  mov eax, %1
    83 00000171 CD30                <1>  int 30h
   238                                  
   239 00000173 FE0D[D4060000]          	dec	byte [argc]
   240                                  	;jng	short pclose_exit
   241 00000179 7F05                    	jg	short p_next_file
   242 0000017B E963FFFFFF              	jmp	pclose_exit
   243                                  
   244                                  p_next_file:
   245 00000180 29C0                    	sub	eax, eax
   246                                  
   247 00000182 A2[E4060000]            	mov	[txtfnum], al ; 0 ; open file number
   248                                  	;mov	[fbuf], eax ; 0	  ; open file number
   249 00000187 A3[E8060000]            	mov	[fbuf+4], eax ; 0 ; character count
   250                                  
   251 0000018C E9A7FEFFFF              	jmp	prn_2
   252                                  
   253                                  prn_8:
   254                                  	sys	_write, [prnfnum], EmptyLines, 4 ;  2 rows
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 00000191 8B1D[E0060000]      <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76 00000197 B9[BD060000]        <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78 0000019C BA04000000          <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000001A1 B804000000          <1>  mov eax, %1
    83 000001A6 CD30                <1>  int 30h
   255 000001A8 726D                    	jc	short prn_err
   256                                  
   257 000001AA A1[DC060000]            	mov	eax, [mtime]
   258 000001AF 57                      	push	edi
   259 000001B0 E8BC010000              	call	ctime
   260 000001B5 5F                      	pop	edi
   261                                  	; cbuf = date&time string (26 bytes)
   262                                  	
   263                                  	sys	_write, [prnfnum], cbuf, 26
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 000001B6 8B1D[E0060000]      <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76 000001BC B9[48050000]        <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78 000001C1 BA1A000000          <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000001C6 B804000000          <1>  mov eax, %1
    83 000001CB CD30                <1>  int 30h
   264 000001CD 7248                    	jc	short prn_err
   265                                  	
   266                                  	sys	_write, [prnfnum], PageHeader-2, 2
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 000001CF 8B1D[E0060000]      <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76 000001D5 B9[C7060000]        <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78 000001DA BA02000000          <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000001DF B804000000          <1>  mov eax, %1
    83 000001E4 CD30                <1>  int 30h
   267 000001E6 722F                    	jc	short prn_err
   268                                  
   269 000001E8 66FF05[D6060000]        	inc	word [pgnumber]
   270                                  
   271 000001EF 89FE                    	mov	esi, edi ; file name address (on stack)
   272                                  
   273 000001F1 31D2                    	xor	edx, edx
   274                                  prn_9:	
   275 000001F3 AC                      	lodsb
   276 000001F4 08C0                    	or	al, al
   277 000001F6 7404                    	jz	short prn_10
   278 000001F8 FEC2                    	inc	dl
   279 000001FA EBF7                    	jmp	short prn_9
   280                                  
   281                                  prn_10:
   282 000001FC 89F9                    	mov	ecx, edi
   283                                  	;sys	_write, [prnfnum], edi, edx
   284                                  	sys	_write
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000001FE B804000000          <1>  mov eax, %1
    83 00000203 CD30                <1>  int 30h
   285 00000205 7210                    	jc	short prn_err
   286                                  
   287 00000207 B9[C9060000]            	mov	ecx, PageHeader
   288 0000020C B206                    	mov	dl, 6
   289                                  	;sys	_write, [prnfnum], PageHeader, edx
   290                                  	sys	_write
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 0000020E B804000000          <1>  mov eax, %1
    83 00000213 CD30                <1>  int 30h
   291                                  	;jc	short prn_err
   292                                  	; 10/07/2022
   293 00000215 730F                    	jnc	short prn_14
   294                                  
   295                                  prn_err:
   296 00000217 B8[98060000]            	mov	eax, printer_err_msg
   297 0000021C E876000000              	call	print_msg	
   298 00000221 E9B0FEFFFF              	jmp	p_err_exit
   299                                  
   300                                  prn_14:
   301 00000226 66A1[D6060000]          	mov	ax, [pgnumber] 
   302 0000022C E8C2000000              	call	write_pg_num
   303 00000231 72E4                    	jc	short prn_err	
   304                                  
   305                                  	;sys	_write, [prnfnum], EmptyLines, 8 ; 4 rows
   306 00000233 B9[BD060000]            	mov	ecx, EmptyLines
   307 00000238 B208                    	mov	dl, 8
   308                                  	sys	_write
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 0000023A B804000000          <1>  mov eax, %1
    83 0000023F CD30                <1>  int 30h
   309 00000241 72D4                    	jc	short prn_err
   310                                  
   311 00000243 8A15[CF060000]          	mov	dl, [rows]
   312 00000249 80EA0B                  	sub	dl, 11
   313 0000024C 89D5                    	mov	ebp, edx
   314                                  
   315                                  write_next_char:
   316                                  prn_11:
   317 0000024E E85E000000              	call	getchar
   318                                  
   319                                  	; 10/07/2022
   320 00000253 88C4                    	mov	ah, al
   321 00000255 8625[DB060000]          	xchg	ah, [pchr] ; previous character
   322 0000025B 3C0A                    	cmp	al, 0Ah
   323 0000025D 750E                    	jne	short prn_13
   324 0000025F 80FC0D                  	cmp	ah, 0Dh
   325 00000262 7409                    	je	short prn_13
   326 00000264 B00D                    	mov	al, 0Dh
   327 00000266 E89D000000              	call	writechar
   328 0000026B B00A                    	mov	al, 10 ; 0Ah
   329                                  	;
   330                                  prn_13:
   331 0000026D E896000000              	call	writechar
   332 00000272 3C0A                    	cmp	al, 10 ; lf character, nextline
   333 00000274 75D8                    	jne	short prn_11
   334 00000276 4D                      	dec	ebp
   335 00000277 75D5                    	jnz	short prn_11
   336                                  	
   337                                  	sys	_write, [prnfnum], EmptyLines, 10 ; 5 rows
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 00000279 8B1D[E0060000]      <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76 0000027F B9[BD060000]        <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78 00000284 BA0A000000          <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 00000289 B804000000          <1>  mov eax, %1
    83 0000028E CD30                <1>  int 30h
   338 00000290 7285                    	jc	short prn_err
   339                                  prn_12:
   340 00000292 E9C8FEFFFF              	jmp	write_next_page
   341                                  
   342                                  ;-----------------------------------------------------------------
   343                                  
   344                                  print_msg:
   345                                  	; eax = asciiz string address
   346 00000297 89C2                    	mov	edx, eax
   347 00000299 4A                      	dec	edx
   348                                  nextchr:
   349 0000029A 42                      	inc	edx
   350 0000029B 803A00                  	cmp	byte [edx], 0
   351 0000029E 77FA                    	ja	short nextchr
   352                                  	;cmp	[edx], 0Dh
   353                                  	;ja	short nextchr
   354 000002A0 29C2                    	sub	edx, eax
   355                                  	; edx = asciiz string length
   356                                  	;
   357                                  	sys	_write, 1, eax
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 000002A2 BB01000000          <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76 000002A7 89C1                <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 000002A9 B804000000          <1>  mov eax, %1
    83 000002AE CD30                <1>  int 30h
   358 000002B0 C3                      	retn
   359                                  
   360                                  ; 25/06/2022
   361                                  ;-----------------------------------------------------------------
   362                                  
   363                                  getchar:
   364 000002B1 A0[D9060000]            	mov	al, [cchar]
   365 000002B6 08C0                    	or	al, al
   366 000002B8 7408                    	jz	short getchar_1
   367 000002BA C605[D9060000]00        	mov	byte [cchar], 0
   368 000002C1 C3                      	retn
   369                                  getchar_1:
   370 000002C2 F605[D8060000]FF        	test	byte [eof], 0FFh
   371 000002C9 7403                    	jz	short getchar_2
   372 000002CB B00A                    	mov	al, 10 ; lf, nextline
   373 000002CD C3                      	retn
   374                                  getchar_2:
   375 000002CE E857000000              	call	getc
   376 000002D3 7308                    	jnc	short getchar_ok
   377 000002D5 FE05[D8060000]          	inc	byte [eof]
   378 000002DB EBD4                    	jmp	short getchar
   379                                  getchar_ok:
   380                                  readf_ok:
   381 000002DD C3                      	retn
   382                                  
   383                                  ; 25/06/2022
   384                                  ;-----------------------------------------------------------------
   385                                  
   386                                  readf:
   387 000002DE E8CEFFFFFF              	call	getchar
   388 000002E3 A2[D9060000]            	mov	[cchar], al
   389 000002E8 F605[D8060000]FF        	test	byte [eof], 0FFh
   390 000002EF 74EC                    	jz	short readf_ok
   391                                  readf_err:
   392 000002F1 F9                      	stc
   393 000002F2 C3                      	retn
   394                                  
   395                                  ; 25/06/2022
   396                                  ;-----------------------------------------------------------------
   397                                  
   398                                  write_pg_num:
   399                                  	; eax = page number (<= 65535)
   400 000002F3 29C9                    	sub	ecx, ecx
   401 000002F5 B10A                    	mov	cl, 10
   402 000002F7 31D2                    	xor	edx, edx
   403                                  w_pnum_1:
   404 000002F9 F7F1                    	div	ecx
   405 000002FB 52                      	push	edx
   406 000002FC 21C0                    	and	eax, eax
   407 000002FE 7405                    	jz	short w_pnum_2
   408 00000300 E8EEFFFFFF              	call	write_pg_num
   409                                  w_pnum_2:	
   410 00000305 58                      	pop	eax
   411 00000306 0430                    	add	al, '0'
   412                                  writechar:
   413 00000308 A2[DA060000]            	mov	[chr], al
   414                                  	sys	_write, [prnfnum], chr, 1
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74 0000030D 8B1D[E0060000]      <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76 00000313 B9[DA060000]        <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78 00000318 BA01000000          <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 0000031D B804000000          <1>  mov eax, %1
    83 00000322 CD30                <1>  int 30h
   415 00000324 A0[DA060000]            	mov	al, [chr]
   416 00000329 C3                      	retn		
   417                                  	
   418                                  
   419                                  ; 25/06/2022
   420                                  ;-----------------------------------------------------------------
   421                                  ; get characters from input file
   422                                  
   423                                  getc:
   424 0000032A A1[E8060000]            	mov	eax, [fbuf+4] ; character count
   425 0000032F 21C0                    	and	eax, eax
   426 00000331 7522                    	jnz	short gch1
   427                                  gch0:
   428 00000333 8B1D[E4060000]          	mov	ebx, [fbuf] ; file descriptor/number
   429 00000339 B9[F0060000]            	mov	ecx, fbuf + 12 ; read buffer address
   430 0000033E 890D[EC060000]          	mov 	[fbuf+8], ecx ; character offset
   431 00000344 29D2                    	sub	edx, edx
   432 00000346 B280                    	mov	dl, 128
   433                                  	sys	_read ; sys _read, ebx, ecx, edx
    70                              <1> 
    71                              <1> 
    72                              <1> 
    73                              <1>  %if %0 >= 2
    74                              <1>  mov ebx, %2
    75                              <1>  %if %0 >= 3
    76                              <1>  mov ecx, %3
    77                              <1>  %if %0 = 4
    78                              <1>  mov edx, %4
    79                              <1>  %endif
    80                              <1>  %endif
    81                              <1>  %endif
    82 00000348 B803000000          <1>  mov eax, %1
    83 0000034D CD30                <1>  int 30h
   434 0000034F 721C                    	jc	short gch2
   435 00000351 09C0                    	or	eax, eax
   436 00000353 741A                    	jz	short gch3
   437                                  gch1:
   438 00000355 48                      	dec	eax
   439 00000356 A3[E8060000]            	mov	[fbuf+4], eax ; character count in buffer
   440 0000035B 8B1D[EC060000]          	mov	ebx, [fbuf+8] ; current character offset
   441                                  	;xor	eax, eax
   442 00000361 30E4                    	xor	ah, ah
   443 00000363 8A03                    	mov	al, [ebx]
   444 00000365 43                      	inc	ebx
   445 00000366 891D[EC060000]          	mov	[fbuf+8], ebx ; next character offset
   446 0000036C C3                      	retn 	
   447                                  gch2:
   448 0000036D 31C0                    	xor	eax, eax
   449                                  gch3:
   450 0000036F F9                      	stc
   451 00000370 C3                      	retn
   452                                  
   453                                  ; 25/06/2022
   454                                  ;=================================================================
   455                                  %include 'ctime386.s'
   456                              <1> ; ****************************************************************************
   457                              <1> ; ctime386.inc (Retro Unix 386 v1 - /bin/ls - list file or directory)
   458                              <1> ; ----------------------------------------------------------------------------
   459                              <1> ; RETRO UNIX 386 (Retro Unix == Turkish Rational Unix)
   460                              <1> ; Operating System Project (v0.2) by ERDOGAN TAN (Beginning: 24/12/2013)
   461                              <1> ;
   462                              <1> ; [ Last Modification: 25/02/2022 ]
   463                              <1> ;
   464                              <1> ; Derived from 'CTIME.INC' source code file of 'Retro UNIX 8086 v1'
   465                              <1> ; operating system project, /bin/ls source code by Erdogan Tan
   466                              <1> ; (28/11/2013)
   467                              <1> ;
   468                              <1> ; Derived from 'ctime.c' file of original UNIX v5 (usr/source/s3/ctime.c)
   469                              <1> ;
   470                              <1> ; ls386.s (ls0.s) 23/09/2015 - 06/10/2015
   471                              <1> ; include ctime386.inc
   472                              <1> ;
   473                              <1> ; ****************************************************************************
   474                              <1> ; ctime386.s (06/10/2015 - 21/02/2022)
   475                              <1> 
   476                              <1> ; Assembler: NASM 2.11 (NASM 2.15, 2022)
   477                              <1> 
   478                              <1> ;timezone equ 5*60*60
   479                              <1> 
   480                              <1> ctime:  ; ctime(at)
   481                              <1> 	; int *at;
   482                              <1> 	; {
   483                              <1> 	; 	return(asctime(localtime(at)));
   484                              <1> 	; }
   485                              <1> 
   486                              <1> 	; EAX = unix epoch time (in seconds)
   487                              <1> 
   488                              <1> 	;call localtime
   489                              <1> 	;call asctime
   490                              <1> 
   491                              <1> 	;retn
   492                              <1>   
   493                              <1> localtime:
   494                              <1> 	; localtime(tim)
   495                              <1> 	; int tim[];
   496                              <1> 	; 	{
   497                              <1> 	;		register int *t, *ct, dayno;
   498                              <1> 	;	int daylbegin, daylend;
   499                              <1> 	;	int copyt[2];
   500                              <1> 	;	t = copyt;
   501                              <1> 	;	t[0] = tim[0];
   502                              <1> 	;	t[1] = tim[1];
   503                              <1> 	;	dpadd(t, -timezone);
   504                              <1> 	;	ct = gmtime(t);
   505                              <1> 	;	dayno = ct[YDAY];
   506                              <1> 	;	if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 ||
   507                              <1> 	;	    dayno==5 && ct[HOUR]>=2))) {
   508                              <1> 	;		daylight =| 1;
   509                              <1> 	;		daylbegin = -1;
   510                              <1> 	;		daylend = 367;
   511                              <1> 	;	} else {
   512                              <1> 	;		daylbegin = sunday(ct, 119);	/* last Sun in Apr */
   513                              <1> 	;		daylend = sunday(ct, 303);	/* last Sun in Oct */
   514                              <1> 	;	}
   515                              <1> 	;	if (daylight &&
   516                              <1> 	;	    (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) &&
   517                              <1> 	;	    (dayno<daylend || (dayno==daylend && ct[HOUR]<1))) {
   518                              <1> 	;		dpadd(t, 1*60*60);
   519                              <1> 	;		ct = gmtime(t);
   520                              <1> 	;		ct[ISDAY]++;
   521                              <1> 	;	}
   522                              <1> 	;	return(ct);
   523                              <1> 	;	}
   524                              <1> 
   525                              <1> 	;sub	eax, timezone	
   526                              <1> 
   527                              <1> 	;push	eax
   528                              <1> 
   529 00000371 E882000000          <1> 	call 	gmtime
   530                              <1> ; if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 ||
   531                              <1> ;     dayno==5 && ct[HOUR]>=2))) {
   532                              <1> 	;cmp	byte [nixonflg], 0
   533                              <1> 	;jna	short lt1
   534                              <1> 	;cmp	word [year], 1974
   535                              <1> 	;jb	short lt1
   536                              <1> 	;ja	short lt0
   537                              <1> 	;cmp	word [yday], 5
   538                              <1> 	;jb	short lt1
   539                              <1> 	;ja	short lt0 
   540                              <1> 	;cmp	word [hour], 2
   541                              <1> 	;jb	short lt1
   542                              <1> ; nixonflag > 0
   543                              <1> ;lt0:
   544                              <1> 	;mov	word [daylight], 1
   545                              <1> 	;mov	word [daylbegin], -1
   546                              <1> 	;mov	word [daylend], 367
   547                              <1> ;	;jmp	short lt2
   548                              <1> 
   549                              <1> ; } else {
   550                              <1> ;lt1:
   551                              <1> ;	mov	cx, 119
   552                              <1> ;	call	sunday ; sunday(ct, 119); /* last Sun in Apr */
   553                              <1> ;	mov	[daylbegin], cx
   554                              <1> ;	mov	cx, 303
   555                              <1> ;	call	sunday ; sunday(ct, 303); /* last Sun in Oct */	
   556                              <1> ;	mov	[daylend], cx
   557                              <1> ;lt2:
   558                              <1> ; if (daylight &&
   559                              <1> ;    (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) &&
   560                              <1> ;    (dayno<daylend || (dayno==daylend && ct[HOUR]<1))) {
   561                              <1> 
   562                              <1> ;	pop	eax
   563                              <1> 
   564                              <1> 	;cmp	byte [daylight], 0
   565                              <1> 	;jna	short lt5
   566                              <1> 	
   567                              <1> 	;mov	cx, [yday]
   568                              <1> 
   569                              <1> 	;cmp	cx, [daylbegin]
   570                              <1> 	;jb	short lt5
   571                              <1> 	;ja	short lt3
   572                              <1> 	;cmp	word [hour], 2
   573                              <1> 	;jb	short lt5
   574                              <1> 	;jmp	short lt4
   575                              <1> ;lt3:
   576                              <1> 	;cmp	cx, [daylend]
   577                              <1> 	;jb	short lt4
   578                              <1> 	;ja	short lt5
   579                              <1> 	;cmp	word [hour], 1
   580                              <1> 	;jnb	short lt5
   581                              <1> ;lt4:
   582                              <1> 	;add	eax, 1*60*60
   583                              <1> 	;call	gmtime
   584                              <1> 	;inc	word [isday]
   585                              <1> ;lt5:
   586                              <1> ;	}
   587                              <1> ;	return(ct);
   588                              <1> ;	}
   589                              <1> 
   590                              <1> 	;retn
   591                              <1> 
   592                              <1> 	; 21/02/2022 (Retro UNIX 386 v1&v1.1&v1.2)
   593                              <1> asctime:
   594                              <1> 	; asctime(t)
   595                              <1> 	;int *t;
   596                              <1> 	;{
   597                              <1> 	;	register char *cp, *ncp;
   598                              <1> 	;	register int *tp;
   599                              <1> 	;
   600                              <1> 	;	cp = cbuf;
   601                              <1> 	;	for (ncp = "Day Mon 00 00:00:00 1900\n"; *cp++ = *ncp++;);
   602                              <1> 	;	ncp = &"SunMonTueWedThuFriSat"[3*t[6]];
   603                              <1> 	;	cp = cbuf;
   604                              <1> 	;	*cp++ = *ncp++;
   605                              <1> 	;	*cp++ = *ncp++;
   606                              <1> 	;	*cp++ = *ncp++;
   607                              <1> 	;	cp++;
   608                              <1> 	;	tp = &t[4];
   609                              <1> 	;	ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[(*tp)*3];
   610                              <1> 	;	*cp++ = *ncp++;
   611                              <1> 	;	*cp++ = *ncp++;
   612                              <1> 	;	*cp++ = *ncp++;
   613                              <1> 	;	cp = numb(cp, *--tp);
   614                              <1> 	;	cp = numb(cp, *--tp+100);
   615                              <1> 	;	cp = numb(cp, *--tp+100);
   616                              <1> 	;	cp = numb(cp, *--tp+100);
   617                              <1> 	;	cp =+ 2;
   618                              <1> 	;	cp = numb(cp, t[YEAR]);
   619                              <1> 	;	return(cbuf);
   620                              <1> 	;}
   621                              <1> 	
   622                              <1> 	;;mov	edi, cbuf
   623                              <1> 	;;mov	esi, ncp0
   624                              <1> 	;;mov	ecx, 13
   625                              <1> 	;;movsw	
   626                              <1> 	;
   627 00000376 BF[48050000]        <1> 	mov	edi, cbuf	
   628                              <1> 	;movzx	esi, word [wday]
   629                              <1> 	;shl	si, 2
   630                              <1> 	;add	esi, ncp1
   631                              <1> 	;movsd
   632 0000037B 0FB735[DE040000]    <1> 	movzx	esi, word [month]
   633                              <1> 	;shl	si, 2
   634 00000382 C1E602              <1> 	shl	esi, 2 ; 21/02/2022
   635 00000385 81C6[14050000]      <1> 	add	esi, ncp2 - 4
   636 0000038B A5                  <1> 	movsd
   637                              <1> 	;movzx eax, word [day]
   638 0000038C 66A1[DC040000]      <1> 	mov	ax, [day]
   639                              <1> 	;mov	cx, 10
   640 00000392 B10A                <1> 	mov	cl, 10
   641 00000394 E824010000          <1> 	call	numb
   642 00000399 B020                <1>  	mov	al, 20h
   643 0000039B AA                  <1> 	stosb
   644                              <1> 	;
   645 0000039C 66A1[E0040000]      <1> 	mov	ax, [year]
   646 000003A2 B564                <1> 	mov	ch, 100
   647 000003A4 F6F5                <1> 	div	ch
   648                              <1> 	;push	ax ;
   649                              <1> 	; 21/02/2022
   650 000003A6 50                  <1> 	push	eax
   651 000003A7 6698                <1> 	cbw ; century (19, 20)
   652 000003A9 E80F010000          <1> 	call	numb
   653                              <1> 	;pop	ax
   654                              <1> 	; 21/02/2022
   655 000003AE 58                  <1> 	pop	eax
   656 000003AF 88E0                <1> 	mov	al, ah
   657 000003B1 6698                <1> 	cbw ;	year (0 to 99)
   658 000003B3 E805010000          <1> 	call	numb
   659 000003B8 B020                <1> 	mov 	al, 20h
   660 000003BA AA                  <1> 	stosb
   661                              <1> 	;
   662                              <1> 	;movzx   esi, word [wday]
   663                              <1> 	; 21/02/2022
   664 000003BB 668B35[E2040000]    <1> 	mov	si, [wday]
   665                              <1> 	;shl	si, 2
   666 000003C2 C1E602              <1> 	shl	esi, 2 ; 21/02/2022
   667 000003C5 81C6[FC040000]      <1> 	add	esi, ncp1
   668 000003CB A5                  <1> 	movsd
   669                              <1> 	;
   670 000003CC 66A1[DA040000]      <1> 	mov	ax, [hour]
   671 000003D2 E8E6000000          <1> 	call	numb
   672 000003D7 B03A                <1>  	mov	al, ':'
   673 000003D9 AA                  <1> 	stosb
   674 000003DA 66A1[D8040000]      <1> 	mov	ax, [minute]
   675 000003E0 E8D8000000          <1> 	call	numb
   676 000003E5 B03A                <1>  	mov	al, ':'
   677 000003E7 AA                  <1> 	stosb
   678 000003E8 66A1[D6040000]      <1> 	mov	ax, [second]
   679 000003EE E8CA000000          <1> 	call	numb
   680 000003F3 B020                <1>  	mov	al, 20h
   681 000003F5 AA                  <1> 	stosb
   682                              <1> 	;mov	ax, [year]
   683                              <1> 	;mov	ch, 100
   684                              <1> 	;div	ch
   685                              <1> 	;push	ax ;
   686                              <1> 	;cbw ; century (19, 20)
   687                              <1> 	;call	numb
   688                              <1> 	;pop	ax
   689                              <1> 	;mov	al, ah
   690                              <1> 	;cbw ;	year (0 to 99)
   691                              <1> 	;call	numb
   692                              <1> 	;mov	al, 20h
   693                              <1> 	;stosb
   694                              <1> 	;xor	al, al
   695                              <1> 	;stosb
   696                              <1> 
   697                              <1> 	; 25/02/2022
   698 000003F6 AA                  <1> 	stosb
   699                              <1> 
   700 000003F7 C3                  <1> 	retn
   701                              <1> 
   702                              <1> gmtime:
   703                              <1> 	; 21/02/2022 (Retro UNIX 386 v1&v1.1&v1.2)
   704                              <1> 	; 24/11/2013 (yday, wday)
   705                              <1> 	; Retro UNIX 8086 v1 - UNIX.ASM (20/06/2013)
   706                              <1> 	; Retro UNIX 8086 v1 feature/procedure only!
   707                              <1> 	; 'convert_from_epoch' procedure prototype: 
   708                              <1> 	; 	            UNIXCOPY.ASM, 10/03/2013
   709                              <1> 	; 30/11/2012
   710                              <1> 	; Derived from DALLAS Semiconductor
   711                              <1> 	; Application Note 31 (DS1602/DS1603)
   712                              <1> 	; 6 May 1998
   713                              <1> 	;
   714                              <1> 	; INPUT:
   715                              <1> 	; DX:AX = Unix (Epoch) Time
   716                              <1> 	;
   717                              <1> 	; ((Modified registers: AX, DX, CX, BX))  
   718                              <1> 	;
   719 000003F8 31D2                <1> 	xor edx, edx
   720                              <1> 	;mov ecx, 60
   721                              <1> 	; 21/02/2022
   722 000003FA 31C9                <1> 	xor ecx, ecx
   723 000003FC B13C                <1> 	mov cl, 60
   724 000003FE F7F1                <1> 	div ecx
   725                              <1> 	;mov [imin], eax     	  ; whole minutes
   726                              <1> 				  ; since 1/1/1970
   727 00000400 668915[D6040000]    <1> 	mov [second], dx  	  ; leftover seconds
   728                              <1> 	;mov ecx, 60
   729 00000407 29D2                <1> 	sub edx, edx
   730 00000409 F7F1                <1> 	div ecx
   731                              <1> 	;mov [ihrs], eax   	  ; whole hours
   732                              <1> 				  ; since 1/1/1970
   733 0000040B 668915[D8040000]    <1> 	mov [minute], dx  	  ; leftover minutes
   734                              <1> 	;mov ecx, 24
   735 00000412 31D2                <1> 	xor edx, edx
   736 00000414 B118                <1> 	mov cl, 24
   737 00000416 F7F1                <1> 	div ecx
   738                              <1> 	;mov [iday], ax  	  ; whole days
   739                              <1> 				  ; since 1/1/1970
   740 00000418 66A3[E2040000]      <1> 	mov [wday], ax 		  ; 24/11/2013	
   741 0000041E 668915[DA040000]    <1> 	mov [hour], dx   	  ; leftover hours
   742 00000425 05DB020000          <1> 	add eax, 365+366	  ; whole day since
   743                              <1> 				  ; 1/1/1968 	
   744                              <1> 	;mov [iday], ax
   745 0000042A 50                  <1> 	push eax
   746 0000042B 66B9B505            <1> 	mov cx, (4*365)+1	  ; 4 years = 1461 days
   747 0000042F 29D2                <1> 	sub edx, edx
   748 00000431 F7F1                <1> 	div ecx
   749 00000433 59                  <1> 	pop ecx
   750                              <1> 	;mov [lday], ax  	  ; count of quadyrs (4 years)
   751 00000434 52                  <1> 	push edx
   752                              <1> 	;mov [qday], dx           ; days since quadyr began
   753 00000435 6683FA3C            <1> 	cmp dx, 31+29             ; if past feb 29 then
   754 00000439 F5                  <1> 	cmc			  ; add this quadyr's leap day
   755 0000043A 83D000              <1> 	adc eax, 0		  ; to # of qadyrs (leap days)
   756                              <1> 	;mov [lday], ax  	  ; since 1968			  
   757                              <1> 	;mov cx, [iday]
   758 0000043D 91                  <1> 	xchg ecx, eax		  ; CX = lday, AX = iday		  
   759 0000043E 29C8                <1> 	sub eax, ecx		  ; iday - lday
   760                              <1> 	;mov ecx, 365
   761 00000440 66B96D01            <1> 	mov cx, 365
   762 00000444 31D2                <1> 	xor edx, edx		  ; DX  = 0
   763                              <1> 	; EAX = iday-lday
   764 00000446 F7F1                <1> 	div ecx
   765                              <1> 	;mov [iyrs], ax		  ; whole years since 1968
   766                              <1> 	; jday = iday - (iyrs*365) - lday
   767                              <1> 	;mov [jday], dx  	  ; days since 1/1 of current year
   768                              <1> 	;add eax, 1968		  ; compute year
   769 00000448 05B0070000          <1> 	add eax, 1968
   770 0000044D 66A3[E0040000]      <1> 	mov [year], ax
   771 00000453 89C3                <1> 	mov ebx, eax		
   772                              <1> 	;mov ax, [qday]
   773 00000455 58                  <1> 	pop eax
   774 00000456 663D6D01            <1> 	cmp ax, 365		  ; if qday <= 365 and qday >= 60	
   775 0000045A 7709                <1> 	ja short L1		  ; jday = jday +1
   776 0000045C 6683F83C            <1> 	cmp ax, 60	          ; if past 2/29 and leap year then
   777 00000460 F5                  <1>         cmc			  ; add a leap day to the # of whole
   778 00000461 6683D200            <1> 	adc dx, 0		  ; days since 1/1 of current year
   779                              <1> L1:			
   780                              <1> 	;mov [jday], dx
   781                              <1> 	;mov [yday], dx 	  ; 24/11/2013	
   782                              <1> 	;mov cx, 12		  ; estimate month
   783                              <1> 	;xchg cx, dx		  ; CX = jday, DX = month 	
   784                              <1> 	; 21/02/2022
   785 00000465 30ED                <1> 	xor ch, ch
   786 00000467 B10C                <1> 	mov cl, 12
   787 00000469 87CA                <1> 	xchg ecx, edx 
   788 0000046B 66B86E01            <1> 	mov ax, 366		  ; mday, max. days since 1/1 is 365
   789 0000046F 6683E303            <1> 	and bx, 11b		  ; year mod 4	(and bx, 3) 
   790                              <1> L2:	; Month calculation	  ; 0 to 11  (11 to 0)	
   791                              <1> 	;cmp cx, ax		  ; mday = # of days passed from 1/1
   792                              <1> 	; 21/02/2022
   793 00000473 39C1                <1> 	cmp ecx, eax
   794 00000475 7319                <1> 	jnb short L3
   795                              <1> 	;dec dx			  ; month = month - 1
   796                              <1> 	; 21/02/2022
   797 00000477 4A                  <1> 	dec edx
   798                              <1> 	;shl dx, 1 
   799 00000478 D1E2                <1> 	shl edx, 1 ; 21/02/2022
   800 0000047A 668B82[E4040000]    <1> 	mov ax, [edx+DMonth] 	  ; # elapsed days at 1st of month
   801                              <1> 	;shr dx, 1		  ; dx = month - 1 (0 to 11)
   802 00000481 D1EA                <1> 	shr edx, 1 ; 21/02/2022
   803 00000483 6683FA01            <1> 	cmp dx, 1		  ; if month > 2 and year mod 4  = 0	
   804 00000487 76EA                <1> 	jna short L2		  ; then mday = mday + 1
   805 00000489 08DB                <1> 	or bl, bl		  ; if past 2/29 and leap year then
   806 0000048B 75E6                <1> 	jnz short L2		  ; add leap day (to mday)
   807                              <1> 	;inc ax			  ; mday = mday + 1
   808                              <1> 	; 21/02/2022
   809 0000048D 40                  <1> 	inc eax
   810 0000048E EBE3                <1> 	jmp short L2
   811                              <1> L3:
   812                              <1> 	;inc dx 		  ; -> dx = month, 1 to 12
   813                              <1> 	; 21/02/2022
   814 00000490 42                  <1> 	inc edx
   815 00000491 668915[DE040000]    <1> 	mov [month], dx
   816                              <1> 	;sub cx, ax		  ; day = jday - mday + 1	
   817                              <1> 	;inc cx 			  
   818                              <1> 	; 21/02/2022
   819 00000498 29C1                <1> 	sub ecx, eax
   820 0000049A 41                  <1> 	inc ecx	
   821 0000049B 66890D[DC040000]    <1> 	mov [day], cx
   822                              <1> 	
   823                              <1> 	; eax, ebx, ecx, edx are changed at return
   824                              <1> 	; output ->
   825                              <1> 	; [year], [month], [day], [hour], [minute], [second]
   826                              <1> 	; [yday] -> 24/11/2013
   827                              <1> 	; [wday] -> 24/11/2013
   828                              <1> 	;
   829                              <1> 	; 24/11/2013
   830 000004A2 66A1[E2040000]      <1> 	mov ax, [wday] ; [iday]
   831                              <1> 	;xor dx, dx
   832 000004A8 31D2                <1> 	xor edx, edx ; 21/02/2022
   833 000004AA 6683C004            <1> 	add ax, 4
   834                              <1> 	; NOTE: January 1, 1970 was THURSDAY
   835                              <1> 	; ch = 0
   836 000004AE B107                <1> 	mov cl, 7
   837 000004B0 66F7F1              <1> 	div cx
   838 000004B3 668915[E2040000]    <1> 	mov [wday], dx ; week of the day,  0 to 6 
   839                              <1> 	; 0 = sunday ... 6 = saturday
   840                              <1> 	;mov word [isday], 0
   841                              <1> 
   842 000004BA C3                  <1> 	retn
   843                              <1> 
   844                              <1> ;sunday:
   845                              <1> 	; sunday(at, ad)
   846                              <1> 	; 	int *at;
   847                              <1> 	;	 {
   848                              <1> 	; 	register int *t, d;
   849                              <1> 	; 	t = at;
   850                              <1> 	; 	d = ad;
   851                              <1> 	; 	d = ad + dysize(t[YEAR]) - 365;
   852                              <1> 	; 	return(d - (d - t[YDAY] + t[WDAY] + 700) % 7);
   853                              <1> 	; 	}
   854                              <1> 
   855                              <1> 	;mov	dx, [year]
   856                              <1> 	;call	dysize
   857                              <1> 	;sub	ax, 365
   858                              <1> 	; add 	cx, ax
   859                              <1> ;	test	word [year], 11b
   860                              <1> ;	jnz	short sunday1
   861                              <1> 	; CX = 119 (77h) or CX = 303 (12Fh)
   862                              <1> 	;inc	cx
   863                              <1> ;	inc	cl
   864                              <1> ;sunday1:
   865                              <1> ;	mov	ax, cx
   866                              <1> ;	add	ax, [wday]
   867                              <1> 	;adc	ax, 700
   868                              <1> ;	add	ax, 700
   869                              <1> ;	sub	ax, [yday]
   870                              <1> 	;xor	dx, dx
   871                              <1> ;	mov	bx, 7
   872                              <1> 	;div	bx
   873                              <1> ;	div	bl
   874                              <1> ;	sub	cx, bx
   875                              <1> ;	retn
   876                              <1> 
   877                              <1> ;dysize:
   878                              <1> ; dysize(y)
   879                              <1> ;	{
   880                              <1> ;	if((y%4) == 0)
   881                              <1> ;		return(366);
   882                              <1> ;	return(365);
   883                              <1> ;	}
   884                              <1> 
   885                              <1> ;	mov 	ax, 365	
   886                              <1> ;	test 	dx, 11b
   887                              <1> ;	jnz 	short dysize1
   888                              <1> ;	;inc 	ax
   889 000004BB FEC0                <1> 	inc 	al			
   890                              <1> ;dysize1:	
   891                              <1> ;	retn 
   892                              <1> 
   893                              <1> numb:   ; AX = 0 to 99
   894                              <1> 	;
   895                              <1> 	; numb(acp, n)
   896                              <1> 	; {
   897                              <1> 	;	register char *cp;
   898                              <1> 	;
   899                              <1> 	;	cp = acp;
   900                              <1> 	;	cp++;
   901                              <1> 	;	if (n>=10)
   902                              <1> 	;	   *cp++ = (n/10)%10 + '0';
   903                              <1> 	;	else
   904                              <1> 	;	   *cp++ = ' ';
   905                              <1> 	;	*cp++ = n%10 + '0';
   906                              <1> 	;	return(cp);
   907                              <1> 	; }
   908                              <1> 	;
   909                              <1> 	;mov	cl, 10
   910 000004BD 6683F80A            <1> 	cmp 	ax, 10
   911 000004C1 7306                <1> 	jnb	short nb1
   912 000004C3 88C4                <1> 	mov	ah, al
   913 000004C5 30C0                <1> 	xor	al, al ; 0
   914 000004C7 EB04                <1> 	jmp	short nb2
   915                              <1> nb1:	
   916 000004C9 F6F1                <1> 	div	cl
   917 000004CB 88E2                <1> 	mov	dl, ah
   918                              <1> 	
   919                              <1> nb2:	
   920 000004CD 0430                <1> 	add	al, '0'
   921 000004CF AA                  <1> 	stosb	; digit 1
   922 000004D0 88E0                <1> 	mov	al, ah
   923 000004D2 0430                <1> 	add	al, '0'
   924 000004D4 AA                  <1> 	stosb	; digit 2
   925 000004D5 C3                  <1> 	retn
   926                              <1> 
   927                              <1> ;;; DATA
   928                              <1> 
   929                              <1> ;daylight: db 1 ; int daylight 1; /* Allow daylight conversion */
   930                              <1> ;nixonflg: db 0 ; int nixonflg 0; /* Daylight time all year around */
   931                              <1> ;daylbegin: dw 0
   932                              <1> ;daylend: dw 0
   933                              <1> 
   934                              <1> ct:
   935                              <1> ; 24/11/2013 (re-order)
   936                              <1> ;
   937                              <1> ; Retro UNIX 8086 v1 - UNIX.ASM
   938                              <1> ; 09/04/2013 epoch variables
   939                              <1> ; Retro UNIX 8086 v1 Prototype: UNIXCOPY.ASM, 10/03/2013
   940                              <1> ;
   941                              <1> 
   942 000004D6 0000                <1> second: dw 0
   943 000004D8 0000                <1> minute: dw 0
   944 000004DA 0000                <1> hour: dw 0
   945 000004DC 0100                <1> day: dw 1
   946 000004DE 0100                <1> month: dw 1
   947 000004E0 B207                <1> year: dw 1970
   948 000004E2 0000                <1> wday: dw 0 ; 24/11/2013
   949                              <1> ;yday: dw 0 ; 24/11/2013
   950                              <1> ;isday: dw 0 ; 24/11/2013
   951                              <1> 
   952                              <1> DMonth:
   953 000004E4 0000                <1> dw 0
   954 000004E6 1F00                <1> dw 31
   955 000004E8 3B00                <1> dw 59
   956 000004EA 5A00                <1> dw 90
   957 000004EC 7800                <1> dw 120
   958 000004EE 9700                <1> dw 151
   959 000004F0 B500                <1> dw 181
   960 000004F2 D400                <1> dw 212
   961 000004F4 F300                <1> dw 243
   962 000004F6 1101                <1> dw 273
   963 000004F8 3001                <1> dw 304
   964 000004FA 4E01                <1> dw 334
   965                              <1> 
   966                              <1> ;ncp0: db "Day Mon 00 00:00:00 1970", 0, 0
   967 000004FC 53756E204D6F6E2054- <1> ncp1: db "Sun Mon Tue Wed Thu Fri Sat "
   967 00000505 756520576564205468- <1>
   967 0000050E 752046726920536174- <1>
   967 00000517 20                  <1>
   968 00000518 4A616E20466562204D- <1> ncp2: db "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec "
   968 00000521 617220417072204D61- <1>
   968 0000052A 79204A756E204A756C- <1>
   968 00000533 204175672053657020- <1>
   968 0000053C 4F6374204E6F762044- <1>
   968 00000545 656320              <1>
   969                              <1> 
   970                              <1> cbuf: 	; char cbuf[26]
   971                              <1> 	;times 26 db 0
   972                              <1> 	; 25/02/2022
   973 00000548 00<rep 1Bh>         <1> 	times 27 db 0	
   974                              <1> 
   975                              <1> ;; ctime.c (Unix v5)
   976                              <1> ;
   977                              <1> ;#
   978                              <1> ;/*
   979                              <1> ; * This routine converts time as follows.
   980                              <1> ; * The epoch is 0000 Jan 1 1970 GMT.
   981                              <1> ; * The argument time is in seconds since then.
   982                              <1> ; * The localtime(t) entry returns a pointer to an array
   983                              <1> ; * containing
   984                              <1> ; *  seconds (0-59)
   985                              <1> ; *  minutes (0-59)
   986                              <1> ; *  hours (0-23)
   987                              <1> ; *  day of month (1-31)
   988                              <1> ; *  month (0-11)
   989                              <1> ; *  year-1970
   990                              <1> ; *  weekday (0-6, Sun is 0)
   991                              <1> ; *  day of the year
   992                              <1> ; *  daylight savings flag
   993                              <1> ; *
   994                              <1> ; * The routine corrects for daylight saving
   995                              <1> ; * time and will work in any time zone provided
   996                              <1> ; * "timezone" is adjusted to the difference between
   997                              <1> ; * Greenwich and local standard time (measured in seconds).
   998                              <1> ; * In places like Michigan "daylight" must
   999                              <1> ; * be initialized to 0 to prevent the conversion
  1000                              <1> ; * to daylight time.
  1001                              <1> ; *
  1002                              <1> ; * "nixonflg,", if set to 1, will
  1003                              <1> ; * cause daylight savings time all year around
  1004                              <1> ; * independently of "daylight".
  1005                              <1> ; *
  1006                              <1> ; * The routine does not work
  1007                              <1> ; * in Saudi Arabia which runs on Solar time.
  1008                              <1> ; *
  1009                              <1> ; * asctime(tvec))
  1010                              <1> ; * where tvec is produced by localtime
  1011                              <1> ; * returns a ptr to a character string
  1012                              <1> ; * that has the ascii time in the form
  1013                              <1> ; *	Thu Jan 01 00:00:00 1970n0\; *	01234567890123456789012345
  1015                              <1> ; *	0	  1	    2
  1016                              <1> ; *
  1017                              <1> ; * ctime(t) just calls localtime, then asctime.
  1018                              <1> ; */
  1019                              <1> ;char	cbuf[26];
  1020                              <1> ;int	dmsize[12]
  1021                              <1> ;{
  1022                              <1> ;	31,
  1023                              <1> ;	28,
  1024                              <1> ;	31,
  1025                              <1> ;	30,
  1026                              <1> ;	31,
  1027                              <1> ;	30,
  1028                              <1> ;	31,
  1029                              <1> ;	31,
  1030                              <1> ;	30,
  1031                              <1> ;	31,
  1032                              <1> ;	30,
  1033                              <1> ;	31
  1034                              <1> ;};
  1035                              <1> ;
  1036                              <1> ;int timezone	5*60*60;
  1037                              <1> ;int tzname[]
  1038                              <1> ;{
  1039                              <1> ;	"EST",
  1040                              <1> ;	"EDT",
  1041                              <1> ;};
  1042                              <1> ;int	daylight 1;	/* Allow daylight conversion */
  1043                              <1> ;int	nixonflg 0;	/* Daylight time all year around */
  1044                              <1> ;
  1045                              <1> ;#define SEC	0
  1046                              <1> ;#define MIN	1
  1047                              <1> ;#define HOUR	2
  1048                              <1> ;#define MDAY	3 
  1049                              <1> ;#define MON	4
  1050                              <1> ;#define YEAR	5
  1051                              <1> ;#define WDAY	6
  1052                              <1> ;#define YDAY	7
  1053                              <1> ;#define ISDAY	8
  1054                              <1> ;
  1055                              <1> ;ctime(at)
  1056                              <1> ;int *at;
  1057                              <1> ;{
  1058                              <1> ;	return(asctime(localtime(at)));
  1059                              <1> ;}
  1060                              <1> ;
  1061                              <1> ;localtime(tim)
  1062                              <1> ;int tim[];
  1063                              <1> ;{
  1064                              <1> ;	register int *t, *ct, dayno;
  1065                              <1> ;	int daylbegin, daylend;
  1066                              <1> ;	int copyt[2];
  1067                              <1> ;
  1068                              <1> ;	t = copyt;
  1069                              <1> ;	t[0] = tim[0];
  1070                              <1> ;	t[1] = tim[1];
  1071                              <1> ;	dpadd(t, -timezone);
  1072                              <1> ;	ct = gmtime(t);
  1073                              <1> ;	dayno = ct[YDAY];
  1074                              <1> ;	if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 ||
  1075                              <1> ;	    dayno==5 && ct[HOUR]>=2))) {
  1076                              <1> ;		daylight =| 1;
  1077                              <1> ;		daylbegin = -1;
  1078                              <1> ;		daylend = 367;
  1079                              <1> ;	} else {
  1080                              <1> ;		daylbegin = sunday(ct, 119);	/* last Sun in Apr */
  1081                              <1> ;		daylend = sunday(ct, 303);	/* last Sun in Oct */
  1082                              <1> ;	}
  1083                              <1> ;	if (daylight &&
  1084                              <1> ;	    (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) &&
  1085                              <1> ;	    (dayno<daylend || (dayno==daylend && ct[HOUR]<1))) {
  1086                              <1> ;		dpadd(t, 1*60*60);
  1087                              <1> ;		ct = gmtime(t);
  1088                              <1> ;		ct[ISDAY]++;
  1089                              <1> ;	}
  1090                              <1> ;	return(ct);
  1091                              <1> ;}
  1092                              <1> ;
  1093                              <1> ;sunday(at, ad)
  1094                              <1> ;int *at;
  1095                              <1> ;{
  1096                              <1> ;	register int *t, d;
  1097                              <1> ;
  1098                              <1> ;	t = at;
  1099                              <1> ;	d = ad;
  1100                              <1> ;	d = ad + dysize(t[YEAR]) - 365;
  1101                              <1> ;	return(d - (d - t[YDAY] + t[WDAY] + 700) % 7);
  1102                              <1> ;}
  1103                              <1> ;
  1104                              <1> ;gmtime(tim)
  1105                              <1> ;int tim[];
  1106                              <1> ;{
  1107                              <1> ;	register int d0, d1;
  1108                              <1> ;	register *tp;
  1109                              <1> ;	static xtime[9];
  1110                              <1> ;	extern int ldivr;
  1111                              <1> ;
  1112                              <1> ;	/*
  1113                              <1> ;	 * break initial number into
  1114                              <1> ;	 * multiples of 8 hours.
  1115                              <1> ;	 * (28800 = 60*60*8)
  1116                              <1> ;	 */
  1117                              <1> ;
  1118                              <1> ;	d0 = ldiv(tim[0], tim[1], 28800);
  1119                              <1> ;	d1 = ldivr;
  1120                              <1> ;	tp = &xtime[0];
  1121                              <1> ;
  1122                              <1> ;	/*
  1123                              <1> ;	 * generate hours:minutes:seconds
  1124                              <1> ;	 */
  1125                              <1> ;
  1126                              <1> ;	*tp++ = d1%60;
  1127                              <1> ;	d1 =/ 60;
  1128                              <1> ;	*tp++ = d1%60;
  1129                              <1> ;	d1 =/ 60;
  1130                              <1> ;	d1 =+ (d0%3)*8;
  1131                              <1> ;	d0 =/ 3;
  1132                              <1> ;	*tp++ = d1;
  1133                              <1> ;
  1134                              <1> ;	/*
  1135                              <1> ;	 * d0 is the day number.
  1136                              <1> ;	 * generate day of the week.
  1137                              <1> ;	 */
  1138                              <1> ;
  1139                              <1> ;	xtime[WDAY] = (d0+4)%7;
  1140                              <1> ;
  1141                              <1> ;	/*
  1142                              <1> ;	 * year number
  1143                              <1> ;	 */
  1144                              <1> ;	for(d1=70; d0 >= dysize(d1); d1++)
  1145                              <1> ;		d0 =- dysize(d1);
  1146                              <1> ;	xtime[YEAR] = d1;
  1147                              <1> ;	xtime[YDAY] = d0;
  1148                              <1> ;
  1149                              <1> ;	/*
  1150                              <1> ;	 * generate month
  1151                              <1> ;	 */
  1152                              <1> ;
  1153                              <1> ;	if (dysize(d1)==366)
  1154                              <1> ;		dmsize[1] = 29;
  1155                              <1> ;	for(d1=0; d0 >= dmsize[d1]; d1++)
  1156                              <1> ;		d0 =- dmsize[d1];
  1157                              <1> ;	dmsize[1] = 28;
  1158                              <1> ;	*tp++ = d0+1;
  1159                              <1> ;	*tp++ = d1;
  1160                              <1> ;	xtime[ISDAY] = 0;
  1161                              <1> ;	return(xtime);
  1162                              <1> ;}
  1163                              <1> ;
  1164                              <1> ;asctime(t)
  1165                              <1> ;int *t;
  1166                              <1> ;{
  1167                              <1> ;	register char *cp, *ncp;
  1168                              <1> ;	register int *tp;
  1169                              <1> ;
  1170                              <1> ;	cp = cbuf;
  1171                              <1> ;	for (ncp = "Day Mon 00 00:00:00 1900\n"; *cp++ = *ncp++;);
  1172                              <1> ;	ncp = &"SunMonTueWedThuFriSat"[3*t[6]];
  1173                              <1> ;	cp = cbuf;
  1174                              <1> ;	*cp++ = *ncp++;
  1175                              <1> ;	*cp++ = *ncp++;
  1176                              <1> ;	*cp++ = *ncp++;
  1177                              <1> ;	cp++;
  1178                              <1> ;	tp = &t[4];
  1179                              <1> ;	ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[(*tp)*3];
  1180                              <1> ;	*cp++ = *ncp++;
  1181                              <1> ;	*cp++ = *ncp++;
  1182                              <1> ;	*cp++ = *ncp++;
  1183                              <1> ;	cp = numb(cp, *--tp);
  1184                              <1> ;	cp = numb(cp, *--tp+100);
  1185                              <1> ;	cp = numb(cp, *--tp+100);
  1186                              <1> ;	cp = numb(cp, *--tp+100);
  1187                              <1> ;	cp =+ 2;
  1188                              <1> ;	cp = numb(cp, t[YEAR]);
  1189                              <1> ;	return(cbuf);
  1190                              <1> ;}
  1191                              <1> ;
  1192                              <1> ;dysize(y)
  1193                              <1> ;{
  1194                              <1> ;	if((y%4) == 0)
  1195                              <1> ;		return(366);
  1196                              <1> ;	return(365);
  1197                              <1> ;}
  1198                              <1> ;
  1199                              <1> ;
  1200                              <1> ;numb:
  1201                              <1> ;	
  1202                              <1> ;
  1203                              <1> ;numb(acp, n)
  1204                              <1> ;{
  1205                              <1> ;	register char *cp;
  1206                              <1> ;	cp = acp;
  1207                              <1> ;	cp++;
  1208                              <1> ;	if (n>=10)
  1209                              <1> ;		*cp++ = (n/10)%10 + '0';
  1210                              <1> ;	else
  1211                              <1> ;		*cp++ = ' ';
  1212                              <1> ;	*cp++ = n%10 + '0';
  1213                              <1> ;	return(cp);
  1214                              <1> ;}
  1215                              <1> ;
   456                                  ;=================================================================
   457                                  
   458                                  ;-----------------------------------------------------------------
   459                                  ;  data - initialized data
   460                                  ;-----------------------------------------------------------------
   461                                  
   462                                  lpt1:
   463 00000563 2F6465762F6C707200      	db '/dev/lpr', 0
   464                                  
   465                                  program_msg:
   466 0000056C 0D0A                    	db  0Dh, 0Ah
   467 0000056E 526574726F20554E49-     	db  'Retro UNIX 386 v1.2 PRINT Utility by Erdogan TAN - 26/06/2022'
   467 00000577 58203338362076312E-
   467 00000580 32205052494E542055-
   467 00000589 74696C697479206279-
   467 00000592 204572646F67616E20-
   467 0000059B 54414E202D2032362F-
   467 000005A4 30362F32303232     
   468 000005AB 0D0A00                  	db  0Dh, 0Ah, 0
   469                                  usage_msg:
   470 000005AE 0D0A                    	db  0Dh, 0Ah
   471 000005B0 55736167653A207072-     	db  'Usage: pr [ -rlcm ] filename1 ... '
   471 000005B9 205B202D726C636D20-
   471 000005C2 5D2066696C656E616D-
   471 000005CB 6531202E2E2E20     
   472 000005D2 0D0A                    	db  0Dh, 0Ah
   473 000005D4 09202020204F707469-     	db  '	    Options: '
   473 000005DD 6F6E733A20         
   474 000005E2 0D0A                    	db  0Dh, 0Ah
   475 000005E4 202020202020202020-     	db  '             -r : 66 lines per page (default option)'
   475 000005ED 202020202D72203A20-
   475 000005F6 3636206C696E657320-
   475 000005FF 706572207061676520-
   475 00000608 2864656661756C7420-
   475 00000611 6F7074696F6E29     
   476 00000618 0D0A                    	db  0Dh, 0Ah	
   477 0000061A 202020202020202020-     	db  '             -l : 78 lines per page'
   477 00000623 202020202D6C203A20-
   477 0000062C 3738206C696E657320-
   477 00000635 7065722070616765   
   478 0000063D 0D0A                    	db  0Dh, 0Ah
   479 0000063F 202020202020202020-     	db  '             -m : modification date (default option)'
   479 00000648 202020202D6D203A20-
   479 00000651 6D6F64696669636174-
   479 0000065A 696F6E206461746520-
   479 00000663 2864656661756C7420-
   479 0000066C 6F7074696F6E29     
   480 00000673 0D0A                    	db  0Dh, 0Ah
   481 00000675 202020202020202020-     	db  '             -c : current date'
   481 0000067E 202020202D63203A20-
   481 00000687 63757272656E742064-
   481 00000690 617465             
   482 00000693 0D0A                    	db  0Dh, 0Ah
   483                                  nextline:
   484 00000695 0D0A00                  	db  0Dh, 0Ah, 0
   485                                  
   486                                  size_pmsg equ usage_msg-(program_msg+1)
   487                                  
   488                                  printer_err_msg:
   489 00000698 0D0A                    	db 0Dh, 0Ah	
   490 0000069A 5072696E7465722045-     	db "Printer Error !"
   490 000006A3 72726F722021       
   491 000006A9 0D0A00                   	db 0Dh, 0Ah, 0  		
   492                                  
   493                                  size_umsg equ printer_err_msg-(usage_msg+1)
   494                                  
   495                                  file_err_msg:
   496 000006AC 0D0A                    	db 0Dh, 0Ah	
   497 000006AE 46696C65204572726F-     	db "File Error !"
   497 000006B7 722021             
   498 000006BA 0D0A00                   	db 0Dh, 0Ah, 0  
   499                                  
   500                                  EmptyLines:
   501 000006BD 0D0A0D0A0D0A0D0A0D-     	db 0Dh, 0Ah, 0Dh, 0Ah, 0Dh, 0Ah, 0Dh, 0Ah, 0Dh, 0Ah
   501 000006C6 0A                 
   502 000006C7 2020                    	db 20h, 20h
   503                                  PageHeader:
   504 000006C9 205061676520            	db " Page "
   505                                  
   506 000006CF 42                      rows:	db 66
   507 000006D0 00                      cdatef:	db 0
   508                                  
   509                                  ;-----------------------------------------------------------------
   510                                  ;  bss - uninitialized data
   511                                  ;-----------------------------------------------------------------	
   512                                  
   513 000006D1 90<rep 3h>              align 4
   514                                  
   515                                  bss_start:
   516                                  
   517                                  ABSOLUTE bss_start
   518                                  
   519 000006D4 ??                      argc:	 resb 1
   520 000006D5 ??                      files:	 resb 1
   521 000006D6 ????                    pgnumber: resw 1
   522 000006D8 ??                      eof:	 resb 1
   523 000006D9 ??                      cchar:	 resb 1
   524 000006DA ??                      chr:	 resb 1
   525 000006DB ??                      pchr:	 resb 1 ; 10/07/2022
   526 000006DC ????????                mtime:	 resd 1	
   527 000006E0 ????????                prnfnum: resd 1
   528                                  
   529                                  ; 26/06/2022
   530                                  
   531                                  fbuf:
   532                                  txtfnum: 
   533 000006E4 <res 8Ch>               	resb 128+12
   534                                  stbuf:
   535 00000770 <res 42h>               	resb 66 
   536                                  
   537                                  bss_end:
   538                                  
   539                                  ;-----------------------------------------------------------------
   540                                  ; 25/06/2022
   541                                  ;-----------------------------------------------------------------
   542                                  ; Original UNIX v2 - pr (utility) disassembled source code
   543                                  ;-----------------------------------------------------------------
   544                                  
   545                                  ;
   546                                  ; +-------------------------------------------------------------------------+
   547                                  ; |   This file	has been generated by The Interactive Disassembler (IDA)    |
   548                                  ; |	      Copyright	(c) 2013 Hex-Rays, <support@hex-rays.com>	    |
   549                                  ; +-------------------------------------------------------------------------+
   550                                  ;
   551                                  ; File Name   :	C:\Users\Erdoan\Desktop\s2.tar\bin\pr
   552                                  ; Format      :	Binary file
   553                                  ; Base Address:	0000h Range: 4000h - 448Eh Loaded length: 0000048Eh
   554                                  
   555                                  ; Processor	  : PDP11
   556                                  ; Target assembler: Macro-11 Assembler
   557                                  
   558                                  ;.macro .array of,type,cnt,val
   559                                  ;.rept  cnt
   560                                  ; type  val
   561                                  ;.endr
   562                                  ;.endm .array
   563                                  
   564                                  ; ===========================================================================
   565                                  
   566                                  ;; Segment type:	Regular
   567                                  ;.PSECT RAM
   568                                  ;byte_0:		.blkb  40000
   569                                  ;; ---------------------------------------------------------------------------
   570                                  ;
   571                                  ;loc_40000:
   572                                  ;		br	loc_40014
   573                                  ;; ---------------------------------------------------------------------------
   574                                  ;		.word 2216
   575                                  ;		.word 0
   576                                  ;		.word 0
   577                                  ;		.word 0
   578                                  ;		.word 0
   579                                  ;; ---------------------------------------------------------------------------
   580                                  ;
   581                                  ;loc_40014:				
   582                                  ;		trap	33
   583                                  ;; ---------------------------------------------------------------------------
   584                                  ;		.word intr_loc
   585                                  ;; ---------------------------------------------------------------------------
   586                                  ;		mov	(SP)+, argc
   587                                  ;		tst	(SP)+
   588                                  ;		clr	R0
   589                                  ;		trap	34
   590                                  ;; ---------------------------------------------------------------------------
   591                                  ;		.word fnum
   592                                  ;; ---------------------------------------------------------------------------
   593                                  ;		bit	#1, statbuf
   594                                  ;		beq	chmod_err
   595                                  ;		trap	22
   596                                  ;; ---------------------------------------------------------------------------
   597                                  ;		.word ttyx		; "/dev/tty0"
   598                                  ;		.word statbuf
   599                                  ;; ---------------------------------------------------------------------------
   600                                  ;		mov	fnum, R0
   601                                  ;		sub	statbuf, R0
   602                                  ;		add	#60, R0	; '0'
   603                                  ;		movb	R0, ttyx+10
   604                                  ;		trap	17
   605                                  ;; ---------------------------------------------------------------------------
   606                                  ;		.word ttyx		; "/dev/tty0"
   607                                  ;		.word 14
   608                                  ;; ---------------------------------------------------------------------------
   609                                  ;		bcs	chmod_err
   610                                  ;		inc	chmodflg
   611                                  ;
   612                                  ;chmod_err:				
   613                                  ;		clr	fnum
   614                                  ;
   615                                  ;err_cf:					
   616                                  ;		mov	fnum, R0
   617                                  ;		beq	err_cf_next
   618                                  ;		trap	6
   619                                  ;		clr	fnum
   620                                  ;
   621                                  ;err_cf_next:				
   622                                  ;		dec	argc
   623                                  ;		bgt	next_arg
   624                                  ;		jmp	intr_loc
   625                                  ;; ---------------------------------------------------------------------------
   626                                  ;
   627                                  ;next_arg:				
   628                                  ;		mov	(SP)+, R0
   629                                  ;		mov	R0, fname_ptr
   630                                  ;		cmpb	(R0)+, #55 ; '-'
   631                                  ;		bne	open_txt_file
   632                                  ;		cmpb	@R0, #154 ; 'l'
   633                                  ;		bne	case_r
   634                                  ;		mov	#78., rows
   635                                  ;		br	err_cf
   636                                  ;; ---------------------------------------------------------------------------
   637                                  ;
   638                                  ;case_r:					
   639                                  ;		cmpb	@R0, #162 ; 'r'
   640                                  ;		bne	case_m
   641                                  ;		mov	#66., rows
   642                                  ;		br	err_cf
   643                                  ;; ---------------------------------------------------------------------------
   644                                  ;
   645                                  ;case_m:					
   646                                  ;		cmpb	@R0, #155 ; 'm'
   647                                  ;		bne	case_c
   648                                  ;		clr	cdateflg
   649                                  ;		br	err_cf
   650                                  ;; ---------------------------------------------------------------------------
   651                                  ;
   652                                  ;case_c:					
   653                                  ;		cmpb	@R0, #143 ; 'c'
   654                                  ;		bne	open_txt_file
   655                                  ;		inc	cdateflg
   656                                  ;		br	err_cf
   657                                  ;; ---------------------------------------------------------------------------
   658                                  ;
   659                                  ;open_txt_file:				
   660                                  ;		mov	fname_ptr, R0
   661                                  ;		jsr	R5, fopen
   662                                  ;; ---------------------------------------------------------------------------
   663                                  ;		.word fnum
   664                                  ;; ---------------------------------------------------------------------------
   665                                  ;		bcs	err_cf
   666                                  ;		tst	cdateflg
   667                                  ;		beq	get_fmod_time
   668                                  ;		trap	15
   669                                  ;		mov	@#word_177304, mtime_l
   670                                  ;		mov	@#word_177302, mtime_h
   671                                  ;		br	write_pages
   672                                  ;; ---------------------------------------------------------------------------
   673                                  ;
   674                                  ;get_fmod_time:				
   675                                  ;		mov	fnum, R0
   676                                  ;		trap	34
   677                                  ;; ---------------------------------------------------------------------------
   678                                  ;		.word fstatbuf
   679                                  ;; ---------------------------------------------------------------------------
   680                                  ;		mov	i_mtime_l, mtime_l
   681                                  ;		mov	i_mtime_h, mtime_h
   682                                  ;
   683                                  ;write_pages:				
   684                                  ;		clr	pagenumber
   685                                  ;		clr	eof
   686                                  ;		clr	cchar
   687                                  ;
   688                                  ;write_next_page:			
   689                                  ;		call	readf
   690                                  ;		br	err_cf
   691                                  ;; ---------------------------------------------------------------------------
   692                                  ;		mov	#1, R0
   693                                  ;		trap	4
   694                                  ;; ---------------------------------------------------------------------------
   695                                  ;		.word EmptyLines	; "\n\n\n\n\n"
   696                                  ;		.word 2
   697                                  ;; ---------------------------------------------------------------------------
   698                                  ;		mov	#1, R0
   699                                  ;		mov	mtime_l, @#word_177304
   700                                  ;		mov	mtime_h, @#word_177302
   701                                  ;		call	write_hdr_date
   702                                  ;		mov	#1, R0
   703                                  ;		trap	4
   704                                  ;; ---------------------------------------------------------------------------
   705                                  ;		.word PageHeader	; "   Page "
   706                                  ;		.word 2
   707                                  ;; ---------------------------------------------------------------------------
   708                                  ;		inc	pagenumber
   709                                  ;		mov	fname_ptr, R1
   710                                  ;		mov	R1, f_name_ptr
   711                                  ;		mov	#-1, R0
   712                                  ;
   713                                  ;strlen:					
   714                                  ;		inc	R0
   715                                  ;		tstb	(R1)+
   716                                  ;		bne	strlen
   717                                  ;		mov	R0, charcount
   718                                  ;		mov	#1, R0
   719                                  ;		trap	4
   720                                  ;; ---------------------------------------------------------------------------
   721                                  ;f_name_ptr:	.word 40000		
   722                                  ;charcount:	.word 40000		
   723                                  ;; ---------------------------------------------------------------------------
   724                                  ;		mov	#1, R0
   725                                  ;		trap	4
   726                                  ;; ---------------------------------------------------------------------------
   727                                  ;		.word PageHeader+2
   728                                  ;		.word 6
   729                                  ;; ---------------------------------------------------------------------------
   730                                  ;		mov	pagenumber, @#word_177304
   731                                  ;		call	write_pg_num
   732                                  ;		mov	#1, R0
   733                                  ;		trap	4
   734                                  ;; ---------------------------------------------------------------------------
   735                                  ;		.word EmptyLines	; "\n\n\n\n\n"
   736                                  ;		.word 4
   737                                  ;; ---------------------------------------------------------------------------
   738                                  ;		mov	rows, R1
   739                                  ;		sub	#11., R1
   740                                  ;
   741                                  ;write_next_char:			
   742                                  ;		call	get_char
   743                                  ;		call	write_char
   744                                  ;		cmp	R0, #10.
   745                                  ;		bne	write_next_char
   746                                  ;		dec	R1
   747                                  ;		bne	write_next_char
   748                                  ;		mov	#1, R0
   749                                  ;		trap	4
   750                                  ;; ---------------------------------------------------------------------------
   751                                  ;		.word EmptyLines	; "\n\n\n\n\n"
   752                                  ;		.word 5
   753                                  ;; ---------------------------------------------------------------------------
   754                                  ;		br	write_next_page
   755                                  ;; ---------------------------------------------------------------------------
   756                                  ;
   757                                  ;intr_loc:				
   758                                  ;					
   759                                  ;		tst	chmodflg
   760                                  ;		beq	_exit
   761                                  ;		trap	17
   762                                  ;; ---------------------------------------------------------------------------
   763                                  ;		.word ttyx		; "/dev/tty0"
   764                                  ;		.word 15
   765                                  ;; ---------------------------------------------------------------------------
   766                                  ;
   767                                  ;_exit:					
   768                                  ;		trap	1
   769                                  ;
   770                                  ;; =============== SUBROUTINE ================================================
   771                                  ;
   772                                  ;
   773                                  ;write_pg_num:				
   774                                  ;					
   775                                  ;		clr	@#word_177302
   776                                  ;		mov	#10., @#word_177300
   777                                  ;		mov	@#word_177302, -(SP)
   778                                  ;		tst	@#word_177304
   779                                  ;		beq	wrt_pg_num_1
   780                                  ;		call	write_pg_num
   781                                  ;
   782                                  ;wrt_pg_num_1:				
   783                                  ;		mov	(SP)+, R0
   784                                  ;		add	#60, R0	; '0'
   785                                  ;
   786                                  ;write_char:				
   787                                  ;		mov	R0, pn_chr
   788                                  ;		mov	#1, R0
   789                                  ;		trap	4
   790                                  ;; End of function write_pg_num
   791                                  ;
   792                                  ;; ---------------------------------------------------------------------------
   793                                  ;		.word pn_chr
   794                                  ;		.word 1
   795                                  ;; ---------------------------------------------------------------------------
   796                                  ;		mov	pn_chr, R0
   797                                  ;		return
   798                                  ;
   799                                  ;; =============== SUBROUTINE ================================================
   800                                  ;
   801                                  ;
   802                                  ;get_char:				
   803                                  ;					
   804                                  ;		mov	cchar, R0
   805                                  ;		beq	get_char_1
   806                                  ;		clr	cchar
   807                                  ;		return
   808                                  ;; ---------------------------------------------------------------------------
   809                                  ;
   810                                  ;get_char_1:				
   811                                  ;		tst	eof
   812                                  ;		beq	get_next_char
   813                                  ;		mov	#10., R0
   814                                  ;		return
   815                                  ;; ---------------------------------------------------------------------------
   816                                  ;
   817                                  ;get_next_char:				
   818                                  ;		jsr	R5, getc
   819                                  ;; End of function get_char
   820                                  ;
   821                                  ;; ---------------------------------------------------------------------------
   822                                  ;		.word fnum
   823                                  ;; ---------------------------------------------------------------------------
   824                                  ;		bcc	getc_ok
   825                                  ;		mov	PC, eof
   826                                  ;		br	get_char
   827                                  ;; ---------------------------------------------------------------------------
   828                                  ;
   829                                  ;getc_ok:				
   830                                  ;		return
   831                                  ;
   832                                  ;; =============== SUBROUTINE ================================================
   833                                  ;
   834                                  ;
   835                                  ;readf:				
   836                                  ;		call	get_char
   837                                  ;		mov	R0, cchar
   838                                  ;		tst	eof
   839                                  ;		bne	readf_err
   840                                  ;		add	#2, @SP
   841                                  ;
   842                                  ;readf_err:				
   843                                  ;		return
   844                                  ;; End of function readf
   845                                  ;
   846                                  ;; ---------------------------------------------------------------------------
   847                                  ;EmptyLines:	.ascii <12>		
   848                                  ;		.ascii <12>
   849                                  ;		.ascii <12>
   850                                  ;		.ascii <12><12>
   851                                  ;PageHeader:	.ascii \   Page \       
   852                                  ;ttyx:		.ascii \/dev/tty0\<0>   
   853                                  ;		.byte	 0 ;
   854                                  ;rows:		.word 102		
   855                                  ;mtime_l:	.word 0			
   856                                  ;mtime_h:	.word 0			
   857                                  ;argc:		.word 0			
   858                                  ;					
   859                                  ;eof:		.word 0			
   860                                  ;					
   861                                  ;cchar:		.word 0			
   862                                  ;pn_chr:	.word 0			
   863                                  ;					
   864                                  ;pagenumber:	.word 0			
   865                                  ;					
   866                                  ;fnum:		.word 0			
   867                                  ;statbuf:	.word 0			
   868                                  ;		.word 0
   869                                  ;		.word 0
   870                                  ;		.word 0
   871                                  ;fstatbuf:	.word 0			
   872                                  ;		.word 0
   873                                  ;		.word 0
   874                                  ;		.word 0
   875                                  ;		.word 0
   876                                  ;		.word 0
   877                                  ;		.word 0
   878                                  ;		.word 0
   879                                  ;		.word 0
   880                                  ;		.word 0
   881                                  ;		.word 0
   882                                  ;		.word 0
   883                                  ;		.word 0
   884                                  ;		.word 0
   885                                  ;i_mtime_h:	.word 0			
   886                                  ;i_mtime_l:	.word 0			
   887                                  ;i_rsvd:	.word 0
   888                                  ;		.array of .bytes cnt=132 val=0
   889                                  ;chmodflg:	.word 0			
   890                                  ;fname_ptr:	.word 0			
   891                                  ;					
   892                                  ;cdateflg:	.word 0			
   893                                  ;; ---------------------------------------------------------------------------
   894                                  ;
   895                                  ;write_hdr_date:				
   896                                  ;		mov	R1, -(SP)
   897                                  ;		sub	#20, SP
   898                                  ;		mov	R0, R1
   899                                  ;		mov	SP, R0
   900                                  ;		call	calc_date
   901                                  ;		mov	R0, datebufptr
   902                                  ;		mov	R1, R0
   903                                  ;		trap	4
   904                                  ;; ---------------------------------------------------------------------------
   905                                  ;datebufptr:	.word 40000		
   906                                  ;		.word 15.
   907                                  ;; ---------------------------------------------------------------------------
   908                                  ;		add	#16., SP
   909                                  ;		mov	(SP)+, R1
   910                                  ;		return
   911                                  ;; ---------------------------------------------------------------------------
   912                                  ;
   913                                  ;calc_date:				
   914                                  ;		mov	R2, -(SP)
   915                                  ;		mov	R3, -(SP)
   916                                  ;		cmp	@#word_177302, word_41700
   917                                  ;		bcs	loc_41372
   918                                  ;		bhi	loc_41340
   919                                  ;		cmp	@#word_177304, word_41702
   920                                  ;		bcs	loc_41372
   921                                  ;
   922                                  ;loc_41340:				
   923                                  ;		mov	@#word_177302, -(SP)
   924                                  ;		sub	word_41702, @#word_177304
   925                                  ;		sbc	@SP
   926                                  ;		sub	word_41700, @SP
   927                                  ;		mov	(SP)+, @#word_177302
   928                                  ;		mov	#29., february
   929                                  ;
   930                                  ;loc_41372:				
   931                                  ;		mov	#-4, @#word_177314
   932                                  ;		mov	#32274,	@#word_177300
   933                                  ;		mov	@#word_177304, R3
   934                                  ;		mov	@#word_177302, @#word_177304
   935                                  ;		mov	#2, @#word_177314
   936                                  ;		mov	#15., @#word_177300
   937                                  ;		add	#15., R0
   938                                  ;		jsr	R5, divide
   939                                  ;; ---------------------------------------------------------------------------
   940                                  ;		.word 10.
   941                                  ;; ---------------------------------------------------------------------------
   942                                  ;		jsr	R5, divide
   943                                  ;		.word 6
   944                                  ;; ---------------------------------------------------------------------------
   945                                  ;		movb	#72, -(R0) ; ':'
   946                                  ;		jsr	R5, divide
   947                                  ;; ---------------------------------------------------------------------------
   948                                  ;		.word 10.
   949                                  ;; ---------------------------------------------------------------------------
   950                                  ;		jsr	R5, divide
   951                                  ;; ---------------------------------------------------------------------------
   952                                  ;		.word 6
   953                                  ;; ---------------------------------------------------------------------------
   954                                  ;		movb	#72, -(R0) ; ':'
   955                                  ;		mov	R3, @#word_177304
   956                                  ;		mov	#30, @#word_177300
   957                                  ;		mov	@#word_177304, R3
   958                                  ;		mov	@#word_177302, @#word_177304
   959                                  ;		jsr	R5, divide
   960                                  ;; ---------------------------------------------------------------------------
   961                                  ;		.word 10.
   962                                  ;; ---------------------------------------------------------------------------
   963                                  ;		jsr	R5, divide
   964                                  ;; ---------------------------------------------------------------------------
   965                                  ;		.word 10.
   966                                  ;; ---------------------------------------------------------------------------
   967                                  ;		mov	#mdays,	R2
   968                                  ;
   969                                  ;loc_41544:
   970                                  ;		cmp	@R2, R3
   971                                  ;		bgt	loc_41554
   972                                  ;		sub	(R2)+, R3
   973                                  ;		br	loc_41544
   974                                  ;; ---------------------------------------------------------------------------
   975                                  ;
   976                                  ;loc_41554:
   977                                  ;		movb	#40, -(R0) ; ' '
   978                                  ;		sub	#mdays,	R2
   979                                  ;		asl	R2
   980                                  ;		add	#byte_41740, R2
   981                                  ;		inc	R3
   982                                  ;		mov	R3, @#word_177304
   983                                  ;		jsr	R5, divide
   984                                  ;; ---------------------------------------------------------------------------
   985                                  ;		.word 10.
   986                                  ;; ---------------------------------------------------------------------------
   987                                  ;		tst	@#word_177304
   988                                  ;		beq	loc_41630
   989                                  ;		add	#60, @#word_177304 ; '0'
   990                                  ;		movb	@#word_177304, -(R0)
   991                                  ;		br	loc_41634
   992                                  ;; ---------------------------------------------------------------------------
   993                                  ;
   994                                  ;loc_41630:				
   995                                  ;		movb	#40, -(R0) ; ' '
   996                                  ;
   997                                  ;loc_41634:				
   998                                  ;		movb	#40, -(R0) ; ' '
   999                                  ;		movb	-(R2), -(R0)
  1000                                  ;		movb	-(R2), -(R0)
  1001                                  ;		movb	-(R2), -(R0)
  1002                                  ;		mov	(SP)+, R3
  1003                                  ;		mov	(SP)+, R2
  1004                                  ;		return
  1005                                  ;
  1006                                  ;; =============== SUBROUTINE ================================================
  1007                                  ;
  1008                                  ;
  1009                                  ;divide:					
  1010                                  ;		clr	@#word_177302
  1011                                  ;		mov	(R5)+, @#word_177300
  1012                                  ;		add	#60, @#word_177302 ; '0'
  1013                                  ;		movb	@#word_177302, -(R0)
  1014                                  ;		rts	R5
  1015                                  ;; End of function divide
  1016                                  ;
  1017                                  ;; ---------------------------------------------------------------------------
  1018                                  ;word_41700:	.word 70310		
  1019                                  ;word_41702:	.word 11000		
  1020                                  ;mdays:		.word 31.
  1021                                  ;february:	.word 28.		
  1022                                  ;		.word 31.
  1023                                  ;		.word 30.
  1024                                  ;		.word 31.
  1025                                  ;		.word 30.
  1026                                  ;		.word 31.
  1027                                  ;		.word 31.
  1028                                  ;		.word 30.
  1029                                  ;		.word 31.
  1030                                  ;		.word 30.
  1031                                  ;		.word 999.
  1032                                  ;		.byte 0
  1033                                  ;Jan:		.ascii \Jan;byte_41740:	.byte 0
  1035                                  ;Feb:		.ascii \Feb\<0>
  1036                                  ;Mar:		.ascii \Mar\<0>
  1037                                  ;Apr:		.ascii \Apr\<0>
  1038                                  ;May:		.ascii \May\<0>
  1039                                  ;Jun:		.ascii \Jun\<0>
  1040                                  ;Jul:		.ascii \Jul\<0>
  1041                                  ;Aug:		.ascii \Aug\<0>
  1042                                  ;Sep:		.ascii \Sep\<0>
  1043                                  ;Oct:		.ascii \Oct\<0>
  1044                                  ;Nov:		.ascii \Nov\<0>
  1045                                  ;Dec:		.ascii \Dec;; ---------------------------------------------------------------------------
  1047                                  ;
  1048                                  ;fopen:					
  1049                                  ;		mov	R1, -(SP)
  1050                                  ;		mov	(R5)+, R1
  1051                                  ;		mov	R0, fnameptr
  1052                                  ;		trap	5
  1053                                  ;; ---------------------------------------------------------------------------
  1054                                  ;fnameptr:	.word 40000		
  1055                                  ;		.word 0
  1056                                  ;; ---------------------------------------------------------------------------
  1057                                  ;		bcs	fopen_err
  1058                                  ;		mov	R0, (R1)+
  1059                                  ;		clr	(R1)+
  1060                                  ;		mov	(SP)+, R1
  1061                                  ;		rts	R5
  1062                                  ;; ---------------------------------------------------------------------------
  1063                                  ;
  1064                                  ;fopen_err:				
  1065                                  ;		mov	#-1, @R1
  1066                                  ;		mov	(SP)+, R1
  1067                                  ;		sec
  1068                                  ;		rts	R5
  1069                                  ;; ---------------------------------------------------------------------------
  1070                                  ;		mov	@R5, fbuf
  1071                                  ;		mov	(R5)+, word_42072
  1072                                  ;		jsr	R5, getc
  1073                                  ;; ---------------------------------------------------------------------------
  1074                                  ;word_42072:	.word 40000		
  1075                                  ;; ---------------------------------------------------------------------------
  1076                                  ;		bcc	getw
  1077                                  ;		rts	R5
  1078                                  ;; ---------------------------------------------------------------------------
  1079                                  ;
  1080                                  ;getw:					
  1081                                  ;		mov	R0, -(SP)
  1082                                  ;		jsr	R5, getc
  1083                                  ;; ---------------------------------------------------------------------------
  1084                                  ;fbuf:		.word 40000		
  1085                                  ;; ---------------------------------------------------------------------------
  1086                                  ;		swab	R0
  1087                                  ;		bis	(SP)+, R0
  1088                                  ;		rts	R5
  1089                                  ;; ---------------------------------------------------------------------------
  1090                                  ;
  1091                                  ;getc:					
  1092                                  ;					
  1093                                  ;		mov	R1, -(SP)
  1094                                  ;		mov	(R5)+, R1
  1095                                  ;		dec	2(R1)
  1096                                  ;		bge	getcbuf
  1097                                  ;		mov	R1, R0
  1098                                  ;		add	#6, R0
  1099                                  ;		mov	R0, bufoff
  1100                                  ;		mov	R0, 4(R1)
  1101                                  ;		mov	@R1, R0
  1102                                  ;		trap	3
  1103                                  ;; ---------------------------------------------------------------------------
  1104                                  ;bufoff:	.word 40000		
  1105                                  ;		.word 128.
  1106                                  ;; ---------------------------------------------------------------------------
  1107                                  ;		bcs	getw_err
  1108                                  ;		tst	R0
  1109                                  ;		bne	getw_ok
  1110                                  ;
  1111                                  ;getw_err:				
  1112                                  ;		mov	(SP)+, R1
  1113                                  ;		sec
  1114                                  ;		rts	R5
  1115                                  ;; ---------------------------------------------------------------------------
  1116                                  ;
  1117                                  ;getw_ok:				
  1118                                  ;		dec	R0
  1119                                  ;		mov	R0, 2(R1)
  1120                                  ;
  1121                                  ;getcbuf:				
  1122                                  ;		clr	R0
  1123                                  ;		bisb	@4(R1),	R0
  1124                                  ;		inc	4(R1)
  1125                                  ;		mov	(SP)+, R1
  1126                                  ;		rts	R5
  1127                                  ;; ---------------------------------------------------------------------------
  1128                                  ;
  1129                                  ;; end of 'RAM'
  1130                                  ;
  1131                                  ;		.END
