1 ; **************************************************************************** 2 ; pr5.s (pr8086.s) - print file - by Erdogan Tan - 25/06/2022 3 ; ---------------------------------------------------------------------------- 4 ; Retro UNIX 8086 v1 - file print utility 5 ; 6 ; [ Last Modification: 10/07/2022 ] 7 8 ; Derived from disassembled source code of unix v2 '/bin/pr' 9 ; 10 ; **************************************************************************** 11 ; [ s2-bits.gz - bin/pr (archive date: 17-01-1972) ] 12 13 ; Assembler: NASM v2.15 14 ; ((nasm pr5.s -l pr5.txt -o pr5 -Z error.txt)) 15 16 ; pr0.s (29/06/2022, Retro UNIX 8086 v1) 17 ; pr1.s (26/06/2022, Retro UNIX 386 v1 & v1.1) 18 ; pr2.s (26/06/2022, Retro UNIX 386 v1.2) 19 ; pr3.s (10/07/2022, Retro UNIX 386 v1 & v1.1) ; (LF -> CRLF) 20 ; pr4.s (10/07/2022, Retro UNIX 386 v1.2) ; (LF -> CRLF) 21 ; pr5.s (10/07/2022, Retro UNIX 8086 v1) ; (LF -> CRLF) 22 23 ; UNIX v1 system calls 24 _rele equ 0 25 _exit equ 1 26 _fork equ 2 27 _read equ 3 28 _write equ 4 29 _open equ 5 30 _close equ 6 31 _wait equ 7 32 _creat equ 8 33 _link equ 9 34 _unlink equ 10 35 _exec equ 11 36 _chdir equ 12 37 _time equ 13 38 _mkdir equ 14 39 _chmod equ 15 40 _chown equ 16 41 _break equ 17 42 _stat equ 18 43 _seek equ 19 44 _tell equ 20 45 _mount equ 21 46 _umount equ 22 47 _setuid equ 23 48 _getuid equ 24 49 _stime equ 25 50 _quit equ 26 51 _intr equ 27 52 _fstat equ 28 53 _emt equ 29 54 _mdate equ 30 55 _stty equ 31 56 _gtty equ 32 57 _ilgins equ 33 58 _sleep equ 34 ; Retro UNIX 8086 v1 feature only ! 59 _msg equ 35 ; Retro UNIX 386 v1 feature only ! 60 _geterr equ 36 ; Retro UNIX 386 v1 feature only ! 61 ; 12/01/2022 - Retro UNIX 386 v1.2 62 ; Retro UNIX 386 v2 system calls 63 _setgid equ 37 64 _getgid equ 38 65 _sysver equ 39 ; (get) Retro Unix 386 version 66 67 ;;; 68 ESCKey equ 1Bh 69 EnterKey equ 0Dh 70 71 %macro sys 1-4 72 ; Retro UNIX 8086 v1 system call. 73 %if %0 >= 2 74 mov bx, %2 75 %if %0 >= 3 76 mov cx, %3 77 %if %0 >= 4 78 mov dx, %4 79 %endif 80 %endif 81 %endif 82 mov ax, %1 83 int 20h 84 %endmacro 85 86 ; 25/06/2022 87 struc stat 88 ; Note: This is for Retro UNIX v1 'sysstat' output !!! 89 ; (34 bytes) 90 00000000 ???? .inode: resw 1 91 00000002 ???? .mode: resw 1 92 00000004 ?? .nlinks: resb 1 93 00000005 ?? .uid: resb 1 94 00000006 ???? .size: resw 1 95 00000008 .dskptr: resw 8 96 00000018 ???????? .ctime: resd 1 97 0000001C ???????? .mtime: resd 1 98 00000020 ???? .rsvd: resw 1 99 .strucsize: 100 endstruc 101 102 ; Retro UNIX 8086 v1 system call format: 103 ; sys systemcall (ax) , , 104 105 ;----------------------------------------------------------------- 106 ; code 107 ;----------------------------------------------------------------- 108 109 [BITS 16] ; 16-bit intructions (for 8086 or x86 real mode) 110 111 [ORG 0] 112 113 START_CODE: 114 ; 29/06/2022 115 ; 26/06/2022 (16 bit version, pr0.s) 116 ; 25/06/2022 (32 bit version, pr1.s) 117 00000000 59 pop cx ; cx = number of arguments 118 ; 119 00000001 58 pop ax ; ax = argument 0 = executable file name 120 ; 121 ;mov bp, program_msg 122 ; 123 ;dec cx 124 00000002 FEC9 dec cl 125 00000004 7E60 jng short prn_0 126 127 00000006 880E[A405] mov [argc], cl 128 129 sys _open, lpt1, 1 ; open /dev/lpr for write 72 <1> 73 <1> %if %0 >= 2 74 0000000A BB[3704] <1> mov bx, %2 75 <1> %if %0 >= 3 76 0000000D B90100 <1> mov cx, %3 77 <1> %if %0 >= 4 78 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 00000010 B80500 <1> mov ax, %1 83 00000013 CD20 <1> int 20h 130 00000015 7309 jnc short prn_1 131 132 00000017 B8[6B05] mov ax, printer_err_msg 133 0000001A E8CB01 call print_msg 134 0000001D E98B00 jmp hang 135 prn_1: 136 00000020 A3[B005] mov [prnfnum], ax 137 138 prn_2: 139 00000023 5F pop di 140 141 00000024 8A05 mov al, [di] 142 143 00000026 3C2D cmp al, '-' ; option ? 144 ;jne short prn_4 145 00000028 7403 je short case_l 146 0000002A E98500 jmp prn_4 147 case_l: 148 0000002D 47 inc di 149 0000002E 8A05 mov al, [di] 150 151 00000030 3C6C cmp al, 'l' 152 00000032 7507 jne short case_r 153 00000034 C606[A205]4E mov byte [rows], 78 154 00000039 EB1E jmp short prn_3 155 case_r: 156 0000003B 3C72 cmp al, 'r' 157 0000003D 7507 jne short case_m 158 0000003F C606[A205]42 mov byte [rows], 66 159 00000044 EB13 jmp short prn_3 160 case_m: 161 00000046 3C6D cmp al, 'm' 162 00000048 7507 jne short case_c 163 0000004A C606[A305]00 mov byte [cdatef], 0 164 0000004F EB08 jmp short prn_3 165 case_c: 166 00000051 3C63 cmp al, 'c' 167 00000053 75FC jne short case_c 168 ;mov byte [cdatef], 1 169 00000055 FE06[A305] inc byte [cdatef] 170 171 prn_3: 172 00000059 FE0E[A405] dec byte [argc] 173 0000005D 7FC4 jg short prn_2 174 175 ; print usage message on /dev/tty 176 0000005F 803E[A505]00 cmp byte [files], 0 177 00000064 771E ja short fclose_exit 178 prn_0: 179 ; print usage message on stdout 180 sys _write, 1, program_msg, size_pmsg 72 <1> 73 <1> %if %0 >= 2 74 00000066 BB0100 <1> mov bx, %2 75 <1> %if %0 >= 3 76 00000069 B9[4004] <1> mov cx, %3 77 <1> %if %0 >= 4 78 0000006C BA4000 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 0000006F B80400 <1> mov ax, %1 83 00000072 CD20 <1> int 20h 181 ;sys _msg, program_msg, size_pmsg, 0Fh 182 183 sys _write, 1, usage_msg, size_umsg 72 <1> 73 <1> %if %0 >= 2 74 00000074 BB0100 <1> mov bx, %2 75 <1> %if %0 >= 3 76 00000077 B9[8104] <1> mov cx, %3 77 <1> %if %0 >= 4 78 0000007A BAE900 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 0000007D B80400 <1> mov ax, %1 83 00000080 CD20 <1> int 20h 184 00000082 EB27 jmp short hang 185 186 fclose_exit: 187 sys _write, 1, nextline, 2 72 <1> 73 <1> %if %0 >= 2 74 00000084 BB0100 <1> mov bx, %2 75 <1> %if %0 >= 3 76 00000087 B9[6805] <1> mov cx, %3 77 <1> %if %0 >= 4 78 0000008A BA0200 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 0000008D B80400 <1> mov ax, %1 83 00000090 CD20 <1> int 20h 188 189 00000092 803E[B205]00 cmp byte [txtfnum], 0 190 00000097 7609 jna short pclose_exit 191 p_err_exit: 192 sys _close, [txtfnum] 72 <1> 73 <1> %if %0 >= 2 74 00000099 8B1E[B205] <1> mov bx, %2 75 <1> %if %0 >= 3 76 <1> mov cx, %3 77 <1> %if %0 >= 4 78 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 0000009D B80600 <1> mov ax, %1 83 000000A0 CD20 <1> int 20h 193 ;jmp short pclose_exit 194 195 pclose_exit: 196 sys _close, [prnfnum] 72 <1> 73 <1> %if %0 >= 2 74 000000A2 8B1E[B005] <1> mov bx, %2 75 <1> %if %0 >= 3 76 <1> mov cx, %3 77 <1> %if %0 >= 4 78 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 000000A6 B80600 <1> mov ax, %1 83 000000A9 CD20 <1> int 20h 197 hang: 198 sys _exit 72 <1> 73 <1> %if %0 >= 2 74 <1> mov bx, %2 75 <1> %if %0 >= 3 76 <1> mov cx, %3 77 <1> %if %0 >= 4 78 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 000000AB B80100 <1> mov ax, %1 83 000000AE CD20 <1> int 20h 199 000000B0 EBF9 jmp short hang 200 201 prn_4: 202 000000B2 FE06[A505] inc byte [files] 203 204 ; di = txt file name address 205 206 sys _open, di, 0 ; open for read 72 <1> 73 <1> %if %0 >= 2 74 000000B6 89FB <1> mov bx, %2 75 <1> %if %0 >= 3 76 000000B8 B90000 <1> mov cx, %3 77 <1> %if %0 >= 4 78 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 000000BB B80500 <1> mov ax, %1 83 000000BE CD20 <1> int 20h 207 000000C0 7308 jnc short prn_5 208 209 f_err_exit: 210 000000C2 B8[7F05] mov ax, file_err_msg 211 000000C5 E82001 call print_msg 212 000000C8 EB8F jmp prn_3 213 214 prn_5: 215 000000CA A3[B205] mov [txtfnum], ax 216 217 000000CD F606[A305]FF test byte [cdatef], 0FFh 218 000000D2 7407 jz short prn_6 219 sys _time 72 <1> 73 <1> %if %0 >= 2 74 <1> mov bx, %2 75 <1> %if %0 >= 3 76 <1> mov cx, %3 77 <1> %if %0 >= 4 78 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 000000D4 B80D00 <1> mov ax, %1 83 000000D7 CD20 <1> int 20h 220 000000D9 EB11 jmp short prn_7 221 prn_6: 222 sys _fstat, ax, stbuf 72 <1> 73 <1> %if %0 >= 2 74 000000DB 89C3 <1> mov bx, %2 75 <1> %if %0 >= 3 76 000000DD B9[3806] <1> mov cx, %3 77 <1> %if %0 >= 4 78 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 000000E0 B81C00 <1> mov ax, %1 83 000000E3 CD20 <1> int 20h 223 ; 26/06/2022 224 000000E5 A1[5406] mov ax, [stbuf+stat.mtime] 225 000000E8 8B16[5606] mov dx, [stbuf+stat.mtime+2] 226 prn_7: 227 000000EC A3[AC05] mov [mtime], ax 228 000000EF 8916[AE05] mov [mtime+2], dx 229 230 write_pages: 231 000000F3 31C0 xor ax, ax ; 0 232 000000F5 A3[A605] mov [pgnumber], ax 233 000000F8 A2[A805] mov [eof], al 234 000000FB A2[A905] mov [cchar], al 235 write_next_page: 236 000000FE E82201 call readf 237 00000101 731C jnc short prn_8 238 239 sys _close, [txtfnum] 72 <1> 73 <1> %if %0 >= 2 74 00000103 8B1E[B205] <1> mov bx, %2 75 <1> %if %0 >= 3 76 <1> mov cx, %3 77 <1> %if %0 >= 4 78 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 00000107 B80600 <1> mov ax, %1 83 0000010A CD20 <1> int 20h 240 241 0000010C FE0E[A405] dec byte [argc] 242 ;jng short pclose_exit 243 00000110 7F02 jg short p_next_file 244 00000112 EB8E jmp pclose_exit 245 246 p_next_file: 247 00000114 29C0 sub ax, ax 248 249 00000116 A2[B205] mov [txtfnum], al ; 0 ; open file number 250 ;mov [fbuf], ax ; 0 ; open file number 251 ; 26/06/2022 252 00000119 A3[B405] mov [fbuf+2], ax ; 0 ; character count 253 254 0000011C E904FF jmp prn_2 255 256 prn_8: 257 sys _write, [prnfnum], EmptyLines, 4 ; 2 rows 72 <1> 73 <1> %if %0 >= 2 74 0000011F 8B1E[B005] <1> mov bx, %2 75 <1> %if %0 >= 3 76 00000123 B9[9005] <1> mov cx, %3 77 <1> %if %0 >= 4 78 00000126 BA0400 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 00000129 B80400 <1> mov ax, %1 83 0000012C CD20 <1> int 20h 258 0000012E 723F jc short prn_err 259 260 ; 26/06/2022 261 00000130 A1[AC05] mov ax, [mtime] 262 00000133 8B16[AE05] mov dx, [mtime+2] 263 00000137 57 push di 264 00000138 E85901 call ctime 265 0000013B 5F pop di 266 ; cbuf = date&time string (26 bytes) 267 268 sys _write, [prnfnum], cbuf, 26 72 <1> 73 <1> %if %0 >= 2 74 0000013C 8B1E[B005] <1> mov bx, %2 75 <1> %if %0 >= 3 76 00000140 B9[1C04] <1> mov cx, %3 77 <1> %if %0 >= 4 78 00000143 BA1A00 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 00000146 B80400 <1> mov ax, %1 83 00000149 CD20 <1> int 20h 269 0000014B 7222 jc short prn_err 270 271 sys _write, [prnfnum], PageHeader-2, 2 72 <1> 73 <1> %if %0 >= 2 74 0000014D 8B1E[B005] <1> mov bx, %2 75 <1> %if %0 >= 3 76 00000151 B9[9A05] <1> mov cx, %3 77 <1> %if %0 >= 4 78 00000154 BA0200 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 00000157 B80400 <1> mov ax, %1 83 0000015A CD20 <1> int 20h 272 0000015C 7211 jc short prn_err 273 274 0000015E FF06[A605] inc word [pgnumber] 275 276 00000162 89FE mov si, di ; file name address (on stack) 277 278 00000164 31D2 xor dx, dx 279 prn_9: 280 00000166 AC lodsb 281 00000167 08C0 or al, al 282 00000169 740D jz short prn_10 283 0000016B FEC2 inc dl 284 0000016D EBF7 jmp short prn_9 285 286 prn_err: 287 0000016F B8[6B05] mov ax, printer_err_msg 288 00000172 E87300 call print_msg 289 00000175 E921FF jmp p_err_exit 290 291 prn_10: 292 00000178 89F9 mov cx, di 293 ;sys _write, [prnfnum], di, dx 294 sys _write 72 <1> 73 <1> %if %0 >= 2 74 <1> mov bx, %2 75 <1> %if %0 >= 3 76 <1> mov cx, %3 77 <1> %if %0 >= 4 78 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 0000017A B80400 <1> mov ax, %1 83 0000017D CD20 <1> int 20h 295 0000017F 72EE jc short prn_err 296 297 00000181 B9[9C05] mov cx, PageHeader 298 00000184 B206 mov dl, 6 299 ;sys _write, [prnfnum], PageHeader, dx 300 sys _write 72 <1> 73 <1> %if %0 >= 2 74 <1> mov bx, %2 75 <1> %if %0 >= 3 76 <1> mov cx, %3 77 <1> %if %0 >= 4 78 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 00000186 B80400 <1> mov ax, %1 83 00000189 CD20 <1> int 20h 301 0000018B 72E2 jc short prn_err 302 303 0000018D A1[A605] mov ax, [pgnumber] 304 00000190 31D2 xor dx, dx ; 29/06/2022 305 00000192 E89D00 call write_pg_num 306 00000195 72D8 jc short prn_err 307 308 ; 26/06/2022 309 sys _write, [prnfnum], EmptyLines, 8 ; 4 rows 72 <1> 73 <1> %if %0 >= 2 74 00000197 8B1E[B005] <1> mov bx, %2 75 <1> %if %0 >= 3 76 0000019B B9[9005] <1> mov cx, %3 77 <1> %if %0 >= 4 78 0000019E BA0800 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 000001A1 B80400 <1> mov ax, %1 83 000001A4 CD20 <1> int 20h 310 000001A6 72C7 jc short prn_err 311 312 000001A8 8A16[A205] mov dl, [rows] 313 000001AC 80EA0B sub dl, 11 314 000001AF 89D5 mov bp, dx 315 316 write_next_char: 317 prn_11: 318 000001B1 E84C00 call getchar 319 320 ; 10/07/2022 321 000001B4 88C4 mov ah, al 322 000001B6 8626[AB05] xchg ah, [pchr] ; previous character 323 000001BA 3C0A cmp al, 0Ah 324 000001BC 750C jne short prn_13 325 000001BE 80FC0D cmp ah, 0Dh 326 000001C1 7407 je short prn_13 327 000001C3 B00D mov al, 0Dh 328 000001C5 E87F00 call writechar 329 000001C8 B00A mov al, 10 ; 0Ah 330 ; 331 prn_13: 332 000001CA E87A00 call writechar 333 000001CD 3C0A cmp al, 10 ; lf character, nextline 334 000001CF 75E0 jne short prn_11 335 000001D1 4D dec bp 336 000001D2 75DD jnz short prn_11 337 338 sys _write, [prnfnum], EmptyLines, 10 ; 5 rows 72 <1> 73 <1> %if %0 >= 2 74 000001D4 8B1E[B005] <1> mov bx, %2 75 <1> %if %0 >= 3 76 000001D8 B9[9005] <1> mov cx, %3 77 <1> %if %0 >= 4 78 000001DB BA0A00 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 000001DE B80400 <1> mov ax, %1 83 000001E1 CD20 <1> int 20h 339 000001E3 728A jc short prn_err 340 prn_12: 341 000001E5 E916FF jmp write_next_page 342 343 ;----------------------------------------------------------------- 344 ; 29/06/2022 345 346 print_msg: 347 ; ax = asciiz string address 348 000001E8 89C7 mov di, ax 349 000001EA 4F dec di 350 nextchr: 351 000001EB 47 inc di 352 000001EC 803D00 cmp byte [di], 0 353 000001EF 77FA ja short nextchr 354 ;cmp [di], 0Dh 355 ;ja short nextchr 356 000001F1 29C7 sub di, ax 357 ; di = asciiz string length 358 ; 359 sys _write, 1, ax, di 72 <1> 73 <1> %if %0 >= 2 74 000001F3 BB0100 <1> mov bx, %2 75 <1> %if %0 >= 3 76 000001F6 89C1 <1> mov cx, %3 77 <1> %if %0 >= 4 78 000001F8 89FA <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 000001FA B80400 <1> mov ax, %1 83 000001FD CD20 <1> int 20h 360 000001FF C3 retn 361 362 ; 25/06/2022 363 ;----------------------------------------------------------------- 364 365 getchar: 366 00000200 A0[A905] mov al, [cchar] 367 00000203 08C0 or al, al 368 00000205 7406 jz short getchar_1 369 00000207 C606[A905]00 mov byte [cchar], 0 370 0000020C C3 retn 371 getchar_1: 372 0000020D F606[A805]FF test byte [eof], 0FFh 373 00000212 7403 jz short getchar_2 374 00000214 B00A mov al, 10 ; lf, nextline 375 00000216 C3 retn 376 getchar_2: 377 00000217 E84300 call getc 378 0000021A 7306 jnc short getchar_ok 379 0000021C FE06[A805] inc byte [eof] 380 00000220 EBDE jmp short getchar 381 getchar_ok: 382 readf_ok: 383 00000222 C3 retn 384 385 ; 25/06/2022 386 ;----------------------------------------------------------------- 387 388 readf: 389 00000223 E8DAFF call getchar 390 00000226 A2[A905] mov [cchar], al 391 00000229 F606[A805]FF test byte [eof], 0FFh 392 0000022E 74F2 jz short readf_ok 393 readf_err: 394 00000230 F9 stc 395 00000231 C3 retn 396 397 ; 26/06/2022 398 ;----------------------------------------------------------------- 399 400 write_pg_num: 401 ; ax = page number 402 00000232 B90A00 mov cx, 10 403 w_pnum_1: 404 ; dx:ax = 32 bit dividend 405 ; cx = 16 bit divisor 406 407 00000235 E84B01 call div32 ; in 'ctime.s' 408 409 ; dx:ax = 32 bit quotient 410 ; bx = 16 bit remainder 411 412 00000238 53 push bx 413 00000239 21D2 and dx, dx 414 0000023B 7504 jnz short w_pnum_2 415 0000023D 21C0 and ax, ax 416 0000023F 7403 jz short w_pnum_3 417 w_pnum_2: 418 00000241 E8EEFF call write_pg_num 419 w_pnum_3: 420 00000244 58 pop ax 421 00000245 0430 add al, '0' 422 writechar: 423 00000247 A2[AA05] mov [chr], al 424 sys _write, [prnfnum], chr, 1 72 <1> 73 <1> %if %0 >= 2 74 0000024A 8B1E[B005] <1> mov bx, %2 75 <1> %if %0 >= 3 76 0000024E B9[AA05] <1> mov cx, %3 77 <1> %if %0 >= 4 78 00000251 BA0100 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 00000254 B80400 <1> mov ax, %1 83 00000257 CD20 <1> int 20h 425 00000259 A0[AA05] mov al, [chr] 426 0000025C C3 retn 427 428 ; 25/06/2022 429 ;----------------------------------------------------------------- 430 ; get characters from input file 431 432 getc: 433 0000025D A1[B405] mov ax, [fbuf+2] ; character count 434 00000260 21C0 and ax, ax 435 00000262 751A jnz short gch1 436 gch0: 437 00000264 8B1E[B205] mov bx, [fbuf] ; file descriptor/number 438 00000268 B9[B805] mov cx, fbuf + 6 ; read buffer address 439 0000026B 890E[B605] mov [fbuf+4], cx ; character offset 440 0000026F 29D2 sub dx, dx 441 00000271 B280 mov dl, 128 442 sys _read ; sys _read, bx, cx, dx 72 <1> 73 <1> %if %0 >= 2 74 <1> mov bx, %2 75 <1> %if %0 >= 3 76 <1> mov cx, %3 77 <1> %if %0 >= 4 78 <1> mov dx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 00000273 B80300 <1> mov ax, %1 83 00000276 CD20 <1> int 20h 443 00000278 7216 jc short gch2 444 0000027A 09C0 or ax, ax 445 0000027C 7414 jz short gch3 446 gch1: 447 0000027E 48 dec ax 448 0000027F A3[B405] mov [fbuf+2], ax ; character count in buffer 449 00000282 8B1E[B605] mov bx, [fbuf+4] ; current character offset 450 00000286 30E4 xor ah, ah 451 00000288 8A07 mov al, [bx] 452 0000028A 43 inc bx 453 0000028B 891E[B605] mov [fbuf+4], bx ; next character offset 454 0000028F C3 retn 455 gch2: 456 00000290 31C0 xor ax, ax 457 gch3: 458 00000292 F9 stc 459 00000293 C3 retn 460 461 ; 26/06/2022 462 ;================================================================= 463 %include 'ctime.s' 464 <1> ; **************************************************************************** 465 <1> ; 466 <1> ; CTIME.INC (Retro Unix 8086 v1 - /bin/ls - list file or directory) 467 <1> ; ---------------------------------------------------------------------------- 468 <1> ; 469 <1> ; RETRO UNIX 8086 (Retro Unix == Turkish Rational Unix) 470 <1> ; Operating System Project (v0.1) by ERDOGAN TAN (Beginning: 11/07/2012) 471 <1> ; Retro UNIX 8086 v1 - /bin/ls file 472 <1> ; 473 <1> ; [ Last Modification: 02/06/2022 ] 474 <1> ; 475 <1> ; Derivation from UNIX Operating System (v1.0 for PDP-11) 476 <1> ; (Original) Source Code by Ken Thompson (Bell Laboratories, 1971-1972) 477 <1> ; 478 <1> ; **************************************************************************** 479 <1> ; 480 <1> ; Derived from 'ctime.c' file of original UNIX v5 (usr/source/s3/ctime.c) 481 <1> ; 482 <1> ; LS0.ASM, 19/11/2013 - 24/11/2013 483 <1> ; include ctime.inc 484 <1> ; 485 <1> ; **************************************************************************** 486 <1> ; ctime1.s (02/06/2022 NASM version of 'ctime1.asm') -NASM 2.15- 487 <1> ; ctime1.asm (26/02/2022) -MASM 6.14- 488 <1> ; ctime0.asm (28/11/2013) 489 <1> 490 <1> ; .8086 491 <1> 492 <1> ;timezone equ 5*60*60 493 <1> 494 <1> 495 <1> ctime: ; ctime(at) 496 <1> ; int *at; 497 <1> ; { 498 <1> ; return(asctime(localtime(at))); 499 <1> ; } 500 <1> 501 <1> ; DX:AX = unix epoch time (in seconds) 502 <1> 503 <1> ;call localtime 504 <1> ;call asctime 505 <1> 506 <1> ;retn 507 <1> 508 <1> localtime: 509 <1> ; localtime(tim) 510 <1> ; int tim[]; 511 <1> ; { 512 <1> ; register int *t, *ct, dayno; 513 <1> ; int daylbegin, daylend; 514 <1> ; int copyt[2]; 515 <1> ; t = copyt; 516 <1> ; t[0] = tim[0]; 517 <1> ; t[1] = tim[1]; 518 <1> ; dpadd(t, -timezone); 519 <1> ; ct = gmtime(t); 520 <1> ; dayno = ct[YDAY]; 521 <1> ; if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 || 522 <1> ; dayno==5 && ct[HOUR]>=2))) { 523 <1> ; daylight =| 1; 524 <1> ; daylbegin = -1; 525 <1> ; daylend = 367; 526 <1> ; } else { 527 <1> ; daylbegin = sunday(ct, 119); /* last Sun in Apr */ 528 <1> ; daylend = sunday(ct, 303); /* last Sun in Oct */ 529 <1> ; } 530 <1> ; if (daylight && 531 <1> ; (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) && 532 <1> ; (dayno ; dpadd(t, 1*60*60); 534 <1> ; ct = gmtime(t); 535 <1> ; ct[ISDAY]++; 536 <1> ; } 537 <1> ; return(ct); 538 <1> ; } 539 <1> 540 <1> ;sub ax, timezone 541 <1> ;sbb dx, 0 542 <1> 543 <1> ;push dx 544 <1> ;push ax 545 <1> 546 00000294 E85D00 <1> call gmtime 547 <1> 548 <1> ; if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 || 549 <1> ; dayno==5 && ct[HOUR]>=2))) { 550 <1> ;cmp byte [nixonflg], 0 551 <1> ;jna short lt1 552 <1> ;cmp word [year], 1974 553 <1> ;jb short lt1 554 <1> ;ja short lt0 555 <1> ;cmp word [yday], 5 556 <1> ;jb short lt1 557 <1> ;ja short lt0 558 <1> ;cmp word [hour], 2 559 <1> ;jb short lt1 560 <1> ; nixonflag > 0 561 <1> ;lt0: 562 <1> ;mov word [daylight], 1 563 <1> ;mov word [daylbegin], -1 564 <1> ;mov word [daylend], 367 565 <1> ; ;jmp short lt2 566 <1> 567 <1> ; } else { 568 <1> ;lt1: 569 <1> ; mov cx, 119 570 <1> ; call sunday ; sunday(ct, 119); /* last Sun in Apr */ 571 <1> ; mov word [daylbegin], cx 572 <1> ; mov cx, 303 573 <1> ; call sunday ; sunday(ct, 303); /* last Sun in Oct */ 574 <1> ; mov word [daylend], cx 575 <1> ;lt2: 576 <1> ; if (daylight && 577 <1> ; (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) && 578 <1> ; (dayno 580 <1> ; pop ax 581 <1> ; pop dx 582 <1> 583 <1> ;cmp byte [daylight], 0 584 <1> ;jna short lt5 585 <1> 586 <1> ;mov cx, word [yday] 587 <1> 588 <1> ;cmp cx, word [daylbegin] 589 <1> ;jb short lt5 590 <1> ;ja short lt3 591 <1> ;cmp word [hour], 2 592 <1> ;jb short lt5 593 <1> ;jmp short lt4 594 <1> ;lt3: 595 <1> ;cmp cx, word [daylend] 596 <1> ;jb short lt4 597 <1> ;ja short lt5 598 <1> ;cmp word [hour], 1 599 <1> ;jnb short lt5 600 <1> ;lt4: 601 <1> ;add ax, 1*60*60 602 <1> ;adc dx, 0 603 <1> ;call gmtime 604 <1> ;inc word [isday] 605 <1> ;lt5: 606 <1> ; } 607 <1> ; return(ct); 608 <1> ; } 609 <1> 610 <1> ;retn 611 <1> 612 <1> ; 26/02/2022 (Retro UNIX 8086 v1, 2022 modification) 613 <1> asctime: 614 <1> ; asctime(t) 615 <1> ;int *t; 616 <1> ;{ 617 <1> ; register char *cp, *ncp; 618 <1> ; register int *tp; 619 <1> ; 620 <1> ; cp = cbuf; 621 <1> ; for (ncp = "Day Mon 00 00:00:00 1900\n"; *cp++ = *ncp++;); 622 <1> ; ncp = &"SunMonTueWedThuFriSat"[3*t[6]]; 623 <1> ; cp = cbuf; 624 <1> ; *cp++ = *ncp++; 625 <1> ; *cp++ = *ncp++; 626 <1> ; *cp++ = *ncp++; 627 <1> ; cp++; 628 <1> ; tp = &t[4]; 629 <1> ; ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[(*tp)*3]; 630 <1> ; *cp++ = *ncp++; 631 <1> ; *cp++ = *ncp++; 632 <1> ; *cp++ = *ncp++; 633 <1> ; cp = numb(cp, *--tp); 634 <1> ; cp = numb(cp, *--tp+100); 635 <1> ; cp = numb(cp, *--tp+100); 636 <1> ; cp = numb(cp, *--tp+100); 637 <1> ; cp =+ 2; 638 <1> ; cp = numb(cp, t[YEAR]); 639 <1> ; return(cbuf); 640 <1> ;} 641 <1> 642 <1> ;;mov di, cbuf 643 <1> ;;mov si, ncp0 644 <1> ;;mov cx, 13 645 <1> ;;movsw 646 <1> ; 647 00000297 BF[1C04] <1> mov di, cbuf 648 <1> ;mov si, word [wday] 649 <1> ;shl si, 1 650 <1> ;shl si, 1 651 <1> ;add si, ncp1 652 <1> ;movsw 653 <1> ;movsw 654 0000029A 8B36[B203] <1> mov si, word [month] 655 0000029E D1E6 <1> shl si, 1 656 000002A0 D1E6 <1> shl si, 1 657 000002A2 81C6[E803] <1> add si, ncp2 - 4 658 000002A6 A5 <1> movsw 659 000002A7 A5 <1> movsw 660 000002A8 A1[B003] <1> mov ax, word [day] 661 <1> ;mov cx, 10 662 000002AB B10A <1> mov cl, 10 663 000002AD E8E200 <1> call numb 664 000002B0 B020 <1> mov al, 20h 665 000002B2 AA <1> stosb 666 <1> ; 667 000002B3 A1[B403] <1> mov ax, word [year] 668 000002B6 B564 <1> mov ch, 100 669 000002B8 F6F5 <1> div ch 670 000002BA 50 <1> push ax ; 671 000002BB 98 <1> cbw ; century (19, 20) 672 000002BC E8D300 <1> call numb 673 000002BF 58 <1> pop ax 674 000002C0 88E0 <1> mov al, ah 675 000002C2 98 <1> cbw ; year (0 to 99) 676 000002C3 E8CC00 <1> call numb 677 000002C6 B020 <1> mov al, 20h 678 000002C8 AA <1> stosb 679 <1> ; 680 000002C9 8B36[B603] <1> mov si, word [wday] 681 000002CD D1E6 <1> shl si, 1 682 000002CF D1E6 <1> shl si, 1 683 000002D1 81C6[D003] <1> add si, ncp1 684 000002D5 A5 <1> movsw 685 000002D6 A5 <1> movsw 686 <1> ; 687 000002D7 A1[AE03] <1> mov ax, word [hour] 688 000002DA E8B500 <1> call numb 689 000002DD B03A <1> mov al, ':' 690 000002DF AA <1> stosb 691 000002E0 A1[AC03] <1> mov ax, word [minute] 692 000002E3 E8AC00 <1> call numb 693 000002E6 B03A <1> mov al, ':' 694 000002E8 AA <1> stosb 695 000002E9 A1[AA03] <1> mov ax, word [second] 696 000002EC E8A300 <1> call numb 697 000002EF B020 <1> mov al, 20h 698 000002F1 AA <1> stosb 699 <1> ;mov ax, word [year] 700 <1> ;mov ch, 100 701 <1> ;div ch 702 <1> ;push ax ; 703 <1> ;cbw ; century (19, 20) 704 <1> ;call numb 705 <1> ;pop ax 706 <1> ;mov al, ah 707 <1> ;cbw ; year (0 to 99) 708 <1> ;call numb 709 <1> ;mov al, 20h 710 <1> ;stosb 711 <1> ;xor al, al 712 <1> ;stosb 713 <1> 714 <1> ; 26/02/2022 715 000002F2 AA <1> stosb 716 <1> 717 000002F3 C3 <1> retn 718 <1> 719 <1> gmtime: 720 <1> ; 24/11/2013 (yday, wday) 721 <1> ; Retro UNIX 8086 v1 - UNIX.ASM (20/06/2013) 722 <1> ; Retro UNIX 8086 v1 feature/procedure only! 723 <1> ; 'convert_from_epoch' procedure prototype: 724 <1> ; UNIXCOPY.ASM, 10/03/2013 725 <1> ; 30/11/2012 726 <1> ; Derived from DALLAS Semiconductor 727 <1> ; Application Note 31 (DS1602/DS1603) 728 <1> ; 6 May 1998 729 <1> ; 730 <1> ; INPUT: 731 <1> ; DX:AX = Unix (Epoch) Time 732 <1> ; 733 <1> ; ((Modified registers: AX, DX, CX, BX)) 734 <1> ; 735 000002F4 B93C00 <1> mov cx, 60 736 000002F7 E88900 <1> call div32 737 <1> ;mov word [imin], ax ; whole minutes 738 <1> ;mov word [imin]+2, dx ; since 1/1/1970 739 000002FA 891E[AA03] <1> mov word [second], bx ; leftover seconds 740 <1> ;mov cx, 60 741 000002FE E88200 <1> call div32 742 <1> ;mov word [ihrs], ax ; whole hours 743 <1> ;mov word [ihrs]+2, dx ; since 1/1/1970 744 00000301 891E[AC03] <1> mov word [minute], bx ; leftover minutes 745 <1> ;mov cx, 24 746 00000305 B118 <1> mov cl, 24 747 00000307 E87900 <1> call div32 748 <1> ;mov word [iday], ax ; whole days 749 <1> ; since 1/1/1970 750 0000030A A3[B603] <1> mov word [wday], ax ; 24/11/2013 751 <1> ;mov word [iday]+2, dx ; DX = 0 752 0000030D 891E[AE03] <1> mov word [hour], bx ; leftover hours 753 00000311 05DB02 <1> add ax, 365+366 ; whole day since 754 <1> ; 1/1/1968 755 <1> ;adc dx, 0 ; DX = 0 756 <1> ;mov word [iday], ax 757 00000314 50 <1> push ax 758 00000315 B9B505 <1> mov cx, (4*365)+1 ; 4 years = 1461 days 759 00000318 E86800 <1> call div32 760 0000031B 59 <1> pop cx 761 <1> ;mov word [lday], ax ; count of quadyrs (4 years) 762 0000031C 53 <1> push bx 763 <1> ;mov word [qday], bx ; days since quadyr began 764 0000031D 83FB3C <1> cmp bx, 31 + 29 ; if past feb 29 then 765 00000320 F5 <1> cmc ; add this quadyr's leap day 766 00000321 83D000 <1> adc ax, 0 ; to # of qadyrs (leap days) 767 <1> ;mov word [lday], ax ; since 1968 768 <1> ;mov cx, word [iday] 769 00000324 91 <1> xchg cx, ax ; CX = lday, AX = iday 770 00000325 29C8 <1> sub ax, cx ; iday - lday 771 00000327 B96D01 <1> mov cx, 365 772 <1> ;xor dx, dx ; DX = 0 773 <1> ; AX = iday-lday, DX = 0 774 0000032A E85600 <1> call div32 775 <1> ;mov word [iyrs], ax ; whole years since 1968 776 <1> ; jday = iday - (iyrs*365) - lday 777 <1> ;mov word [jday], bx ; days since 1/1 of current year 778 0000032D 05B007 <1> add ax, 1968 ; compute year 779 00000330 A3[B403] <1> mov word [year], ax 780 00000333 89C2 <1> mov dx, ax 781 <1> ;mov ax, word [qday] 782 00000335 58 <1> pop ax 783 00000336 3D6D01 <1> cmp ax, 365 ; if qday <= 365 and qday >= 60 784 00000339 7707 <1> ja short gmt_1 ; jday = jday +1 785 0000033B 83F83C <1> cmp ax, 60 ; if past 2/29 and leap year then 786 0000033E F5 <1> cmc ; add a leap day to the # of whole 787 0000033F 83D300 <1> adc bx, 0 ; days since 1/1 of current year 788 <1> gmt_1: 789 <1> ;mov word [jday], bx 790 <1> ;mov word [yday], bx ; 24/11/2013 791 00000342 B90C00 <1> mov cx, 12 ; estimate month 792 00000345 87CB <1> xchg cx, bx ; CX = jday, BX = month 793 00000347 B86E01 <1> mov ax, 366 ; mday, max. days since 1/1 is 365 794 0000034A 83E203 <1> and dx, 11b ; year mod 4 (and dx, 3) 795 <1> gmt_2: ; Month calculation ; 0 to 11 (11 to 0) 796 0000034D 39C1 <1> cmp cx, ax ; mday = # of days passed from 1/1 797 0000034F 7315 <1> jnb short gmt_3 798 00000351 4B <1> dec bx ; month = month - 1 799 00000352 D1E3 <1> shl bx, 1 800 00000354 8B87[B803] <1> mov ax, word DMonth[BX] ; # elapsed days at 1st of month 801 00000358 D1EB <1> shr bx, 1 ; bx = month - 1 (0 to 11) 802 0000035A 83FB01 <1> cmp bx, 1 ; if month > 2 and year mod 4 = 0 803 0000035D 76EE <1> jna short gmt_2 ; then mday = mday + 1 804 0000035F 08D2 <1> or dl, dl ; if past 2/29 and leap year then 805 00000361 75EA <1> jnz short gmt_2 ; add leap day (to mday) 806 00000363 40 <1> inc ax ; mday = mday + 1 807 00000364 EBE7 <1> jmp short gmt_2 808 <1> gmt_3: 809 00000366 43 <1> inc bx ; -> bx = month, 1 to 12 810 00000367 891E[B203] <1> mov word [month], bx 811 0000036B 29C1 <1> sub cx, ax ; day = jday - mday + 1 812 0000036D 41 <1> inc cx 813 0000036E 890E[B003] <1> mov word [day], cx 814 <1> 815 <1> ; ax, bx, cx, dx is changed at return 816 <1> ; output -> 817 <1> ; [year], [month], [day], [hour], [minute], [second] 818 <1> ; [yday] -> 24/11/2013 819 <1> ; [wday] -> 24/11/2013 820 <1> ; 821 <1> ; 24/11/2013 822 00000372 A1[B603] <1> mov ax, word [wday] ; [iday] 823 00000375 30D2 <1> xor dl, dl ; xor dx, dx 824 <1> ; dx = 0 825 00000377 83C004 <1> add ax, 4 826 <1> ; NOTE: January 1, 1970 was THURSDAY 827 <1> ; ch = 0 828 0000037A B107 <1> mov cl, 7 829 0000037C F7F1 <1> div cx 830 0000037E 8916[B603] <1> mov word [wday], dx ; week of the day, 0 to 6 831 <1> ; 0 = sunday ... 6 = saturday 832 <1> ;mov word [isday], 0 833 <1> 834 00000382 C3 <1> retn 835 <1> 836 <1> div32: 837 <1> ; Input: 838 <1> ; DX:AX = 32 bit dividend 839 <1> ; CX = 16 bit divisor 840 <1> ; Output: 841 <1> ; DX:AX = 32 bit quotient 842 <1> ; BX = 16 bit remainder 843 00000383 89D3 <1> mov bx, dx 844 00000385 93 <1> xchg ax, bx 845 00000386 31D2 <1> xor dx, dx 846 00000388 F7F1 <1> div cx ; at first, divide DX 847 0000038A 93 <1> xchg ax, bx ; remainder is in DX 848 <1> ; now, BX has quotient 849 <1> ; save remainder 850 0000038B F7F1 <1> div cx ; so, DX_AX divided and 851 <1> ; AX has quotient 852 <1> ; DX has remainder 853 0000038D 87D3 <1> xchg dx, bx ; finally, BX has remainder 854 <1> 855 0000038F C3 <1> retn 856 <1> 857 <1> ;sunday: 858 <1> ; sunday(at, ad) 859 <1> ; int *at; 860 <1> ; { 861 <1> ; register int *t, d; 862 <1> ; t = at; 863 <1> ; d = ad; 864 <1> ; d = ad + dysize(t[YEAR]) - 365; 865 <1> ; return(d - (d - t[YDAY] + t[WDAY] + 700) % 7); 866 <1> ; } 867 <1> 868 <1> ;mov dx, word [year] 869 <1> ;call dysize 870 <1> ;sub ax, 365 871 <1> ;add cx, ax 872 <1> ; test word [year], 11b 873 <1> ; jnz short @f 874 <1> ; CX = 119 (77h) or CX = 303 (12Fh) 875 <1> ;inc cx 876 <1> ; inc cl 877 <1> ;@@: 878 <1> ; mov ax, cx 879 <1> ; add ax, word [wday] 880 <1> ;adc ax, 700 881 <1> ; add ax, 700 882 <1> ; sub ax, word [yday] 883 <1> ;xor dx, dx 884 <1> ; mov bx, 7 885 <1> ;div bx 886 <1> ; div bl 887 <1> ; sub cx, bx 888 <1> ; retn 889 <1> 890 <1> ;dysize: 891 <1> ; dysize(y) 892 <1> ; { 893 <1> ; if((y%4) == 0) 894 <1> ; return(366); 895 <1> ; return(365); 896 <1> ; } 897 <1> 898 <1> ; mov ax, 365 899 <1> ; test dx, 11b 900 <1> ; jnz short @f 901 <1> ; ;inc ax 902 00000390 FEC0 <1> inc al 903 <1> ;@@: 904 <1> ; retn 905 <1> 906 <1> 907 <1> numb: ; AX = 0 to 99 908 <1> ; 909 <1> ; numb(acp, n) 910 <1> ; { 911 <1> ; register char *cp; 912 <1> ; 913 <1> ; cp = acp; 914 <1> ; cp++; 915 <1> ; if (n>=10) 916 <1> ; *cp++ = (n/10)%10 + '0'; 917 <1> ; else 918 <1> ; *cp++ = ' '; 919 <1> ; *cp++ = n%10 + '0'; 920 <1> ; return(cp); 921 <1> ; } 922 <1> ; 923 <1> ;mov cl, 10 924 00000392 83F80A <1> cmp ax, 10 925 00000395 7306 <1> jnb short nb1 926 00000397 88C4 <1> mov ah, al 927 00000399 30C0 <1> xor al, al ; 0 928 0000039B EB04 <1> jmp short nb2 929 <1> nb1: 930 0000039D F6F1 <1> div cl 931 0000039F 88E2 <1> mov dl, ah 932 <1> nb2: 933 000003A1 0430 <1> add al, '0' 934 000003A3 AA <1> stosb ; digit 1 935 000003A4 88E0 <1> mov al, ah 936 000003A6 0430 <1> add al, '0' 937 000003A8 AA <1> stosb ; digit 2 938 000003A9 C3 <1> retn 939 <1> 940 <1> 941 <1> ;;; DATA 942 <1> 943 <1> ;daylight: db 1 ; int daylight 1; /* Allow daylight conversion */ 944 <1> ;nixonflg: db 0 ; int nixonflg 0; /* Daylight time all year around */ 945 <1> ;daylbegin: dw 0 946 <1> ;daylend: dw 0 947 <1> 948 <1> ct: 949 <1> ; 24/11/2013 (re-order) 950 <1> ; 951 <1> ; Retro UNIX 8086 v1 - UNIX.ASM 952 <1> ; 09/04/2013 epoch variables 953 <1> ; Retro UNIX 8086 v1 Prototype: UNIXCOPY.ASM, 10/03/2013 954 <1> ; 955 <1> 956 000003AA 0000 <1> second: dw 0 957 000003AC 0000 <1> minute: dw 0 958 000003AE 0000 <1> hour: dw 0 959 000003B0 0100 <1> day: dw 1 960 000003B2 0100 <1> month: dw 1 961 000003B4 B207 <1> year: dw 1970 962 000003B6 0000 <1> wday: dw 0 ; 24/11/2013 963 <1> ;yday: dw 0 ; 24/11/2013 964 <1> ;isday: dw 0 ; 24/11/2013 965 <1> 966 <1> DMonth: 967 000003B8 0000 <1> dw 0 968 000003BA 1F00 <1> dw 31 969 000003BC 3B00 <1> dw 59 970 000003BE 5A00 <1> dw 90 971 000003C0 7800 <1> dw 120 972 000003C2 9700 <1> dw 151 973 000003C4 B500 <1> dw 181 974 000003C6 D400 <1> dw 212 975 000003C8 F300 <1> dw 243 976 000003CA 1101 <1> dw 273 977 000003CC 3001 <1> dw 304 978 000003CE 4E01 <1> dw 334 979 <1> 980 <1> ;ncp0: db "Day Mon 00 00:00:00 1970", 0, 0 981 000003D0 53756E204D6F6E2054- <1> ncp1: db "Sun Mon Tue Wed Thu Fri Sat " 981 000003D9 756520576564205468- <1> 981 000003E2 752046726920536174- <1> 981 000003EB 20 <1> 982 000003EC 4A616E20466562204D- <1> ncp2: db "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec " 982 000003F5 617220417072204D61- <1> 982 000003FE 79204A756E204A756C- <1> 982 00000407 204175672053657020- <1> 982 00000410 4F6374204E6F762044- <1> 982 00000419 656320 <1> 983 <1> 984 <1> cbuf: ; char cbuf[26] 985 0000041C 00 <1> times 26 db 0 986 00000436 00 <1> db 0 ; 02/06/2022 987 <1> 988 <1> ;; ctime.c (Unix v5) 989 <1> ; 990 <1> ;# 991 <1> ;/* 992 <1> ; * This routine converts time as follows. 993 <1> ; * The epoch is 0000 Jan 1 1970 GMT. 994 <1> ; * The argument time is in seconds since then. 995 <1> ; * The localtime(t) entry returns a pointer to an array 996 <1> ; * containing 997 <1> ; * seconds (0-59) 998 <1> ; * minutes (0-59) 999 <1> ; * hours (0-23) 1000 <1> ; * day of month (1-31) 1001 <1> ; * month (0-11) 1002 <1> ; * year-1970 1003 <1> ; * weekday (0-6, Sun is 0) 1004 <1> ; * day of the year 1005 <1> ; * daylight savings flag 1006 <1> ; * 1007 <1> ; * The routine corrects for daylight saving 1008 <1> ; * time and will work in any time zone provided 1009 <1> ; * "timezone" is adjusted to the difference between 1010 <1> ; * Greenwich and local standard time (measured in seconds). 1011 <1> ; * In places like Michigan "daylight" must 1012 <1> ; * be initialized to 0 to prevent the conversion 1013 <1> ; * to daylight time. 1014 <1> ; * 1015 <1> ; * "nixonflg,", if set to 1, will 1016 <1> ; * cause daylight savings time all year around 1017 <1> ; * independently of "daylight". 1018 <1> ; * 1019 <1> ; * The routine does not work 1020 <1> ; * in Saudi Arabia which runs on Solar time. 1021 <1> ; * 1022 <1> ; * asctime(tvec)) 1023 <1> ; * where tvec is produced by localtime 1024 <1> ; * returns a ptr to a character string 1025 <1> ; * that has the ascii time in the form 1026 <1> ; * Thu Jan 01 00:00:00 1970n0\; * 01234567890123456789012345 1028 <1> ; * 0 1 2 1029 <1> ; * 1030 <1> ; * ctime(t) just calls localtime, then asctime. 1031 <1> ; */ 1032 <1> ;char cbuf[26]; 1033 <1> ;int dmsize[12] 1034 <1> ;{ 1035 <1> ; 31, 1036 <1> ; 28, 1037 <1> ; 31, 1038 <1> ; 30, 1039 <1> ; 31, 1040 <1> ; 30, 1041 <1> ; 31, 1042 <1> ; 31, 1043 <1> ; 30, 1044 <1> ; 31, 1045 <1> ; 30, 1046 <1> ; 31 1047 <1> ;}; 1048 <1> ; 1049 <1> ;int timezone 5*60*60; 1050 <1> ;int tzname[] 1051 <1> ;{ 1052 <1> ; "EST", 1053 <1> ; "EDT", 1054 <1> ;}; 1055 <1> ;int daylight 1; /* Allow daylight conversion */ 1056 <1> ;int nixonflg 0; /* Daylight time all year around */ 1057 <1> ; 1058 <1> ;#define SEC 0 1059 <1> ;#define MIN 1 1060 <1> ;#define HOUR 2 1061 <1> ;#define MDAY 3 1062 <1> ;#define MON 4 1063 <1> ;#define YEAR 5 1064 <1> ;#define WDAY 6 1065 <1> ;#define YDAY 7 1066 <1> ;#define ISDAY 8 1067 <1> ; 1068 <1> ;ctime(at) 1069 <1> ;int *at; 1070 <1> ;{ 1071 <1> ; return(asctime(localtime(at))); 1072 <1> ;} 1073 <1> ; 1074 <1> ;localtime(tim) 1075 <1> ;int tim[]; 1076 <1> ;{ 1077 <1> ; register int *t, *ct, dayno; 1078 <1> ; int daylbegin, daylend; 1079 <1> ; int copyt[2]; 1080 <1> ; 1081 <1> ; t = copyt; 1082 <1> ; t[0] = tim[0]; 1083 <1> ; t[1] = tim[1]; 1084 <1> ; dpadd(t, -timezone); 1085 <1> ; ct = gmtime(t); 1086 <1> ; dayno = ct[YDAY]; 1087 <1> ; if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 || 1088 <1> ; dayno==5 && ct[HOUR]>=2))) { 1089 <1> ; daylight =| 1; 1090 <1> ; daylbegin = -1; 1091 <1> ; daylend = 367; 1092 <1> ; } else { 1093 <1> ; daylbegin = sunday(ct, 119); /* last Sun in Apr */ 1094 <1> ; daylend = sunday(ct, 303); /* last Sun in Oct */ 1095 <1> ; } 1096 <1> ; if (daylight && 1097 <1> ; (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) && 1098 <1> ; (dayno ; dpadd(t, 1*60*60); 1100 <1> ; ct = gmtime(t); 1101 <1> ; ct[ISDAY]++; 1102 <1> ; } 1103 <1> ; return(ct); 1104 <1> ;} 1105 <1> ; 1106 <1> ;sunday(at, ad) 1107 <1> ;int *at; 1108 <1> ;{ 1109 <1> ; register int *t, d; 1110 <1> ; 1111 <1> ; t = at; 1112 <1> ; d = ad; 1113 <1> ; d = ad + dysize(t[YEAR]) - 365; 1114 <1> ; return(d - (d - t[YDAY] + t[WDAY] + 700) % 7); 1115 <1> ;} 1116 <1> ; 1117 <1> ;gmtime(tim) 1118 <1> ;int tim[]; 1119 <1> ;{ 1120 <1> ; register int d0, d1; 1121 <1> ; register *tp; 1122 <1> ; static xtime[9]; 1123 <1> ; extern int ldivr; 1124 <1> ; 1125 <1> ; /* 1126 <1> ; * break initial number into 1127 <1> ; * multiples of 8 hours. 1128 <1> ; * (28800 = 60*60*8) 1129 <1> ; */ 1130 <1> ; 1131 <1> ; d0 = ldiv(tim[0], tim[1], 28800); 1132 <1> ; d1 = ldivr; 1133 <1> ; tp = &xtime[0]; 1134 <1> ; 1135 <1> ; /* 1136 <1> ; * generate hours:minutes:seconds 1137 <1> ; */ 1138 <1> ; 1139 <1> ; *tp++ = d1%60; 1140 <1> ; d1 =/ 60; 1141 <1> ; *tp++ = d1%60; 1142 <1> ; d1 =/ 60; 1143 <1> ; d1 =+ (d0%3)*8; 1144 <1> ; d0 =/ 3; 1145 <1> ; *tp++ = d1; 1146 <1> ; 1147 <1> ; /* 1148 <1> ; * d0 is the day number. 1149 <1> ; * generate day of the week. 1150 <1> ; */ 1151 <1> ; 1152 <1> ; xtime[WDAY] = (d0+4)%7; 1153 <1> ; 1154 <1> ; /* 1155 <1> ; * year number 1156 <1> ; */ 1157 <1> ; for(d1=70; d0 >= dysize(d1); d1++) 1158 <1> ; d0 =- dysize(d1); 1159 <1> ; xtime[YEAR] = d1; 1160 <1> ; xtime[YDAY] = d0; 1161 <1> ; 1162 <1> ; /* 1163 <1> ; * generate month 1164 <1> ; */ 1165 <1> ; 1166 <1> ; if (dysize(d1)==366) 1167 <1> ; dmsize[1] = 29; 1168 <1> ; for(d1=0; d0 >= dmsize[d1]; d1++) 1169 <1> ; d0 =- dmsize[d1]; 1170 <1> ; dmsize[1] = 28; 1171 <1> ; *tp++ = d0+1; 1172 <1> ; *tp++ = d1; 1173 <1> ; xtime[ISDAY] = 0; 1174 <1> ; return(xtime); 1175 <1> ;} 1176 <1> ; 1177 <1> ;asctime(t) 1178 <1> ;int *t; 1179 <1> ;{ 1180 <1> ; register char *cp, *ncp; 1181 <1> ; register int *tp; 1182 <1> ; 1183 <1> ; cp = cbuf; 1184 <1> ; for (ncp = "Day Mon 00 00:00:00 1900\n"; *cp++ = *ncp++;); 1185 <1> ; ncp = &"SunMonTueWedThuFriSat"[3*t[6]]; 1186 <1> ; cp = cbuf; 1187 <1> ; *cp++ = *ncp++; 1188 <1> ; *cp++ = *ncp++; 1189 <1> ; *cp++ = *ncp++; 1190 <1> ; cp++; 1191 <1> ; tp = &t[4]; 1192 <1> ; ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[(*tp)*3]; 1193 <1> ; *cp++ = *ncp++; 1194 <1> ; *cp++ = *ncp++; 1195 <1> ; *cp++ = *ncp++; 1196 <1> ; cp = numb(cp, *--tp); 1197 <1> ; cp = numb(cp, *--tp+100); 1198 <1> ; cp = numb(cp, *--tp+100); 1199 <1> ; cp = numb(cp, *--tp+100); 1200 <1> ; cp =+ 2; 1201 <1> ; cp = numb(cp, t[YEAR]); 1202 <1> ; return(cbuf); 1203 <1> ;} 1204 <1> ; 1205 <1> ;dysize(y) 1206 <1> ;{ 1207 <1> ; if((y%4) == 0) 1208 <1> ; return(366); 1209 <1> ; return(365); 1210 <1> ;} 1211 <1> ; 1212 <1> ; 1213 <1> ;numb: 1214 <1> ; 1215 <1> ; 1216 <1> ;numb(acp, n) 1217 <1> ;{ 1218 <1> ; register char *cp; 1219 <1> ; cp = acp; 1220 <1> ; cp++; 1221 <1> ; if (n>=10) 1222 <1> ; *cp++ = (n/10)%10 + '0'; 1223 <1> ; else 1224 <1> ; *cp++ = ' '; 1225 <1> ; *cp++ = n%10 + '0'; 1226 <1> ; return(cp); 1227 <1> ;} 1228 <1> ; 464 ;================================================================= 465 466 ;----------------------------------------------------------------- 467 ; data - initialized data 468 ;----------------------------------------------------------------- 469 470 lpt1: 471 00000437 2F6465762F6C707200 db '/dev/lpr', 0 472 473 program_msg: 474 00000440 0D0A db 0Dh, 0Ah 475 00000442 526574726F20554E49- db 'Retro UNIX 8086 v1 PRINT Utility by Erdogan TAN - 10/07/2022' 475 0000044B 582038303836207631- 475 00000454 205052494E54205574- 475 0000045D 696C69747920627920- 475 00000466 4572646F67616E2054- 475 0000046F 414E202D2031302F30- 475 00000478 372F32303232 476 0000047E 0D0A00 db 0Dh, 0Ah, 0 477 usage_msg: 478 00000481 0D0A db 0Dh, 0Ah 479 00000483 55736167653A207072- db 'Usage: pr [ -rlcm ] filename1 ... ' 479 0000048C 205B202D726C636D20- 479 00000495 5D2066696C656E616D- 479 0000049E 6531202E2E2E20 480 000004A5 0D0A db 0Dh, 0Ah 481 000004A7 09202020204F707469- db ' Options: ' 481 000004B0 6F6E733A20 482 000004B5 0D0A db 0Dh, 0Ah 483 000004B7 202020202020202020- db ' -r : 66 lines per page (default option)' 483 000004C0 202020202D72203A20- 483 000004C9 3636206C696E657320- 483 000004D2 706572207061676520- 483 000004DB 2864656661756C7420- 483 000004E4 6F7074696F6E29 484 000004EB 0D0A db 0Dh, 0Ah 485 000004ED 202020202020202020- db ' -l : 78 lines per page' 485 000004F6 202020202D6C203A20- 485 000004FF 3738206C696E657320- 485 00000508 7065722070616765 486 00000510 0D0A db 0Dh, 0Ah 487 00000512 202020202020202020- db ' -m : modification date (default option)' 487 0000051B 202020202D6D203A20- 487 00000524 6D6F64696669636174- 487 0000052D 696F6E206461746520- 487 00000536 2864656661756C7420- 487 0000053F 6F7074696F6E29 488 00000546 0D0A db 0Dh, 0Ah 489 00000548 202020202020202020- db ' -c : current date' 489 00000551 202020202D63203A20- 489 0000055A 63757272656E742064- 489 00000563 617465 490 00000566 0D0A db 0Dh, 0Ah 491 nextline: 492 00000568 0D0A00 db 0Dh, 0Ah, 0 493 494 size_pmsg equ usage_msg-(program_msg+1) 495 496 printer_err_msg: 497 0000056B 0D0A db 0Dh, 0Ah 498 0000056D 5072696E7465722045- db "Printer Error !" 498 00000576 72726F722021 499 0000057C 0D0A00 db 0Dh, 0Ah, 0 500 501 size_umsg equ printer_err_msg-(usage_msg+1) 502 503 file_err_msg: 504 0000057F 0D0A db 0Dh, 0Ah 505 00000581 46696C65204572726F- db "File Error !" 505 0000058A 722021 506 0000058D 0D0A00 db 0Dh, 0Ah, 0 507 508 EmptyLines: 509 00000590 0D0A0D0A0D0A0D0A0D- db 0Dh, 0Ah, 0Dh, 0Ah, 0Dh, 0Ah, 0Dh, 0Ah, 0Dh, 0Ah 509 00000599 0A 510 0000059A 2020 db 20h, 20h 511 PageHeader: 512 0000059C 205061676520 db " Page " 513 514 000005A2 42 rows: db 66 515 000005A3 00 cdatef: db 0 516 517 ;----------------------------------------------------------------- 518 ; bss - uninitialized data 519 ;----------------------------------------------------------------- 520 521 align 2 522 523 bss_start: 524 525 ABSOLUTE bss_start 526 527 000005A4 ?? argc: resb 1 528 000005A5 ?? files: resb 1 529 000005A6 ???? pgnumber: resw 1 530 000005A8 ?? eof: resb 1 531 000005A9 ?? cchar: resb 1 532 000005AA ?? chr: resb 1 533 000005AB ?? pchr: resb 1 ; 10/07/2022 534 000005AC ???????? mtime: resd 1 535 536 ; 26/06/2022 537 000005B0 ???? prnfnum: resw 1 538 539 fbuf: 540 txtfnum: 541 000005B2 resb 128+6 542 stbuf: 543 00000638 resb 34 544 545 bss_end: 546 547 ;----------------------------------------------------------------- 548 ; 25/06/2022 549 ;----------------------------------------------------------------- 550 ; Original UNIX v2 - pr (utility) disassembled source code 551 ;----------------------------------------------------------------- 552 553 ; 554 ; +-------------------------------------------------------------------------+ 555 ; | This file has been generated by The Interactive Disassembler (IDA) | 556 ; | Copyright (c) 2013 Hex-Rays, | 557 ; +-------------------------------------------------------------------------+ 558 ; 559 ; File Name : C:\Users\Erdošan\Desktop\s2.tar\bin\pr 560 ; Format : Binary file 561 ; Base Address: 0000h Range: 4000h - 448Eh Loaded length: 0000048Eh 562 563 ; Processor : PDP11 564 ; Target assembler: Macro-11 Assembler 565 566 ;.macro .array of,type,cnt,val 567 ;.rept cnt 568 ; type val 569 ;.endr 570 ;.endm .array 571 572 ; =========================================================================== 573 574 ;; Segment type: Regular 575 ;.PSECT RAM 576 ;byte_0: .blkb 40000 577 ;; --------------------------------------------------------------------------- 578 ; 579 ;loc_40000: 580 ; br loc_40014 581 ;; --------------------------------------------------------------------------- 582 ; .word 2216 583 ; .word 0 584 ; .word 0 585 ; .word 0 586 ; .word 0 587 ;; --------------------------------------------------------------------------- 588 ; 589 ;loc_40014: 590 ; trap 33 591 ;; --------------------------------------------------------------------------- 592 ; .word intr_loc 593 ;; --------------------------------------------------------------------------- 594 ; mov (SP)+, argc 595 ; tst (SP)+ 596 ; clr R0 597 ; trap 34 598 ;; --------------------------------------------------------------------------- 599 ; .word fnum 600 ;; --------------------------------------------------------------------------- 601 ; bit #1, statbuf 602 ; beq chmod_err 603 ; trap 22 604 ;; --------------------------------------------------------------------------- 605 ; .word ttyx ; "/dev/tty0" 606 ; .word statbuf 607 ;; --------------------------------------------------------------------------- 608 ; mov fnum, R0 609 ; sub statbuf, R0 610 ; add #60, R0 ; '0' 611 ; movb R0, ttyx+10 612 ; trap 17 613 ;; --------------------------------------------------------------------------- 614 ; .word ttyx ; "/dev/tty0" 615 ; .word 14 616 ;; --------------------------------------------------------------------------- 617 ; bcs chmod_err 618 ; inc chmodflg 619 ; 620 ;chmod_err: 621 ; clr fnum 622 ; 623 ;err_cf: 624 ; mov fnum, R0 625 ; beq err_cf_next 626 ; trap 6 627 ; clr fnum 628 ; 629 ;err_cf_next: 630 ; dec argc 631 ; bgt next_arg 632 ; jmp intr_loc 633 ;; --------------------------------------------------------------------------- 634 ; 635 ;next_arg: 636 ; mov (SP)+, R0 637 ; mov R0, fname_ptr 638 ; cmpb (R0)+, #55 ; '-' 639 ; bne open_txt_file 640 ; cmpb @R0, #154 ; 'l' 641 ; bne case_r 642 ; mov #78., rows 643 ; br err_cf 644 ;; --------------------------------------------------------------------------- 645 ; 646 ;case_r: 647 ; cmpb @R0, #162 ; 'r' 648 ; bne case_m 649 ; mov #66., rows 650 ; br err_cf 651 ;; --------------------------------------------------------------------------- 652 ; 653 ;case_m: 654 ; cmpb @R0, #155 ; 'm' 655 ; bne case_c 656 ; clr cdateflg 657 ; br err_cf 658 ;; --------------------------------------------------------------------------- 659 ; 660 ;case_c: 661 ; cmpb @R0, #143 ; 'c' 662 ; bne open_txt_file 663 ; inc cdateflg 664 ; br err_cf 665 ;; --------------------------------------------------------------------------- 666 ; 667 ;open_txt_file: 668 ; mov fname_ptr, R0 669 ; jsr R5, fopen 670 ;; --------------------------------------------------------------------------- 671 ; .word fnum 672 ;; --------------------------------------------------------------------------- 673 ; bcs err_cf 674 ; tst cdateflg 675 ; beq get_fmod_time 676 ; trap 15 677 ; mov @#word_177304, mtime_l 678 ; mov @#word_177302, mtime_h 679 ; br write_pages 680 ;; --------------------------------------------------------------------------- 681 ; 682 ;get_fmod_time: 683 ; mov fnum, R0 684 ; trap 34 685 ;; --------------------------------------------------------------------------- 686 ; .word fstatbuf 687 ;; --------------------------------------------------------------------------- 688 ; mov i_mtime_l, mtime_l 689 ; mov i_mtime_h, mtime_h 690 ; 691 ;write_pages: 692 ; clr pagenumber 693 ; clr eof 694 ; clr cchar 695 ; 696 ;write_next_page: 697 ; call readf 698 ; br err_cf 699 ;; --------------------------------------------------------------------------- 700 ; mov #1, R0 701 ; trap 4 702 ;; --------------------------------------------------------------------------- 703 ; .word EmptyLines ; "\n\n\n\n\n" 704 ; .word 2 705 ;; --------------------------------------------------------------------------- 706 ; mov #1, R0 707 ; mov mtime_l, @#word_177304 708 ; mov mtime_h, @#word_177302 709 ; call write_hdr_date 710 ; mov #1, R0 711 ; trap 4 712 ;; --------------------------------------------------------------------------- 713 ; .word PageHeader ; " Page " 714 ; .word 2 715 ;; --------------------------------------------------------------------------- 716 ; inc pagenumber 717 ; mov fname_ptr, R1 718 ; mov R1, f_name_ptr 719 ; mov #-1, R0 720 ; 721 ;strlen: 722 ; inc R0 723 ; tstb (R1)+ 724 ; bne strlen 725 ; mov R0, charcount 726 ; mov #1, R0 727 ; trap 4 728 ;; --------------------------------------------------------------------------- 729 ;f_name_ptr: .word 40000 730 ;charcount: .word 40000 731 ;; --------------------------------------------------------------------------- 732 ; mov #1, R0 733 ; trap 4 734 ;; --------------------------------------------------------------------------- 735 ; .word PageHeader+2 736 ; .word 6 737 ;; --------------------------------------------------------------------------- 738 ; mov pagenumber, @#word_177304 739 ; call write_pg_num 740 ; mov #1, R0 741 ; trap 4 742 ;; --------------------------------------------------------------------------- 743 ; .word EmptyLines ; "\n\n\n\n\n" 744 ; .word 4 745 ;; --------------------------------------------------------------------------- 746 ; mov rows, R1 747 ; sub #11., R1 748 ; 749 ;write_next_char: 750 ; call get_char 751 ; call write_char 752 ; cmp R0, #10. 753 ; bne write_next_char 754 ; dec R1 755 ; bne write_next_char 756 ; mov #1, R0 757 ; trap 4 758 ;; --------------------------------------------------------------------------- 759 ; .word EmptyLines ; "\n\n\n\n\n" 760 ; .word 5 761 ;; --------------------------------------------------------------------------- 762 ; br write_next_page 763 ;; --------------------------------------------------------------------------- 764 ; 765 ;intr_loc: 766 ; 767 ; tst chmodflg 768 ; beq _exit 769 ; trap 17 770 ;; --------------------------------------------------------------------------- 771 ; .word ttyx ; "/dev/tty0" 772 ; .word 15 773 ;; --------------------------------------------------------------------------- 774 ; 775 ;_exit: 776 ; trap 1 777 ; 778 ;; =============== SUBROUTINE ================================================ 779 ; 780 ; 781 ;write_pg_num: 782 ; 783 ; clr @#word_177302 784 ; mov #10., @#word_177300 785 ; mov @#word_177302, -(SP) 786 ; tst @#word_177304 787 ; beq wrt_pg_num_1 788 ; call write_pg_num 789 ; 790 ;wrt_pg_num_1: 791 ; mov (SP)+, R0 792 ; add #60, R0 ; '0' 793 ; 794 ;write_char: 795 ; mov R0, pn_chr 796 ; mov #1, R0 797 ; trap 4 798 ;; End of function write_pg_num 799 ; 800 ;; --------------------------------------------------------------------------- 801 ; .word pn_chr 802 ; .word 1 803 ;; --------------------------------------------------------------------------- 804 ; mov pn_chr, R0 805 ; return 806 ; 807 ;; =============== SUBROUTINE ================================================ 808 ; 809 ; 810 ;get_char: 811 ; 812 ; mov cchar, R0 813 ; beq get_char_1 814 ; clr cchar 815 ; return 816 ;; --------------------------------------------------------------------------- 817 ; 818 ;get_char_1: 819 ; tst eof 820 ; beq get_next_char 821 ; mov #10., R0 822 ; return 823 ;; --------------------------------------------------------------------------- 824 ; 825 ;get_next_char: 826 ; jsr R5, getc 827 ;; End of function get_char 828 ; 829 ;; --------------------------------------------------------------------------- 830 ; .word fnum 831 ;; --------------------------------------------------------------------------- 832 ; bcc getc_ok 833 ; mov PC, eof 834 ; br get_char 835 ;; --------------------------------------------------------------------------- 836 ; 837 ;getc_ok: 838 ; return 839 ; 840 ;; =============== SUBROUTINE ================================================ 841 ; 842 ; 843 ;readf: 844 ; call get_char 845 ; mov R0, cchar 846 ; tst eof 847 ; bne readf_err 848 ; add #2, @SP 849 ; 850 ;readf_err: 851 ; return 852 ;; End of function readf 853 ; 854 ;; --------------------------------------------------------------------------- 855 ;EmptyLines: .ascii <12> 856 ; .ascii <12> 857 ; .ascii <12> 858 ; .ascii <12><12> 859 ;PageHeader: .ascii \ Page \ 860 ;ttyx: .ascii \/dev/tty0\<0> 861 ; .byte 0 ; 862 ;rows: .word 102 863 ;mtime_l: .word 0 864 ;mtime_h: .word 0 865 ;argc: .word 0 866 ; 867 ;eof: .word 0 868 ; 869 ;cchar: .word 0 870 ;pn_chr: .word 0 871 ; 872 ;pagenumber: .word 0 873 ; 874 ;fnum: .word 0 875 ;statbuf: .word 0 876 ; .word 0 877 ; .word 0 878 ; .word 0 879 ;fstatbuf: .word 0 880 ; .word 0 881 ; .word 0 882 ; .word 0 883 ; .word 0 884 ; .word 0 885 ; .word 0 886 ; .word 0 887 ; .word 0 888 ; .word 0 889 ; .word 0 890 ; .word 0 891 ; .word 0 892 ; .word 0 893 ;i_mtime_h: .word 0 894 ;i_mtime_l: .word 0 895 ;i_rsvd: .word 0 896 ; .array of .bytes cnt=132 val=0 897 ;chmodflg: .word 0 898 ;fname_ptr: .word 0 899 ; 900 ;cdateflg: .word 0 901 ;; --------------------------------------------------------------------------- 902 ; 903 ;write_hdr_date: 904 ; mov R1, -(SP) 905 ; sub #20, SP 906 ; mov R0, R1 907 ; mov SP, R0 908 ; call calc_date 909 ; mov R0, datebufptr 910 ; mov R1, R0 911 ; trap 4 912 ;; --------------------------------------------------------------------------- 913 ;datebufptr: .word 40000 914 ; .word 15. 915 ;; --------------------------------------------------------------------------- 916 ; add #16., SP 917 ; mov (SP)+, R1 918 ; return 919 ;; --------------------------------------------------------------------------- 920 ; 921 ;calc_date: 922 ; mov R2, -(SP) 923 ; mov R3, -(SP) 924 ; cmp @#word_177302, word_41700 925 ; bcs loc_41372 926 ; bhi loc_41340 927 ; cmp @#word_177304, word_41702 928 ; bcs loc_41372 929 ; 930 ;loc_41340: 931 ; mov @#word_177302, -(SP) 932 ; sub word_41702, @#word_177304 933 ; sbc @SP 934 ; sub word_41700, @SP 935 ; mov (SP)+, @#word_177302 936 ; mov #29., february 937 ; 938 ;loc_41372: 939 ; mov #-4, @#word_177314 940 ; mov #32274, @#word_177300 941 ; mov @#word_177304, R3 942 ; mov @#word_177302, @#word_177304 943 ; mov #2, @#word_177314 944 ; mov #15., @#word_177300 945 ; add #15., R0 946 ; jsr R5, divide 947 ;; --------------------------------------------------------------------------- 948 ; .word 10. 949 ;; --------------------------------------------------------------------------- 950 ; jsr R5, divide 951 ; .word 6 952 ;; --------------------------------------------------------------------------- 953 ; movb #72, -(R0) ; ':' 954 ; jsr R5, divide 955 ;; --------------------------------------------------------------------------- 956 ; .word 10. 957 ;; --------------------------------------------------------------------------- 958 ; jsr R5, divide 959 ;; --------------------------------------------------------------------------- 960 ; .word 6 961 ;; --------------------------------------------------------------------------- 962 ; movb #72, -(R0) ; ':' 963 ; mov R3, @#word_177304 964 ; mov #30, @#word_177300 965 ; mov @#word_177304, R3 966 ; mov @#word_177302, @#word_177304 967 ; jsr R5, divide 968 ;; --------------------------------------------------------------------------- 969 ; .word 10. 970 ;; --------------------------------------------------------------------------- 971 ; jsr R5, divide 972 ;; --------------------------------------------------------------------------- 973 ; .word 10. 974 ;; --------------------------------------------------------------------------- 975 ; mov #mdays, R2 976 ; 977 ;loc_41544: 978 ; cmp @R2, R3 979 ; bgt loc_41554 980 ; sub (R2)+, R3 981 ; br loc_41544 982 ;; --------------------------------------------------------------------------- 983 ; 984 ;loc_41554: 985 ; movb #40, -(R0) ; ' ' 986 ; sub #mdays, R2 987 ; asl R2 988 ; add #byte_41740, R2 989 ; inc R3 990 ; mov R3, @#word_177304 991 ; jsr R5, divide 992 ;; --------------------------------------------------------------------------- 993 ; .word 10. 994 ;; --------------------------------------------------------------------------- 995 ; tst @#word_177304 996 ; beq loc_41630 997 ; add #60, @#word_177304 ; '0' 998 ; movb @#word_177304, -(R0) 999 ; br loc_41634 1000 ;; --------------------------------------------------------------------------- 1001 ; 1002 ;loc_41630: 1003 ; movb #40, -(R0) ; ' ' 1004 ; 1005 ;loc_41634: 1006 ; movb #40, -(R0) ; ' ' 1007 ; movb -(R2), -(R0) 1008 ; movb -(R2), -(R0) 1009 ; movb -(R2), -(R0) 1010 ; mov (SP)+, R3 1011 ; mov (SP)+, R2 1012 ; return 1013 ; 1014 ;; =============== SUBROUTINE ================================================ 1015 ; 1016 ; 1017 ;divide: 1018 ; clr @#word_177302 1019 ; mov (R5)+, @#word_177300 1020 ; add #60, @#word_177302 ; '0' 1021 ; movb @#word_177302, -(R0) 1022 ; rts R5 1023 ;; End of function divide 1024 ; 1025 ;; --------------------------------------------------------------------------- 1026 ;word_41700: .word 70310 1027 ;word_41702: .word 11000 1028 ;mdays: .word 31. 1029 ;february: .word 28. 1030 ; .word 31. 1031 ; .word 30. 1032 ; .word 31. 1033 ; .word 30. 1034 ; .word 31. 1035 ; .word 31. 1036 ; .word 30. 1037 ; .word 31. 1038 ; .word 30. 1039 ; .word 999. 1040 ; .byte 0 1041 ;Jan: .ascii \Jan;byte_41740: .byte 0 1043 ;Feb: .ascii \Feb\<0> 1044 ;Mar: .ascii \Mar\<0> 1045 ;Apr: .ascii \Apr\<0> 1046 ;May: .ascii \May\<0> 1047 ;Jun: .ascii \Jun\<0> 1048 ;Jul: .ascii \Jul\<0> 1049 ;Aug: .ascii \Aug\<0> 1050 ;Sep: .ascii \Sep\<0> 1051 ;Oct: .ascii \Oct\<0> 1052 ;Nov: .ascii \Nov\<0> 1053 ;Dec: .ascii \Dec;; --------------------------------------------------------------------------- 1055 ; 1056 ;fopen: 1057 ; mov R1, -(SP) 1058 ; mov (R5)+, R1 1059 ; mov R0, fnameptr 1060 ; trap 5 1061 ;; --------------------------------------------------------------------------- 1062 ;fnameptr: .word 40000 1063 ; .word 0 1064 ;; --------------------------------------------------------------------------- 1065 ; bcs fopen_err 1066 ; mov R0, (R1)+ 1067 ; clr (R1)+ 1068 ; mov (SP)+, R1 1069 ; rts R5 1070 ;; --------------------------------------------------------------------------- 1071 ; 1072 ;fopen_err: 1073 ; mov #-1, @R1 1074 ; mov (SP)+, R1 1075 ; sec 1076 ; rts R5 1077 ;; --------------------------------------------------------------------------- 1078 ; mov @R5, fbuf 1079 ; mov (R5)+, word_42072 1080 ; jsr R5, getc 1081 ;; --------------------------------------------------------------------------- 1082 ;word_42072: .word 40000 1083 ;; --------------------------------------------------------------------------- 1084 ; bcc getw 1085 ; rts R5 1086 ;; --------------------------------------------------------------------------- 1087 ; 1088 ;getw: 1089 ; mov R0, -(SP) 1090 ; jsr R5, getc 1091 ;; --------------------------------------------------------------------------- 1092 ;fbuf: .word 40000 1093 ;; --------------------------------------------------------------------------- 1094 ; swab R0 1095 ; bis (SP)+, R0 1096 ; rts R5 1097 ;; --------------------------------------------------------------------------- 1098 ; 1099 ;getc: 1100 ; 1101 ; mov R1, -(SP) 1102 ; mov (R5)+, R1 1103 ; dec 2(R1) 1104 ; bge getcbuf 1105 ; mov R1, R0 1106 ; add #6, R0 1107 ; mov R0, bufoff 1108 ; mov R0, 4(R1) 1109 ; mov @R1, R0 1110 ; trap 3 1111 ;; --------------------------------------------------------------------------- 1112 ;bufoff: .word 40000 1113 ; .word 128. 1114 ;; --------------------------------------------------------------------------- 1115 ; bcs getw_err 1116 ; tst R0 1117 ; bne getw_ok 1118 ; 1119 ;getw_err: 1120 ; mov (SP)+, R1 1121 ; sec 1122 ; rts R5 1123 ;; --------------------------------------------------------------------------- 1124 ; 1125 ;getw_ok: 1126 ; dec R0 1127 ; mov R0, 2(R1) 1128 ; 1129 ;getcbuf: 1130 ; clr R0 1131 ; bisb @4(R1), R0 1132 ; inc 4(R1) 1133 ; mov (SP)+, R1 1134 ; rts R5 1135 ;; --------------------------------------------------------------------------- 1136 ; 1137 ;; end of 'RAM' 1138 ; 1139 ; .END