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 .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) , , 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 ; 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 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 <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 ; 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 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 resb 128+12 534 stbuf: 535 00000770 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, | 549 ; +-------------------------------------------------------------------------+ 550 ; 551 ; File Name : C:\Users\Erdošan\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