| | 577 | // thread subrecord |
|---|
| | 578 | if((type & 0b10000000) == 0){ |
|---|
| | 579 | FixupThread* fixupThread; |
|---|
| | 580 | uint threadNumber = type & 0b00000011; |
|---|
| | 581 | |
|---|
| | 582 | ubyte method = (type & 0b00011100) >> 2; |
|---|
| | 583 | |
|---|
| | 584 | // frame thread |
|---|
| | 585 | if(type & 0b01000000){ |
|---|
| | 586 | fixupThread = &(this.fixupFrames[threadNumber]); |
|---|
| | 587 | |
|---|
| | 588 | if(fixupThread.method < 4){ |
|---|
| | 589 | fixupThread.index = cursor.getIndex(); |
|---|
| | 590 | } |
|---|
| | 591 | else{ |
|---|
| | 592 | fixupThread.index = 0; |
|---|
| | 593 | } |
|---|
| | 594 | } |
|---|
| | 595 | // target thread |
|---|
| | 596 | else{ |
|---|
| | 597 | fixupThread = &(this.fixupTargets[threadNumber]); |
|---|
| | 598 | fixupThread.index = cursor.getIndex(); |
|---|
| | 599 | } |
|---|
| | 600 | |
|---|
| | 601 | fixupThread.method = method; |
|---|
| | 602 | } |
|---|
| 579 | | if(type & 0b10000000){ |
|---|
| 580 | | debug writefln("fixup data %d of %d ",cursor.getPosition(),cursor.getData().length); |
|---|
| 581 | | // parse out the Locat |
|---|
| 582 | | ushort offset = cursor.getByte(); |
|---|
| 583 | | ubyte locat = cursor.getByte(); |
|---|
| 584 | | |
|---|
| 585 | | bit isSegmentRelativeFixup = (locat & 0b01000000) != 0; |
|---|
| 586 | | ubyte location = (locat & 0b00111100) >> 2; |
|---|
| 587 | | offset |= (locat & 0b00000011) << 8; // get the high-order bits from the 'locat' |
|---|
| 588 | | |
|---|
| 589 | | debug writefln("segment relative: %s | location: %0.10b | offset: %d",isSegmentRelativeFixup,location,offset); |
|---|
| 590 | | |
|---|
| | 604 | else{ |
|---|
| | 605 | ubyte offset = cursor.getByte(); |
|---|
| | 606 | |
|---|
| | 607 | bit isSegmentRelativeFixup = (type & 0b01000000) != 0; |
|---|
| | 608 | ubyte location = (type & 0b00111100) >> 2; |
|---|
| | 609 | offset |= offset | (type & 0b00000011) << 8; // get the high-order bits from the 'locat' |
|---|
| | 610 | |
|---|
| 637 | | debug writefln("fixup %0.8b remaining: %s",cursor.getData()[cursor.getPosition()],cursor.getData()[cursor.getPosition()..$]); |
|---|
| 638 | | //TODO: do something! |
|---|
| 639 | | |
|---|
| 640 | | } |
|---|
| 641 | | // thread subrecord |
|---|
| 642 | | else{ |
|---|
| 643 | | FixupThread* fixupThread; |
|---|
| 644 | | uint threadNumber = type & 0b00000011; |
|---|
| 645 | | |
|---|
| 646 | | // frame thread |
|---|
| 647 | | if(type & 0b01000000){ |
|---|
| 648 | | debug writefln("fixup thread"); |
|---|
| 649 | | fixupThread = &(this.fixupFrames[threadNumber]); |
|---|
| 650 | | } |
|---|
| 651 | | // target thread |
|---|
| 652 | | else{ |
|---|
| 653 | | debug writefln("fixup frame"); |
|---|
| 654 | | fixupThread = &(this.fixupTargets[threadNumber]); |
|---|
| 655 | | } |
|---|
| 656 | | |
|---|
| 657 | | fixupThread.method = (type & 0b00011100) >> 2; |
|---|
| 658 | | |
|---|
| 659 | | debug writefln("thread before index (%0.8b) assigning thread #%d method: %d",type,threadNumber,fixupThread.method); |
|---|
| 660 | | |
|---|
| 661 | | if(fixupThread.method < 3){ |
|---|
| 662 | | fixupThread.index = cursor.getIndex(); |
|---|
| 663 | | } |
|---|
| 664 | | |
|---|
| 665 | | debug writefln("thread after (%0.8b) remaining: %s",cursor.getData()[cursor.getPosition()],cursor.getData()[cursor.getPosition()..$]); |
|---|
| | 656 | debug{ |
|---|
| | 657 | EnumDataRecord enumData = this.enumData[$-1]; |
|---|
| | 658 | |
|---|
| | 659 | uint address = enumData.offset + offset; |
|---|
| | 660 | |
|---|
| | 661 | writef("fixup - %s : %0.2X | offset: %0.4X | segrel: %s",enumData.base.name,enumData.offset,address,isSegmentRelativeFixup); |
|---|
| | 662 | |
|---|
| | 663 | writef(" | frame: "); |
|---|
| | 664 | switch(frameMethod){ |
|---|
| | 665 | case 0: writef("segment %s",this.segments[frameDatum].name); break; |
|---|
| | 666 | case 1: writef("group %s",this.groups[frameDatum].name); break; |
|---|
| | 667 | case 2: writef("extern %s",this.externs[frameDatum].name); break; |
|---|
| | 668 | case 4: writef("segment %s",this.segments[$-1].name); break; |
|---|
| | 669 | case 5: writef("[target]"); break; |
|---|
| | 670 | case 3: |
|---|
| | 671 | default: |
|---|
| | 672 | writef("<invalid>"); |
|---|
| | 673 | } |
|---|
| | 674 | |
|---|
| | 675 | writef(" | target: "); |
|---|
| | 676 | switch(targetMethod){ |
|---|
| | 677 | |
|---|
| | 678 | case 0: writef("(displacment: %d) ",targetDisplacement); |
|---|
| | 679 | case 4: writef("segment %s",this.segments[targetDatum].name); break; |
|---|
| | 680 | |
|---|
| | 681 | case 1: writef("(displacment: %d) ",targetDisplacement); |
|---|
| | 682 | case 5: writef("group %s",this.groups[targetDatum].name); break; |
|---|
| | 683 | |
|---|
| | 684 | case 2: writef("(displacment: %d) ",targetDisplacement); |
|---|
| | 685 | case 6: writef("extern %s",this.externs[frameDatum].name); break; |
|---|
| | 686 | |
|---|
| | 687 | default: |
|---|
| | 688 | writef("<invalid>"); |
|---|
| | 689 | } |
|---|
| | 690 | |
|---|
| | 691 | writefln(""); |
|---|
| | 692 | } |
|---|