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