]> git.proxmox.com Git - mirror_edk2.git/blobdiff - DuetPkg/BootSector/efi64.S
ArmPkg/UncachedMemoryAllocationLib: restore mapping attributes after free
[mirror_edk2.git] / DuetPkg / BootSector / efi64.S
index b7b3384291578ae8236ba48a2bf42dafd09ee625..34bd7521b95a6794502bf2b3bc4de2eb94eab320 100644 (file)
-#------------------------------------------------------------------------------
-#*
-#*   Copyright 2006, Intel Corporation                                                         
-#*   All rights reserved. This program and the accompanying materials                          
-#*   are licensed and made available under the terms and conditions of the BSD License         
-#*   which accompanies this distribution.  The full text of the license may be found at        
-#*   http://opensource.org/licenses/bsd-license.php                                            
-#*                                                                                             
-#*   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
-#*   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
-#*   
-#*    efi64.asm
-#*  
-#*   Abstract:
-#*
-#------------------------------------------------------------------------------
-
-##############################################################################
-# Now in 64-bit long mode.
-##############################################################################
-
-        .486: 
-        .stack: 
-        .code: 
-        .org 0x21000
-
-.equ                 DEFAULT_HANDLER_SIZE, INT1 - INT0
-
-.macro jmpCommonIdtEntry  
-    # jmp     commonIdtEntry - this must be hand coded to keep the assembler from
-    #                          using a 8 bit reletive jump when the entries are
-    #                          within 255 bytes of the common entry.  This must
-    #                          be done to maintain the consistency of the size
-    #                          of entry points...
-    .byte   0xe9                                        # jmp 16 bit relative
-               .long   commonIdtEntry - . - 4   # offset to jump to
-.endm
-
-
-Start:  
-
-    movl    $0x001fffe8,%esp # make final stack aligned
-
-    # set OSFXSR and OSXMMEXCPT because some code will use XMM register
-    .byte 0xf
-    .byte 0x20
-    .byte 0xe0
-#    mov rax, cr4
-    btsl $9,%eax
-    btsl $0xa,%eax
-    .byte 0xf
-    .byte 0x22
-    .byte 0xe0
-#    mov cr4, rax
-
-    call    ClearScreen
-
-    # Populate IDT with meaningful offsets for exception handlers...
-               sidt    Idtr 
-               
-
-               movl    Halt, %eax
-    movl    %eax,%ebx                   # use bx to copy 15..0 to descriptors
-    shrl    $16,%eax                    # use ax to copy 31..16 to descriptors 
-                                        # 63..32 of descriptors is 0
-    movl    $0x78,%ecx                  # 78h IDT entries to initialize with unique entry points (exceptions)
-               movl    (Idtr + 2), %esi
-    movl    (%esi),%edi
-
-LOOP_1:                                         # loop through all IDT entries exception handlers and initialize to default handler
+#------------------------------------------------------------------------------\r
+#*\r
+#*   Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
+#*   This program and the accompanying materials                          \r
+#*   are licensed and made available under the terms and conditions of the BSD License         \r
+#*   which accompanies this distribution.  The full text of the license may be found at        \r
+#*   http://opensource.org/licenses/bsd-license.php                                            \r
+#*                                                                                             \r
+#*   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+#*   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+#*   \r
+#*    efi64.asm\r
+#*  \r
+#*   Abstract:\r
+#*\r
+#------------------------------------------------------------------------------\r
+\r
+##############################################################################\r
+# Now in 64-bit long mode.\r
+##############################################################################\r
+\r
+        .486: \r
+        .stack: \r
+        .code: \r
+        .org 0x21000\r
+\r
+.global _start\r
+_start:\r
+\r
+.equ                 DEFAULT_HANDLER_SIZE, INT1 - INT0\r
+\r
+.macro jmpCommonIdtEntry  \r
+    # jmp     commonIdtEntry - this must be hand coded to keep the assembler from\r
+    #                          using a 8 bit reletive jump when the entries are\r
+    #                          within 255 bytes of the common entry.  This must\r
+    #                          be done to maintain the consistency of the size\r
+    #                          of entry points...\r
+    .byte   0xe9                     # jmp 16 bit relative\r
+    .long   commonIdtEntry - . - 4   # offset to jump to\r
+.endm\r
+\r
+\r
+Start:  \r
+\r
+    movl    $0x001fffe8,%esp # make final stack aligned\r
+\r
+    # set OSFXSR and OSXMMEXCPT because some code will use XMM register\r
+    .byte 0xf\r
+    .byte 0x20\r
+    .byte 0xe0\r
+#    mov rax, cr4\r
+    btsl $9,%eax\r
+    btsl $0xa,%eax\r
+    .byte 0xf\r
+    .byte 0x22\r
+    .byte 0xe0\r
+#    mov cr4, rax\r
+\r
+    call    ClearScreen\r
+\r
+    # Populate IDT with meaningful offsets for exception handlers...\r
+    movl    $Idtr, %eax\r
+    sidt    (%eax)                      # get fword address of IDT\r
+    \r
+\r
+    movl    $Halt, %eax\r
+    movl    %eax,%ebx                   # use bx to copy 15..0 to descriptors\r
+    shrl    $16,%eax                    # use ax to copy 31..16 to descriptors \r
+                                        # 63..32 of descriptors is 0\r
+    movl    $0x78,%ecx                  # 78h IDT entries to initialize with unique entry points (exceptions)\r
+    movl    $(Idtr + 2), %esi\r
+    movl    (%esi),%edi\r
+\r
+LOOP_1:                                         # loop through all IDT entries exception handlers and initialize to default handler\r
     movw    %bx, (%edi)                         # write bits 15..0 of offset\r
     movw    $0x38, 2(%edi)                      # SYS_CODE_SEL64 from GDT\r
-    movw    $(0x0e00 | 0x8000), 4(%edi)                # type = 386 interrupt gate, present\r
-    movw    %ax, 6(%edi)                        # write bits 31..16 of offset
+    movw    $(0x0e00 | 0x8000), 4(%edi)         # type = 386 interrupt gate, present\r
+    movw    %ax, 6(%edi)                        # write bits 31..16 of offset\r
     movl    $0, 8(%edi)                         # write bits 31..16 of offset  \r
     addl    $16, %edi                           # move up to next descriptor\r
-    addw    DEFAULT_HANDLER_SIZE, %bx           # move to next entry point\r
-    loopl   LOOP_1                              # loop back through again until all descriptors are initialized
-
-    ## at this point edi contains the offset of the descriptor for INT 20
-    ## and bx contains the low 16 bits of the offset of the default handler
-    ## so initialize all the rest of the descriptors with these two values...
-#    mov     ecx, 101                            ; there are 100 descriptors left (INT 20 (14h) - INT 119 (77h)
-#@@:                                             ; loop through all IDT entries exception handlers and initialize to default handler
-#    mov     word ptr [edi], bx                  ; write bits 15..0 of offset
-#    mov     word ptr [edi+2], 38h               ; SYS_CODE64_SEL from GDT
-#    mov     word ptr [edi+4], 0e00h OR 8000h    ; type = 386 interrupt gate, present
-#    mov     word ptr [edi+6], ax                ; write bits 31..16 of offset
-#    mov     dword ptr [edi+8], 0                ; write bits 63..32 of offset
-#    add     edi, 16                             ; move up to next descriptor
-#    loop    @b                                  ; loop back through again until all descriptors are initialized
-
-
-##  DUMP    location of IDT and several of the descriptors
-#    mov     ecx, 8
-#    mov     eax, [offset Idtr + 2]
-#    mov     eax, [eax]
-#    mov     edi, 0b8000h
-#    call    PrintQword
-#    mov     esi, eax
-#    mov     edi, 0b80a0h
-#    jmp     OuterLoop
-
-##    
-## just for fun, let's do a software interrupt to see if we correctly land in the exception handler...
-#    mov     eax, 011111111h
-#    mov     ebx, 022222222h
-#    mov     ecx, 033333333h
-#    mov     edx, 044444444h
-#    mov     ebp, 055555555h
-#    mov     esi, 066666666h
-#    mov     edi, 077777777h
-#    push    011111111h
-#    push    022222222h
-#    push    033333333h
-#    int     119
-
-    movl    $0x22000,%esi               # esi = 22000
-    movl    0x14(%esi),%eax             # eax = [22014]
-    addl    %eax,%esi                   # esi = 22000 + [22014] = Base of EFILDR.C
-    movl    0x3c(%esi),%ebp             # ebp = [22000 + [22014] + 3c] = NT Image Header for EFILDR.C
-    addl    %esi,%ebp
-    movl    0x30(%ebp),%edi             # edi = [[22000 + [22014] + 3c] + 2c] = ImageBase (63..32 is zero, ignore)
-    movl    0x28(%ebp),%eax             # eax = [[22000 + [22014] + 3c] + 24] = EntryPoint
-    addl    %edi,%eax                   # eax = ImageBase + EntryPoint
-               movl    %ebx, EfiLdrOffset          
-    movl    %eax, (%ebx)                # Modify far jump instruction for correct entry point
-
-               movw    6(%ebp), %bx                # bx = Number of sections
-    xorl    %eax,%eax
-               movw    0x14(%ebp), %ax             # ax = Optional Header Size
-    addl    %eax,%ebp
-    addl    $0x18,%ebp                  # ebp = Start of 1st Section
-
-SectionLoop: 
-    pushl   %esi                        # Save Base of EFILDR.C
-    pushl   %edi                        # Save ImageBase
-    addl    0x14(%ebp),%esi             # esi = Base of EFILDR.C + PointerToRawData
-    addl    0x0c(%ebp),%edi             # edi = ImageBase + VirtualAddress
-    movl    0x10(%ebp),%ecx             # ecs = SizeOfRawData
-
-    cld
-    shrl    $2,%ecx
-    rep
-    movsl
-
-    popl    %edi                        # Restore ImageBase
-    popl    %esi                        # Restore Base of EFILDR.C
-
-    addw    $0x28,%bp                   # ebp = ebp + 028h = Pointer to next section record
-    .byte 0x66
-    .byte 0xff
-    .byte 0xcb
-#    dec     bx
-    cmpw    $0,%bx
-    jne     SectionLoop
-
-               movl    (Idtr), %eax                  # get size of IDT
-               movzx           (%edx), %eax
-    .byte 0xff
-    .byte 0xc0
-#    inc     eax
-               addl    2(%edx), %eax                                                            # add to base of IDT to get location of memory map...
-    xorl    %ecx,%ecx
-    movl    %eax,%ecx                    # put argument to RCX
-
-    .byte 0x48
-    .byte 0xc7
-    .byte 0xc0
-EfiLdrOffset: 
-    .long 0x00401000                    # Offset of EFILDR
-#   mov rax, 401000h
-    .byte 0x50
-#   push rax
-
-# ret
-    .byte 0xc3
-
-#    db      "**** DEFAULT IDT ENTRY ***",0
-    .align 0x2
-Halt: 
-INT0: 
-    pushl   $0x0    # push error code place holder on the stack
-    pushl   $0x0
-    jmpCommonIdtEntry 
-#    db      0e9h                        ; jmp 16 bit reletive 
-#    dd      commonIdtEntry - $ - 4      ;  offset to jump to
-
-INT1: 
-    pushl   $0x0    # push error code place holder on the stack
-    pushl   $0x1
-    jmpCommonIdtEntry 
-
-INT2: 
-    pushl   $0x0    # push error code place holder on the stack
-    pushl   $0x2
-    jmpCommonIdtEntry 
-
-INT3: 
-    pushl   $0x0    # push error code place holder on the stack
-    pushl   $0x3
-    jmpCommonIdtEntry 
-
-INT4: 
-    pushl   $0x0    # push error code place holder on the stack
-    pushl   $0x4
-    jmpCommonIdtEntry 
-
-INT5: 
-    pushl   $0x0    # push error code place holder on the stack
-    pushl   $0x5
-    jmpCommonIdtEntry 
-
-INT6: 
-    pushl   $0x0    # push error code place holder on the stack
-    pushl   $0x6
-    jmpCommonIdtEntry 
-
-INT7: 
-    pushl   $0x0    # push error code place holder on the stack
-    pushl   $0x7
-    jmpCommonIdtEntry 
-
-INT8: 
-#   Double fault causes an error code to be pushed so no phony push necessary
-    nop
-    nop
-    pushl   $0x8
-    jmpCommonIdtEntry 
-
-INT9: 
-    pushl   $0x0    # push error code place holder on the stack
-    pushl   $0x9
-    jmpCommonIdtEntry 
-
-INT10: 
-#   Invalid TSS causes an error code to be pushed so no phony push necessary
-    nop
-    nop
-    pushl   $10
-    jmpCommonIdtEntry 
-
-INT11: 
-#   Segment Not Present causes an error code to be pushed so no phony push necessary
-    nop
-    nop
-    pushl   $11
-    jmpCommonIdtEntry 
-
-INT12: 
-#   Stack fault causes an error code to be pushed so no phony push necessary
-    nop
-    nop
-    pushl   $12
-    jmpCommonIdtEntry 
-
-INT13: 
-#   GP fault causes an error code to be pushed so no phony push necessary
-    nop
-    nop
-    pushl   $13
-    jmpCommonIdtEntry 
-
-INT14: 
-#   Page fault causes an error code to be pushed so no phony push necessary
-    nop
-    nop
-    pushl   $14
-    jmpCommonIdtEntry 
-
-INT15: 
-    pushl   $0x0    # push error code place holder on the stack
-    pushl   $15
-    jmpCommonIdtEntry 
-
-INT16: 
-    pushl   $0x0    # push error code place holder on the stack
-    pushl   $16
-    jmpCommonIdtEntry 
-
-INT17: 
-#   Alignment check causes an error code to be pushed so no phony push necessary
-    nop
-    nop
-    pushl   $17
-    jmpCommonIdtEntry 
-
-INT18: 
-    pushl   $0x0    # push error code place holder on the stack
-    pushl   $18
-    jmpCommonIdtEntry 
-
-INT19: 
-    pushl   $0x0    # push error code place holder on the stack
-    pushl   $19
-    jmpCommonIdtEntry 
-
-INTUnknown: 
-.rept  (0x78 - 20)
-    pushl   $0x0    # push error code place holder on the stack
-#    push    xxh     ; push vector number
-    .byte 0x6a
-    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number
-    jmpCommonIdtEntry 
-.endr
-
-commonIdtEntry: 
-    pushl   %eax
-    pushl   %ecx
-    pushl   %edx
-    pushl   %ebx
-    pushl   %esp
-    pushl   %ebp
-    pushl   %esi
-    pushl   %edi
-    .byte 0x41
-    .byte 0x50
-#    push    r8
-    .byte 0x41
-    .byte 0x51
-#    push    r9
-    .byte 0x41
-    .byte 0x52
-#    push    r10
-    .byte 0x41
-    .byte 0x53
-#    push    r11
-    .byte 0x41
-    .byte 0x54
-#    push    r12
-    .byte 0x41
-    .byte 0x55
-#    push    r13
-    .byte 0x41
-    .byte 0x56
-#    push    r14
-    .byte 0x41
-    .byte 0x57
-#    push    r15
-    .byte 0x48
-    movl    %esp,%ebp
-#    mov     rbp, rsp
-
-##
-##  At this point the stack looks like this:
-##
-##      Calling SS
-##      Calling RSP
-##      rflags
-##      Calling CS
-##      Calling RIP
-##      Error code or 0
-##      Int num or 0ffh for unknown int num
-##      rax
-##      rcx
-##      rdx
-##      rbx
-##      rsp
-##      rbp
-##      rsi
-##      rdi
-##      r8
-##      r9
-##      r10
-##      r11
-##      r12
-##      r13
-##      r14
-##      r15 <------- RSP, RBP
-##      
-
-    call    ClearScreen
-    mov     String1, %esi 
-    call    PrintString
-    .byte 0x48
-    movl    16*8(%ebp),%eax       ## move Int number into RAX 
-    .byte 0x48
-    cmpl    $18,%eax
-    ja      PrintDefaultString
-PrintExceptionString: 
-    shll    $3,%eax             ## multiply by 8 to get offset from StringTable to actual string address
-               addl    StringTable, %eax
-    movl    (%eax),%esi
-    jmp     PrintTheString
-PrintDefaultString: 
-               movl    IntUnknownString, %esi
-    # patch Int number
-    movl    %eax,%edx
-    call    A2C
-    movb    %al,1(%esi)
-    movl    %edx,%eax
-    shrl    $4,%eax
-    call    A2C
-    movb    %al,(%esi)
-PrintTheString:        
-    call    PrintString
-               movl    String2, %esi
-    call    PrintString
-    .byte 0x48
-    movl    19*8(%ebp),%eax    # CS
-    call    PrintQword
-    movb    $':', %al
-               movb    %al, (%edi)
-    addl    $2,%edi
-    .byte 0x48
-    movl    18*8(%ebp),%eax    # RIP
-    call    PrintQword
-               movl    String3, %esi
-    call    PrintString
-
-    movl    $0xb8140,%edi
-
-               movl    StringRax, %esi
-    call    PrintString
-    .byte 0x48
-    movl    15*8(%ebp),%eax
-    call    PrintQword
-
-               movl    StringRcx, %esi
-    call    PrintString
-    .byte 0x48
-    movl    14*8(%ebp),%eax
-    call    PrintQword
-
-               movl    StringRdx, %esi
-    call    PrintString
-    .byte 0x48
-    movl    13*8(%ebp),%eax
-    call    PrintQword
-
-    movl    $0xb81e0,%edi
-
-               movl    StringRbx, %esi
-    call    PrintString
-    .byte 0x48
-    movl    12*8(%ebp),%eax
-    call    PrintQword
-
-               movl    StringRsp, %esi
-    call    PrintString
-    .byte 0x48
-    movl    21*8(%ebp),%eax
-    call    PrintQword
-
-               movl    StringRbp, %esi
-    call    PrintString
-    .byte 0x48
-    movl    10*8(%ebp),%eax
-    call    PrintQword
-
-    movl    $0xb8280,%edi
-
-               movl    StringRsi, %esi
-    call    PrintString
-    .byte 0x48
-    movl    9*8(%ebp),%eax
-    call    PrintQword
-
-               movl    StringRdi, %esi
-    call    PrintString
-    .byte 0x48
-    movl    8*8(%ebp),%eax
-    call    PrintQword
-
-               movl    StringEcode, %esi
-    call    PrintString
-    .byte 0x48
-    movl    17*8(%ebp),%eax
-    call    PrintQword
-
-    movl    $0xb8320,%edi
-
-               movl    StringR8, %esi
-    call    PrintString
-    .byte 0x48
-    movl    7*8(%ebp),%eax
-    call    PrintQword
-
-               movl    StringR9, %esi
-    call    PrintString
-    .byte 0x48
-    movl    6*8(%ebp),%eax
-    call    PrintQword
-
-               movl    StringR10, %esi
-    call    PrintString
-    .byte 0x48
-    movl    5*8(%ebp),%eax
-    call    PrintQword
-
-    movl    $0xb83c0,%edi
-
-               movl    StringR11, %esi
-    call    PrintString
-    .byte 0x48
-    movl    4*8(%ebp),%eax
-    call    PrintQword
-
-               movl    StringR12, %esi
-    call    PrintString
-    .byte 0x48
-    movl    3*8(%ebp),%eax
-    call    PrintQword
-
-               movl    StringR13, %esi
-    call    PrintString
-    .byte 0x48
-    movl    2*8(%ebp),%eax
-    call    PrintQword
-
-    movl    $0xb8460,%edi
-
-               movl    StringR14, %esi
-    call    PrintString
-    .byte 0x48
-    movl    1*8(%ebp),%eax
-    call    PrintQword
-
-               movl    StringR15, %esi
-    call    PrintString
-    .byte 0x48
-    movl    0*8(%ebp),%eax
-    call    PrintQword
-
-               movl    StringSs, %esi
-    call    PrintString
-    .byte 0x48
-    movl    22*8(%ebp),%eax
-    call    PrintQword
-
-    movl    $0xb8500,%edi
-
-               movl    StringRflags, %esi
-    call    PrintString
-    .byte 0x48
-    movl    20*8(%ebp),%eax
-    call    PrintQword
-
-    movl    $0xb8640,%edi
-
-    movl    %ebp,%esi
-    addl    $23*8,%esi
-    movl    $4,%ecx
-
-
-OuterLoop: 
-    pushl   %ecx
-    movl    $4,%ecx
-    .byte 0x48
-    movl    %edi,%edx
-
-InnerLoop: 
-    .byte 0x48
-    movl    (%esi),%eax
-    call    PrintQword
-    addl    $8,%esi
-               mov                     $0x00, %al 
-    movb    %al,(%edi)
-    addl    $2,%edi
-    loop    InnerLoop
-
-    popl    %ecx
-    addl    $0xa0,%edx
-    movl    %edx,%edi
-    loop    OuterLoop
-
-
-    movl    $0xb8960,%edi
-
-    .byte 0x48
-    movl    18*8(%ebp),%eax  # RIP
-    subl    $8*8,%eax
-    .byte 0x48
-    movl    %eax,%esi       # esi = rip - 8 QWORD linear (total 16 QWORD)
-
-    movl    $4,%ecx
-
-OuterLoop1: 
-    pushl   %ecx
-    movl    $4,%ecx
-    movl    %edi,%edx
-
-InnerLoop1: 
-    .byte 0x48
-    movl    (%esi),%eax
-    call    PrintQword
-    addl    $8,%esi
-               movb            $0x00, %al
-    movb    %al,(%edi)
-    addl    $2,%edi
-    loop    InnerLoop1
-
-    popl    %ecx
-    addl    $0xa0,%edx
-    movl    %edx,%edi
-    loop    OuterLoop1
-
-
-
-    #wbinvd
+    addw    $DEFAULT_HANDLER_SIZE, %bx          # move to next entry point\r
+    loopl   LOOP_1                              # loop back through again until all descriptors are initialized\r
+\r
+    ## at this point edi contains the offset of the descriptor for INT 20\r
+    ## and bx contains the low 16 bits of the offset of the default handler\r
+    ## so initialize all the rest of the descriptors with these two values...\r
+#    mov     ecx, 101                            ; there are 100 descriptors left (INT 20 (14h) - INT 119 (77h)\r
+#@@:                                             ; loop through all IDT entries exception handlers and initialize to default handler\r
+#    mov     word ptr [edi], bx                  ; write bits 15..0 of offset\r
+#    mov     word ptr [edi+2], 38h               ; SYS_CODE64_SEL from GDT\r
+#    mov     word ptr [edi+4], 0e00h OR 8000h    ; type = 386 interrupt gate, present\r
+#    mov     word ptr [edi+6], ax                ; write bits 31..16 of offset\r
+#    mov     dword ptr [edi+8], 0                ; write bits 63..32 of offset\r
+#    add     edi, 16                             ; move up to next descriptor\r
+#    loop    @b                                  ; loop back through again until all descriptors are initialized\r
+\r
+\r
+##  DUMP    location of IDT and several of the descriptors\r
+#    mov     ecx, 8\r
+#    mov     eax, [offset Idtr + 2]\r
+#    mov     eax, [eax]\r
+#    mov     edi, 0b8000h\r
+#    call    PrintQword\r
+#    mov     esi, eax\r
+#    mov     edi, 0b80a0h\r
+#    jmp     OuterLoop\r
+\r
+##    \r
+## just for fun, let's do a software interrupt to see if we correctly land in the exception handler...\r
+#    mov     eax, 011111111h\r
+#    mov     ebx, 022222222h\r
+#    mov     ecx, 033333333h\r
+#    mov     edx, 044444444h\r
+#    mov     ebp, 055555555h\r
+#    mov     esi, 066666666h\r
+#    mov     edi, 077777777h\r
+#    push    011111111h\r
+#    push    022222222h\r
+#    push    033333333h\r
+#    int     119\r
+\r
+    movl    $0x22000,%esi               # esi = 22000\r
+    movl    0x14(%esi),%eax             # eax = [22014]\r
+    addl    %eax,%esi                   # esi = 22000 + [22014] = Base of EFILDR.C\r
+    movl    0x3c(%esi),%ebp             # ebp = [22000 + [22014] + 3c] = NT Image Header for EFILDR.C\r
+    addl    %esi,%ebp\r
+    movl    0x30(%ebp),%edi             # edi = [[22000 + [22014] + 3c] + 2c] = ImageBase (63..32 is zero, ignore)\r
+    movl    0x28(%ebp),%eax             # eax = [[22000 + [22014] + 3c] + 24] = EntryPoint\r
+    addl    %edi,%eax                   # eax = ImageBase + EntryPoint\r
+    movl    $EfiLdrOffset, %ebx\r
+    movl    %eax, (%ebx)                # Modify far jump instruction for correct entry point\r
+\r
+    movw    6(%ebp), %bx                # bx = Number of sections\r
+    xorl    %eax,%eax\r
+    movw    0x14(%ebp), %ax             # ax = Optional Header Size\r
+    addl    %eax,%ebp\r
+    addl    $0x18,%ebp                  # ebp = Start of 1st Section\r
+\r
+SectionLoop: \r
+    pushl   %esi                        # Save Base of EFILDR.C\r
+    pushl   %edi                        # Save ImageBase\r
+    addl    0x14(%ebp),%esi             # esi = Base of EFILDR.C + PointerToRawData\r
+    addl    0x0c(%ebp),%edi             # edi = ImageBase + VirtualAddress\r
+    movl    0x10(%ebp),%ecx             # ecs = SizeOfRawData\r
+\r
+    cld\r
+    shrl    $2,%ecx\r
+    rep\r
+    movsl\r
+\r
+    popl    %edi                        # Restore ImageBase\r
+    popl    %esi                        # Restore Base of EFILDR.C\r
+\r
+    addw    $0x28,%bp                   # ebp = ebp + 028h = Pointer to next section record\r
+    .byte 0x66\r
+    .byte 0xff\r
+    .byte 0xcb\r
+#    dec     bx\r
+    cmpw    $0,%bx\r
+    jne     SectionLoop\r
+\r
+    movl    $Idtr, %edx                  # get size of IDT\r
+    movzxw  (%edx), %eax\r
+    .byte 0xff\r
+    .byte 0xc0\r
+#    inc     eax\r
+    addl    2(%edx), %eax                # add to base of IDT to get location of memory map...\r
+    xorl    %ecx,%ecx\r
+    movl    %eax,%ecx                    # put argument to RCX\r
+\r
+    .byte 0x48\r
+    .byte 0xc7\r
+    .byte 0xc0\r
+EfiLdrOffset: \r
+    .long 0x00401000                    # Offset of EFILDR\r
+#   mov rax, 401000h\r
+    .byte 0x50\r
+#   push rax\r
+\r
+# ret\r
+    .byte 0xc3\r
+\r
+#    db      "**** DEFAULT IDT ENTRY ***",0\r
+    .p2align 1\r
+Halt: \r
+INT0: \r
+    pushl   $0x0    # push error code place holder on the stack\r
+    pushl   $0x0\r
+    jmpCommonIdtEntry \r
+#    db      0e9h                        ; jmp 16 bit reletive \r
+#    dd      commonIdtEntry - $ - 4      ;  offset to jump to\r
+\r
+INT1: \r
+    pushl   $0x0    # push error code place holder on the stack\r
+    pushl   $0x1\r
+    jmpCommonIdtEntry \r
+\r
+INT2: \r
+    pushl   $0x0    # push error code place holder on the stack\r
+    pushl   $0x2\r
+    jmpCommonIdtEntry \r
+\r
+INT3: \r
+    pushl   $0x0    # push error code place holder on the stack\r
+    pushl   $0x3\r
+    jmpCommonIdtEntry \r
+\r
+INT4: \r
+    pushl   $0x0    # push error code place holder on the stack\r
+    pushl   $0x4\r
+    jmpCommonIdtEntry \r
+\r
+INT5: \r
+    pushl   $0x0    # push error code place holder on the stack\r
+    pushl   $0x5\r
+    jmpCommonIdtEntry \r
+\r
+INT6: \r
+    pushl   $0x0    # push error code place holder on the stack\r
+    pushl   $0x6\r
+    jmpCommonIdtEntry \r
+\r
+INT7: \r
+    pushl   $0x0    # push error code place holder on the stack\r
+    pushl   $0x7\r
+    jmpCommonIdtEntry \r
+\r
+INT8: \r
+#   Double fault causes an error code to be pushed so no phony push necessary\r
+    nop\r
+    nop\r
+    pushl   $0x8\r
+    jmpCommonIdtEntry \r
+\r
+INT9: \r
+    pushl   $0x0    # push error code place holder on the stack\r
+    pushl   $0x9\r
+    jmpCommonIdtEntry \r
+\r
+INT10: \r
+#   Invalid TSS causes an error code to be pushed so no phony push necessary\r
+    nop\r
+    nop\r
+    pushl   $10\r
+    jmpCommonIdtEntry \r
+\r
+INT11: \r
+#   Segment Not Present causes an error code to be pushed so no phony push necessary\r
+    nop\r
+    nop\r
+    pushl   $11\r
+    jmpCommonIdtEntry \r
+\r
+INT12: \r
+#   Stack fault causes an error code to be pushed so no phony push necessary\r
+    nop\r
+    nop\r
+    pushl   $12\r
+    jmpCommonIdtEntry \r
+\r
+INT13: \r
+#   GP fault causes an error code to be pushed so no phony push necessary\r
+    nop\r
+    nop\r
+    pushl   $13\r
+    jmpCommonIdtEntry \r
+\r
+INT14: \r
+#   Page fault causes an error code to be pushed so no phony push necessary\r
+    nop\r
+    nop\r
+    pushl   $14\r
+    jmpCommonIdtEntry \r
+\r
+INT15: \r
+    pushl   $0x0    # push error code place holder on the stack\r
+    pushl   $15\r
+    jmpCommonIdtEntry \r
+\r
+INT16: \r
+    pushl   $0x0    # push error code place holder on the stack\r
+    pushl   $16\r
+    jmpCommonIdtEntry \r
+\r
+INT17: \r
+#   Alignment check causes an error code to be pushed so no phony push necessary\r
+    nop\r
+    nop\r
+    pushl   $17\r
+    jmpCommonIdtEntry \r
+\r
+INT18: \r
+    pushl   $0x0    # push error code place holder on the stack\r
+    pushl   $18\r
+    jmpCommonIdtEntry \r
+\r
+INT19: \r
+    pushl   $0x0    # push error code place holder on the stack\r
+    pushl   $19\r
+    jmpCommonIdtEntry \r
+\r
+INTUnknown: \r
+# The following segment repeats (0x78 - 20) times:\r
+# No. 1\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 2\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 3\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 4\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 5\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 6\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 7\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 8\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 9\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 10\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 11\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 12\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 13\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 14\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 15\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 16\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 17\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 18\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 19\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 20\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 21\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 22\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 23\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 24\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 25\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 26\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 27\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 28\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 29\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 30\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 31\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 32\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 33\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 34\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 35\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 36\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 37\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 38\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 39\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 40\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 41\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 42\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 43\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 44\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 45\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 46\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 47\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 48\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 49\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 50\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 51\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 52\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 53\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 54\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 55\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 56\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 57\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 58\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 59\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 60\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 61\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 62\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 63\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 64\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 65\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 66\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 67\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 68\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 69\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 70\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 71\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 72\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 73\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 74\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 75\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 76\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 77\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 78\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 79\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 80\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 81\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 82\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 83\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 84\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 85\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 86\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 87\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 88\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 89\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 90\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 91\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 92\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 93\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 94\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 95\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 96\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 97\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 98\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 99\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+# No. 100\r
+    pushl   $0x0    # push error code place holder on the stack\r
+#    push    xxh     ; push vector number\r
+    .byte 0x6a\r
+    .byte      ( . - INTUnknown - 3 ) / 9 + 20   # vector number\r
+    jmpCommonIdtEntry \r
+\r
+\r
+commonIdtEntry: \r
+    pushl   %eax\r
+    pushl   %ecx\r
+    pushl   %edx\r
+    pushl   %ebx\r
+    pushl   %esp\r
+    pushl   %ebp\r
+    pushl   %esi\r
+    pushl   %edi\r
+    .byte 0x41\r
+    .byte 0x50\r
+#    push    r8\r
+    .byte 0x41\r
+    .byte 0x51\r
+#    push    r9\r
+    .byte 0x41\r
+    .byte 0x52\r
+#    push    r10\r
+    .byte 0x41\r
+    .byte 0x53\r
+#    push    r11\r
+    .byte 0x41\r
+    .byte 0x54\r
+#    push    r12\r
+    .byte 0x41\r
+    .byte 0x55\r
+#    push    r13\r
+    .byte 0x41\r
+    .byte 0x56\r
+#    push    r14\r
+    .byte 0x41\r
+    .byte 0x57\r
+#    push    r15\r
+    .byte 0x48\r
+    movl    %esp,%ebp\r
+#    mov     rbp, rsp\r
+\r
+##\r
+##  At this point the stack looks like this:\r
+##\r
+##      Calling SS\r
+##      Calling RSP\r
+##      rflags\r
+##      Calling CS\r
+##      Calling RIP\r
+##      Error code or 0\r
+##      Int num or 0ffh for unknown int num\r
+##      rax\r
+##      rcx\r
+##      rdx\r
+##      rbx\r
+##      rsp\r
+##      rbp\r
+##      rsi\r
+##      rdi\r
+##      r8\r
+##      r9\r
+##      r10\r
+##      r11\r
+##      r12\r
+##      r13\r
+##      r14\r
+##      r15 <------- RSP, RBP\r
+##      \r
+\r
+    call    ClearScreen\r
+    movl    $String1, %esi \r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    16*8(%ebp),%eax       ## move Int number into RAX \r
+    .byte 0x48\r
+    cmpl    $18,%eax\r
+    ja      PrintDefaultString\r
+PrintExceptionString: \r
+    shll    $3,%eax             ## multiply by 8 to get offset from StringTable to actual string address\r
+    addl    $StringTable, %eax\r
+    movl    (%eax),%esi\r
+    jmp     PrintTheString\r
+PrintDefaultString: \r
+    movl    $IntUnknownString, %esi\r
+    # patch Int number\r
+    movl    %eax,%edx\r
+    call    A2C\r
+    movb    %al,1(%esi)\r
+    movl    %edx,%eax\r
+    shrl    $4,%eax\r
+    call    A2C\r
+    movb    %al,(%esi)\r
+PrintTheString:        \r
+    call    PrintString\r
+    movl    $String2, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    19*8(%ebp),%eax    # CS\r
+    call    PrintQword\r
+    movb    $':', %al\r
+    movb    %al, (%edi)\r
+    addl    $2,%edi\r
+    .byte 0x48\r
+    movl    18*8(%ebp),%eax    # RIP\r
+    call    PrintQword\r
+    movl    $String3, %esi\r
+    call    PrintString\r
+\r
+    movl    $0xb8140,%edi\r
+\r
+    movl    $StringRax, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    15*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $StringRcx, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    14*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $StringRdx, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    13*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $0xb81e0,%edi\r
+\r
+    movl    $StringRbx, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    12*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $StringRsp, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    21*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $StringRbp, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    10*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $0xb8280,%edi\r
+\r
+    movl    $StringRsi, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    9*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $StringRdi, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    8*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $StringEcode, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    17*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $0xb8320,%edi\r
+\r
+    movl    $StringR8, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    7*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $StringR9, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    6*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $StringR10, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    5*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $0xb83c0,%edi\r
+\r
+    movl    $StringR11, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    4*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $StringR12, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    3*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $StringR13, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    2*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $0xb8460,%edi\r
+\r
+    movl    $StringR14, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    1*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $StringR15, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    0*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $StringSs, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    22*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $0xb8500,%edi\r
+\r
+    movl    $StringRflags, %esi\r
+    call    PrintString\r
+    .byte 0x48\r
+    movl    20*8(%ebp),%eax\r
+    call    PrintQword\r
+\r
+    movl    $0xb8640,%edi\r
+\r
+    movl    %ebp,%esi\r
+    addl    $23*8,%esi\r
+    movl    $4,%ecx\r
+\r
+\r
+OuterLoop: \r
+    pushl   %ecx\r
+    movl    $4,%ecx\r
+    .byte 0x48\r
+    movl    %edi,%edx\r
+\r
+InnerLoop: \r
+    .byte 0x48\r
+    movl    (%esi),%eax\r
+    call    PrintQword\r
+    addl    $8,%esi\r
+    movb    $0x20, %al       # blank character\r
+    movb    %al,(%edi)\r
+    addl    $2,%edi\r
+    loop    InnerLoop\r
+\r
+    popl    %ecx\r
+    addl    $0xa0,%edx\r
+    movl    %edx,%edi\r
+    loop    OuterLoop\r
+\r
+\r
+    movl    $0xb8960,%edi\r
+\r
+    .byte 0x48\r
+    movl    18*8(%ebp),%eax  # RIP\r
+    subl    $8*8,%eax\r
+    .byte 0x48\r
+    movl    %eax,%esi       # esi = rip - 8 QWORD linear (total 16 QWORD)\r
+\r
+    movl    $4,%ecx\r
+\r
+OuterLoop1: \r
+    pushl   %ecx\r
+    movl    $4,%ecx\r
+    movl    %edi,%edx\r
+\r
+InnerLoop1: \r
+    .byte 0x48\r
+    movl    (%esi),%eax\r
+    call    PrintQword\r
+    addl    $8,%esi\r
+    movb    $0x20, %al     # blank character\r
+    movb    %al,(%edi)\r
+    addl    $2,%edi\r
+    loop    InnerLoop1\r
+\r
+    popl    %ecx\r
+    addl    $0xa0,%edx\r
+    movl    %edx,%edi\r
+    loop    OuterLoop1\r
+\r
+\r
+\r
+    #wbinvd\r
 LN_C1:    \r
-    jmp     LN_C1
-
-#
-# return
-#
-    movl    %ebp,%esp
-#    mov     rsp, rbp
-    .byte 0x41
-    .byte 0x5f
-#    pop    r15
-    .byte 0x41
-    .byte 0x5e
-#    pop    r14
-    .byte 0x41
-    .byte 0x5d
-#    pop    r13
-    .byte 0x41
-    .byte 0x5c
-#    pop    r12
-    .byte 0x41
-    .byte 0x5b
-#    pop    r11
-    .byte 0x41
-    .byte 0x5a
-#    pop    r10
-    .byte 0x41
-    .byte 0x59
-#    pop    r9
-    .byte 0x41
-    .byte 0x58
-#    pop    r8
-    popl   %edi
-    popl   %esi
-    popl   %ebp
-    popl   %eax # esp
-    popl   %ebx
-    popl   %edx
-    popl   %ecx
-    popl   %eax
-
-    .byte 0x48
-    .byte 0x83
-    .byte 0xc4
-    .byte 0x10
-#    add    esp, 16 ; error code and INT number
-
-    .byte 0x48
-    .byte 0xcf
-#    iretq
-
-PrintString: 
-    pushl   %eax
-LN_C2: 
-               movb    (%esi), %al
-    cmpb    $0,%al
-    je      LN_C3
-               movb    %al, (%edi)
-    .byte 0xff
-    .byte 0xc6
-#    inc     esi
-    addl    $2,%edi
-    jmp     LN_C2
-LN_C3: 
-    popl    %eax
-    ret
-
-## RAX contains qword to print
-## RDI contains memory location (screen location) to print it to
-PrintQword: 
-    pushl   %ecx
-    pushl   %ebx
-    pushl   %eax
-
-    .byte 0x48
-    .byte 0xc7
-    .byte 0xc1
-    .long 16
-#    mov     rcx, 16
-looptop: 
-    .byte 0x48
-    roll    $4,%eax
-    movb    %al,%bl
-    andb    $0xf,%bl
-    addb    $'0', %bl
-    cmpb    $'9', %bl
-    jle     @f
-    addb    $7,%bl
-@@: 
-               movb %bl, (%edi)
-    addl    $2,%edi
-    loop    looptop
-    #wbinvd
-
-    popl    %eax
-    popl    %ebx
-    popl    %ecx
-    ret
-
-ClearScreen: 
-    pushl   %eax
-    pushl   %ecx
-
-               movb            $0x00, %al
-    movb    $0xc,%ah
-    movl    $0xb8000,%edi
-    movl    $80*24,%ecx
-LN_C4: 
-               movw      %ax, (%edi)
-    addl    $2,%edi
-    loop    LN_C4
-    movl    $0xb8000,%edi
-
-    popl    %ecx
-    popl    %eax
-
-    ret
-
-A2C: 
-    andb    $0xf,%al
-    addb    $'0', %al
-    cmpb    $'9', %al
-    jle     @f
-    addb    $7,%al
-LN_C5: 
-    ret
-
-String1:            .asciz      "*** INT "
-
+    jmp     LN_C1\r
+\r
+#\r
+# return\r
+#\r
+    movl    %ebp,%esp\r
+#    mov     rsp, rbp\r
+    .byte 0x41\r
+    .byte 0x5f\r
+#    pop    r15\r
+    .byte 0x41\r
+    .byte 0x5e\r
+#    pop    r14\r
+    .byte 0x41\r
+    .byte 0x5d\r
+#    pop    r13\r
+    .byte 0x41\r
+    .byte 0x5c\r
+#    pop    r12\r
+    .byte 0x41\r
+    .byte 0x5b\r
+#    pop    r11\r
+    .byte 0x41\r
+    .byte 0x5a\r
+#    pop    r10\r
+    .byte 0x41\r
+    .byte 0x59\r
+#    pop    r9\r
+    .byte 0x41\r
+    .byte 0x58\r
+#    pop    r8\r
+    popl   %edi\r
+    popl   %esi\r
+    popl   %ebp\r
+    popl   %eax # esp\r
+    popl   %ebx\r
+    popl   %edx\r
+    popl   %ecx\r
+    popl   %eax\r
+\r
+    .byte 0x48\r
+    .byte 0x83\r
+    .byte 0xc4\r
+    .byte 0x10\r
+#    add    esp, 16 ; error code and INT number\r
+\r
+    .byte 0x48\r
+    .byte 0xcf\r
+#    iretq\r
+\r
+PrintString: \r
+    pushl   %eax\r
+LN_C2: \r
+    movb    (%esi), %al\r
+    cmpb    $0,%al\r
+    je      LN_C3\r
+    movb    %al, (%edi)\r
+    .byte 0xff\r
+    .byte 0xc6\r
+#    inc     esi\r
+    addl    $2,%edi\r
+    jmp     LN_C2\r
+LN_C3: \r
+    popl    %eax\r
+    ret\r
+\r
+## RAX contains qword to print\r
+## RDI contains memory location (screen location) to print it to\r
+PrintQword: \r
+    pushl   %ecx\r
+    pushl   %ebx\r
+    pushl   %eax\r
+\r
+    .byte 0x48\r
+    .byte 0xc7\r
+    .byte 0xc1\r
+    .long 16\r
+#    mov     rcx, 16\r
+looptop: \r
+    .byte 0x48\r
+    roll    $4,%eax\r
+    movb    %al,%bl\r
+    andb    $0xf,%bl\r
+    addb    $'0', %bl\r
+    cmpb    $'9', %bl\r
+    jle     LN_C4\r
+    addb    $7,%bl\r
+LN_C4: \r
+    movb %bl, (%edi)\r
+    addl    $2,%edi\r
+    loop    looptop\r
+    #wbinvd\r
+\r
+    popl    %eax\r
+    popl    %ebx\r
+    popl    %ecx\r
+    ret\r
+\r
+ClearScreen: \r
+    pushl   %eax\r
+    pushl   %ecx\r
+\r
+    movb    $0x20, %al       # blank character\r
+    movb    $0xc,%ah\r
+    movl    $0xb8000,%edi\r
+    movl    $80*24,%ecx\r
+LN_C5: \r
+    movw    %ax, (%edi)\r
+    addl    $2,%edi\r
+    loop    LN_C5\r
+    movl    $0xb8000,%edi\r
+\r
+    popl    %ecx\r
+    popl    %eax\r
+\r
+    ret\r
+\r
+A2C: \r
+    andb    $0xf,%al\r
+    addb    $'0', %al\r
+    cmpb    $'9', %al\r
+    jle     LN_C6\r
+    addb    $7,%al\r
+LN_C6: \r
+    ret\r
+\r
+String1:            .asciz      "*** INT "\r
+\r
 Int0String:         .asciz      "00h Divide by 0 -"\r
 Int1String:         .asciz      "01h Debug exception -"\r
 Int2String:         .asciz      "02h NMI -"\r
@@ -747,40 +1346,40 @@ Int16String:        .asciz      "10h Floating point error -"
 Int17String:        .asciz      "11h Alignment check -"\r
 Int18String:        .asciz      "12h Machine check -"\r
 Int19String:        .asciz      "13h SIMD Floating-Point Exception -"\r
-IntUnknownString:   .asciz      "??h Unknown interrupt -"
-
-StringTable:   .long  Int0String, Int1String, Int2String, Int3String,    \\r
-                      Int4String, Int5String, Int6String, Int7String,    \\r
-                      Int8String, Int9String, Int10String, Int11String,  \\r
-                      Int12String, Int13String, Int14String, Int15String,\\r
-                      Int16String, Int17String, Int18String, Int19String
-
-String2:           .asciz  " HALT!! *** ("
-String3:           .asciz  ")"
-StringRax:         .asciz  "RAX="
-StringRcx:         .asciz  " RCX="
-StringRdx:         .asciz  " RDX="
-StringRbx:         .asciz  "RBX="
-StringRsp:         .asciz  " RSP="
-StringRbp:         .asciz  " RBP="
-StringRsi:         .asciz  "RSI="
-StringRdi:         .asciz  " RDI="
-StringEcode:       .asciz  " ECODE="
-StringR8:          .asciz  "R8 ="
-StringR9:          .asciz  " R9 ="
-StringR10:         .asciz  " R10="
-StringR11:         .asciz  "R11="
-StringR12:         .asciz  " R12="
-StringR13:         .asciz  " R13="
-StringR14:         .asciz  "R14="
-StringR15:         .asciz  " R15="
-StringSs:          .asciz  " SS ="
-StringRflags:      .asciz  "RFLAGS="
-
-Idtr:        .float  0
-            .float  0
-
-    .org 0x21ffe
-BlockSignature: 
-    .word 0xaa55
-
+IntUnknownString:   .asciz      "??h Unknown interrupt -"\r
+\r
+StringTable:   .long  Int0String, 0, Int1String, 0, Int2String, 0, Int3String, 0,  \\r
+                      Int4String, 0, Int5String, 0, Int6String, 0, Int7String, 0,  \\r
+                      Int8String, 0, Int9String, 0, Int10String, 0, Int11String, 0,  \\r
+                      Int12String, 0, Int13String, 0, Int14String, 0, Int15String, 0,  \\r
+                      Int16String, 0, Int17String, 0, Int18String, 0, Int19String, 0\r
+\r
+String2:           .asciz  " HALT!! *** ("\r
+String3:           .asciz  ")"\r
+StringRax:         .asciz  "RAX="\r
+StringRcx:         .asciz  " RCX="\r
+StringRdx:         .asciz  " RDX="\r
+StringRbx:         .asciz  "RBX="\r
+StringRsp:         .asciz  " RSP="\r
+StringRbp:         .asciz  " RBP="\r
+StringRsi:         .asciz  "RSI="\r
+StringRdi:         .asciz  " RDI="\r
+StringEcode:       .asciz  " ECODE="\r
+StringR8:          .asciz  "R8 ="\r
+StringR9:          .asciz  " R9 ="\r
+StringR10:         .asciz  " R10="\r
+StringR11:         .asciz  "R11="\r
+StringR12:         .asciz  " R12="\r
+StringR13:         .asciz  " R13="\r
+StringR14:         .asciz  "R14="\r
+StringR15:         .asciz  " R15="\r
+StringSs:          .asciz  " SS ="\r
+StringRflags:      .asciz  "RFLAGS="\r
+\r
+Idtr:        .float  0\r
+            .float  0\r
+\r
+    .org 0x21ffe\r
+BlockSignature: \r
+    .word 0xaa55\r
+\r