Page 1 of 1

Bootloader stage 2 not loading in bochs.

Posted: Fri Jan 05, 2018 2:13 pm
by Sneh Kumar Mishra
Hello
I am following this awsome series in LINUX (ubuntu 16.04), until now I have sucessfully run boot loader stage 1 but there is some issue in loading stage 2 in bochs (It works fine in virtual box though). here is bootloader stage one code:

Code: Select all

bits 16

org  0                      ;we will set segments later

start:	jmp	main

;***** BPB Parameter block *****
;must start 3 bytes after start (jmp main is of 3 byte)

bpbOEM			db "My OS   "			; OEM identifier (Cannot exceed 8 bytes!)
bpbBytesPerSector:  	DW 512
bpbSectorsPerCluster: 	DB 1
bpbReservedSectors: 	DW 1
bpbNumberOfFATs: 	DB 2
bpbRootEntries: 	DW 224
bpbTotalSectors: 	DW 2880
bpbMedia: 		DB 0xf8  ;; 0xF1
bpbSectorsPerFAT: 	DW 9
bpbSectorsPerTrack: 	DW 18
bpbHeadsPerCylinder: 	DW 2
bpbHiddenSectors: 	DD 0
bpbTotalSectorsBig:     DD 0
bsDriveNumber: 	        DB 0
bsUnused: 		DB 0
bsExtBootSignature: 	DB 0x29
bsSerialNumber:	        DD 0xa0a1a2a3
bsVolumeLabel: 	        DB "MOS FLOPPY "
bsFileSystem: 	        DB "FAT12   "

Print:
    ;string pointed by ds:si, terminated by 0
    lodsb                   ;load next byte pointed by si to al
    or al, al               ;if al is zero
    jz PrintDone
    mov ah, 0eh             ;prepare fro bios vedio interuppt call
    int 10h
    jmp Print
    PrintDone:
        ret

ReadSectors :
    ;cx = no fo sectors to ReadSectors
    ;ax = strating sectors
    ;ES:BX = buffer to read to
    
    .MAIN :
        mov di, 0x0005       ;we will try 5 times if failed
    .SECTORLOOP :
        push ax
        push bx
        push cx
        call LBACHS          ;we will get absolute sector, absolute head and absolute track information from here
        mov ah, 0x02         ;prepare bios read interrupt
        mov al, 0x01         ;we will read one sector
        mov ch, byte[absoluteTrack]
        mov cl, byte[absoluteSector]
        mov dh, byte[absoluteHead]
        mov dl, byte[bsDriveNumber]
        int 0x13            ;bios read interrupt call
        jnc .SUCCESS        ;if sucessful
        xor ax, ax          ;retying again
        int 0x13            ;reset disk interuppt call
        dec di              ;decrease a try
        pop cx
        pop bx
        pop ax
        jnz .SECTORLOOP
        int 0x18            ;start basic
        
        .SUCCESS:
            pop cx
            pop bx
            pop ax
            add bx, word[bpbBytesPerSector]         ;next read buffer location
            inc ax                                  ;next sector to read
            loop .MAIN
            ret

ClusterLBA:
;convert custer no to LBACHS
;LBA = (cluster - 2)*sectors per cluster
        sub ax, 0x0002
        xor cx, cx
        mov cl, byte[bpbSectorsPerCluster]
        mul cx
        add ax, word[datasector]                    ;base of data sectors
        ret
        
LBACHS:
;convert LBA to CHS
;absolute sector = (logical sector % sector per track) + 1
;absolute head = (logical sector / sectors per track) % no of heads
;absoluteTrack = logical sector / (sectors per track * no of heads)
        xor dx, dx  
        div word [bpbSectorsPerTrack]
        inc dl
        mov byte[absoluteSector], dl
        xor dx, dx
        div word[bpbHeadsPerCylinder]
        mov byte[absoluteHead], dl
        mov byte[absoluteTrack], al
        ret

main:
        cli
        mov ax, 0x07C0                                       ;0x7C0*2^4 = 0x7C00
        mov ds, ax                                          ;setup segment registers
        mov es, ax
        mov fs, ax
        mov gs, ax
        
        ;create stack
        mov ax, 0x0000
        mov ss, ax
        mov sp, 0xFFFF
        sti
        
        ;display Starting
        mov si, msgStart
        call Print
        
        ;load root directory table
        LOAD_ROOT:
            ;size of root directory = 32*(no of root entries)/(bytes per sector) SECTORS
            xor cx, cx
            xor dx, dx
            mov ax, 0x0020
            mul word[bpbRootEntries]
            div word[bpbBytesPerSector]
            xchg ax, cx                         ;size of root in cx
            
            ;location root directory = reserved sectors + (no of FATS * sectors per FAT)
            mov al, byte [bpbNumberOfFATs]
            mul word [bpbSectorsPerFAT]
            add ax, word[bpbReservedSectors]
            mov word [datasector], ax
            add word [datasector], cx            ;start of data sector
            
            ;read root directory into memory 0x7C0:0x0200 = 7C00+0200
            mov bx, 0x0200
            call ReadSectors
            
            ;find stage2 boot loader
            mov cx, word[bpbRootEntries]
            mov di, 0x0200                      ;address of root table in memory
            .LOOP:
                push cx
                mov cx, 0x000B                  ;11 character name
                mov si, ImageName               ;Image name
                push di
                rep cmpsb
                    pop di
                    je LOAD_FAT
                    pop cx
                    add di, 0x0020              ;next entry in root table
                    loop .LOOP
                    jmp FAILURE
                    
            LOAD_FAT:
            ;save starting cluster of boot image
            mov dx, word[di+0x001A]
            mov word[cluster], dx
            
            ;compute size of FAT and store in cx = no of FAT * sectors per FAT
            xor ax, ax
            mov al, byte[bpbNumberOfFATs]
            mul word[bpbSectorsPerFAT]
            mov cx, ax
            
            ;location of FAT in ax = no of reserved Sectors
            mov ax, word[bpbReservedSectors]
            
            ;read FAT in memory at 0x7C0:0x0200
            mov bx, 0x0200
            call ReadSectors
            
            ;load image file into memory at 0050:0000 => 0x500)
            mov ax, 0x0050
            mov es, ax
            mov bx, 0x0000
            push bx
            
            LOAD_IMAGE:
          
            mov ax, word[cluster]
            pop bx
            call ClusterLBA
            xor cx, cx
            mov cl, byte[bpbSectorsPerCluster]
            call ReadSectors
            push bx
            
            ;compute next cluster, remember cluster entries are of 12 bits = 3/2 bytes
            mov ax, word[cluster]
            mov cx, ax
            mov dx, ax
            shr dx, 0x0001          ;devide by 2
            add cx, dx              ;equals to 3/2*cluster number
            mov bx, 0x0200          ;location of FAT in memory
            add bx, cx              ;we moved 3/2*cluster no bytes from start
            mov dx, word[bx]        ;read 2 bytes in dx
            test ax, 0x0001         ;if this was odd cluster =>  lower 12 bits, else =>higher 12 bits will be used
            jnz .ODD_CLUSTER
            
            .EVEN_CLUSTER:
                and dx, 0000111111111111b
                jmp .DONE
            
            .ODD_CLUSTER:
                shr dx, 0x0004
            
            .DONE:
                mov word[cluster], dx   ;new cluster location
                cmp dx, 0x0FF0          ;if this was last cluster
                jb LOAD_IMAGE
            
            DONE:
                mov si, msgStageTwo
                call Print
                push word 0x0050      ;segment address
                push word 0x0000      ;offset in segment
                retf                  ;far return, both of the above value will be used
                
            FAILURE:
                mov si, msgFailure
                call Print
                mov ah, 0x00
                int 0x16            ;wait for key press
                int 0x19            ;reboot
                
            
            absoluteSector db 0x00
            absoluteHead   db 0x00
            absoluteTrack  db 0x00
            
            datasector     dw 0x0000
            cluster        dw 0x0000
            ImageName      db "KRNLDR  SYS"         ;must be 11 bytes
            msgStart     db 0x0D,0x0A, "Boot Loader starting (0x7c00)....", 0x0D, 0x0A, 0x00
            msgStageTwo  db "Jumping to stage2 (0x500)", 0x0D, 0x0A, 0x0D, 0x0A, 0x00
            msgFailure  db 0x0D, 0x0A, "ERROR : Press Key to Reboot", 0x0A, 0x00
            
            times 510-($-$$) db 0
            dw 0xAA55                               ;boot signature

It seems stage 2 is not correctly loaded in memory at 0x0500, Bochs debugger is showing some unknown instruction at 0x0500, it just hungs after printing "jumping to stage two" (print call just before RETF instruction). Here is my bochs configuration file:

Code: Select all

romimage: file="/usr/share/bochs/BIOS-bochs-latest"
vgaromimage: file ="/usr/share/bochs/VGABIOS-lgpl-latest"
floppya: 1_44=/dev/loop0, status=inserted
display_library: x, options="gui_debug"
log: bochsout.txt

And here is bochs log:

Code: Select all

00000000000i[     ] Bochs x86 Emulator 2.6
00000000000i[     ]   Built from SVN snapshot on September 2nd, 2012
00000000000i[     ] System configuration
00000000000i[     ]   processors: 1 (cores=1, HT threads=1)
00000000000i[     ]   A20 line support: yes
00000000000i[     ] IPS is set to 4000000
00000000000i[     ] CPU configuration
00000000000i[     ]   level: 6
00000000000i[     ]   SMP support: no
00000000000i[     ]   APIC support: xapic
00000000000i[     ]   FPU support: yes
00000000000i[     ]   MMX support: yes
00000000000i[     ]   3dnow! support: no
00000000000i[     ]   SEP support: yes
00000000000i[     ]   SSE support: sse2
00000000000i[     ]   XSAVE support: no 
00000000000i[     ]   AES support: no
00000000000i[     ]   MOVBE support: no
00000000000i[     ]   ADX support: no
00000000000i[     ]   x86-64 support: yes
00000000000i[     ]   1G paging support: no
00000000000i[     ]   MWAIT support: yes
00000000000i[     ]   AVX support: no
00000000000i[     ]   VMX support: 1
00000000000i[     ] Optimization configuration
00000000000i[     ]   RepeatSpeedups support: yes
00000000000i[     ]   Fast function calls: yes
00000000000i[     ]   Handlers Chaining speedups: no
00000000000i[     ] Devices configuration
00000000000i[     ]   NE2000 support: yes
00000000000i[     ]   PCI support: yes, enabled=yes
00000000000i[     ]   SB16 support: yes
00000000000i[     ]   USB support: yes
00000000000i[     ]   VGA extension support: vbe cirrus
00000000000i[MEM0 ] allocated memory at 0x7fe974eb4010. after alignment, vector=0x7fe974eb5000
00000000000i[MEM0 ] 32.00MB
00000000000i[MEM0 ] mem block size = 0x00100000, blocks=32
00000000000i[MEM0 ] rom at 0xfffe0000/131072 ('/usr/share/bochs/BIOS-bochs-latest')
00000000000i[     ] lt_dlhandle is 0x2f17540
00000000000i[PLGIN] loaded plugin libbx_hdimage.so
00000000000i[     ] lt_dlhandle is 0x2f17ed0
00000000000i[PLGIN] loaded plugin libbx_pci.so
00000000000i[     ] lt_dlhandle is 0x2f18a50
00000000000i[PLGIN] loaded plugin libbx_pci2isa.so
00000000000i[     ] lt_dlhandle is 0x2f19460
00000000000i[PLGIN] loaded plugin libbx_acpi.so
00000000000i[     ] lt_dlhandle is 0x2f19e60
00000000000i[PLGIN] loaded plugin libbx_cmos.so
00000000000i[     ] lt_dlhandle is 0x2f1a7a0
00000000000i[PLGIN] loaded plugin libbx_dma.so
00000000000i[     ] lt_dlhandle is 0x2f1b230
00000000000i[PLGIN] loaded plugin libbx_pic.so
00000000000i[     ] lt_dlhandle is 0x2f1bad0
00000000000i[PLGIN] loaded plugin libbx_pit.so
00000000000i[     ] lt_dlhandle is 0x2f1c500
00000000000i[PLGIN] loaded plugin libbx_floppy.so
00000000000i[     ] lt_dlhandle is 0x2f1d0f0
00000000000i[PLGIN] loaded plugin libbx_vga.so
00000000000i[     ] lt_dlhandle is 0x2f1d880
00000000000i[PLGIN] loaded plugin libbx_ioapic.so
00000000000i[     ] lt_dlhandle is 0x2f1e2c0
00000000000i[PLGIN] loaded plugin libbx_keyboard.so
00000000000i[     ] lt_dlhandle is 0x2f1eb60
00000000000i[PLGIN] loaded plugin libbx_harddrv.so
00000000000i[     ] lt_dlhandle is 0x2f30c50
00000000000i[PLGIN] loaded plugin libbx_pci_ide.so
00000000000i[PLGIN] init_dev of 'pci' plugin device by virtual method
00000000000i[PCI  ] 440FX Host bridge present at device 0, function 0
00000000000i[PLGIN] init_dev of 'pci2isa' plugin device by virtual method
00000000000i[PCI  ] PIIX3 PCI-to-ISA bridge present at device 1, function 0
00000000000i[PLGIN] init_dev of 'cmos' plugin device by virtual method
00000000000i[CMOS ] Using local time for initial clock
00000000000i[CMOS ] Setting initial clock to: Fri Jan  5 19:33:21 2018 (time0=1515161001)
00000000000i[PLGIN] init_dev of 'dma' plugin device by virtual method
00000000000i[DMA  ] channel 4 used by cascade
00000000000i[PLGIN] init_dev of 'pic' plugin device by virtual method
00000000000i[PLGIN] init_dev of 'pit' plugin device by virtual method
00000000000i[PLGIN] init_dev of 'floppy' plugin device by virtual method
00000000000i[DMA  ] channel 2 used by Floppy Drive
00000000000e[FDD  ] cannot determine media geometry, trying to use defaults
00000000000i[FDD  ] fd0: '/dev/loop0' ro=0, h=2,t=80,spt=18
00000000000i[PLGIN] init_dev of 'vga' plugin device by virtual method
00000000000i[MEM0 ] Register memory access handlers: 0x00000000000a0000 - 0x00000000000bffff
00000000000i[VGA  ] interval=200000
00000000000i[MEM0 ] Register memory access handlers: 0x00000000e0000000 - 0x00000000e0ffffff
00000000000i[BXVGA] VBE Bochs Display Extension Enabled
00000000000i[XGUI ] test_alloc_colors: 16 colors available out of 16 colors tried
00000000000i[XGUI ] font 8 wide x 16 high, display depth = 24
00000000000i[MEM0 ] rom at 0xc0000/41472 ('/usr/share/bochs/VGABIOS-lgpl-latest')
00000000000i[PLGIN] init_dev of 'acpi' plugin device by virtual method
00000000000i[PCI  ] ACPI Controller present at device 1, function 3
00000000000i[PLGIN] init_dev of 'ioapic' plugin device by virtual method
00000000000i[IOAP ] initializing I/O APIC
00000000000i[MEM0 ] Register memory access handlers: 0x00000000fec00000 - 0x00000000fec00fff
00000000000i[PLGIN] init_dev of 'keyboard' plugin device by virtual method
00000000000i[KBD  ] will paste characters every 1000 keyboard ticks
00000000000i[PLGIN] init_dev of 'harddrv' plugin device by virtual method
00000000000i[HD   ] Using boot sequence floppy, none, none
00000000000i[HD   ] Floppy boot signature check is enabled
00000000000i[PLGIN] init_dev of 'pci_ide' plugin device by virtual method
00000000000i[PCI  ] PIIX3 PCI IDE controller present at device 1, function 1
00000000000i[PLGIN] init_dev of 'unmapped' plugin device by virtual method
00000000000i[PLGIN] init_dev of 'biosdev' plugin device by virtual method
00000000000i[PLGIN] init_dev of 'speaker' plugin device by virtual method
00000000000i[PLGIN] init_dev of 'extfpuirq' plugin device by virtual method
00000000000i[PLGIN] init_dev of 'parallel' plugin device by virtual method
00000000000i[PAR  ] parallel port 1 at 0x0378 irq 7
00000000000i[PLGIN] init_dev of 'serial' plugin device by virtual method
00000000000i[SER  ] com1 at 0x03f8 irq 4
00000000000i[PLGIN] init_dev of 'gameport' plugin device by virtual method
00000000000i[PLGIN] init_dev of 'iodebug' plugin device by virtual method
00000000000i[PLGIN] register state of 'pci' plugin device by virtual method
00000000000i[PLGIN] register state of 'pci2isa' plugin device by virtual method
00000000000i[PLGIN] register state of 'cmos' plugin device by virtual method
00000000000i[PLGIN] register state of 'dma' plugin device by virtual method
00000000000i[PLGIN] register state of 'pic' plugin device by virtual method
00000000000i[PLGIN] register state of 'pit' plugin device by virtual method
00000000000i[PLGIN] register state of 'floppy' plugin device by virtual method
00000000000i[PLGIN] register state of 'vga' plugin device by virtual method
00000000000i[PLGIN] register state of 'unmapped' plugin device by virtual method
00000000000i[PLGIN] register state of 'biosdev' plugin device by virtual method
00000000000i[PLGIN] register state of 'speaker' plugin device by virtual method
00000000000i[PLGIN] register state of 'extfpuirq' plugin device by virtual method
00000000000i[PLGIN] register state of 'parallel' plugin device by virtual method
00000000000i[PLGIN] register state of 'serial' plugin device by virtual method
00000000000i[PLGIN] register state of 'gameport' plugin device by virtual method
00000000000i[PLGIN] register state of 'iodebug' plugin device by virtual method
00000000000i[PLGIN] register state of 'acpi' plugin device by virtual method
00000000000i[PLGIN] register state of 'ioapic' plugin device by virtual method
00000000000i[PLGIN] register state of 'keyboard' plugin device by virtual method
00000000000i[PLGIN] register state of 'harddrv' plugin device by virtual method
00000000000i[PLGIN] register state of 'pci_ide' plugin device by virtual method
00000000000i[SYS  ] bx_pc_system_c::Reset(HARDWARE) called
00000000000i[CPU0 ] cpu hardware reset
00000000000i[APIC0] allocate APIC id=0 (MMIO enabled) to 0x00000000fee00000
00000000000i[CPU0 ] CPUID[0x00000000]: 00000002 756e6547 6c65746e 49656e69
00000000000i[CPU0 ] CPUID[0x00000001]: 00000633 00010800 00002028 1fcbfbff
00000000000i[CPU0 ] CPUID[0x00000002]: 00410601 00000000 00000000 00000000
00000000000i[CPU0 ] CPUID[0x80000000]: 80000008 00000000 00000000 00000000
00000000000i[CPU0 ] CPUID[0x80000001]: 00000000 00000000 00000101 2a100000
00000000000i[CPU0 ] CPUID[0x80000002]: 20202020 20202020 20202020 6e492020
00000000000i[CPU0 ] CPUID[0x80000003]: 286c6574 50202952 69746e65 52286d75
00000000000i[CPU0 ] CPUID[0x80000004]: 20342029 20555043 20202020 00202020
00000000000i[CPU0 ] CPUID[0x80000005]: 01ff01ff 01ff01ff 40020140 40020140
00000000000i[CPU0 ] CPUID[0x80000006]: 00000000 42004200 02008140 00000000
00000000000i[CPU0 ] CPUID[0x80000007]: 00000000 00000000 00000000 00000000
00000000000i[CPU0 ] CPUID[0x80000008]: 00003028 00000000 00000000 00000000
00000000000i[PLGIN] reset of 'pci' plugin device by virtual method
00000000000i[PLGIN] reset of 'pci2isa' plugin device by virtual method
00000000000i[PLGIN] reset of 'cmos' plugin device by virtual method
00000000000i[PLGIN] reset of 'dma' plugin device by virtual method
00000000000i[PLGIN] reset of 'pic' plugin device by virtual method
00000000000i[PLGIN] reset of 'pit' plugin device by virtual method
00000000000i[PLGIN] reset of 'floppy' plugin device by virtual method
00000000000i[PLGIN] reset of 'vga' plugin device by virtual method
00000000000i[PLGIN] reset of 'acpi' plugin device by virtual method
00000000000i[PLGIN] reset of 'ioapic' plugin device by virtual method
00000000000i[PLGIN] reset of 'keyboard' plugin device by virtual method
00000000000i[PLGIN] reset of 'harddrv' plugin device by virtual method
00000000000i[PLGIN] reset of 'pci_ide' plugin device by virtual method
00000000000i[PLGIN] reset of 'unmapped' plugin device by virtual method
00000000000i[PLGIN] reset of 'biosdev' plugin device by virtual method
00000000000i[PLGIN] reset of 'speaker' plugin device by virtual method
00000000000i[SPEAK] Using /dev/console for output
00000000000i[PLGIN] reset of 'extfpuirq' plugin device by virtual method
00000000000i[PLGIN] reset of 'parallel' plugin device by virtual method
00000000000i[PLGIN] reset of 'serial' plugin device by virtual method
00000000000i[PLGIN] reset of 'gameport' plugin device by virtual method
00000000000i[PLGIN] reset of 'iodebug' plugin device by virtual method
00000000000i[XGUI ] Mouse capture off
00000000000i[XGUI ] Mouse capture off
00000000000i[MEM0 ] allocate_block: block=0x0 used 0x1 of 0x20
00000004661i[BIOS ] $Revision: 11318 $ $Date: 2012-08-06 19:59:54 +0200 (Mo, 06. Aug 2012) $
00000319051i[KBD  ] reset-disable command received
00000321813i[BIOS ] Starting rombios32
00000322255i[BIOS ] Shutdown flag 0
00000322852i[BIOS ] ram_size=0x02000000
00000323280i[BIOS ] ram_end=32MB
00000363809i[BIOS ] Found 1 cpu(s)
00000377990i[BIOS ] bios_table_addr: 0x000fa438 end=0x000fcc00
00000705785i[PCI  ] 440FX PMC write to PAM register 59 (TLB Flush)
00001033717i[P2I  ] PCI IRQ routing: PIRQA# set to 0x0b
00001033741i[P2I  ] PCI IRQ routing: PIRQB# set to 0x09
00001033765i[P2I  ] PCI IRQ routing: PIRQC# set to 0x0b
00001033789i[P2I  ] PCI IRQ routing: PIRQD# set to 0x09
00001033799i[P2I  ] write: ELCR2 = 0x0a
00001034578i[BIOS ] PIIX3/PIIX4 init: elcr=00 0a
00001042258i[BIOS ] PCI: bus=0 devfn=0x00: vendor_id=0x8086 device_id=0x1237 class=0x0600
00001044537i[BIOS ] PCI: bus=0 devfn=0x08: vendor_id=0x8086 device_id=0x7000 class=0x0601
00001046655i[BIOS ] PCI: bus=0 devfn=0x09: vendor_id=0x8086 device_id=0x7010 class=0x0101
00001046884i[PIDE ] new BM-DMA address: 0xc000
00001047504i[BIOS ] region 4: 0x0000c000
00001049538i[BIOS ] PCI: bus=0 devfn=0x0b: vendor_id=0x8086 device_id=0x7113 class=0x0680
00001049768i[ACPI ] new irq line = 11
00001049782i[ACPI ] new irq line = 9
00001049809i[ACPI ] new PM base address: 0xb000
00001049823i[ACPI ] new SM base address: 0xb100
00001049851i[PCI  ] setting SMRAM control register to 0x4a
00001213945i[CPU0 ] Enter to System Management Mode
00001213945i[CPU0 ] enter_system_management_mode: temporary disable VMX while in SMM mode
00001213955i[CPU0 ] RSM: Resuming from System Management Mode
00001377976i[PCI  ] setting SMRAM control register to 0x0a
00001392878i[BIOS ] MP table addr=0x000fa510 MPC table addr=0x000fa440 size=0xc8
00001394693i[BIOS ] SMBIOS table addr=0x000fa520
00001394744i[MEM0 ] allocate_block: block=0x1f used 0x2 of 0x20
00001397672i[BIOS ] Firmware waking vector 0x1ff00cc
00001402531i[BIOS ] ACPI tables: RSDP addr=0x000fa640 ACPI DATA addr=0x01ff0000 size=0x1f22
00001402568i[PCI  ] 440FX PMC write to PAM register 59 (TLB Flush)
00001403299i[BIOS ] bios_table_cur_addr: 0x000fa664
00001530917i[VBIOS] VGABios $Id: vgabios.c,v 1.75 2011/10/15 14:07:21 vruppert Exp $
00001530988i[BXVGA] VBE known Display Interface b0c0
00001531020i[BXVGA] VBE known Display Interface b0c5
00001533945i[VBIOS] VBE Bios $Id: vbe.c,v 1.64 2011/07/19 18:25:05 vruppert Exp $
00001600003i[XGUI ] charmap update. Font Height is 16
00014040953i[BIOS ] Booting from 0000:7c00
00121936267i[XGUI ] Mouse capture off
00121936267i[MEM0 ] allocate_block: block=0x1 used 0x3 of 0x20
00121936267i[     ] dbg: Quit
00121936267i[CPU0 ] CPU is in real mode (active)
00121936267i[CPU0 ] CS.mode = 16 bit
00121936267i[CPU0 ] SS.mode = 16 bit
00121936267i[CPU0 ] EFER   = 0x00000000
00121936267i[CPU0 ] | EAX=00000005  EBX=00000207  ECX=00090007  EDX=00000fff
00121936267i[CPU0 ] | ESP=0000fff5  EBP=00000000  ESI=000e01d7  EDI=00000005
00121936267i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df if tf sf zf af PF cf
00121936267i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00121936267i[CPU0 ] |  CS:f000( 0004| 0|  0) 000f0000 0000ffff 0 0
00121936267i[CPU0 ] |  DS:07c0( 0005| 0|  0) 00007c00 0000ffff 0 0
00121936267i[CPU0 ] |  SS:0000( 0005| 0|  0) 00000000 0000ffff 0 0
00121936267i[CPU0 ] |  ES:0050( 0005| 0|  0) 00000500 0000ffff 0 0
00121936267i[CPU0 ] |  FS:07c0( 0005| 0|  0) 00007c00 0000ffff 0 0
00121936267i[CPU0 ] |  GS:07c0( 0005| 0|  0) 00007c00 0000ffff 0 0
00121936267i[CPU0 ] | EIP=0000ff53 (00000230)
00121936267i[CPU0 ] | CR0=0x60000010 CR2=0x00000000
00121936267i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
00121936267i[CMOS ] Last time is 1515161031 (Fri Jan  5 19:33:51 2018)
00121936267i[XGUI ] Exit
00121936267i[CTRL ] quit_sim called with exit code 0
And at last this is how I have created and mounted floppy disk:
dd if=/dev/zero of=myfloppy.img bs=512 ... /dev/loop0

Thank you for reading, please help I want to follow this series to the end.