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