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