1 ; **************************************************************************** 2 ; ls386.s (ls1.s) - Retro Unix 386 v1.1 - /bin/ls - list file or directory 3 ; ---------------------------------------------------------------------------- 4 ; RETRO UNIX 386 (Retro Unix == Turkish Rational Unix) 5 ; Operating System Project (v0.2) by ERDOGAN TAN (Beginning: 24/12/2013) 6 ; 7 ; [ Last Modification: 22/01/2022 ] 8 ; 9 ; Derived from 'ls0.asm' source code file of 'Retro UNIX 8086 v1' 10 ; operating system project, /bin/ls source code by Erdogan Tan 11 ; (19/11/2013-29/11/2013) 12 ; 13 ; Derived from 'ls.s' file of original UNIX operating system 14 ; (v1.0 for PDP-11) 15 ; **************************************************************************** 16 17 ; ls1.s (04/12/2015), Retro UNIX 386 v1.1 (14 byte file names) 18 ; ls0.s (07/10/2015), Retro UNIX 386 v1 (8 byte file names) 19 20 ; ls386.s (23/09/2015, Retro UNIX 386 v1, NASM 2.11, 32 bit version) 21 ; LS0.ASM, 19/11/2013 - 29/11/2013 (Retro UNIX 8086 v1, MASM 6.11) 22 23 ; Assembler: NASM 2.15 (NASM v2.11) 24 ; nasm ls386.s -l ls386.txt -o ls386 -Z error.txt 25 26 ; 06/10/2015 27 ; 05/10/2015 28 ; 23/09/2015 29 30 ; UNIX v1 system calls 31 _rele equ 0 32 _exit equ 1 33 _fork equ 2 34 _read equ 3 35 _write equ 4 36 _open equ 5 37 _close equ 6 38 _wait equ 7 39 _creat equ 8 40 _link equ 9 41 _unlink equ 10 42 _exec equ 11 43 _chdir equ 12 44 _time equ 13 45 _mkdir equ 14 46 _chmod equ 15 47 _chown equ 16 48 _break equ 17 49 _stat equ 18 50 _seek equ 19 51 _tell equ 20 52 _mount equ 21 53 _umount equ 22 54 _setuid equ 23 55 _getuid equ 24 56 _stime equ 25 57 _quit equ 26 58 _intr equ 27 59 _fstat equ 28 60 _emt equ 29 61 _mdate equ 30 62 _stty equ 31 63 _gtty equ 32 64 _ilgins equ 33 65 _sleep equ 34 ; Retro UNIX 8086 v1 feature only ! 66 _msg equ 35 ; Retro UNIX 386 v1 feature only ! 67 _geterr equ 36 ; Retro UNIX 386 v1 feature only ! 68 69 %macro sys 1-4 70 ; 03/09/2015 71 ; 13/04/2015 72 ; Retro UNIX 386 v1 system call. 73 %if %0 >= 2 74 mov ebx, %2 75 %if %0 >= 3 76 mov ecx, %3 77 %if %0 = 4 78 mov edx, %4 79 %endif 80 %endif 81 %endif 82 mov eax, %1 83 int 30h 84 %endmacro 85 86 ; Retro UNIX 386 v1 system call format: 87 ; sys systemcall (eax) , , 88 89 [BITS 32] ; We need 32-bit intructions for protected mode 90 91 [ORG 0] 92 93 START_CODE: ; / ls -- list file or directory 94 95 ;.globl flush 96 ;.globl fopen 97 ;.globl getw 98 ;.globl getc 99 ;.globl putc 100 ;.globl ctime 101 ;.globl end 102 103 ;mov eax, _end + 512 104 ;and al, 0FEh 105 ;cmp eax, esp 106 ;jna short S1 107 ;mov esp, eax 108 ;S1: 109 ;mov ebx, eax 110 111 ; Retro UNIX 8086 v1 modification: 112 ; 'sys break' is not needed to extend 113 ; current user core memory 114 ; (because of 8086 segmentation and 32 kB 115 ; memory allocation); 116 ; but, it is needed to clear/reset 117 ; user core memory beyond of (after) previous 118 ; 'u.break' which depends on executable 119 ; file size; because 'bss' 120 ; data is not in current executable file 121 ; ('BSS' is an external data structure after 122 ; the last byte of the executable file). 123 124 ; clear bss area 125 ; (It is not necessary to clear bss area 126 ; because Retro UNIX 386 v1 kernel will clear 127 ; this bss area during memory page allocation.) 128 ;mov ecx, _end 129 ;mov edi, bss_start 130 ;sub ecx, edi 131 ;shr cx, 2 132 ;sub eax, eax 133 ;rep stosd 134 135 ; sys break 136 ; clears memory from 'bss' to 'bss._end+512' 137 00000000 BB[34150000] mov ebx, _end + 512 138 sys _break 70 <1> 71 <1> 72 <1> 73 <1> %if %0 >= 2 74 <1> mov ebx, %2 75 <1> %if %0 >= 3 76 <1> mov ecx, %3 77 <1> %if %0 = 4 78 <1> mov edx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 00000005 B811000000 <1> mov eax, %1 83 0000000A CD30 <1> int 30h 139 ; sys break; end+512. 140 sys _write, 1, nl, 2 70 <1> 71 <1> 72 <1> 73 <1> %if %0 >= 2 74 0000000C BB01000000 <1> mov ebx, %2 75 <1> %if %0 >= 3 76 00000011 B9[94080000] <1> mov ecx, %3 77 <1> %if %0 = 4 78 00000016 BA02000000 <1> mov edx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 0000001B B804000000 <1> mov eax, %1 83 00000020 CD30 <1> int 30h 141 ; 142 ; 12/01/2022 143 00000022 881D[1C0B0000] mov [obuf], bl ; 1 ; file descriptor/number 144 ;mov [obuf], bx ; 1 145 ; mov $1,obuf 146 00000028 89E6 mov esi, esp 147 ; mov sp,r5 148 0000002A AD lodsd 149 0000002B 48 dec eax 150 ; 12/01/2022 151 ; eax = number of arguments (except file name) 152 ; ((eax < 32)) 153 ; 12/01/2022 154 0000002C A2[C0080000] mov [count], al 155 ;mov [count], ax 156 ; mov (r5)+,count 157 ; tst (r5)+ 158 ; dec count 159 ; 12/01/2022 160 00000031 A2[C1080000] mov [ocount], al 161 ;mov [ocount], ax 162 ; mov count,ocount 163 ; bgt loop 164 ; mov $dotp,r5 165 00000036 766D jna short B0 166 ;and eax, eax 167 ;jnz short S2 168 ;jz short B0 169 ;mov esi, dotp 170 ;jmp short sloop 171 ;S2: 172 00000038 AD lodsd ; file name ptr 173 sloop: ;loop: 174 00000039 AD lodsd ; argument pointer in sequence 175 0000003A 89C3 mov ebx, eax 176 ;mov (r5)+,r4 177 0000003C 803B2D cmp byte [ebx], '-' 178 ; cmpb (r4)+,$'- 179 0000003F 754E jne short A1 180 ; bne 1f 181 00000041 43 inc ebx 182 ; 12/01/2022 183 00000042 FE0D[C1080000] dec byte [ocount] 184 ;dec word [ocount] 185 ; dec ocount 186 A3: ;3: 187 00000048 8A03 mov al, [ebx] 188 ; movb (r4)+,r0 189 0000004A 43 inc ebx 190 0000004B 08C0 or al, al 191 0000004D 7445 jz short eloop ; end of argument (string) 192 ; beq eloop 193 0000004F 3C6C cmp al, 'l' 194 ; cmp r0,$'l 195 00000051 7508 jne short S3 196 ; bne 4f 197 ; 12/01/2022 198 00000053 FE05[C2080000] inc byte [longf] 199 ;inc word [longf] 200 ; inc longf 201 00000059 EBED jmp short A3 202 ; br 3b 203 S3: ;4: 204 0000005B 3C74 cmp al, 't' 205 ; cmpb r0,$'t 206 0000005D 750C jne short S4 207 ; bne 4f 208 ; 12/01/2022 209 ; (save mtime position) 210 0000005F C705[CC080000]1400- mov dword [sortoff], 20 ; 14+6 (runix v1.1 fs) 210 00000067 0000 211 ;mov dword [sortoff], 14 ; 8+6 (runix v1 fs) 212 ; mov $14.,sortoff 213 00000069 EBDD jmp short A3 214 ; br 3b 215 S4: ;4: 216 0000006B 3C61 cmp al, 'a' 217 ; cmpb r0,$'a 218 0000006D 7508 jne short S5 219 ; bne 4f 220 ; 12/01/2022 221 0000006F FE05[C4080000] inc byte [allflg] 222 ;inc word [allflg] 223 ; inc allflg 224 00000075 EBD1 jmp short A3 225 S5: ;4: 226 00000077 3C73 cmp al, 's' 227 ; cmpb r0,$'s 228 00000079 7508 jne short S6 229 ; bne 4f 230 0000007B FE05[C3080000] inc byte [longf+1] 231 ; incb longf+1 232 00000081 EBC5 jmp short A3 233 ; br 3b 234 S6: ;4: 235 00000083 3C64 cmp al, 'd' 236 ; cmpb r0,$'d 237 00000085 75C1 jne short A3 238 ; bne 3b 239 ; 12/01/2022 240 00000087 FE05[C5080000] inc byte [dirflg] 241 ;inc word [dirflg] 242 ; inc dirflg 243 0000008D EBB9 jmp short A3 244 ; br 3b 245 A1: ;1: 246 ;dec ebx 247 ; dec r4 248 0000008F E829000000 call do 249 ; jsr pc,do 250 eloop: 251 ; 12/01/2022 252 00000094 FE0D[C0080000] dec byte [count] 253 ;dec word [count] 254 ; dec count 255 0000009A 7F9D jg short sloop 256 ; bgt loop 257 0000009C A1[86080000] mov eax, [dnp] 258 000000A1 21C0 and eax, eax 259 ;tst dnp 260 000000A3 7507 jnz short S7 261 ; bne 1f 262 B0: 263 000000A5 BE[8A080000] mov esi, dotp 264 ; mov $dotp,r5 265 000000AA EB8D jmp short sloop 266 ; br loop 267 S7: ;1: 268 000000AC BE[1C0B0000] mov esi, obuf 269 000000B1 E84A050000 call flush 270 ; jsr r5,flush; obuf 271 sys _exit 70 <1> 71 <1> 72 <1> 73 <1> %if %0 >= 2 74 <1> mov ebx, %2 75 <1> %if %0 >= 3 76 <1> mov ecx, %3 77 <1> %if %0 = 4 78 <1> mov edx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 000000B6 B801000000 <1> mov eax, %1 83 000000BB CD30 <1> int 30h 272 ; sys exit 273 274 ; 04/12/2015 (14 byte file names) 275 ;; 26 bytes listing (source) data 276 ;; structure: 277 ;; offset 278 ;; 0-13 : file name 279 ;; 14-15 : flags 280 ;; 16-17 : nlinks, uid 281 ;; 18-19 : size 282 ;; 20-21-22-23 : mtime 283 ;; 24-25 : inode number 284 285 do: 286 000000BD 56 push esi ; r5 287 000000BE 29C0 sub eax, eax 288 000000C0 A3[C8080000] mov [tblocks], eax ; 0 289 ; clr tblocks 290 000000C5 BD[34130000] mov ebp, _end 291 ; mov $end,r1 292 000000CA BF[D0080000] mov edi, filnam 293 ; mov $filnam,r3 294 000000CF 891D[86080000] mov [dnp], ebx 295 ; mov r4,dnp 296 000000D5 89DE mov esi, ebx ; r4 297 ;mov [isadir], ax ; 0 298 ; ; clr isadir 299 ; 12/01/2022 300 000000D7 A2[C6080000] mov [isadir], al ; 0 301 ;cmp [dirflg], ax ; 0 302 ; ; tst dirflg 303 ;ja nondir 304 ; ; bne nondir 305 ; 12/01/2022 306 000000DC 3805[C5080000] cmp [dirflg], al 307 000000E2 7605 jna short do_stat 308 000000E4 E9BE000000 jmp nondir 309 do_stat: 310 ;mov ebx, [dnp] 311 000000E9 B9[F0080000] mov ecx, statb 312 sys _stat 70 <1> 71 <1> 72 <1> 73 <1> %if %0 >= 2 74 <1> mov ebx, %2 75 <1> %if %0 >= 3 76 <1> mov ecx, %3 77 <1> %if %0 = 4 78 <1> mov edx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 000000EE B812000000 <1> mov eax, %1 83 000000F3 CD30 <1> int 30h 313 ; sys stat; dnp: 0; statb 314 000000F5 731B jnc short B1 315 ; bec 1f 316 ; EBX = file name address 317 000000F7 BE[03010000] mov esi, S8 318 do_err: 319 000000FC E8A9020000 call questf 320 00000101 5E pop esi 321 00000102 C3 retn 322 ;jsr r5,questf; < nonexistent\n\0>; .even 323 ; rts pc 324 S8: 325 00000103 206E6F6E6578697374- db ' nonexistent', 0Dh, 0Ah, 0 325 0000010C 656E740D0A00 326 327 B1: ;1: 328 ; 12/01/2022 329 ;test word [statb+2], 4000h 330 00000112 F605[F3080000]40 test byte [statb+3], 40h ; directory ? 331 ; ; bit $40000,statb+2 /test directory 332 ;jz nondir 333 ; ; beq nondir 334 ; 12/01/2022 335 00000119 7505 jnz short B8 ; yes 336 ; not directory 337 0000011B E987000000 jmp nondir 338 B8: 339 ;inc word [isadir] 340 ; inc isadir 341 ; 12/01/2022 342 00000120 FE05[C6080000] inc byte [isadir] 343 ;mov eax, ebx 344 ; mov r4,r0 345 00000126 57 push edi 346 00000127 BF[14090000] mov edi, dbuf 347 0000012C E8F2040000 call fopen 348 ; jsr r5,fopen; dbuf 349 00000131 5F pop edi 350 00000132 7315 jnc short B2 351 ; bcc 1f 352 ; EBX = file name address 353 00000134 BE[3B010000] mov esi, S9 354 00000139 EBC1 jmp short do_err 355 ;call questf 356 ;pop esi 357 ;retn 358 ; jsr r5,questf; < unreadable\n\0>; .even 359 ; rts pc 360 S9: 361 0000013B 20756E726561646162- db ' unreadable', 0Dh, 0Ah, 0 361 00000144 6C650D0A00 362 B2: 363 ;mov esi, ebx ; r4 364 S10: ;1: 365 00000149 AC lodsb 366 0000014A AA stosb 367 ;movb (r4)+,(r3)+ 368 0000014B 08C0 or al, al 369 0000014D 75FA jnz short S10 370 ; bne 1b 371 0000014F 4F dec edi 372 ; dec r3 373 ; 374 00000150 807FFF2F cmp byte [edi-1],'/' 375 ; cmpb -1(r3),$'/ 376 00000154 7403 je short B3 377 ; beq 1f 378 00000156 B02F mov al, '/' 379 00000158 AA stosb 380 ; movb $'/,(r3)+ 381 B3: ;1: 382 ;mov ebx, dbuf 383 00000159 BE[14090000] mov esi, dbuf 384 S11: 385 0000015E E8D1040000 call getw 386 ; jsr r5,getw; dbuf 387 00000163 726B jc short pass2 388 ; bcs pass2 389 ; 12/01/2022 390 00000165 29C9 sub ecx, ecx 391 00000167 B107 mov cl, 7 392 ;mov ecx, 7 ; 04/12/2015 (14 byte file names) 393 ; mov $4,-(sp) 394 00000169 21C0 and eax, eax ; 12/01/2022 395 ;and ax, ax 396 ; tst r0 397 0000016B 750B jnz short B5 398 ; bne 2f 399 B4: ;3: 400 0000016D 51 push ecx 401 ; mov esi, dbuf 402 0000016E E8C1040000 call getw 403 ; jsr r5,getw; dbuf 404 00000173 59 pop ecx 405 00000174 E2F7 loop B4 406 ; dec (sp) 407 ; bne 3b 408 ; tst (sp)+ 409 00000176 EBE6 jmp short S11 410 ;jmp short B3 411 ; br 1b 412 B5: ;2: 413 ; EDI == r2 414 ; mov r3,r2 415 00000178 57 push edi ; r3 (filnam +'/'+1) 416 B6: ;2: 417 ;; copying file name 418 ;; to listing (source) data address (ebp) 419 ;; (offset 0-13) ; 04/12/2015 (14 byte file names) 420 ;; and filnam (edi) 421 ; 422 00000179 51 push ecx 423 ; mov esi, dbuf 424 0000017A E8B5040000 call getw 425 ; jsr r5,getw; dbuf 426 0000017F 66894500 mov [ebp], ax 427 00000183 45 inc ebp 428 00000184 45 inc ebp 429 ; mov r0,(r1)+ 430 00000185 66AB stosw 431 ;stosb 432 ; movb r0,(r2)+ 433 ;xchg al, ah 434 ; swab r0 435 ;stosb 436 ; movb r0,(r2)+ 437 00000187 59 pop ecx 438 00000188 E2EF loop B6 439 ; dec (sp) 440 ; bne 2b 441 ; tst (sp)+ 442 0000018A 31C0 xor eax, eax ; 0 443 0000018C AA stosb 444 ; clrb (r2)+ 445 0000018D 5F pop edi ; r3 446 ; 12/01/2022 447 0000018E 3805[C4080000] cmp [allflg], al ; 0 448 ;cmp [allflg], ax ; 0 449 ; tst allflg 450 00000194 770A ja short B7 451 ; bne 2f 452 00000196 803F2E cmp byte [edi], '.' 453 ; cmpb (r3),$'. 454 00000199 7505 jne short B7 455 ; bne 2f 456 0000019B 83ED0E sub ebp, 14 ; 04/12/2015 (14 byte file names) 457 ; sub $8.,r1 458 0000019E EBBE jmp short S11 459 ;jmp short B3 460 ; br 1b 461 B7: ;2: 462 ;; copying 12 bytes inode data to 463 ;; listing (source) data from offset 464 ;; 14 to offset 25 (of 26 data bytes) 465 ; 466 000001A0 E860030000 call gstat 467 ; jsr r5,gstat 468 000001A5 EBB2 jmp short B3 469 ; br 1b 470 nondir: 471 ; mov esi, ebx ; r4 472 000001A7 89FB mov ebx, edi ; offset filnam 473 ;mov r3,r2 474 S12: ;1: 475 ; ESI points to file name (input) 476 000001A9 AC lodsb 477 000001AA AA stosb 478 ; movb (r4)+,(r2)+ 479 000001AB 20C0 and al, al 480 000001AD 75FA jnz short S12 481 ; bne 1b 482 S13: ;1: 483 000001AF 39DF cmp edi, ebx ; offset filnam 484 ; cmp r2,r3 485 000001B1 7607 jna short S14 486 ; blos 1f 487 000001B3 4F dec edi 488 000001B4 803F2F cmp byte [edi], '/' 489 ; cmpb -(r2),$'/ 490 000001B7 75F6 jne short S13 491 ; bne 1b 492 000001B9 47 inc edi 493 ; inc r2 494 ;; EDI points to last name 495 ;; of the path (after "/") 496 S14: ;1: 497 ; 12/01/2022 498 000001BA 31C9 xor ecx, ecx 499 000001BC B10E mov cl, 14 500 ;mov ecx, 14 ; 04/12/2015 (14 byte file names) 501 ; mov $8.,-(sp) 502 ndloop: ;1: 503 000001BE 8A07 mov al, [edi] 504 000001C0 884500 mov [ebp], al 505 000001C3 45 inc ebp 506 ; movb (r2)+,(r1)+ 507 ; bne 2f 508 ; dec r2 509 000001C4 08C0 or al, al 510 000001C6 7401 jz short S15 511 000001C8 47 inc edi 512 S15: 513 000001C9 E2F3 loop ndloop 514 000001CB E835030000 call gstat ; fill/get 12 bytes listing data 515 ;jmp short pass2 516 S16: ;2: 517 ; dec (sp) 518 ; bne 1b 519 ; jsr r5,gstat 520 ; tst (sp)+ 521 522 pass2: 523 ; 12/01/2022 524 000001D0 0FB61D[14090000] movzx ebx, byte [dbuf] 525 ;movzx ebx, word [dbuf] 526 ; mov dbuf,r0 527 sys _close 70 <1> 71 <1> 72 <1> 73 <1> %if %0 >= 2 74 <1> mov ebx, %2 75 <1> %if %0 >= 3 76 <1> mov ecx, %3 77 <1> %if %0 = 4 78 <1> mov edx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 000001D7 B806000000 <1> mov eax, %1 83 000001DC CD30 <1> int 30h 528 ; sys close 529 000001DE 89D9 mov ecx, ebx ; file descriptor 530 000001E0 BB[34130000] mov ebx, _end 531 ; mov $end,r2 532 000001E5 39DD cmp ebp, ebx ; ebp >= _end (= last word + 4) 533 ; cmp r1,r2 534 000001E7 7502 jne short C1 535 ; bne 1f 536 000001E9 5E pop esi ; r5 537 000001EA C3 retn 538 ; rts pc 539 C1: ;1: 540 ; sorting begins here 541 ; mov r5,-(sp) 542 000001EB 89EF mov edi, ebp ; current end of listing words (+4) 543 000001ED 55 push ebp ; r1 544 ; mov r1,-(sp) 545 546 ; EBX will point to mtime or file name (+14 or 0) 547 ; offset of 26 bytes listing (source) data 548 000001EE 031D[CC080000] add ebx, [sortoff] 549 ; add sortoff,r2 550 C2: ;1: 551 000001F4 89D8 mov eax, ebx 552 000001F6 AB stosd 553 ; mov r2,(r1)+ 554 ; 04/12/2015 (20 -> 26) 555 000001F7 83C31A add ebx, 26 ; EBX now points to next 26 bytes 556 ; add $20.,r2 557 000001FA 39EB cmp ebx, ebp ; is EBX passed the data limit ? 558 ; cmp r2,(sp) 559 000001FC 72F6 jb short C2 560 ; blo 1b 561 S17: 562 000001FE 89EB mov ebx, ebp 563 ; mov (sp),r2 564 00000200 83EF04 sub edi, 4 565 ; tst -(r1) 566 C3: ;1: 567 00000203 89FA mov edx, edi ; r1 568 S18: 569 ;mov ebp, ebx 570 ; mov r2,r3 571 C4: ;2: 572 00000205 83C504 add ebp, 4 573 ; tst (r3)+ 574 00000208 39D5 cmp ebp, edx 575 ; cmp r3,r1 576 0000020A 7724 ja short C7 577 ; bhi 2f 578 0000020C 8B33 mov esi, [ebx] ; file name 1 or time 1 579 ; mov (r2),r4 580 0000020E 8B7D00 mov edi, [ebp] ; file name 2 or time 2 581 ; mov (r3),r5 582 00000211 833D[CC080000]00 cmp dword [sortoff], 0 583 ; tst sortoff 584 00000218 7605 jna short C5 585 ; beq 4f 586 587 ; sorting by modification time 588 0000021A A7 cmpsd 589 0000021B 7209 jb short C6 590 ; cmp (r4)+,(r5)+ 591 ; blo 3f 592 ; bhi 2b 593 ; cmp (r4)+,(r5)+ 594 ; blo 3f 595 0000021D EBE6 jmp short C4 596 ; br 2b 597 598 ; sorting by file name 599 C5: ;4: 600 ; ? 601 ;; mov ecx, 14 ; 04/12/2015 (14 byte file names) 602 ;C5x: ;4: 603 0000021F A6 cmpsb 604 ; cmpb (r4)+,(r5)+ 605 00000220 7704 ja short C6 606 ; bhi 3f 607 00000222 72E1 jb short C4 608 ; blo 2b 609 ;dec ecx ; ? 610 ; dec r0 611 ;jnz short C5x ; ? 612 ;jmp short C5x 613 00000224 EBF9 jmp short C5 614 ; br 4b 615 C6: ;3: 616 ; 05/10/2015 617 ; (xchg [ebx],[ebp]) ; 22/01/2022 618 00000226 8B4500 mov eax, [ebp] 619 00000229 8703 xchg eax, [ebx] 620 0000022B 894500 mov [ebp], eax 621 ; mov (r2),-(sp) 622 ; mov (r3),(r2) 623 ; mov (sp)+,(r3) 624 0000022E EBD5 jmp short C4 625 ; br 2b 626 C7: ;2: 627 00000230 83C304 add ebx, 4 628 ; tst (r2)+ 629 00000233 39D3 cmp ebx, edx 630 ; cmp r2,r1 631 ;jb short S18 632 ;jb short C3 633 ; blo 1b 634 ; 635 00000235 7304 jnb short C8 636 00000237 89DD mov ebp, ebx 637 00000239 EBCA jmp short S18 638 C8: ;1: 639 ; end of sorting 640 0000023B 5D pop ebp ; r1 -> r2 641 ; mov (sp)+,r2 642 ; mov (sp)+,r5 643 644 ; BP = R2 645 pass3: 646 ; DX = R1 -> 'eol:' points to end of the list 647 0000023C 8915[B3080000] mov [eol], edx ; save dx/r1 648 ; 649 ; 13/01/2022 650 00000242 803D[C1080000]01 cmp byte [ocount], 1 651 ;cmp word [ocount], 1 652 ; cmp ocount,$1 653 00000249 7E1E jng short E1 654 ; ble 1f 655 ; 12/01/2022 656 0000024B 803D[C6080000]00 cmp byte [isadir], 0 657 ;cmp word [isadir], 0 658 ; tst isadir 659 00000252 7648 jna short E2 660 ; beq 2f 661 00000254 8B35[86080000] mov esi, [dnp] 662 ; mov dnp,0f 663 0000025A E83E010000 call pstring 664 ; jsr r5,pstring; 0:.. 665 0000025F BE[AF080000] mov esi, colon 666 ; jsr r5,pstring; colon 667 00000264 E834010000 call pstring 668 E1: ;1: 669 00000269 66833D[C2080000]00 cmp word [longf], 0 670 ; tst longf 671 ;jna E10 672 ; ; beq 1f 673 ; 12/01/2022 674 00000271 7705 ja short E16 675 00000273 E99E000000 jmp E10 676 E16: 677 00000278 BE[97080000] mov esi, totmes 678 0000027D E81B010000 call pstring 679 ; jsr r5,pstring; totmes 680 00000282 A1[C8080000] mov eax, [tblocks] 681 ; mov tblocks,r0 682 ;mov ebx, 4 683 ; 22/01/2022 684 00000287 29DB sub ebx, ebx 685 00000289 B304 mov bl, 4 686 0000028B E807030000 call decimal 687 ; jsr r5,decimal; 4 688 00000290 BE[94080000] mov esi, nl 689 00000295 E803010000 call pstring 690 ; jsr r5,pstring; nl 691 0000029A EB09 jmp short S19 692 E2: ;2: 693 0000029C 803D[C2080000]00 cmp byte [longf], 0 694 ; tstb longf 695 000002A3 7671 jna short E10 696 ; beq 1f 697 S19: 698 000002A5 BB[A3080000] mov ebx, passwd 699 ; mov $passwd,r0 700 000002AA BF[2A110000] mov edi, iobuf 701 000002AF E86F030000 call fopen 702 ; jsr r5,fopen; iobuf 703 000002B4 7260 jc short E10 704 ; bes 1f 705 000002B6 BF[2A0D0000] mov edi, uidbuf 706 ; mov $uidbuf,r3 707 E3: ;3: 708 E4: ;2: 709 000002BB BE[2A110000] mov esi, iobuf 710 S20: 711 000002C0 E882030000 call getc 712 ; jsr r5,getc; iobuf 713 000002C5 723B jc short E9 714 ; bes 3f 715 E17: 716 000002C7 AA stosb 717 ; movb r0,(r3)+ 718 000002C8 3C3A cmp al, ':' 719 ; cmpb r0,$': 720 ; 21/01/2022 721 000002CA 75F4 jne short S20 722 ;jne short E4 723 ; bne 2b 724 E5: ;2: 725 ;mov esi, iobuf 726 000002CC E876030000 call getc 727 ; jsr r5,getc; iobuf 728 000002D1 3C3A cmp al, ':' 729 ; cmpb r0,$': 730 000002D3 75F7 jne short E5 731 ; bne 2b 732 E6: ;2: 733 ;mov esi, iobuf 734 000002D5 E86D030000 call getc 735 ; jsr r5,getc; iobuf 736 000002DA 3C3A cmp al, ':' 737 ; cmpb r0,$': 738 000002DC 7403 je short E7 739 ; beq 2f ; 22/01/2022 740 000002DE AA stosb 741 ; movb r0,(r3)+ 742 000002DF EBF4 jmp short E6 743 ; br 2b 744 E7: ;2: 745 000002E1 B00D mov al, 0Dh 746 000002E3 AA stosb 747 ; movb $'\n,(r3)+ 748 000002E4 81FF[2A110000] cmp edi, euidbuf 749 ; cmp r3,$euidbuf 750 000002EA 7316 jnb short E9 751 ; bhis 3f 752 E8: ;2: 753 ;mov esi, iobuf 754 000002EC E856030000 call getc 755 ; jsr r5,getc; iobuf 756 000002F1 3C0D cmp al, 0Dh ; end of line 757 ; cmpb r0,$'\n 758 000002F3 75F7 jne short E8 759 ; bne 2b 760 ;jmp short E3 761 ; br 3b 762 ; 763 ; 22/01/2022 764 ; (msdos/windows 'passwd' text file, CRLF) 765 000002F5 E84D030000 call getc 766 000002FA 7206 jc short E9 767 000002FC 3C0A cmp al, 0Ah ; LF 768 000002FE 75C7 jne short E17 769 ; 770 00000300 EBBE jmp short S20 771 E9: ;3: 772 00000302 893D[8E080000] mov [euids], edi 773 ; mov r3,euids 774 ; 12/01/2022 775 00000308 0FB61D[2A110000] movzx ebx, byte [iobuf] 776 777 ; 07/10/2015 (32 bit modification) 778 ; Retro UNIX 8086 v1 modification !!! 779 ; 780 ;movzx ebx, word [iobuf] 781 ; 782 ;; ??? (file descriptor ???) 783 ;; Original unix v1 'ls.s' has/had source 784 ;; code defect here !!! 785 ; 786 sys _close 70 <1> 71 <1> 72 <1> 73 <1> %if %0 >= 2 74 <1> mov ebx, %2 75 <1> %if %0 >= 3 76 <1> mov ecx, %3 77 <1> %if %0 = 4 78 <1> mov edx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 0000030F B806000000 <1> mov eax, %1 83 00000314 CD30 <1> int 30h 787 ; sys close 788 E10: ;1: 789 ; BP = R2 790 ; [eol] = end of the list 791 ; (= r1 in original unix v1 'ls.s') 792 00000316 3B2D[B3080000] cmp ebp, [eol] 793 ; cmp r2,r1 794 0000031C 772F ja short E14 795 ; bhi 1f 796 0000031E 8B7500 mov esi, [ebp] 797 00000321 83C504 add ebp, 4 798 ; mov (r2)+,r3 799 00000324 2B35[CC080000] sub esi, [sortoff] 800 ; sub sortoff,r3 801 ;; 802 ;; ESI points to filename offset (0) 803 ;; of the listing (source) data (26 bytes) 804 ; 805 0000032A E83C000000 call pentry 806 ; jsr r5,pentry 807 ; 808 ; 12/01/2022 809 0000032F 29C9 sub ecx, ecx 810 00000331 B10E mov cl, 14 811 ;mov ecx, 14 ; 04/12/2015 (14 byte file names) 812 ; mov $8.,-(sp) 813 ;; print/write file name (on the end of 814 ;; the listing row (after time string) 815 E11: ;2: 816 00000333 AC lodsb 817 ; movb (r3)+,r0 818 00000334 08C0 or al, al 819 00000336 7409 jz short E13 820 ; beq 2f 821 00000338 51 push ecx 822 ;mov ebx, obuf 823 00000339 E8A3020000 call putc 824 ; jsr r5,putc; obuf 825 0000033E 59 pop ecx 826 0000033F E2F2 loop E11 827 ; dec (sp) 828 ; bne 2b 829 E13: ;2: 830 ; tst (sp)+ 831 00000341 BE[94080000] mov esi, nl ; new line 832 00000346 E852000000 call pstring 833 ; jsr r5,pstring; nl 834 0000034B EBC9 jmp short E10 835 ; br 1b 836 E14: ;1: 837 ; 12/01/2022 838 0000034D 803D[C1080000]01 cmp byte [ocount], 1 839 ;cmp word [ocount], 1 840 ; cmp ocount,$1 841 00000354 7E13 jng short E15 842 ; ble 1f 843 ; 12/01/2022 844 00000356 803D[C6080000]00 cmp byte [isadir], 0 845 ;cmp word [isadir], 0 846 ; tst isadir 847 0000035D 740A je short E15 848 ; beq 1f 849 0000035F BE[94080000] mov esi, nl 850 00000364 E834000000 call pstring 851 ; jsr r5,pstring; nl 852 E15: ;1: 853 00000369 5E pop esi ; r5 854 0000036A C3 retn 855 ; rts pc 856 857 pentry: 858 ;mov r2,-(sp) 859 0000036B 803D[C2080000]00 cmp byte [longf], 0 860 ; tstb longf 861 00000372 7741 ja short listl 862 ; bne listl 863 00000374 803D[C3080000]00 cmp byte [longf+1], 0 864 ; tstb longf+1 865 0000037B 7701 ja short S21 866 ; bne 2f 867 ; mov (sp)+,r2 868 0000037D C3 retn 869 ; rts r5 870 S21: ;2: 871 0000037E 0FB74612 movzx eax, word [esi+18] ; 04/12/2015 (+12 -> +18) 872 ; mov 12.(r3),r0 873 ; 12/01/2022 874 ; eax = file size 875 00000382 E84B020000 call calcb 876 ; jsr r5,calcb 877 00000387 56 push esi 878 ;mov ebx, 3 879 ; 12/01/2022 880 00000388 29DB sub ebx, ebx 881 0000038A B303 mov bl, 3 882 0000038C E806020000 call decimal 883 ; jsr r5,decimal; 3 884 00000391 E802000000 call _pstring 885 ; jsr r5,pstring; space 886 ; mov (sp)+,r2 887 00000396 5E pop esi 888 00000397 C3 retn 889 ; rts r5 890 891 _pstring: 892 00000398 BE[A1080000] mov esi, space 893 894 pstring: 895 ; mov r5,-(sp) 896 ; mov (r5),r5 897 S22: ;1: 898 0000039D AC lodsb 899 ; movb (r5)+,r0 900 0000039E 20C0 and al, al 901 000003A0 7407 jz short S23 902 ; beq 1f 903 ;mov ebx, obuf 904 000003A2 E83A020000 call putc 905 ; jsr r5,putc; obuf 906 000003A7 EBF4 jmp short S22 907 ; br 1b 908 S23: ;1: 909 000003A9 C3 retn 910 ; mov (sp)+,r5 911 ; tst (r5)+ 912 ; rts r5 913 914 questf: 915 000003AA 56 push esi 916 000003AB 89DE mov esi, ebx 917 ; mov r4,0f 918 000003AD E8EBFFFFFF call pstring 919 ; jsr r5,pstring; 0:.. 920 000003B2 5E pop esi 921 ; mov r5,0f 922 ;call pstring 923 ; jsr r5,pstring; 0:.. 924 ;retn 925 ; 926 000003B3 EBE8 jmp short pstring 927 ;1: 928 ; tstb (r5)+ 929 ; bne 1b 930 ; inc r5 931 ; bic $1,r5 932 ; rts r5 933 listl: 934 ; 06/10/2015 (32 bit modifications) 935 000003B5 0FB74618 movzx eax, word [esi+24] ; 04/12/2015 (+18 -> +24) 936 ; mov 18.(r3),r0 / inode 937 000003B9 56 push esi ; r3 938 ;mov ebx, 4 939 ; 12/01/2022 940 000003BA 31DB xor ebx, ebx 941 000003BC B304 mov bl, 4 942 000003BE E8D4010000 call decimal 943 ; jsr r5,decimal; 4 944 000003C3 E8D0FFFFFF call _pstring 945 ; jsr r5,pstring; space 946 947 000003C8 5E pop esi ; r3 948 000003C9 89F7 mov edi, esi 949 ; mov r3,r4 950 000003CB 83C70E add edi, 14 ; 04/12/2015 (8 -> 14) 951 ; add $8.,r4 / get to flags 952 F0: 953 ; 12/01/2022 954 000003CE F6470110 test byte [edi+1], 10h 955 ;test word [edi], 1000h 956 ; bit $10000,(r4) /large 957 000003D2 7404 jz short F1 958 ; beq 2f 959 000003D4 B06C mov al, 'l' 960 ; 13/01/2022 961 ;call mode 962 ; jsr r5,mode; 'l 963 000003D6 EB02 jmp short F2 964 ; br 3f 965 F1: ;2: 966 000003D8 B073 mov al, 's' 967 F2: 968 000003DA E802020000 call mode 969 ; jsr r5,mode; 's 970 ;F2: ;3: 971 000003DF F6470140 test byte [edi+1], 40h 972 ;test word [edi], 4000h 973 ; bit $40000,(r4) /directory 974 000003E3 7404 jz short F3 975 ; beq 2f 976 000003E5 B064 mov al, 'd' 977 ; 13/01/2022 978 ;call mode 979 ; jsr r5,mode; 'd 980 000003E7 EB12 jmp short F6 981 ; br 3f 982 F3: ;2: 983 000003E9 F60720 test byte [edi], 20h 984 ; bit $40,(r4) /set uid 985 000003EC 7404 jz short F4 986 ; beq 2f 987 000003EE B075 mov al, 'u' 988 ; 13/01/2022 989 ;call mode 990 ; jsr r5,mode; 'u 991 000003F0 EB09 jmp short F6 992 ; br 3f 993 F4: ;2: 994 ; 13/01/2022 995 000003F2 B02D mov al, '-' 996 000003F4 F60710 test byte [edi], 10h 997 ; bit $20,(r4) /executable 998 000003F7 7402 jz short F5 999 ; beq 2f 1000 000003F9 B078 mov al, 'x' 1001 ; 13/01/2022 1002 ;call mode 1003 ; jsr r5,mode; 'x 1004 ;jmp short F6 1005 ; br 3f 1006 F5: ;2: 1007 ; 13/01/2022 1008 ;call _mode 1009 ; jsr r5,mode; '- 1010 F6: ;3: 1011 ; 13/01/2022 1012 000003FB E8E1010000 call mode 1013 00000400 B02D mov al, '-' 1014 ; 1015 00000402 F60708 test byte [edi], 8 1016 ; bit $10,(r4) /read owner 1017 00000405 7402 jz short F7 1018 ; beq 2f 1019 00000407 B072 mov al, 'r' 1020 ; 13/01/2022 1021 F7: 1022 00000409 E8D3010000 call mode 1023 ; jsr r5,mode; 'r 1024 ;jmp short F8 1025 ; br 3f 1026 ;F7: ;2: 1027 ; 13/01/2022 1028 ;call _mode 1029 ; jsr r5, mode; '- 1030 F8: ;3: 1031 ; 13/01/2022 1032 0000040E B02D mov al, '-' 1033 ; 1034 00000410 F60704 test byte [edi], 4 1035 ; bit $4,(r4) /write owner 1036 00000413 7402 jz short F9 1037 ; beq 2f 1038 00000415 B077 mov al, 'w' 1039 ; 13/01/2022 1040 F9: 1041 00000417 E8C5010000 call mode 1042 ; jsr r5,mode; 'w 1043 ;jmp short F10 1044 ; br 3f 1045 ;F9: ;2: 1046 ;call _mode 1047 ; jsr r5,mode; '- 1048 F10: ;3: 1049 ; 13/01/2022 1050 0000041C B02D mov al, '-' 1051 ; 1052 0000041E F60702 test byte [edi], 2 1053 ; bit $2,(r4) /read non-owner 1054 00000421 7402 jz short F11 1055 ; beq 2f 1056 00000423 B072 mov al, 'r' 1057 ; 13/01/2022 1058 F11: 1059 00000425 E8B7010000 call mode 1060 ; jsr r5,mode; 'r 1061 ;jmp short F12 1062 ; br 3f 1063 ;F11: ;2: 1064 ;call _mode 1065 ; jsr r5,mode; '- 1066 F12: ;3: 1067 ; 13/01/2022 1068 0000042A B02D mov al, '-' 1069 ; 1070 0000042C F60701 test byte [edi], 1 ; (r4) 1071 ; bit $1,(r4)+ /write non-owner 1072 0000042F 7402 jz short F13 1073 ; beq 2f 1074 00000431 B077 mov al, 'w' 1075 F13: 1076 00000433 E8A9010000 call mode 1077 ; jsr r5,mode; 'w 1078 ;jmp short F14 1079 ; br 3f 1080 ;F13: ;2: 1081 ;call _mode 1082 ; jsr r5,mode; '- 1083 F14: ;3: 1084 00000438 56 push esi ; r3 1085 00000439 E85AFFFFFF call _pstring 1086 ; jsr r5,pstring; space 1087 ; inc edi, 4 ;; (r4)+ 1088 ; inc edi ;; 1089 0000043E 89FE mov esi, edi 1090 00000440 66AD lodsw ; (r4)+ 1091 ; 12/01/2022 1092 00000442 29C0 sub eax, eax 1093 00000444 AC lodsb ;; nlinks 1094 ;movzx eax, al 1095 ; movb (r4)+,r0 1096 ;mov ebx, 2 1097 ; 12/01/2022 1098 00000445 29DB sub ebx, ebx 1099 00000447 B302 mov bl, 2 1100 00000449 E841010000 call _decimal 1101 ; jsr r5,decimal; 2 1102 0000044E AC lodsb ;; uid 1103 ; movb (r4)+,r2 1104 0000044F E833000000 call puid 1105 ; jsr pc,puid 1106 00000454 66AD lodsw ;; size 1107 ; mov (r4)+,r0 1108 ;movzx eax, ax 1109 ;mov ebx, 5 1110 ; 12/01/2022 1111 00000456 31DB xor ebx, ebx 1112 00000458 B305 mov bl, 5 1113 0000045A E830010000 call _decimal 1114 ; jsr r5,decimal; 5 1115 0000045F 56 push esi 1116 00000460 E833FFFFFF call _pstring 1117 ; jsr r5,pstring; space 1118 00000465 5E pop esi 1119 ; mov r1,-(sp) 1120 00000466 8B1D[B3080000] mov ebx, [eol] ;r1 1121 0000046C AD lodsd ; mtime 1122 ; mov (r4)+,r0 1123 ; mov (r4)+,r1 1124 ; sub $16.,sp 1125 ; mov sp,r2 1126 ; EAX = unix time (epoch) 1127 0000046D E811020000 call ctime 1128 ; jsr pc,ctime 1129 ; mov sp,r2 1130 ;mov ecx, 25 1131 ; 12/01/2022 1132 00000472 29C9 sub ecx, ecx 1133 00000474 B119 mov cl, 25 1134 ;;mov ecx, 15 1135 ; mov $15.,-(sp) 1136 00000476 BE[68080000] mov esi, cbuf 1137 F15: ;1: 1138 0000047B 51 push ecx 1139 0000047C AC lodsb 1140 ; movb (r2)+,r0 1141 ;mov ebx, obuf 1142 0000047D E85F010000 call putc 1143 ; jsr r5,putc; obuf 1144 00000482 59 pop ecx 1145 00000483 E2F6 loop F15 1146 ; dec (sp) 1147 ; bne 1b 1148 ; add $18.,sp 1149 ; mov (sp)+,r1 1150 ;call _pstring 1151 ; jsr r5,pstring; space 1152 ; mov (sp)+,r2 1153 00000485 5E pop esi ; r3 1154 00000486 C3 retn 1155 ; rts r5 1156 1157 puid: 1158 ; 22/01/2022 1159 ; 20/01/2022 - Retro UNIX 386 v1.1 1160 ; 06/10/2015 (32 bit modifications) 1161 ; print user name 1162 ; AL = user id/number 1163 ; 1164 00000487 56 push esi ; r4 ; 20/01/2022 1165 G0: 1166 ; 22/01/2022 1167 ;push eax ; r2 1168 ; ; mov r1,-(sp) 1169 00000488 BE[2A0D0000] mov esi, uidbuf 1170 ; mov $uidbuf,r1 1171 G1: ;1: 1172 ; 22/01/2022 1173 0000048D 50 push eax ; r2 1174 ; mov r1,-(sp) 1175 ;cmp esi, [euids] ; 22/01/2022 1176 ; cmp r1,euids 1177 ;jnb short G8 1178 ; bhis 1f 1179 0000048E 56 push esi ; 0: 1180 ; mov r1,0f 1181 G2: ;2: 1182 0000048F AC lodsb 1183 00000490 20C0 and al, al 1184 ; tstb (r1)+ 1185 00000492 7409 jz short G3 1186 ; beq 3f 1187 00000494 3C3A cmp al, ':' 1188 ; cmpb -1(r1),$': 1189 00000496 75F7 jne short G2 1190 ; bne 2b 1191 00000498 30C0 xor al, al ; 0 1192 0000049A 8846FF mov [esi-1], al ;0 1193 ; clrb -1(r1) 1194 G3: ;3: 1195 0000049D 31DB xor ebx, ebx 1196 ; clr -(sp) 1197 ;mov ecx, 10 1198 0000049F B10A mov cl, 10 1199 G4: ;3: 1200 000004A1 AC lodsb 1201 ; movb (r1)+,r0 1202 000004A2 2C30 sub al, '0' 1203 ; sub $'0,r0 1204 000004A4 3C09 cmp al, 9 1205 ; cmp r0,$9. 1206 000004A6 770A ja short G5 1207 ; bhi 3f 1208 ; mov r1,-(sp) 1209 ; 07/10/2015 1210 000004A8 0FB6C0 movzx eax, al 1211 000004AB 93 xchg eax, ebx 1212 ; mov 2(sp),r1 1213 000004AC F7E1 mul ecx 1214 ; mpy $10.,r1 1215 000004AE 01C3 add ebx, eax 1216 ; add r0,r1 1217 ; mov r1,2(sp) 1218 ; mov (sp)+,r1 1219 000004B0 EBEF jmp short G4 1220 ; br 3b 1221 G5: ;3: 1222 ;pop esi ; 0: 1223 ; 20/01/2022 1224 ; (esi = r1) 1225 000004B2 5A pop edx ; 0: 1226 000004B3 58 pop eax ; r2 1227 ; mov (sp)+,r0 1228 000004B4 39C3 cmp ebx, eax 1229 ; cmp r0,r2 1230 ;jne short G1 1231 ; bne 1b 1232 000004B6 7424 je short S24 1233 ; 20/01/2022 1234 ; (esi = r1) 1235 000004B8 3B35[8E080000] cmp esi, [euids] ; 22/01/2022 1236 000004BE 72CD jb short G1 1237 ;jmp short G8 1238 G8: 1239 000004C0 50 push eax ; r2/UID 1240 000004C1 E8D2FEFFFF call _pstring 1241 ;jsr r5,pstring; space 1242 000004C6 58 pop eax 1243 ; mov r2,r0 1244 ;mov ebx, 3 1245 ; 12/01/2022 1246 000004C7 29DB sub ebx, ebx 1247 000004C9 B303 mov bl, 3 1248 000004CB E8C7000000 call decimal 1249 ; jsr r5,decimal; 3 1250 000004D0 BE[9E080000] mov esi, space3 1251 000004D5 E8C3FEFFFF call pstring 1252 ; jsr r5,pstring; space3 1253 000004DA 5E pop esi ; r4 ; 20/01/2022 1254 ; mov (sp)+,r1 1255 000004DB C3 retn 1256 ; rts pc 1257 S24: 1258 ;push esi ; 0: 1259 ; 20/01/2022 1260 000004DC 52 push edx ; 0: 1261 000004DD E8B6FEFFFF call _pstring 1262 ; jsr r5,pstring; space 1263 000004E2 5E pop esi ; 0: 1264 000004E3 56 push esi ; 0: 1265 000004E4 E8B4FEFFFF call pstring 1266 ; jsr r5,pstring; 0:.. 1267 000004E9 5E pop esi ; 0: 1268 ; mov 0b,r1 1269 ; 12/01/2022 1270 000004EA 31C9 xor ecx, ecx 1271 000004EC B106 mov cl, 6 1272 ;mov cx, 6 1273 ; mov $6,-(sp) 1274 G6: ;3: 1275 000004EE AC lodsb 1276 ; tstb (r1)+ 1277 000004EF 20C0 and al, al 1278 000004F1 7406 jz short G7 1279 ; beq 3f 1280 000004F3 FEC9 dec cl 1281 ; dec (sp) 1282 ;jmp short G6 1283 ; ; br 3b 1284 ; 22/01/2022 1285 ; (max. 5 chars of uid will be usable here) 1286 000004F5 75F7 jnz short G6 1287 000004F7 FEC1 inc cl 1288 G7: ;3: 1289 ;push cx 1290 ; 12/01/2022 1291 000004F9 51 push ecx 1292 000004FA E899FEFFFF call _pstring 1293 ; jsr r5,pstring; space 1294 ;pop cx 1295 000004FF 59 pop ecx 1296 ; 12/01/2022 1297 00000500 49 dec ecx 1298 ;dec cx 1299 ; dec (sp) 1300 ;jg short G7 1301 ; ; bgt 3b 1302 ; 22/01/2022 1303 00000501 75F6 jnz short G7 1304 ; tst (sp)+ 1305 00000503 5E pop esi ; r4 ; 20/01/2022 1306 ; mov (sp)+,r1 1307 00000504 C3 retn 1308 ; rts pc 1309 ;G8: ;1: 1310 ; jsr r5,pstring; space 1311 ; mov r2,r0 1312 ; jsr r5,decimal; 3 1313 ; jsr r5,pstring; space3 1314 ; mov (sp)+,r1 1315 ; rts pc 1316 1317 ;_mode: 1318 ; mov al, '-' 1319 ;mode: 1320 ; AL = mode char 1321 ; mov (r5)+,r0 1322 ;mov ebx, obuf 1323 ; call putc 1324 ; jsr r5,putc; obuf 1325 ; retn 1326 ; rts r5 1327 1328 gstat: 1329 ; 06/10/2015 (32 bit modifications) 1330 00000505 55 push ebp 1331 ; mov r1,-(sp) 1332 00000506 81C500020000 add ebp, 512 1333 ; add $512.,r1 1334 0000050C 3B2D[82080000] cmp ebp, [brk] 1335 ; cmp r1,0f 1336 00000512 720F jb short D1 1337 ; blo 1f 1338 00000514 892D[82080000] mov [brk], ebp 1339 ; mov r1,0f 1340 sys _break, ebp ; sys _break, brk 70 <1> 71 <1> 72 <1> 73 <1> %if %0 >= 2 74 0000051A 89EB <1> mov ebx, %2 75 <1> %if %0 >= 3 76 <1> mov ecx, %3 77 <1> %if %0 = 4 78 <1> mov edx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 0000051C B811000000 <1> mov eax, %1 83 00000521 CD30 <1> int 30h 1341 ; sys break; 0: end+512. 1342 D1: ;1: 1343 00000523 5D pop ebp 1344 ; mov (sp)+,r1 1345 00000524 31C0 xor eax, eax 1346 ; Detailed (Long) listing 1347 00000526 663905[C2080000] cmp [longf], ax ;0 1348 ; tst longf 1349 0000052D 7708 ja short D2 1350 ; bne 2f 1351 ; Sorting by modification time 1352 0000052F 3905[CC080000] cmp [sortoff], eax ;0 1353 ; tst sortoff 1354 00000535 761D jna short D4 1355 ; beq 1f 1356 D2: ;2: 1357 sys _stat, filnam, statb 70 <1> 71 <1> 72 <1> 73 <1> %if %0 >= 2 74 00000537 BB[D0080000] <1> mov ebx, %2 75 <1> %if %0 >= 3 76 0000053C B9[F0080000] <1> mov ecx, %3 77 <1> %if %0 = 4 78 <1> mov edx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 00000541 B812000000 <1> mov eax, %1 83 00000546 CD30 <1> int 30h 1358 ; sys stat; filnam; statb 1359 00000548 731C jnc short D3 1360 ; bec 2f 1361 ; mov r4,-(sp) 1362 ;mov ebx, filnam 1363 ; mov $filnam,r4 1364 0000054A BE[58050000] mov esi, S25 1365 0000054F E856FEFFFF call questf 1366 ; jsr r5,questf; < unstatable\n\0>; .even 1367 ; mov (sp)+,r4 1368 D4: 1369 ; 12/01/2022 1370 00000554 83C50C add ebp, 12 ; 26-14 ? 1371 ; add $12.,r1 1372 00000557 C3 retn 1373 ; rts r5 1374 S25: 1375 00000558 20756E737461746162- db ' unstatable', 0Dh, 0Ah, 0 1375 00000561 6C650D0A00 1376 1377 D3: ;2: 1378 00000566 57 push edi 1379 00000567 89EF mov edi, ebp 1380 00000569 BE[F2080000] mov esi, statb + 2 1381 ; mov $statb+2,r0 1382 0000056E A5 movsd 1383 ; mov (r0)+,(r1)+ /flags 1384 ; mov (r0)+,(r1)+ /nlinks, uid 1385 ; mov r0,-(sp) 1386 1387 0000056F 0FB706 movzx eax, word [esi] 1388 ; mov (r0),r0 1389 ; eax = file (directory) size 1390 00000572 E85B000000 call calcb 1391 ; jsr r5,calcb 1392 00000577 0105[C8080000] add [tblocks], eax 1393 ; add r0,tblocks 1394 ; mov (sp)+,r0 1395 0000057D 66A5 movsw 1396 ; mov (r0)+,(r1)+ /size 1397 0000057F 83C614 add esi, 20 1398 ; add $20.,r0 /dska, ctim 1399 00000582 A5 movsd ; inode (file) modification/write time 1400 ; mov (r0)+,(r1)+ /mtim 1401 ; mov (r0)+,(r1)+ 1402 00000583 66A1[F0080000] mov ax, [statb] 1403 00000589 66AB stosw 1404 ; mov statb,(r1)+ /inode 1405 0000058B 89FD mov ebp, edi 1406 0000058D 5F pop edi 1407 0000058E C3 retn 1408 ; rts r5 1409 ;D4: ;1: 1410 ; add ebp, 12 1411 ; add $12.,r1 1412 ; retn 1413 ; rts r5 1414 1415 _decimal: 1416 0000058F 56 push esi 1417 00000590 E802000000 call decimal 1418 00000595 5E pop esi 1419 00000596 C3 retn 1420 1421 decimal: 1422 ; convert number to decimal number chars 1423 ; 5/10/2015 (32 bit modifications) 1424 ; EAX = number to be converted 1425 ; EBX = number of digits (=4) 1426 ; mov r1,-(sp) 1427 ; mov r2,-(sp) 1428 ; mov r3,-(sp) 1429 ;push edi 1430 00000597 31D2 xor edx, edx 1431 ; 12/01/2022 1432 00000599 29C9 sub ecx, ecx 1433 0000059B B10A mov cl, 10 1434 0000059D 89CE mov esi, ecx ; esi = 10 1435 0000059F B106 mov cl, 6 1436 ;mov ecx, 6 1437 ; mov $6,r2 1438 000005A1 BF[2A0D0000] mov edi, numbuf + 6 1439 ; mov $numbuf+6,r3 1440 ; 12/01/2022 1441 ;mov esi, 10 1442 S26: ;1: 1443 ;and eax, eax 1444 ;jz short S27 1445 ;mov r0,r1 1446 ;xor edx, edx 1447 ; clr r0 1448 ;mov esi, 10 1449 ; dvd $10.,r0 1450 000005A6 F7F6 div esi 1451 ;S27: 1452 000005A8 80C230 add dl, '0' 1453 ; add $'0,r1 1454 000005AB 4F dec edi 1455 000005AC 8817 mov [edi], dl 1456 ; movb r1,-(r3) 1457 000005AE 30D2 xor dl, dl 1458 000005B0 E2F4 loop S26 1459 ; sob r2,1b 1460 000005B2 B020 mov al, 20h ; space 1461 000005B4 B105 mov cl, 5 1462 S28: ;1: 1463 ;cmp edi, numbuf + 5 1464 ; cmp r3,$numbuf+5 1465 ;je short S29 1466 ; beq 1f 1467 000005B6 803F30 cmp byte [edi], '0' 1468 ; cmpb (r3),$'0 1469 000005B9 7503 jne short S29 1470 ; bne 1f 1471 ;mov al, 20h 1472 000005BB AA stosb 1473 ; movb $' ,(r3)+ 1474 ;jmp short S28 1475 ; br 1b 1476 000005BC E2F8 loop S28 1477 S29: ;1: 1478 000005BE BE[2A0D0000] mov esi, numbuf + 6 1479 ; mov $numbuf+6,r1 1480 000005C3 29DE sub esi, ebx 1481 ; sub (r5),r1 1482 ;mov ecx, ebx 1483 000005C5 88D9 mov cl, bl 1484 ; mov (r5)+,-(sp) 1485 S30: ;1: 1486 000005C7 51 push ecx 1487 000005C8 AC lodsb 1488 ; movb (r1)+,r0 1489 ;mov ebx, obuf 1490 000005C9 E813000000 call putc 1491 ; jsr r5,putc; obuf 1492 000005CE 59 pop ecx 1493 000005CF E2F6 loop S30 1494 ; dec (sp) 1495 ; bne 1b 1496 ; tst (sp)+ 1497 ; mov (sp)+,r3 1498 ; mov (sp)+,r2 1499 ; mov (sp)+,r1 1500 ;pop edi 1501 000005D1 C3 retn 1502 ; rts r5 1503 1504 calcb: 1505 ; 06/10/2015 (32 bit modifications) 1506 ; calculate number of blocks 1507 ; 12/01/2022 - Retro UNIX 386 v2 fs inode 1508 ; bl = high byte of inode flags 1509 ; eax = file (directory) size 1510 000005D2 05FF010000 add eax, 511 1511 000005D7 C1E809 shr eax, 9 ; (eax+511)/512 1512 ; add $511.,r0 1513 ; clrb r0 1514 ; swab r0 1515 ; asr r0 1516 ; eax = (size+511)/512 1517 ; large file ? (>=4096 bytes) 1518 000005DA 83F808 cmp eax, 8 1519 ; cmp r0,$8 1520 000005DD 7201 jb short S31 1521 ; blo 1f 1522 ; add indirect block 1523 000005DF 40 inc eax 1524 ; inc r0 1525 S31: ;1: 1526 000005E0 C3 retn 1527 ; rts r5 1528 1529 ; 13/01/2022 1530 ;_mode: 1531 ; mov al, '-' 1532 mode: 1533 ; AL = mode char 1534 ; mov (r5)+,r0 1535 ;mov ebx, obuf 1536 ; call putc 1537 ; jsr r5,putc; obuf 1538 ; retn 1539 ; rts r5 1540 1541 ; 'putc' procedure 1542 ; is derived from 'put.s' 1543 ; file of original UNIX v5 1544 ; 1545 ; write characters on output file 1546 putc: 1547 ; AL = character to be written 1548 ; obuf = output buffer 1549 ;; EBX = buffer address 1550 000005E1 56 push esi 1551 ;mov r1,-(sp) 1552 000005E2 BE[1C0B0000] mov esi, obuf 1553 ;mov esi, ebx 1554 ;mov (r5)+,r1 1555 S32: ;1: 1556 000005E7 66FF4E02 dec word [esi+2] 1557 ; dec 2(r1) 1558 000005EB 7909 jns short S33 1559 ; bge 1f 1560 000005ED 50 push eax 1561 ; mov r0,-(sp) 1562 000005EE E80D000000 call fl 1563 ; jsr pc,fl 1564 000005F3 58 pop eax 1565 ; mov (sp)+,r0 1566 000005F4 EBF1 jmp short S32 1567 ; br 1b 1568 S33: ;1: 1569 000005F6 8B5E04 mov ebx, [esi+4] 1570 000005F9 8803 mov [ebx], al 1571 ; movb r0,*4(r1) 1572 000005FB FF4604 inc dword [esi+4] 1573 ; inc 4(r1) 1574 000005FE 5E pop esi 1575 ; mov (sp)+,r1 1576 000005FF C3 retn 1577 ; rts r5 1578 1579 ; 'flush' procedure 1580 ; is derived from 'put.s' 1581 ; file of original UNIX v5 1582 1583 flush: 1584 ; mov r0,-(sp) 1585 ; mov r1,-(sp) 1586 ; mov (r5)+,r1 1587 ; jsr pc,fl 1588 ; mov (sp)+,r1 1589 ; mov (sp)+,r0 1590 ; rts r5 1591 fl: 1592 ;mov ecx, esi 1593 ; ; mov r1,r0 1594 ;add ecx, 8 1595 ; ; add $6,r0 1596 ; 12/01/2022 1597 ;lea ecx, [esi+8] 1598 00000600 31C9 xor ecx, ecx 1599 00000602 B108 mov cl, 8 1600 00000604 01F1 add ecx, esi 1601 ;push ecx ; Buffer data address 1602 ; mov r0,-(sp) 1603 ; mov r0,0f 1604 00000606 8B5604 mov edx, [esi+4] ; Buffer offset 1605 ; mov 4(r1),0f+2 1606 00000609 09D2 or edx, edx 1607 0000060B 740C jz short S34 1608 ; beq 1f 1609 0000060D 29CA sub edx, ecx ; Byte count 1610 ; sub (sp),0f+2 1611 ;movzx ebx, word [esi] ; File descriptor (=1) 1612 ; mov (r1),r0 1613 ; 12/01/2022 1614 0000060F 0FB61E movzx ebx, byte [esi] ; File descriptor (=1) 1615 ; 1616 sys _write ; sys _write, ebx, ecx, edx 70 <1> 71 <1> 72 <1> 73 <1> %if %0 >= 2 74 <1> mov ebx, %2 75 <1> %if %0 >= 3 76 <1> mov ecx, %3 77 <1> %if %0 = 4 78 <1> mov edx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 00000612 B804000000 <1> mov eax, %1 83 00000617 CD30 <1> int 30h 1617 ; sys 0; 9f 1618 ;.data 1619 ;9: 1620 ; ; sys write; 0:..; .. 1621 ;.text 1622 S34: ;1: 1623 ;pop ecx 1624 00000619 894E04 mov [esi+4], ecx ; Begin. of buf. data 1625 ; mov (sp)+,4(r1) 1626 0000061C 66C746020002 mov word [esi+2], 512 ; Buffer data size 1627 ; mov $512.,2(r1) 1628 00000622 C3 retn 1629 ; rts pc 1630 1631 ; 'getw', 'getc' and 'fopen' procedures 1632 ; are derived from 'get.s' 1633 ; file of original UNIX v5 1634 1635 ; open a file for use by get(c|w) 1636 ; 1637 fopen: 1638 ; EBX = file name offset 1639 ; EDI = buffer offset 1640 ; 1641 00000623 31C9 xor ecx, ecx ; 0 => open for read 1642 sys _open ; sys _open, ebx, ecx (0) 70 <1> 71 <1> 72 <1> 73 <1> %if %0 >= 2 74 <1> mov ebx, %2 75 <1> %if %0 >= 3 76 <1> mov ecx, %3 77 <1> %if %0 = 4 78 <1> mov edx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 00000625 B805000000 <1> mov eax, %1 83 0000062A CD30 <1> int 30h 1643 0000062C 7202 jc short S35 1644 ;stosw ; file descriptor (in buffer offset 0) 1645 ; 12/01/2022 1646 0000062E AA stosb ; file descriptor 1647 0000062F C3 retn 1648 S35: 1649 ;mov ax, 0FFFFh ; -1 1650 ;stosw 1651 ; 12/01/2022 1652 00000630 B0FF mov al, 0FFh ; -1 1653 00000632 AA stosb 1654 ;stc 1655 00000633 C3 retn 1656 1657 ; get words from input file 1658 ; 1659 getw: 1660 ;mov esi, ebx 1661 00000634 E80E000000 call getc 1662 00000639 720B jc short S36 1663 1664 ; 12/01/2022 1665 ;push ax 1666 0000063B 50 push eax 1667 0000063C E806000000 call getc 1668 ;;pop dx 1669 ;pop edx 1670 ;mov ah, dl 1671 ;xchg ah, al 1672 ; 14/01/2022 1673 00000641 88442401 mov [esp+1], al 1674 00000645 58 pop eax 1675 S36: 1676 00000646 C3 retn 1677 1678 ; get characters from input file 1679 ; 1680 getc: 1681 ; ESI = buffer address 1682 00000647 668B4602 mov ax, [esi+2] ; char count 1683 0000064B 6621C0 and ax, ax 1684 0000064E 751D jnz short gch1 1685 gch0: 1686 ;mov ecx, esi 1687 ;add ecx, 8 ; read buffer address 1688 ; 12/01/2022 1689 ;lea ecx, [esi+8] 1690 00000650 29C9 sub ecx, ecx 1691 00000652 B108 mov cl, 8 1692 00000654 01F1 add ecx, esi ; buffer data address 1693 ;movzx ebx, word [esi] 1694 ; 12/01/2022 1695 00000656 0FB61E movzx ebx, byte [esi] 1696 00000659 894E04 mov [esi+4], ecx ; char offset 1697 ;xor ax, ax 1698 ;mov [esi+2], ax ; 0 1699 ;mov edx, 512 1700 ; 12/01/2022 1701 0000065C 31D2 xor edx, edx 1702 0000065E B602 mov dh, 2 ; edx = 512 1703 sys _read ; sys _read, ebx, ecx, edx 70 <1> 71 <1> 72 <1> 73 <1> %if %0 >= 2 74 <1> mov ebx, %2 75 <1> %if %0 >= 3 76 <1> mov ecx, %3 77 <1> %if %0 = 4 78 <1> mov edx, %4 79 <1> %endif 80 <1> %endif 81 <1> %endif 82 00000660 B803000000 <1> mov eax, %1 83 00000665 CD30 <1> int 30h 1704 00000667 7216 jc short gch2 1705 00000669 09C0 or eax, eax 1706 0000066B 7414 jz short gch3 1707 gch1: 1708 0000066D 6648 dec ax 1709 0000066F 66894602 mov [esi+2], ax 1710 00000673 8B5E04 mov ebx, [esi+4] 1711 00000676 31C0 xor eax, eax ; 12/01/2022 1712 00000678 8A03 mov al, [ebx] 1713 0000067A 43 inc ebx 1714 0000067B 895E04 mov [esi+4], ebx 1715 ;xor ah, ah 1716 0000067E C3 retn 1717 gch2: 1718 ;xor ax, ax 1719 ; 12/01/2022 1720 0000067F 29C0 sub eax, eax 1721 gch3: 1722 00000681 F9 stc 1723 00000682 C3 retn 1724 1725 ;/ getw/getc -- get words/characters from input file 1726 ;/ fopen -- open a file for use by get(c|w) 1727 ;/ 1728 ;/ calling sequences -- 1729 ;/ 1730 ;/ mov $filename,r0 1731 ;/ jsr r5,fopen; ioptr 1732 ;/ 1733 ;/ on return ioptr buffer is set up or error bit is set if 1734 ;/ file could not be opened. 1735 ;/ 1736 ;/ jsr r5,get(c|w)1; ioptr 1737 ;/ 1738 ;/ on return char/word is in r0; error bit is 1739 ;/ set on error or end of file. 1740 ;/ 1741 ;/ ioptr is the address of a 518-byte buffer 1742 ;/ whose layout is as follows: 1743 ;/ 1744 ;/ ioptr: .=.+2 / file descriptor 1745 ; .=.+2 /// buffer size (This is noted by Erdogan Tan; 19/11/2013) 1746 ;/ .=.+2 / charact+2 / pointer to next character (reset if no. chars=0) 1747 ;/ .=.+512. / the buffer 1748 1749 ; .globl getc,getw,fopen 1750 1751 ;fopen: 1752 ; mov r1,-(sp) 1753 ; mov (r5)+,r1 1754 ; mov r0,0f 1755 ; sys 0; 9f 1756 ;.data 1757 ;9: 1758 ; sys open; 0:..; 0 1759 ;.text 1760 ; bes 1f 1761 ; mov r0,(r1)+ 1762 ; clr (r1)+ 1763 ; mov (sp)+,r1 1764 ; rts r5 1765 ;1: 1766 ; mov $-1,(r1) 1767 ; mov (sp)+,r1 1768 ; sec 1769 ; rts r5 1770 ; 1771 ;.data 1772 ;getw: 1773 ; mov (r5),9f 1774 ; mov (r5)+,8f 1775 ; jsr r5,getc; 8:.. 1776 ; bec 1f 1777 ; rts r5 1778 ;1: 1779 ; mov r0,-(sp) 1780 ; jsr r5,getc; 9:.. 1781 ; swab r0 1782 ; bis (sp)+,r0 1783 ; rts r5 1784 ;.text 1785 ; 1786 ;getc: 1787 ; mov r1,-(sp) 1788 ; mov (r5)+,r1 1789 ; dec 2(r1) 1790 ; bge 1f 1791 ; mov r1,r0 1792 ; add $6,r0 1793 ; mov r0,0f 1794 ; mov r0,4(r1) 1795 ; mov (r1),r0 1796 ; sys 0; 9f 1797 ;.data 1798 ;9: 1799 ; sys read; 0:..; 512. 1800 ;.text 1801 ; bes 2f 1802 ; tst r0 1803 ; bne 3f 1804 ;2: 1805 ; mov (sp)+,r1 1806 ; sec 1807 ; rts r5 1808 ;3: 1809 ; dec r0 1810 ; mov r0,2(r1) 1811 ;1: 1812 ; clr r0 1813 ; bisb *4(r1),r0 1814 ; inc 4(r1) 1815 ; mov (sp)+,r1 1816 ; rts r5 1817 1818 ;%include 'ctime386.inc' ; 24/11/2013 1819 %include 'ctime386.s' ; 12/01/2022 1820 <1> ; **************************************************************************** 1821 <1> ; ctime386.inc (Retro Unix 386 v1 - /bin/ls - list file or directory) 1822 <1> ; ---------------------------------------------------------------------------- 1823 <1> ; RETRO UNIX 386 (Retro Unix == Turkish Rational Unix) 1824 <1> ; Operating System Project (v0.2) by ERDOGAN TAN (Beginning: 24/12/2013) 1825 <1> ; 1826 <1> ; [ Last Modification: 06/10/2015 ] 1827 <1> ; 1828 <1> ; Derived from 'CTIME.INC' source code file of 'Retro UNIX 8086 v1' 1829 <1> ; operating system project, /bin/ls source code by Erdogan Tan 1830 <1> ; (28/11/2013) 1831 <1> ; 1832 <1> ; Derived from 'ctime.c' file of original UNIX v5 (usr/source/s3/ctime.c) 1833 <1> ; 1834 <1> ; ls386.s (ls0.s) 23/09/2015 - 06/10/2015 1835 <1> ; include ctime386.inc 1836 <1> ; 1837 <1> ; **************************************************************************** 1838 <1> 1839 <1> ; Assembler: NASM 2.11 1840 <1> 1841 <1> ;timezone equ 5*60*60 1842 <1> 1843 <1> 1844 <1> ctime: ; ctime(at) 1845 <1> ; int *at; 1846 <1> ; { 1847 <1> ; return(asctime(localtime(at))); 1848 <1> ; } 1849 <1> 1850 <1> ; EAX = unix epoch time (in seconds) 1851 <1> 1852 <1> ;call localtime 1853 <1> ;call asctime 1854 <1> 1855 <1> ;retn 1856 <1> 1857 <1> localtime: 1858 <1> ; localtime(tim) 1859 <1> ; int tim[]; 1860 <1> ; { 1861 <1> ; register int *t, *ct, dayno; 1862 <1> ; int daylbegin, daylend; 1863 <1> ; int copyt[2]; 1864 <1> ; t = copyt; 1865 <1> ; t[0] = tim[0]; 1866 <1> ; t[1] = tim[1]; 1867 <1> ; dpadd(t, -timezone); 1868 <1> ; ct = gmtime(t); 1869 <1> ; dayno = ct[YDAY]; 1870 <1> ; if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 || 1871 <1> ; dayno==5 && ct[HOUR]>=2))) { 1872 <1> ; daylight =| 1; 1873 <1> ; daylbegin = -1; 1874 <1> ; daylend = 367; 1875 <1> ; } else { 1876 <1> ; daylbegin = sunday(ct, 119); /* last Sun in Apr */ 1877 <1> ; daylend = sunday(ct, 303); /* last Sun in Oct */ 1878 <1> ; } 1879 <1> ; if (daylight && 1880 <1> ; (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) && 1881 <1> ; (dayno ; dpadd(t, 1*60*60); 1883 <1> ; ct = gmtime(t); 1884 <1> ; ct[ISDAY]++; 1885 <1> ; } 1886 <1> ; return(ct); 1887 <1> ; } 1888 <1> 1889 <1> ;sub eax, timezone 1890 <1> 1891 <1> ;push eax 1892 <1> 1893 00000683 E885000000 <1> call gmtime 1894 <1> ; if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 || 1895 <1> ; dayno==5 && ct[HOUR]>=2))) { 1896 <1> ;cmp byte [nixonflg], 0 1897 <1> ;jna short lt1 1898 <1> ;cmp word [year], 1974 1899 <1> ;jb short lt1 1900 <1> ;ja short lt0 1901 <1> ;cmp word [yday], 5 1902 <1> ;jb short lt1 1903 <1> ;ja short lt0 1904 <1> ;cmp word [hour], 2 1905 <1> ;jb short lt1 1906 <1> ; nixonflag > 0 1907 <1> ;lt0: 1908 <1> ;mov word [daylight], 1 1909 <1> ;mov word [daylbegin], -1 1910 <1> ;mov word [daylend], 367 1911 <1> ; ;jmp short lt2 1912 <1> 1913 <1> ; } else { 1914 <1> ;lt1: 1915 <1> ; mov cx, 119 1916 <1> ; call sunday ; sunday(ct, 119); /* last Sun in Apr */ 1917 <1> ; mov [daylbegin], cx 1918 <1> ; mov cx, 303 1919 <1> ; call sunday ; sunday(ct, 303); /* last Sun in Oct */ 1920 <1> ; mov [daylend], cx 1921 <1> ;lt2: 1922 <1> ; if (daylight && 1923 <1> ; (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) && 1924 <1> ; (dayno 1926 <1> ; pop eax 1927 <1> 1928 <1> ;cmp byte [daylight], 0 1929 <1> ;jna short lt5 1930 <1> 1931 <1> ;mov cx, [yday] 1932 <1> 1933 <1> ;cmp cx, [daylbegin] 1934 <1> ;jb short lt5 1935 <1> ;ja short lt3 1936 <1> ;cmp word [hour], 2 1937 <1> ;jb short lt5 1938 <1> ;jmp short lt4 1939 <1> ;lt3: 1940 <1> ;cmp cx, [daylend] 1941 <1> ;jb short lt4 1942 <1> ;ja short lt5 1943 <1> ;cmp word [hour], 1 1944 <1> ;jnb short lt5 1945 <1> ;lt4: 1946 <1> ;add eax, 1*60*60 1947 <1> ;call gmtime 1948 <1> ;inc word [isday] 1949 <1> ;lt5: 1950 <1> ; } 1951 <1> ; return(ct); 1952 <1> ; } 1953 <1> 1954 <1> ;retn 1955 <1> 1956 <1> 1957 <1> asctime: 1958 <1> ; asctime(t) 1959 <1> ;int *t; 1960 <1> ;{ 1961 <1> ; register char *cp, *ncp; 1962 <1> ; register int *tp; 1963 <1> ; 1964 <1> ; cp = cbuf; 1965 <1> ; for (ncp = "Day Mon 00 00:00:00 1900\n"; *cp++ = *ncp++;); 1966 <1> ; ncp = &"SunMonTueWedThuFriSat"[3*t[6]]; 1967 <1> ; cp = cbuf; 1968 <1> ; *cp++ = *ncp++; 1969 <1> ; *cp++ = *ncp++; 1970 <1> ; *cp++ = *ncp++; 1971 <1> ; cp++; 1972 <1> ; tp = &t[4]; 1973 <1> ; ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[(*tp)*3]; 1974 <1> ; *cp++ = *ncp++; 1975 <1> ; *cp++ = *ncp++; 1976 <1> ; *cp++ = *ncp++; 1977 <1> ; cp = numb(cp, *--tp); 1978 <1> ; cp = numb(cp, *--tp+100); 1979 <1> ; cp = numb(cp, *--tp+100); 1980 <1> ; cp = numb(cp, *--tp+100); 1981 <1> ; cp =+ 2; 1982 <1> ; cp = numb(cp, t[YEAR]); 1983 <1> ; return(cbuf); 1984 <1> ;} 1985 <1> 1986 <1> ;;mov edi, cbuf 1987 <1> ;;mov esi, ncp0 1988 <1> ;;mov ecx, 13 1989 <1> ;;movsw 1990 <1> ; 1991 00000688 BF[68080000] <1> mov edi, cbuf 1992 <1> ;movzx esi, word [wday] 1993 <1> ;shl si, 2 1994 <1> ;add esi, ncp1 1995 <1> ;movsd 1996 0000068D 0FB735[FE070000] <1> movzx esi, word [month] 1997 00000694 66C1E602 <1> shl si, 2 1998 00000698 81C6[34080000] <1> add esi, ncp2 - 4 1999 0000069E A5 <1> movsd 2000 <1> ;movzx eax, word [day] 2001 0000069F 66A1[FC070000] <1> mov ax, [day] 2002 <1> ;mov cx, 10 2003 000006A5 B10A <1> mov cl, 10 2004 000006A7 E831010000 <1> call numb 2005 000006AC B020 <1> mov al, 20h 2006 000006AE AA <1> stosb 2007 <1> ; 2008 000006AF 66A1[00080000] <1> mov ax, [year] 2009 000006B5 B564 <1> mov ch, 100 2010 000006B7 F6F5 <1> div ch 2011 000006B9 6650 <1> push ax ; 2012 000006BB 6698 <1> cbw ; century (19, 20) 2013 000006BD E81B010000 <1> call numb 2014 000006C2 6658 <1> pop ax 2015 000006C4 88E0 <1> mov al, ah 2016 000006C6 6698 <1> cbw ; year (0 to 99) 2017 000006C8 E810010000 <1> call numb 2018 000006CD B020 <1> mov al, 20h 2019 000006CF AA <1> stosb 2020 <1> ; 2021 000006D0 0FB735[02080000] <1> movzx esi, word [wday] 2022 000006D7 66C1E602 <1> shl si, 2 2023 000006DB 81C6[1C080000] <1> add esi, ncp1 2024 000006E1 A5 <1> movsd 2025 <1> ; 2026 000006E2 66A1[FA070000] <1> mov ax, [hour] 2027 000006E8 E8F0000000 <1> call numb 2028 000006ED B03A <1> mov al, ':' 2029 000006EF AA <1> stosb 2030 000006F0 66A1[F8070000] <1> mov ax, [minute] 2031 000006F6 E8E2000000 <1> call numb 2032 000006FB B03A <1> mov al, ':' 2033 000006FD AA <1> stosb 2034 000006FE 66A1[F6070000] <1> mov ax, [second] 2035 00000704 E8D4000000 <1> call numb 2036 00000709 B020 <1> mov al, 20h 2037 0000070B AA <1> stosb 2038 <1> ;mov ax, [year] 2039 <1> ;mov ch, 100 2040 <1> ;div ch 2041 <1> ;push ax ; 2042 <1> ;cbw ; century (19, 20) 2043 <1> ;call numb 2044 <1> ;pop ax 2045 <1> ;mov al, ah 2046 <1> ;cbw ; year (0 to 99) 2047 <1> ;call numb 2048 <1> ;mov al, 20h 2049 <1> ;stosb 2050 <1> ;xor al, al 2051 <1> ;stosb 2052 <1> 2053 0000070C C3 <1> retn 2054 <1> 2055 <1> gmtime: 2056 <1> ; 24/11/2013 (yday, wday) 2057 <1> ; Retro UNIX 8086 v1 - UNIX.ASM (20/06/2013) 2058 <1> ; Retro UNIX 8086 v1 feature/procedure only! 2059 <1> ; 'convert_from_epoch' procedure prototype: 2060 <1> ; UNIXCOPY.ASM, 10/03/2013 2061 <1> ; 30/11/2012 2062 <1> ; Derived from DALLAS Semiconductor 2063 <1> ; Application Note 31 (DS1602/DS1603) 2064 <1> ; 6 May 1998 2065 <1> ; 2066 <1> ; INPUT: 2067 <1> ; DX:AX = Unix (Epoch) Time 2068 <1> ; 2069 <1> ; ((Modified registers: AX, DX, CX, BX)) 2070 <1> ; 2071 0000070D 31D2 <1> xor edx, edx 2072 0000070F B93C000000 <1> mov ecx, 60 2073 00000714 F7F1 <1> div ecx 2074 <1> ;mov [imin], eax ; whole minutes 2075 <1> ; since 1/1/1970 2076 00000716 668915[F6070000] <1> mov [second], dx ; leftover seconds 2077 <1> ; mov ecx, 60 2078 0000071D 29D2 <1> sub edx, edx 2079 0000071F F7F1 <1> div ecx 2080 <1> ;mov [ihrs], eax ; whole hours 2081 <1> ; since 1/1/1970 2082 00000721 668915[F8070000] <1> mov [minute], dx ; leftover minutes 2083 <1> ;mov ecx, 24 2084 00000728 31D2 <1> xor edx, edx 2085 0000072A B118 <1> mov cl, 24 2086 0000072C F7F1 <1> div ecx 2087 <1> ;mov [iday], ax ; whole days 2088 <1> ; since 1/1/1970 2089 0000072E 66A3[02080000] <1> mov [wday], ax ; 24/11/2013 2090 00000734 668915[FA070000] <1> mov [hour], dx ; leftover hours 2091 0000073B 05DB020000 <1> add eax, 365+366 ; whole day since 2092 <1> ; 1/1/1968 2093 <1> ;mov [iday], ax 2094 00000740 50 <1> push eax 2095 00000741 66B9B505 <1> mov cx, (4*365)+1 ; 4 years = 1461 days 2096 00000745 29D2 <1> sub edx, edx 2097 00000747 F7F1 <1> div ecx 2098 00000749 59 <1> pop ecx 2099 <1> ;mov [lday], ax ; count of quadyrs (4 years) 2100 0000074A 52 <1> push edx 2101 <1> ;mov [qday], dx ; days since quadyr began 2102 0000074B 6683FA3C <1> cmp dx, 31 + 29 ; if past feb 29 then 2103 0000074F F5 <1> cmc ; add this quadyr's leap day 2104 00000750 83D000 <1> adc eax, 0 ; to # of qadyrs (leap days) 2105 <1> ;mov [lday], ax ; since 1968 2106 <1> ;mov cx, [iday] 2107 00000753 91 <1> xchg ecx, eax ; CX = lday, AX = iday 2108 00000754 29C8 <1> sub eax, ecx ; iday - lday 2109 <1> ;mov ecx, 365 2110 00000756 66B96D01 <1> mov cx, 365 2111 0000075A 31D2 <1> xor edx, edx ; DX = 0 2112 <1> ; EAX = iday-lday 2113 0000075C F7F1 <1> div ecx 2114 <1> ;mov [iyrs], ax ; whole years since 1968 2115 <1> ; jday = iday - (iyrs*365) - lday 2116 <1> ;mov [jday], dx ; days since 1/1 of current year 2117 <1> ;add eax, 1968 ; compute year 2118 0000075E 05B0070000 <1> add eax, 1968 2119 00000763 66A3[00080000] <1> mov [year], ax 2120 00000769 89C3 <1> mov ebx, eax 2121 <1> ;mov ax, [qday] 2122 0000076B 58 <1> pop eax 2123 0000076C 663D6D01 <1> cmp ax, 365 ; if qday <= 365 and qday >= 60 2124 00000770 7709 <1> ja short L1 ; jday = jday +1 2125 00000772 6683F83C <1> cmp ax, 60 ; if past 2/29 and leap year then 2126 00000776 F5 <1> cmc ; add a leap day to the # of whole 2127 00000777 6683D200 <1> adc dx, 0 ; days since 1/1 of current year 2128 <1> L1: 2129 <1> ;mov [jday], dx 2130 <1> ;mov [yday], dx ; 24/11/2013 2131 0000077B 66B90C00 <1> mov cx, 12 ; estimate month 2132 0000077F 6687CA <1> xchg cx, dx ; CX = jday, DX = month 2133 00000782 66B86E01 <1> mov ax, 366 ; mday, max. days since 1/1 is 365 2134 00000786 6683E303 <1> and bx, 11b ; year mod 4 (and bx, 3) 2135 <1> L2: ; Month calculation ; 0 to 11 (11 to 0) 2136 0000078A 6639C1 <1> cmp cx, ax ; mday = # of days passed from 1/1 2137 0000078D 731D <1> jnb short L3 2138 0000078F 664A <1> dec dx ; month = month - 1 2139 00000791 66D1E2 <1> shl dx, 1 2140 00000794 668B82[04080000] <1> mov ax, [edx+DMonth] ; # elapsed days at 1st of month 2141 0000079B 66D1EA <1> shr dx, 1 ; dx = month - 1 (0 to 11) 2142 0000079E 6683FA01 <1> cmp dx, 1 ; if month > 2 and year mod 4 = 0 2143 000007A2 76E6 <1> jna short L2 ; then mday = mday + 1 2144 000007A4 08DB <1> or bl, bl ; if past 2/29 and leap year then 2145 000007A6 75E2 <1> jnz short L2 ; add leap day (to mday) 2146 000007A8 6640 <1> inc ax ; mday = mday + 1 2147 000007AA EBDE <1> jmp short L2 2148 <1> L3: 2149 000007AC 6642 <1> inc dx ; -> dx = month, 1 to 12 2150 000007AE 668915[FE070000] <1> mov [month], dx 2151 000007B5 6629C1 <1> sub cx, ax ; day = jday - mday + 1 2152 000007B8 6641 <1> inc cx 2153 000007BA 66890D[FC070000] <1> mov [day], cx 2154 <1> 2155 <1> ; eax, ebx, ecx, edx are changed at return 2156 <1> ; output -> 2157 <1> ; [year], [month], [day], [hour], [minute], [second] 2158 <1> ; [yday] -> 24/11/2013 2159 <1> ; [wday] -> 24/11/2013 2160 <1> ; 2161 <1> ; 24/11/2013 2162 000007C1 66A1[02080000] <1> mov ax, [wday] ; [iday] 2163 000007C7 6631D2 <1> xor dx, dx 2164 000007CA 6683C004 <1> add ax, 4 2165 <1> ; NOTE: January 1, 1970 was THURSDAY 2166 <1> ; ch = 0 2167 000007CE B107 <1> mov cl, 7 2168 000007D0 66F7F1 <1> div cx 2169 000007D3 668915[02080000] <1> mov [wday], dx ; week of the day, 0 to 6 2170 <1> ; 0 = sunday ... 6 = saturday 2171 <1> ;mov word [isday], 0 2172 <1> 2173 000007DA C3 <1> retn 2174 <1> 2175 <1> 2176 <1> ;sunday: 2177 <1> ; sunday(at, ad) 2178 <1> ; int *at; 2179 <1> ; { 2180 <1> ; register int *t, d; 2181 <1> ; t = at; 2182 <1> ; d = ad; 2183 <1> ; d = ad + dysize(t[YEAR]) - 365; 2184 <1> ; return(d - (d - t[YDAY] + t[WDAY] + 700) % 7); 2185 <1> ; } 2186 <1> 2187 <1> ;mov dx, [year] 2188 <1> ;call dysize 2189 <1> ;sub ax, 365 2190 <1> ; add cx, ax 2191 <1> ; test word [year], 11b 2192 <1> ; jnz short sunday1 2193 <1> ; CX = 119 (77h) or CX = 303 (12Fh) 2194 <1> ;inc cx 2195 <1> ; inc cl 2196 <1> ;sunday1: 2197 <1> ; mov ax, cx 2198 <1> ; add ax, [wday] 2199 <1> ;adc ax, 700 2200 <1> ; add ax, 700 2201 <1> ; sub ax, [yday] 2202 <1> ;xor dx, dx 2203 <1> ; mov bx, 7 2204 <1> ;div bx 2205 <1> ; div bl 2206 <1> ; sub cx, bx 2207 <1> ; retn 2208 <1> 2209 <1> ;dysize: 2210 <1> ; dysize(y) 2211 <1> ; { 2212 <1> ; if((y%4) == 0) 2213 <1> ; return(366); 2214 <1> ; return(365); 2215 <1> ; } 2216 <1> 2217 <1> ; mov ax, 365 2218 <1> ; test dx, 11b 2219 <1> ; jnz short dysize1 2220 <1> ; ;inc ax 2221 000007DB FEC0 <1> inc al 2222 <1> ;dysize1: 2223 <1> ; retn 2224 <1> 2225 <1> 2226 <1> numb: ; AX = 0 to 99 2227 <1> ; 2228 <1> ; numb(acp, n) 2229 <1> ; { 2230 <1> ; register char *cp; 2231 <1> ; 2232 <1> ; cp = acp; 2233 <1> ; cp++; 2234 <1> ; if (n>=10) 2235 <1> ; *cp++ = (n/10)%10 + '0'; 2236 <1> ; else 2237 <1> ; *cp++ = ' '; 2238 <1> ; *cp++ = n%10 + '0'; 2239 <1> ; return(cp); 2240 <1> ; } 2241 <1> ; 2242 <1> ;mov cl, 10 2243 000007DD 6683F80A <1> cmp ax, 10 2244 000007E1 7306 <1> jnb short nb1 2245 000007E3 88C4 <1> mov ah, al 2246 000007E5 30C0 <1> xor al, al ; 0 2247 000007E7 EB04 <1> jmp short nb2 2248 <1> nb1: 2249 000007E9 F6F1 <1> div cl 2250 000007EB 88E2 <1> mov dl, ah 2251 <1> 2252 <1> nb2: 2253 000007ED 0430 <1> add al, '0' 2254 000007EF AA <1> stosb ; digit 1 2255 000007F0 88E0 <1> mov al, ah 2256 000007F2 0430 <1> add al, '0' 2257 000007F4 AA <1> stosb ; digit 2 2258 000007F5 C3 <1> retn 2259 <1> 2260 <1> 2261 <1> ;;; DATA 2262 <1> 2263 <1> ;daylight: db 1 ; int daylight 1; /* Allow daylight conversion */ 2264 <1> ;nixonflg: db 0 ; int nixonflg 0; /* Daylight time all year around */ 2265 <1> ;daylbegin: dw 0 2266 <1> ;daylend: dw 0 2267 <1> 2268 <1> 2269 <1> ct: 2270 <1> ; 24/11/2013 (re-order) 2271 <1> ; 2272 <1> ; Retro UNIX 8086 v1 - UNIX.ASM 2273 <1> ; 09/04/2013 epoch variables 2274 <1> ; Retro UNIX 8086 v1 Prototype: UNIXCOPY.ASM, 10/03/2013 2275 <1> ; 2276 <1> 2277 000007F6 0000 <1> second: dw 0 2278 000007F8 0000 <1> minute: dw 0 2279 000007FA 0000 <1> hour: dw 0 2280 000007FC 0100 <1> day: dw 1 2281 000007FE 0100 <1> month: dw 1 2282 00000800 B207 <1> year: dw 1970 2283 00000802 0000 <1> wday: dw 0 ; 24/11/2013 2284 <1> ;yday: dw 0 ; 24/11/2013 2285 <1> ;isday: dw 0 ; 24/11/2013 2286 <1> 2287 <1> DMonth: 2288 00000804 0000 <1> dw 0 2289 00000806 1F00 <1> dw 31 2290 00000808 3B00 <1> dw 59 2291 0000080A 5A00 <1> dw 90 2292 0000080C 7800 <1> dw 120 2293 0000080E 9700 <1> dw 151 2294 00000810 B500 <1> dw 181 2295 00000812 D400 <1> dw 212 2296 00000814 F300 <1> dw 243 2297 00000816 1101 <1> dw 273 2298 00000818 3001 <1> dw 304 2299 0000081A 4E01 <1> dw 334 2300 <1> 2301 <1> ;ncp0: db "Day Mon 00 00:00:00 1970", 0, 0 2302 0000081C 53756E204D6F6E2054- <1> ncp1: db "Sun Mon Tue Wed Thu Fri Sat " 2302 00000825 756520576564205468- <1> 2302 0000082E 752046726920536174- <1> 2302 00000837 20 <1> 2303 00000838 4A616E20466562204D- <1> ncp2: db "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec " 2303 00000841 617220417072204D61- <1> 2303 0000084A 79204A756E204A756C- <1> 2303 00000853 204175672053657020- <1> 2303 0000085C 4F6374204E6F762044- <1> 2303 00000865 656320 <1> 2304 <1> 2305 <1> cbuf: ; char cbuf[26] 2306 00000868 00 <1> times 26 db 0 2307 <1> 2308 <1> 2309 <1> ;; ctime.c (Unix v5) 2310 <1> ; 2311 <1> ;# 2312 <1> ;/* 2313 <1> ; * This routine converts time as follows. 2314 <1> ; * The epoch is 0000 Jan 1 1970 GMT. 2315 <1> ; * The argument time is in seconds since then. 2316 <1> ; * The localtime(t) entry returns a pointer to an array 2317 <1> ; * containing 2318 <1> ; * seconds (0-59) 2319 <1> ; * minutes (0-59) 2320 <1> ; * hours (0-23) 2321 <1> ; * day of month (1-31) 2322 <1> ; * month (0-11) 2323 <1> ; * year-1970 2324 <1> ; * weekday (0-6, Sun is 0) 2325 <1> ; * day of the year 2326 <1> ; * daylight savings flag 2327 <1> ; * 2328 <1> ; * The routine corrects for daylight saving 2329 <1> ; * time and will work in any time zone provided 2330 <1> ; * "timezone" is adjusted to the difference between 2331 <1> ; * Greenwich and local standard time (measured in seconds). 2332 <1> ; * In places like Michigan "daylight" must 2333 <1> ; * be initialized to 0 to prevent the conversion 2334 <1> ; * to daylight time. 2335 <1> ; * 2336 <1> ; * "nixonflg,", if set to 1, will 2337 <1> ; * cause daylight savings time all year around 2338 <1> ; * independently of "daylight". 2339 <1> ; * 2340 <1> ; * The routine does not work 2341 <1> ; * in Saudi Arabia which runs on Solar time. 2342 <1> ; * 2343 <1> ; * asctime(tvec)) 2344 <1> ; * where tvec is produced by localtime 2345 <1> ; * returns a ptr to a character string 2346 <1> ; * that has the ascii time in the form 2347 <1> ; * Thu Jan 01 00:00:00 1970n0\; * 01234567890123456789012345 2349 <1> ; * 0 1 2 2350 <1> ; * 2351 <1> ; * ctime(t) just calls localtime, then asctime. 2352 <1> ; */ 2353 <1> ;char cbuf[26]; 2354 <1> ;int dmsize[12] 2355 <1> ;{ 2356 <1> ; 31, 2357 <1> ; 28, 2358 <1> ; 31, 2359 <1> ; 30, 2360 <1> ; 31, 2361 <1> ; 30, 2362 <1> ; 31, 2363 <1> ; 31, 2364 <1> ; 30, 2365 <1> ; 31, 2366 <1> ; 30, 2367 <1> ; 31 2368 <1> ;}; 2369 <1> ; 2370 <1> ;int timezone 5*60*60; 2371 <1> ;int tzname[] 2372 <1> ;{ 2373 <1> ; "EST", 2374 <1> ; "EDT", 2375 <1> ;}; 2376 <1> ;int daylight 1; /* Allow daylight conversion */ 2377 <1> ;int nixonflg 0; /* Daylight time all year around */ 2378 <1> ; 2379 <1> ;#define SEC 0 2380 <1> ;#define MIN 1 2381 <1> ;#define HOUR 2 2382 <1> ;#define MDAY 3 2383 <1> ;#define MON 4 2384 <1> ;#define YEAR 5 2385 <1> ;#define WDAY 6 2386 <1> ;#define YDAY 7 2387 <1> ;#define ISDAY 8 2388 <1> ; 2389 <1> ;ctime(at) 2390 <1> ;int *at; 2391 <1> ;{ 2392 <1> ; return(asctime(localtime(at))); 2393 <1> ;} 2394 <1> ; 2395 <1> ;localtime(tim) 2396 <1> ;int tim[]; 2397 <1> ;{ 2398 <1> ; register int *t, *ct, dayno; 2399 <1> ; int daylbegin, daylend; 2400 <1> ; int copyt[2]; 2401 <1> ; 2402 <1> ; t = copyt; 2403 <1> ; t[0] = tim[0]; 2404 <1> ; t[1] = tim[1]; 2405 <1> ; dpadd(t, -timezone); 2406 <1> ; ct = gmtime(t); 2407 <1> ; dayno = ct[YDAY]; 2408 <1> ; if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 || 2409 <1> ; dayno==5 && ct[HOUR]>=2))) { 2410 <1> ; daylight =| 1; 2411 <1> ; daylbegin = -1; 2412 <1> ; daylend = 367; 2413 <1> ; } else { 2414 <1> ; daylbegin = sunday(ct, 119); /* last Sun in Apr */ 2415 <1> ; daylend = sunday(ct, 303); /* last Sun in Oct */ 2416 <1> ; } 2417 <1> ; if (daylight && 2418 <1> ; (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) && 2419 <1> ; (dayno ; dpadd(t, 1*60*60); 2421 <1> ; ct = gmtime(t); 2422 <1> ; ct[ISDAY]++; 2423 <1> ; } 2424 <1> ; return(ct); 2425 <1> ;} 2426 <1> ; 2427 <1> ;sunday(at, ad) 2428 <1> ;int *at; 2429 <1> ;{ 2430 <1> ; register int *t, d; 2431 <1> ; 2432 <1> ; t = at; 2433 <1> ; d = ad; 2434 <1> ; d = ad + dysize(t[YEAR]) - 365; 2435 <1> ; return(d - (d - t[YDAY] + t[WDAY] + 700) % 7); 2436 <1> ;} 2437 <1> ; 2438 <1> ;gmtime(tim) 2439 <1> ;int tim[]; 2440 <1> ;{ 2441 <1> ; register int d0, d1; 2442 <1> ; register *tp; 2443 <1> ; static xtime[9]; 2444 <1> ; extern int ldivr; 2445 <1> ; 2446 <1> ; /* 2447 <1> ; * break initial number into 2448 <1> ; * multiples of 8 hours. 2449 <1> ; * (28800 = 60*60*8) 2450 <1> ; */ 2451 <1> ; 2452 <1> ; d0 = ldiv(tim[0], tim[1], 28800); 2453 <1> ; d1 = ldivr; 2454 <1> ; tp = &xtime[0]; 2455 <1> ; 2456 <1> ; /* 2457 <1> ; * generate hours:minutes:seconds 2458 <1> ; */ 2459 <1> ; 2460 <1> ; *tp++ = d1%60; 2461 <1> ; d1 =/ 60; 2462 <1> ; *tp++ = d1%60; 2463 <1> ; d1 =/ 60; 2464 <1> ; d1 =+ (d0%3)*8; 2465 <1> ; d0 =/ 3; 2466 <1> ; *tp++ = d1; 2467 <1> ; 2468 <1> ; /* 2469 <1> ; * d0 is the day number. 2470 <1> ; * generate day of the week. 2471 <1> ; */ 2472 <1> ; 2473 <1> ; xtime[WDAY] = (d0+4)%7; 2474 <1> ; 2475 <1> ; /* 2476 <1> ; * year number 2477 <1> ; */ 2478 <1> ; for(d1=70; d0 >= dysize(d1); d1++) 2479 <1> ; d0 =- dysize(d1); 2480 <1> ; xtime[YEAR] = d1; 2481 <1> ; xtime[YDAY] = d0; 2482 <1> ; 2483 <1> ; /* 2484 <1> ; * generate month 2485 <1> ; */ 2486 <1> ; 2487 <1> ; if (dysize(d1)==366) 2488 <1> ; dmsize[1] = 29; 2489 <1> ; for(d1=0; d0 >= dmsize[d1]; d1++) 2490 <1> ; d0 =- dmsize[d1]; 2491 <1> ; dmsize[1] = 28; 2492 <1> ; *tp++ = d0+1; 2493 <1> ; *tp++ = d1; 2494 <1> ; xtime[ISDAY] = 0; 2495 <1> ; return(xtime); 2496 <1> ;} 2497 <1> ; 2498 <1> ;asctime(t) 2499 <1> ;int *t; 2500 <1> ;{ 2501 <1> ; register char *cp, *ncp; 2502 <1> ; register int *tp; 2503 <1> ; 2504 <1> ; cp = cbuf; 2505 <1> ; for (ncp = "Day Mon 00 00:00:00 1900\n"; *cp++ = *ncp++;); 2506 <1> ; ncp = &"SunMonTueWedThuFriSat"[3*t[6]]; 2507 <1> ; cp = cbuf; 2508 <1> ; *cp++ = *ncp++; 2509 <1> ; *cp++ = *ncp++; 2510 <1> ; *cp++ = *ncp++; 2511 <1> ; cp++; 2512 <1> ; tp = &t[4]; 2513 <1> ; ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[(*tp)*3]; 2514 <1> ; *cp++ = *ncp++; 2515 <1> ; *cp++ = *ncp++; 2516 <1> ; *cp++ = *ncp++; 2517 <1> ; cp = numb(cp, *--tp); 2518 <1> ; cp = numb(cp, *--tp+100); 2519 <1> ; cp = numb(cp, *--tp+100); 2520 <1> ; cp = numb(cp, *--tp+100); 2521 <1> ; cp =+ 2; 2522 <1> ; cp = numb(cp, t[YEAR]); 2523 <1> ; return(cbuf); 2524 <1> ;} 2525 <1> ; 2526 <1> ;dysize(y) 2527 <1> ;{ 2528 <1> ; if((y%4) == 0) 2529 <1> ; return(366); 2530 <1> ; return(365); 2531 <1> ;} 2532 <1> ; 2533 <1> ; 2534 <1> ;numb: 2535 <1> ; 2536 <1> ; 2537 <1> ;numb(acp, n) 2538 <1> ;{ 2539 <1> ; register char *cp; 2540 <1> ; cp = acp; 2541 <1> ; cp++; 2542 <1> ; if (n>=10) 2543 <1> ; *cp++ = (n/10)%10 + '0'; 2544 <1> ; else 2545 <1> ; *cp++ = ' '; 2546 <1> ; *cp++ = n%10 + '0'; 2547 <1> ; return(cp); 2548 <1> ;} 2549 <1> ; 1820 1821 00000882 [34150000] brk: dd _end + 512 ; (gstat:) 1822 1823 ; directory name pointer 1824 00000886 00000000 dnp: dd 0 ; (do:) 1825 1826 0000088A [92080000] dotp: dd dot 1827 ;dotp: dot 1828 0000088E [2A0D0000] euids: dd uidbuf 1829 ; euids: uidbuf 1830 00000892 2E00 dot: db '.', 0 1831 ;dot: <.\0> 1832 00000894 0D0A00 nl: db 0Dh, 0Ah, 0 1833 ; nl: <\n\0> 1834 00000897 746F74616C2000 totmes: db 'total ', 0 1835 ; totmes: 1836 0000089E 202020 space3: db 20h, 20h, 20h 1837 ; space3: < > 1838 000008A1 2000 space: db 20h, 0 1839 ; space: < \0> 1840 000008A3 2F6574632F70617373- passwd: db '/etc/passwd', 0 1840 000008AC 776400 1841 ; passwd: 1842 000008AF 3A0D0A00 colon: db ':', 0Dh, 0Ah, 0 1843 ; colon: <:\n\0> 1844 1845 000008B3 00000000 eol: dd 0 ; (pass3:) 1846 1847 ; 22/01/2022 1848 000008B7 16 db 22 1849 000008B8 01 db 1 1850 000008B9 E607 dw 2022 1851 000008BB 0000 dw 0 1852 000008BD A101 dw 417 1853 1854 000008BF 90 align 4 1855 1856 bss_start: 1857 1858 ABSOLUTE bss_start 1859 ;EVEN 1860 ;bss: 1861 ;count: resw 1 1862 ;ocount: resw 1 1863 ; 12/01/2022 1864 000008C0 ?? count: resb 1 1865 000008C1 ?? ocount: resb 1 1866 ; 1867 000008C2 ???? longf: resw 1 1868 ;allflg: resw 1 1869 ;dirflg: resw 1 1870 ;isadir: resw 1 1871 ; 12/01/2022 1872 000008C4 ?? allflg: resb 1 1873 000008C5 ?? dirflg: resb 1 1874 000008C6 ?? isadir: resb 1 1875 000008C7 ?? resb 1 1876 ; 1877 000008C8 ???????? tblocks: resd 1 1878 000008CC ???????? sortoff: resd 1 1879 000008D0 filnam: resb 32 1880 000008F0 statb: resb 34 1881 ; 12/01/2022 1882 00000912 ???? resb 2 ; dword alignment (not necessary) 1883 ; 1884 00000914 dbuf: resb 520 1885 ; 2 byte file descriptor, 2 byte buffer data size, 1886 ; 4 byte buffer offset, 512 byte buffer data 1887 00000B1C obuf: resb 520 1888 00000D24 ???????????? numbuf: resb 6 1889 00000D2A uidbuf: resb 1024 1890 euidbuf: 1891 0000112A iobuf: resb 520 1892 1893 00001332 ???? alignb 4 1894 _end: 1895 1896 ; .even 1897 1898 ;.bss 1899 1900 ;count: .=.+2 1901 ;ocount: .=.+2 1902 ;longf: .=.+2 1903 ;sortoff: .=.+2 1904 ;allflg: .=.+2 1905 ;dirflg: .=.+2 1906 ;isadir: .=.+2 1907 ;filnam: .=.+32. 1908 ;statb: .=.+34. 1909 ;dbuf: .=.+518. 1910 ;obuf: .=.+518. 1911 ;numbuf: .=.+6 1912 ;tblocks: .=.+2 1913 ;uidbuf: .=.+1024. 1914 ;euidbuf: 1915 ;iobuf: .=.+518.