📄 mbrbm.lis
字号:
520 00000091 B94000 MOV CX, NPARTL 521 00000094 F3A4 REP MOVSB 522 00000096 C3 RET 523 524 ; read from disc via bios, return code AH 525 READ_DISC: 526 00000097 B80102 MOV AX, READ1 ; read one sector 527 0000009A BB0076 MOV BX, LOADADR ; into load area 528 0000009D CD13 INT DISC 529 0000009F 720A JB READ_DISK_RET ; disc error 530 000000A1 813EFE7755AA CMP WORD [LOADADR+SIGNUM], MAGIC 531 000000A7 7402 JZ READ_DISK_RET ; no valid partition table 532 000000A9 B4FF MOV AH, 0xFF 533 READ_DISK_RET: 534 000000AB C3 RET 535 536 ; display *SI -> display 537 PUTS: 538 NEXT_CHAR: 539 000000AC AC LODSB 540 000000AD 08C0 OR AL, AL ; last char ='\0'? 541 000000AF 7429 JZ NEXT_CHAR_RET 542 000000B1 B40E MOV AH, PUTC ; next char 543 000000B3 BB0700 MOV BX, CNTRL ; control word tty emulation 544 000000B6 56 PUSH SI 545 000000B7 CD10 INT VIDEO 546 000000B9 5E POP SI 547 000000BA EBF0 JMP NEXT_CHAR 548 549 ; convert dec -> ascii, AX -> [--DI], max 2550! 550 CONVERT: 551 000000BC B720 MOV BH, ' ' ; overwrite five chars 552 000000BE 887DFC MOV [DI-4], BH ; with blanc 553 000000C1 887DFD MOV [DI-3], BH ; with blanc 554 000000C4 887DFE MOV [DI-2], BH ; with blanc 555 000000C7 887DFF MOV [DI-1], BH ; with blanc 556 000000CA B50A MOV CH, 10 ; decimal base 557 NEXT_DIGIT: 558 000000CC F6F5 DIV CH ; next modulu 559 000000CE 80C430 ADD AH, '0' ; ascii conversion 560 000000D1 8825 MOV [DI], AH ; put in string 561 000000D3 4F DEC DI ; next position 562 000000D4 30E4 XOR AH, AH ; clear high byte 563 000000D6 08C0 OR AL, AL ; was last digit? 564 000000D8 75F2 JNZ NEXT_DIGIT 565 NEXT_CHAR_RET: 566 000000DA C3 RET 567 568 ; analyse partition table 569 ANALYSE_TABLE: 570 000000DB BD[BE01] MOV BP, PART_TAB ; si = *partititon table 571 000000DE B90400 MOV CX, NPARTN ; search active partition 0..3 572 NEXT_PART: 573 000000E1 51 PUSH CX 574 000000E2 B020 MOV AL, ' ' ; default not active 575 000000E4 F6460080 TEST BYTE [BP], SDEV ; partition active? 576 000000E8 740F JZ NOT_ACTIVE 577 000000EA A0[6F00] MOV AL, [ACTIVE] ; active partition already found? 578 000000ED 343F XOR AL, INVPART ; no more marked invalid 579 000000EF 7506 JNZ SCND_ACTIVE ; second active found 580 000000F1 A0[5D00] MOV AL, [PART] ; remember active partition 581 000000F4 A2[6F00] MOV [ACTIVE], AL 582 SCND_ACTIVE: 583 000000F7 B042 MOV AL, 'B' ; mark with 'B' 584 NOT_ACTIVE: 585 000000F9 A2[5E00] MOV [ACTIND], AL ; set active indicator 586 000000FC 8A4604 MOV AL, [BP+P_SYS] ; display system identification 587 000000FF 30E4 XOR AH, AH 588 00000101 BF[6400] MOV DI, SYSID 589 00000104 E8B5FF CALL CONVERT 590 00000107 8B460E MOV AX, [BP+P_SIZE+2] ; display partition size in GB 591 0000010A C1F805 SAR AX, 5 592 0000010D 40 INC AX ; round up gb 593 0000010E BF[6B00] MOV DI, MEGBYTE 594 00000111 E8A8FF CALL CONVERT 595 00000114 BE[5900] MOV SI, PARTITION ; display partition information 596 00000117 E892FF CALL PUTS 597 0000011A 83C510 ADD BP, BYTE PARTL ; next partition 598 0000011D FE06[5D00] INC BYTE [PART] 599 00000121 59 POP CX 600 00000122 E2BD LOOP NEXT_PART 601 00000124 C3 RET 602 603 ; invalid message 604 INVALID: 605 00000125 BE[7300] MOV SI, INVTABLE ; issue error message 606 ; get partition 607 GET_PART: 608 00000128 E881FF CALL PUTS 609 ; wait for key or timeout 610 WAIT_KEY: 611 0000012B 30E4 XOR AH, AH 612 0000012D CD1A INT RTIME 613 0000012F 89D3 MOV BX, DX ; init wait counter 614 00000131 83C32C ADD BX, BYTE WAITC 615 KEY_PRESSED: 616 00000134 B401 MOV AH, KEYBST ; wait for key pressed or timeout 617 00000136 CD16 INT KEYB 618 00000138 750B JNZ GET_CHAR ; key pressed? 619 0000013A 30E4 XOR AH, AH 620 0000013C CD1A INT RTIME 621 0000013E 39D3 CMP BX, DX ; timeout? 622 00000140 7FF2 JG KEY_PRESSED 623 00000142 E90700 JMP CHECK ; timeout, load active partition 624 ; get pressed key from buffer 625 GET_CHAR: 626 00000145 B400 MOV AH, KEYBK ; get pressed key 627 00000147 CD16 INT KEYB 628 00000149 A2[6F00] MOV [ACTIVE], AL ; remember active 629 ; check partition validity 630 CHECK: 631 0000014C BE[6F00] MOV SI, ACTIVE ; type boot partition 632 0000014F E85AFF CALL PUTS 633 00000152 A0[6F00] MOV AL, [ACTIVE] ; get active or pressed 634 00000155 2C30 SUB AL, '0' ; check partition number 0..7 635 00000157 7CCC JL INVALID 636 00000159 3C07 CMP AL, HIGPART 637 0000015B 7FC8 JG INVALID 638 0000015D C606[5900]31 MOV BYTE [DRIVE], '1' ; build drive number 639 00000162 3C04 CMP AL, 4 ; 0..3 drive 0, 4..7 drive 1 640 00000164 801E[5900]00 SBB BYTE [DRIVE], 0 ; drive number ascii 641 00000169 250300 AND AX, 00003 ; partition number MOD 4 642 0000016C B104 MOV CL, 4 ; partition number * PARTL 643 0000016E D3E0 SHL AX, CL 644 00000170 05[BE01] ADD AX, PART_TAB ; build partition table entry adress 645 00000173 89C5 MOV BP, AX ; partition table entry adress 646 00000175 E806FF CALL READ_TABLE ; read partition table from drive 647 00000178 08E4 OR AH, AH ; read ok? 648 0000017A 75A9 JNZ INVALID 649 650 ; boot partition 651 BOOT_PART: 652 0000017C 386604 CMP [BP+P_SYS], AH ; partition empty? 653 0000017F 74A4 JZ INVALID 654 00000181 A0[5900] MOV AL, [DRIVE] ; get first partition block for os boot 655 00000184 0450 ADD AL, DRIVE0-'0' ; ascii -> 080 656 00000186 884600 MOV [BP], AL ; build head, sector adress 657 00000189 8B4E02 MOV CX, [BP+P_SEC] 658 0000018C 8B5600 MOV DX, [BP] 659 0000018F E805FF CALL READ_DISC ; read operating system bootstrap 660 00000192 08E4 OR AH, AH ; read ok? 661 00000194 758F JNZ INVALID 662 663 ; set proper environment for os boot 664 00000196 81C50006 ADD BP, COPYLOC ; di, si, bp = partition table entry 665 0000019A 89EE MOV SI, BP ; nessessary? perhaps XENIX? 666 0000019C 89EF MOV DI, BP 667 668 ; set segment pointers to 0 669 0000019E 31C0 XOR AX, AX 670 000001A0 8ED0 MOV SS, AX 671 000001A2 8ED8 MOV DS, AX 672 000001A4 8EC0 MOV ES, AX 673 000001A6 BC007C MOV SP, LOADLOC 674 000001A9 89E3 MOV BX, SP 675 676 000001AB EA007C0000 JMP 0:LOADLOC ; boot operation system via far jump 677 ; into bootstrap 678 679 ; data until end of block 680 VOLUMEID: 681 000001B0 FF<rept> TIMES BCODEL-$+MBRBR0 DB 0xFF ; filler for VolumeID 682 683 PART_TAB: 684 000001BE 00<rept> TIMES NPARTL DB 0 ; partition table 685 686 SIG_NUM: 687 000001FE 55AA DW MAGIC ; magic word 688 689 ; END-OF-MBRBM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -