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