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