aboutsummaryrefslogtreecommitdiff
path: root/sys/boot/i386/btx/btx
diff options
context:
space:
mode:
authorRuslan Ermilov <ru@FreeBSD.org>2004-05-14 20:29:30 +0000
committerRuslan Ermilov <ru@FreeBSD.org>2004-05-14 20:29:30 +0000
commit237266b2e696b5f15d5d7f8f106357168e5aca8f (patch)
treea1d07b6a6ab6f3789e2952ef64b917b2ea697b90 /sys/boot/i386/btx/btx
parentb09ce52594105803f9d8380492b9a21421477c76 (diff)
downloadsrc-237266b2e696b5f15d5d7f8f106357168e5aca8f.tar.gz
src-237266b2e696b5f15d5d7f8f106357168e5aca8f.zip
Back out last revision that unnecessarily changed valid assembler
line comments and damaged the CVS history. Prompted by: bde, jhb
Notes
Notes: svn path=/head/; revision=129240
Diffstat (limited to 'sys/boot/i386/btx/btx')
-rw-r--r--sys/boot/i386/btx/btx/btx.S1841
1 files changed, 920 insertions, 921 deletions
diff --git a/sys/boot/i386/btx/btx/btx.S b/sys/boot/i386/btx/btx/btx.S
index 77cfe861a377..7581519ba536 100644
--- a/sys/boot/i386/btx/btx/btx.S
+++ b/sys/boot/i386/btx/btx/btx.S
@@ -18,588 +18,587 @@
/*
* Memory layout.
*/
- .set MEM_BTX,0x1000 // Start of BTX memory
- .set MEM_ESP0,0x1800 // Supervisor stack
- .set MEM_BUF,0x1800 // Scratch buffer
- .set MEM_ESP1,0x1e00 // Link stack
- .set MEM_IDT,0x1e00 // IDT
- .set MEM_TSS,0x1f98 // TSS
- .set MEM_MAP,0x2000 // I/O bit map
- .set MEM_DIR,0x4000 // Page directory
- .set MEM_TBL,0x5000 // Page tables
- .set MEM_ORG,0x9000 // BTX code
- .set MEM_USR,0xa000 // Start of user memory
+ .set MEM_BTX,0x1000 # Start of BTX memory
+ .set MEM_ESP0,0x1800 # Supervisor stack
+ .set MEM_BUF,0x1800 # Scratch buffer
+ .set MEM_ESP1,0x1e00 # Link stack
+ .set MEM_IDT,0x1e00 # IDT
+ .set MEM_TSS,0x1f98 # TSS
+ .set MEM_MAP,0x2000 # I/O bit map
+ .set MEM_DIR,0x4000 # Page directory
+ .set MEM_TBL,0x5000 # Page tables
+ .set MEM_ORG,0x9000 # BTX code
+ .set MEM_USR,0xa000 # Start of user memory
/*
* Paging control.
*/
- .set PAG_SIZ,0x1000 // Page size
- .set PAG_CNT,0x1000 // Pages to map
+ .set PAG_SIZ,0x1000 # Page size
+ .set PAG_CNT,0x1000 # Pages to map
/*
* Segment selectors.
*/
- .set SEL_SCODE,0x8 // Supervisor code
- .set SEL_SDATA,0x10 // Supervisor data
- .set SEL_RCODE,0x18 // Real mode code
- .set SEL_RDATA,0x20 // Real mode data
- .set SEL_UCODE,0x28|3 // User code
- .set SEL_UDATA,0x30|3 // User data
- .set SEL_TSS,0x38 // TSS
+ .set SEL_SCODE,0x8 # Supervisor code
+ .set SEL_SDATA,0x10 # Supervisor data
+ .set SEL_RCODE,0x18 # Real mode code
+ .set SEL_RDATA,0x20 # Real mode data
+ .set SEL_UCODE,0x28|3 # User code
+ .set SEL_UDATA,0x30|3 # User data
+ .set SEL_TSS,0x38 # TSS
/*
* Task state segment fields.
*/
- .set TSS_ESP0,0x4 // PL 0 ESP
- .set TSS_SS0,0x8 // PL 0 SS
- .set TSS_ESP1,0xc // PL 1 ESP
- .set TSS_MAP,0x66 // I/O bit map base
+ .set TSS_ESP0,0x4 # PL 0 ESP
+ .set TSS_SS0,0x8 # PL 0 SS
+ .set TSS_ESP1,0xc # PL 1 ESP
+ .set TSS_MAP,0x66 # I/O bit map base
/*
* System calls.
*/
- .set SYS_EXIT,0x0 // Exit
- .set SYS_EXEC,0x1 // Exec
+ .set SYS_EXIT,0x0 # Exit
+ .set SYS_EXEC,0x1 # Exec
/*
* V86 constants.
*/
- .set V86_FLG,0x208eff // V86 flag mask
- .set V86_STK,0x400 // V86 stack allowance
+ .set V86_FLG,0x208eff # V86 flag mask
+ .set V86_STK,0x400 # V86 stack allowance
/*
* Dump format control bytes.
*/
- .set DMP_X16,0x1 // Word
- .set DMP_X32,0x2 // Long
- .set DMP_MEM,0x4 // Memory
- .set DMP_EOL,0x8 // End of line
+ .set DMP_X16,0x1 # Word
+ .set DMP_X32,0x2 # Long
+ .set DMP_MEM,0x4 # Memory
+ .set DMP_EOL,0x8 # End of line
/*
* Screen defaults and assumptions.
*/
- .set SCR_MAT,0x7 // Mode/attribute
- .set SCR_COL,0x50 // Columns per row
- .set SCR_ROW,0x19 // Rows per screen
+ .set SCR_MAT,0x7 # Mode/attribute
+ .set SCR_COL,0x50 # Columns per row
+ .set SCR_ROW,0x19 # Rows per screen
/*
* BIOS Data Area locations.
*/
- .set BDA_MEM,0x413 // Free memory
- .set BDA_KEYFLAGS,0x417 // Keyboard shift-state flags
- .set BDA_SCR,0x449 // Video mode
- .set BDA_POS,0x450 // Cursor position
- .set BDA_BOOT,0x472 // Boot howto flag
+ .set BDA_MEM,0x413 # Free memory
+ .set BDA_KEYFLAGS,0x417 # Keyboard shift-state flags
+ .set BDA_SCR,0x449 # Video mode
+ .set BDA_POS,0x450 # Cursor position
+ .set BDA_BOOT,0x472 # Boot howto flag
/*
* Derivations, for brevity.
*/
- .set _ESP0H,MEM_ESP0>>0x8 // Byte 1 of ESP0
- .set _ESP1H,MEM_ESP1>>0x8 // Byte 1 of ESP1
- .set _TSSIO,MEM_MAP-MEM_TSS // TSS I/O base
- .set _TSSLM,MEM_DIR-MEM_TSS-1 // TSS limit
- .set _IDTLM,MEM_TSS-MEM_IDT-1 // IDT limit
+ .set _ESP0H,MEM_ESP0>>0x8 # Byte 1 of ESP0
+ .set _ESP1H,MEM_ESP1>>0x8 # Byte 1 of ESP1
+ .set _TSSIO,MEM_MAP-MEM_TSS # TSS I/O base
+ .set _TSSLM,MEM_DIR-MEM_TSS-1 # TSS limit
+ .set _IDTLM,MEM_TSS-MEM_IDT-1 # IDT limit
/*
* Code segment.
*/
.globl start
.code16
-start: // Start of code
+start: # Start of code
/*
* BTX header.
*/
-btx_hdr: .byte 0xeb // Machine ID
- .byte 0xe // Header size
- .ascii "BTX" // Magic
- .byte 0x1 // Major version
- .byte 0x1 // Minor version
- .byte BTX_FLAGS // Flags
- .word PAG_CNT-MEM_ORG>>0xc // Paging control
- .word break-start // Text size
- .long 0x0 // Entry address
+btx_hdr: .byte 0xeb # Machine ID
+ .byte 0xe # Header size
+ .ascii "BTX" # Magic
+ .byte 0x1 # Major version
+ .byte 0x1 # Minor version
+ .byte BTX_FLAGS # Flags
+ .word PAG_CNT-MEM_ORG>>0xc # Paging control
+ .word break-start # Text size
+ .long 0x0 # Entry address
/*
* Initialization routine.
*/
-init: cli // Disable interrupts
- xor %ax,%ax // Zero/segment
- mov %ax,%ss // Set up
- mov $MEM_ESP0,%sp // stack
- mov %ax,%es // Address
- mov %ax,%ds // data
- pushl $0x2 // Clear
- popfl // flags
+init: cli # Disable interrupts
+ xor %ax,%ax # Zero/segment
+ mov %ax,%ss # Set up
+ mov $MEM_ESP0,%sp # stack
+ mov %ax,%es # Address
+ mov %ax,%ds # data
+ pushl $0x2 # Clear
+ popfl # flags
/*
* Initialize memory.
*/
- mov $MEM_IDT,%di // Memory to initialize
- mov $(MEM_ORG-MEM_IDT)/2,%cx // Words to zero
- push %di // Save
- rep // Zero-fill
- stosw // memory
- pop %di // Restore
+ mov $MEM_IDT,%di # Memory to initialize
+ mov $(MEM_ORG-MEM_IDT)/2,%cx # Words to zero
+ push %di # Save
+ rep # Zero-fill
+ stosw # memory
+ pop %di # Restore
/*
* Create IDT.
*/
- mov $idtctl,%si // Control string
-init.1: lodsb // Get entry
- cbw // count
- xchg %ax,%cx // as word
- jcxz init.4 // If done
- lodsb // Get segment
- xchg %ax,%dx // P:DPL:type
- lodsw // Get control
- xchg %ax,%bx // set
- lodsw // Get handler offset
- mov $SEL_SCODE,%dh // Segment selector
-init.2: shr %bx // Handle this int?
- jnc init.3 // No
- mov %ax,(%di) // Set handler offset
- mov %dh,0x2(%di) // and selector
- mov %dl,0x5(%di) // Set P:DPL:type
- add $0x4,%ax // Next handler
-init.3: lea 0x8(%di),%di // Next entry
- loop init.2 // Till set done
- jmp init.1 // Continue
+ mov $idtctl,%si # Control string
+init.1: lodsb # Get entry
+ cbw # count
+ xchg %ax,%cx # as word
+ jcxz init.4 # If done
+ lodsb # Get segment
+ xchg %ax,%dx # P:DPL:type
+ lodsw # Get control
+ xchg %ax,%bx # set
+ lodsw # Get handler offset
+ mov $SEL_SCODE,%dh # Segment selector
+init.2: shr %bx # Handle this int?
+ jnc init.3 # No
+ mov %ax,(%di) # Set handler offset
+ mov %dh,0x2(%di) # and selector
+ mov %dl,0x5(%di) # Set P:DPL:type
+ add $0x4,%ax # Next handler
+init.3: lea 0x8(%di),%di # Next entry
+ loop init.2 # Till set done
+ jmp init.1 # Continue
/*
* Initialize TSS.
*/
-init.4: movb $_ESP0H,TSS_ESP0+1(%di) // Set ESP0
- movb $SEL_SDATA,TSS_SS0(%di) // Set SS0
- movb $_ESP1H,TSS_ESP1+1(%di) // Set ESP1
- movb $_TSSIO,TSS_MAP(%di) // Set I/O bit map base
+init.4: movb $_ESP0H,TSS_ESP0+1(%di) # Set ESP0
+ movb $SEL_SDATA,TSS_SS0(%di) # Set SS0
+ movb $_ESP1H,TSS_ESP1+1(%di) # Set ESP1
+ movb $_TSSIO,TSS_MAP(%di) # Set I/O bit map base
#ifdef PAGING
/*
* Create page directory.
*/
- xor %edx,%edx // Page
- mov $PAG_SIZ>>0x8,%dh // size
- xor %eax,%eax // Zero
- mov $MEM_DIR,%di // Page directory
- mov $PAG_CNT>>0xa,%cl // Entries
- mov $MEM_TBL|0x7,%ax // First entry
-init.5: stosl // Write entry
- add %dx,%ax // To next
- loop init.5 // Till done
+ xor %edx,%edx # Page
+ mov $PAG_SIZ>>0x8,%dh # size
+ xor %eax,%eax # Zero
+ mov $MEM_DIR,%di # Page directory
+ mov $PAG_CNT>>0xa,%cl # Entries
+ mov $MEM_TBL|0x7,%ax # First entry
+init.5: stosl # Write entry
+ add %dx,%ax # To next
+ loop init.5 # Till done
/*
* Create page tables.
*/
- mov $MEM_TBL,%di // Page table
- mov $PAG_CNT>>0x8,%ch // Entries
- xor %ax,%ax // Start address
-init.6: mov $0x7,%al // Set U:W:P flags
- cmp btx_hdr+0x8,%cx // Standard user page?
- jb init.7 // Yes
- cmp $PAG_CNT-MEM_BTX>>0xc,%cx // BTX memory?
- jae init.7 // No or first page
- and $~0x2,%al // Clear W flag
- cmp $PAG_CNT-MEM_USR>>0xc,%cx // User page zero?
- jne init.7 // No
- testb $0x80,btx_hdr+0x7 // Unmap it?
- jz init.7 // No
- and $~0x1,%al // Clear P flag
-init.7: stosl // Set entry
- add %edx,%eax // Next address
- loop init.6 // Till done
+ mov $MEM_TBL,%di # Page table
+ mov $PAG_CNT>>0x8,%ch # Entries
+ xor %ax,%ax # Start address
+init.6: mov $0x7,%al # Set U:W:P flags
+ cmp btx_hdr+0x8,%cx # Standard user page?
+ jb init.7 # Yes
+ cmp $PAG_CNT-MEM_BTX>>0xc,%cx # BTX memory?
+ jae init.7 # No or first page
+ and $~0x2,%al # Clear W flag
+ cmp $PAG_CNT-MEM_USR>>0xc,%cx # User page zero?
+ jne init.7 # No
+ testb $0x80,btx_hdr+0x7 # Unmap it?
+ jz init.7 # No
+ and $~0x1,%al # Clear P flag
+init.7: stosl # Set entry
+ add %edx,%eax # Next address
+ loop init.6 # Till done
#endif
/*
* Bring up the system.
*/
- mov $0x2820,%bx // Set protected mode
- callw setpic // IRQ offsets
- lidt idtdesc // Set IDT
+ mov $0x2820,%bx # Set protected mode
+ callw setpic # IRQ offsets
+ lidt idtdesc # Set IDT
#ifdef PAGING
- xor %eax,%eax // Set base
- mov $MEM_DIR>>0x8,%ah // of page
- mov %eax,%cr3 // directory
+ xor %eax,%eax # Set base
+ mov $MEM_DIR>>0x8,%ah # of page
+ mov %eax,%cr3 # directory
#endif
- lgdt gdtdesc // Set GDT
- mov %cr0,%eax // Switch to protected
+ lgdt gdtdesc # Set GDT
+ mov %cr0,%eax # Switch to protected
#ifdef PAGING
- or $0x80000001,%eax // mode and enable paging
+ or $0x80000001,%eax # mode and enable paging
#else
- or $0x01,%eax // mode
+ or $0x01,%eax # mode
#endif
- mov %eax,%cr0 //
- ljmp $SEL_SCODE,$init.8 // To 32-bit code
+ mov %eax,%cr0 #
+ ljmp $SEL_SCODE,$init.8 # To 32-bit code
.code32
-init.8: xorl %ecx,%ecx // Zero
- movb $SEL_SDATA,%cl // To 32-bit
- movw %cx,%ss // stack
+init.8: xorl %ecx,%ecx # Zero
+ movb $SEL_SDATA,%cl # To 32-bit
+ movw %cx,%ss # stack
/*
* Launch user task.
*/
- movb $SEL_TSS,%cl // Set task
- ltr %cx // register
- movl $MEM_USR,%edx // User base address
- movzwl %ss:BDA_MEM,%eax // Get free memory
- shll $0xa,%eax // To bytes
- subl $0x1000,%eax // Less arg space
- subl %edx,%eax // Less base
- movb $SEL_UDATA,%cl // User data selector
- pushl %ecx // Set SS
- pushl %eax // Set ESP
- push $0x202 // Set flags (IF set)
- push $SEL_UCODE // Set CS
- pushl btx_hdr+0xc // Set EIP
- pushl %ecx // Set GS
- pushl %ecx // Set FS
- pushl %ecx // Set DS
- pushl %ecx // Set ES
- pushl %edx // Set EAX
- movb $0x7,%cl // Set remaining
-init.9: push $0x0 // general
- loop init.9 // registers
+ movb $SEL_TSS,%cl # Set task
+ ltr %cx # register
+ movl $MEM_USR,%edx # User base address
+ movzwl %ss:BDA_MEM,%eax # Get free memory
+ shll $0xa,%eax # To bytes
+ subl $0x1000,%eax # Less arg space
+ subl %edx,%eax # Less base
+ movb $SEL_UDATA,%cl # User data selector
+ pushl %ecx # Set SS
+ pushl %eax # Set ESP
+ push $0x202 # Set flags (IF set)
+ push $SEL_UCODE # Set CS
+ pushl btx_hdr+0xc # Set EIP
+ pushl %ecx # Set GS
+ pushl %ecx # Set FS
+ pushl %ecx # Set DS
+ pushl %ecx # Set ES
+ pushl %edx # Set EAX
+ movb $0x7,%cl # Set remaining
+init.9: push $0x0 # general
+ loop init.9 # registers
#ifdef BTX_SERIAL
- call sio_init // setup the serial console
+ call sio_init # setup the serial console
#endif
- popa // and initialize
- popl %es // Initialize
- popl %ds // user
- popl %fs // segment
- popl %gs // registers
- iret // To user mode
+ popa # and initialize
+ popl %es # Initialize
+ popl %ds # user
+ popl %fs # segment
+ popl %gs # registers
+ iret # To user mode
/*
* Exit routine.
*/
-exit: cli // Disable interrupts
- movl $MEM_ESP0,%esp // Clear stack
+exit: cli # Disable interrupts
+ movl $MEM_ESP0,%esp # Clear stack
/*
* Turn off paging.
*/
- movl %cr0,%eax // Get CR0
- andl $~0x80000000,%eax // Disable
- movl %eax,%cr0 // paging
- xorl %ecx,%ecx // Zero
- movl %ecx,%cr3 // Flush TLB
+ movl %cr0,%eax # Get CR0
+ andl $~0x80000000,%eax # Disable
+ movl %eax,%cr0 # paging
+ xorl %ecx,%ecx # Zero
+ movl %ecx,%cr3 # Flush TLB
/*
* Restore the GDT in case we caught a kernel trap.
*/
- lgdt gdtdesc // Set GDT
+ lgdt gdtdesc # Set GDT
/*
* To 16 bits.
*/
- ljmpw $SEL_RCODE,$exit.1 // Reload CS
+ ljmpw $SEL_RCODE,$exit.1 # Reload CS
.code16
-exit.1: mov $SEL_RDATA,%cl // 16-bit selector
- mov %cx,%ss // Reload SS
- mov %cx,%ds // Load
- mov %cx,%es // remaining
- mov %cx,%fs // segment
- mov %cx,%gs // registers
+exit.1: mov $SEL_RDATA,%cl # 16-bit selector
+ mov %cx,%ss # Reload SS
+ mov %cx,%ds # Load
+ mov %cx,%es # remaining
+ mov %cx,%fs # segment
+ mov %cx,%gs # registers
/*
* To real-address mode.
*/
- dec %ax // Switch to
- mov %eax,%cr0 // real mode
- ljmp $0x0,$exit.2 // Reload CS
-exit.2: xor %ax,%ax // Real mode segment
- mov %ax,%ss // Reload SS
- mov %ax,%ds // Address data
- mov $0x7008,%bx // Set real mode
- callw setpic // IRQ offsets
- lidt ivtdesc // Set IVT
+ dec %ax # Switch to
+ mov %eax,%cr0 # real mode
+ ljmp $0x0,$exit.2 # Reload CS
+exit.2: xor %ax,%ax # Real mode segment
+ mov %ax,%ss # Reload SS
+ mov %ax,%ds # Address data
+ mov $0x7008,%bx # Set real mode
+ callw setpic # IRQ offsets
+ lidt ivtdesc # Set IVT
/*
* Reboot or await reset.
*/
- sti // Enable interrupts
- testb $0x1,btx_hdr+0x7 // Reboot?
-exit.3: jz exit.3 // No
- movw $0x1234, BDA_BOOT // Do a warm boot
- ljmp $0xf000,$0xfff0 // reboot the machine
+ sti # Enable interrupts
+ testb $0x1,btx_hdr+0x7 # Reboot?
+exit.3: jz exit.3 # No
+ movw $0x1234, BDA_BOOT # Do a warm boot
+ ljmp $0xf000,$0xfff0 # reboot the machine
/*
* Set IRQ offsets by reprogramming 8259A PICs.
*/
-setpic: in $0x21,%al // Save master
- push %ax // IMR
- in $0xa1,%al // Save slave
- push %ax // IMR
- movb $0x11,%al // ICW1 to
- outb %al,$0x20 // master,
- outb %al,$0xa0 // slave
- movb %bl,%al // ICW2 to
- outb %al,$0x21 // master
- movb %bh,%al // ICW2 to
- outb %al,$0xa1 // slave
- movb $0x4,%al // ICW3 to
- outb %al,$0x21 // master
- movb $0x2,%al // ICW3 to
- outb %al,$0xa1 // slave
- movb $0x1,%al // ICW4 to
- outb %al,$0x21 // master,
- outb %al,$0xa1 // slave
- pop %ax // Restore slave
- outb %al,$0xa1 // IMR
- pop %ax // Restore master
- outb %al,$0x21 // IMR
- retw // To caller
+setpic: in $0x21,%al # Save master
+ push %ax # IMR
+ in $0xa1,%al # Save slave
+ push %ax # IMR
+ movb $0x11,%al # ICW1 to
+ outb %al,$0x20 # master,
+ outb %al,$0xa0 # slave
+ movb %bl,%al # ICW2 to
+ outb %al,$0x21 # master
+ movb %bh,%al # ICW2 to
+ outb %al,$0xa1 # slave
+ movb $0x4,%al # ICW3 to
+ outb %al,$0x21 # master
+ movb $0x2,%al # ICW3 to
+ outb %al,$0xa1 # slave
+ movb $0x1,%al # ICW4 to
+ outb %al,$0x21 # master,
+ outb %al,$0xa1 # slave
+ pop %ax # Restore slave
+ outb %al,$0xa1 # IMR
+ pop %ax # Restore master
+ outb %al,$0x21 # IMR
+ retw # To caller
.code32
/*
* Initiate return from V86 mode to user mode.
*/
-inthlt: hlt // To supervisor mode
+inthlt: hlt # To supervisor mode
/*
* Exception jump table.
*/
-intx00: push $0x0 // Int 0x0: #DE
- jmp ex_noc // Divide error
- push $0x1 // Int 0x1: #DB
- jmp ex_noc // Debug
- push $0x3 // Int 0x3: #BP
- jmp ex_noc // Breakpoint
- push $0x4 // Int 0x4: #OF
- jmp ex_noc // Overflow
- push $0x5 // Int 0x5: #BR
- jmp ex_noc // BOUND range exceeded
- push $0x6 // Int 0x6: #UD
- jmp ex_noc // Invalid opcode
- push $0x7 // Int 0x7: #NM
- jmp ex_noc // Device not available
- push $0x8 // Int 0x8: #DF
- jmp except // Double fault
- push $0xa // Int 0xa: #TS
- jmp except // Invalid TSS
- push $0xb // Int 0xb: #NP
- jmp except // Segment not present
- push $0xc // Int 0xc: #SS
- jmp except // Stack segment fault
- push $0xd // Int 0xd: #GP
- jmp ex_v86 // General protection
- push $0xe // Int 0xe: #PF
- jmp except // Page fault
-intx10: push $0x10 // Int 0x10: #MF
- jmp ex_noc // Floating-point error
+intx00: push $0x0 # Int 0x0: #DE
+ jmp ex_noc # Divide error
+ push $0x1 # Int 0x1: #DB
+ jmp ex_noc # Debug
+ push $0x3 # Int 0x3: #BP
+ jmp ex_noc # Breakpoint
+ push $0x4 # Int 0x4: #OF
+ jmp ex_noc # Overflow
+ push $0x5 # Int 0x5: #BR
+ jmp ex_noc # BOUND range exceeded
+ push $0x6 # Int 0x6: #UD
+ jmp ex_noc # Invalid opcode
+ push $0x7 # Int 0x7: #NM
+ jmp ex_noc # Device not available
+ push $0x8 # Int 0x8: #DF
+ jmp except # Double fault
+ push $0xa # Int 0xa: #TS
+ jmp except # Invalid TSS
+ push $0xb # Int 0xb: #NP
+ jmp except # Segment not present
+ push $0xc # Int 0xc: #SS
+ jmp except # Stack segment fault
+ push $0xd # Int 0xd: #GP
+ jmp ex_v86 # General protection
+ push $0xe # Int 0xe: #PF
+ jmp except # Page fault
+intx10: push $0x10 # Int 0x10: #MF
+ jmp ex_noc # Floating-point error
/*
* Handle #GP exception.
*/
-ex_v86: testb $0x2,0x12(%esp,1) // V86 mode?
- jz except // No
- jmp v86mon // To monitor
+ex_v86: testb $0x2,0x12(%esp,1) # V86 mode?
+ jz except # No
+ jmp v86mon # To monitor
/*
* Save a zero error code.
*/
-ex_noc: pushl (%esp,1) // Duplicate int no
- movb $0x0,0x4(%esp,1) // Fake error code
+ex_noc: pushl (%esp,1) # Duplicate int no
+ movb $0x0,0x4(%esp,1) # Fake error code
/*
* Handle exception.
*/
-except: cld // String ops inc
- pushl %ds // Save
- pushl %es // most
- pusha // registers
- movb $0x6,%al // Push loop count
- testb $0x2,0x3a(%esp,1) // V86 mode?
- jnz except.1 // Yes
- pushl %gs // Set GS
- pushl %fs // Set FS
- pushl %ds // Set DS
- pushl %es // Set ES
- movb $0x2,%al // Push loop count
- cmpw $SEL_SCODE,0x44(%esp,1) // Supervisor mode?
- jne except.1 // No
- pushl %ss // Set SS
- leal 0x50(%esp,1),%eax // Set
- pushl %eax // ESP
- jmp except.2 // Join common code
-except.1: pushl 0x50(%esp,1) // Set GS, FS, DS, ES
- decb %al // (if V86 mode), and
- jne except.1 // SS, ESP
-except.2: push $SEL_SDATA // Set up
- popl %ds // to
- pushl %ds // address
- popl %es // data
- movl %esp,%ebx // Stack frame
- movl $dmpfmt,%esi // Dump format string
- movl $MEM_BUF,%edi // Buffer
- pushl %edi // Dump to
- call dump // buffer
- popl %esi // and
- call putstr // display
- leal 0x18(%esp,1),%esp // Discard frame
- popa // Restore
- popl %es // registers
- popl %ds // saved
- cmpb $0x3,(%esp,1) // Breakpoint?
- je except.3 // Yes
- cmpb $0x1,(%esp,1) // Debug?
- jne except.2a // No
- testl $0x100,0x10(%esp,1) // Trap flag set?
- jnz except.3 // Yes
-except.2a: jmp exit // Exit
-except.3: leal 0x8(%esp,1),%esp // Discard err, int no
- iret // From interrupt
+except: cld # String ops inc
+ pushl %ds # Save
+ pushl %es # most
+ pusha # registers
+ movb $0x6,%al # Push loop count
+ testb $0x2,0x3a(%esp,1) # V86 mode?
+ jnz except.1 # Yes
+ pushl %gs # Set GS
+ pushl %fs # Set FS
+ pushl %ds # Set DS
+ pushl %es # Set ES
+ movb $0x2,%al # Push loop count
+ cmpw $SEL_SCODE,0x44(%esp,1) # Supervisor mode?
+ jne except.1 # No
+ pushl %ss # Set SS
+ leal 0x50(%esp,1),%eax # Set
+ pushl %eax # ESP
+ jmp except.2 # Join common code
+except.1: pushl 0x50(%esp,1) # Set GS, FS, DS, ES
+ decb %al # (if V86 mode), and
+ jne except.1 # SS, ESP
+except.2: push $SEL_SDATA # Set up
+ popl %ds # to
+ pushl %ds # address
+ popl %es # data
+ movl %esp,%ebx # Stack frame
+ movl $dmpfmt,%esi # Dump format string
+ movl $MEM_BUF,%edi # Buffer
+ pushl %edi # Dump to
+ call dump # buffer
+ popl %esi # and
+ call putstr # display
+ leal 0x18(%esp,1),%esp # Discard frame
+ popa # Restore
+ popl %es # registers
+ popl %ds # saved
+ cmpb $0x3,(%esp,1) # Breakpoint?
+ je except.3 # Yes
+ cmpb $0x1,(%esp,1) # Debug?
+ jne except.2a # No
+ testl $0x100,0x10(%esp,1) # Trap flag set?
+ jnz except.3 # Yes
+except.2a: jmp exit # Exit
+except.3: leal 0x8(%esp,1),%esp # Discard err, int no
+ iret # From interrupt
/*
* Return to user mode from V86 mode.
*/
-intrtn: cld // String ops inc
- pushl %ds // Address
- popl %es // data
- leal 0x3c(%ebp),%edx // V86 Segment registers
- movl MEM_TSS+TSS_ESP1,%esi // Link stack pointer
- lodsl // INT_V86 args pointer
- movl %esi,%ebx // Saved exception frame
- testl %eax,%eax // INT_V86 args?
- jz intrtn.2 // No
- movl $MEM_USR,%edi // User base
- movl 0x1c(%esi),%ebx // User ESP
- movl %eax,(%edi,%ebx,1) // Restore to user stack
- leal 0x8(%edi,%eax,1),%edi // Arg segment registers
- testb $0x4,-0x6(%edi) // Return flags?
- jz intrtn.1 // No
- movl 0x30(%ebp),%eax // Get V86 flags
- movw %ax,0x18(%esi) // Set user flags
-intrtn.1: leal 0x10(%esi),%ebx // Saved exception frame
- xchgl %edx,%esi // Segment registers
- movb $0x4,%cl // Update seg regs
- rep // in INT_V86
- movsl // args
-intrtn.2: movl %edx,%esi // Segment registers
- leal 0x28(%ebp),%edi // Set up seg
- movb $0x4,%cl // regs for
- rep // later
- movsl // pop
- movl %ebx,%esi // Restore exception
- movb $0x5,%cl // frame to
- rep // supervisor
- movsl // stack
- movl %esi,MEM_TSS+TSS_ESP1 // Link stack pointer
- popa // Restore
- leal 0x8(%esp,1),%esp // Discard err, int no
- popl %es // Restore
- popl %ds // user
- popl %fs // segment
- popl %gs // registers
- iret // To user mode
+intrtn: cld # String ops inc
+ pushl %ds # Address
+ popl %es # data
+ leal 0x3c(%ebp),%edx # V86 Segment registers
+ movl MEM_TSS+TSS_ESP1,%esi # Link stack pointer
+ lodsl # INT_V86 args pointer
+ movl %esi,%ebx # Saved exception frame
+ testl %eax,%eax # INT_V86 args?
+ jz intrtn.2 # No
+ movl $MEM_USR,%edi # User base
+ movl 0x1c(%esi),%ebx # User ESP
+ movl %eax,(%edi,%ebx,1) # Restore to user stack
+ leal 0x8(%edi,%eax,1),%edi # Arg segment registers
+ testb $0x4,-0x6(%edi) # Return flags?
+ jz intrtn.1 # No
+ movl 0x30(%ebp),%eax # Get V86 flags
+ movw %ax,0x18(%esi) # Set user flags
+intrtn.1: leal 0x10(%esi),%ebx # Saved exception frame
+ xchgl %edx,%esi # Segment registers
+ movb $0x4,%cl # Update seg regs
+ rep # in INT_V86
+ movsl # args
+intrtn.2: movl %edx,%esi # Segment registers
+ leal 0x28(%ebp),%edi # Set up seg
+ movb $0x4,%cl # regs for
+ rep # later
+ movsl # pop
+ movl %ebx,%esi # Restore exception
+ movb $0x5,%cl # frame to
+ rep # supervisor
+ movsl # stack
+ movl %esi,MEM_TSS+TSS_ESP1 # Link stack pointer
+ popa # Restore
+ leal 0x8(%esp,1),%esp # Discard err, int no
+ popl %es # Restore
+ popl %ds # user
+ popl %fs # segment
+ popl %gs # registers
+ iret # To user mode
/*
* V86 monitor.
*/
-v86mon: cld // String ops inc
- pushl $SEL_SDATA // Set up for
- popl %ds // flat addressing
- pusha // Save registers
- movl %esp,%ebp // Address stack frame
- movzwl 0x2c(%ebp),%edi // Load V86 CS
- shll $0x4,%edi // To linear
- movl 0x28(%ebp),%esi // Load V86 IP
- addl %edi,%esi // Code pointer
- xorl %ecx,%ecx // Zero
- movb $0x2,%cl // 16-bit operands
- xorl %eax,%eax // Zero
-v86mon.1: lodsb // Get opcode
- cmpb $0x66,%al // Operand size prefix?
- jne v86mon.2 // No
- movb $0x4,%cl // 32-bit operands
- jmp v86mon.1 // Continue
-v86mon.2: cmpb $0xf4,%al // HLT?
- jne v86mon.3 // No
- cmpl $inthlt+0x1,%esi // Is inthlt?
- jne v86mon.7 // No (ignore)
- jmp intrtn // Return to user mode
-v86mon.3: cmpb $0xf,%al // Prefixed instruction?
- jne v86mon.4 // No
- cmpb $0x09,(%esi) // Is it a WBINVD?
- je v86wbinvd // Yes
- cmpb $0x30,(%esi) // Is it a WRMSR?
- je v86wrmsr // Yes
- cmpb $0x32,(%esi) // Is it a RDMSR?
- je v86rdmsr // Yes
- cmpb $0x20,(%esi) // Is this a
- jne v86mon.4 // MOV EAX,CR0
- cmpb $0xc0,0x1(%esi) // instruction?
- je v86mov // Yes
-v86mon.4: cmpb $0xfa,%al // CLI?
- je v86cli // Yes
- cmpb $0xfb,%al // STI?
- je v86sti // Yes
- movzwl 0x38(%ebp),%ebx // Load V86 SS
- shll $0x4,%ebx // To offset
- pushl %ebx // Save
- addl 0x34(%ebp),%ebx // Add V86 SP
- movl 0x30(%ebp),%edx // Load V86 flags
- cmpb $0x9c,%al // PUSHF/PUSHFD?
- je v86pushf // Yes
- cmpb $0x9d,%al // POPF/POPFD?
- je v86popf // Yes
- cmpb $0xcd,%al // INT imm8?
- je v86intn // Yes
- cmpb $0xcf,%al // IRET/IRETD?
- je v86iret // Yes
- popl %ebx // Restore
- popa // Restore
- jmp except // Handle exception
-v86mon.5: movl %edx,0x30(%ebp) // Save V86 flags
-v86mon.6: popl %edx // V86 SS adjustment
- subl %edx,%ebx // Save V86
- movl %ebx,0x34(%ebp) // SP
-v86mon.7: subl %edi,%esi // From linear
- movl %esi,0x28(%ebp) // Save V86 IP
- popa // Restore
- leal 0x8(%esp,1),%esp // Discard int no, error
- iret // To V86 mode
+v86mon: cld # String ops inc
+ pushl $SEL_SDATA # Set up for
+ popl %ds # flat addressing
+ pusha # Save registers
+ movl %esp,%ebp # Address stack frame
+ movzwl 0x2c(%ebp),%edi # Load V86 CS
+ shll $0x4,%edi # To linear
+ movl 0x28(%ebp),%esi # Load V86 IP
+ addl %edi,%esi # Code pointer
+ xorl %ecx,%ecx # Zero
+ movb $0x2,%cl # 16-bit operands
+ xorl %eax,%eax # Zero
+v86mon.1: lodsb # Get opcode
+ cmpb $0x66,%al # Operand size prefix?
+ jne v86mon.2 # No
+ movb $0x4,%cl # 32-bit operands
+ jmp v86mon.1 # Continue
+v86mon.2: cmpb $0xf4,%al # HLT?
+ jne v86mon.3 # No
+ cmpl $inthlt+0x1,%esi # Is inthlt?
+ jne v86mon.7 # No (ignore)
+ jmp intrtn # Return to user mode
+v86mon.3: cmpb $0xf,%al # Prefixed instruction?
+ jne v86mon.4 # No
+ cmpb $0x09,(%esi) # Is it a WBINVD?
+ je v86wbinvd # Yes
+ cmpb $0x30,(%esi) # Is it a WRMSR?
+ je v86wrmsr # Yes
+ cmpb $0x32,(%esi) # Is it a RDMSR?
+ je v86rdmsr # Yes
+ cmpb $0x20,(%esi) # Is this a
+ jne v86mon.4 # MOV EAX,CR0
+ cmpb $0xc0,0x1(%esi) # instruction?
+ je v86mov # Yes
+v86mon.4: cmpb $0xfa,%al # CLI?
+ je v86cli # Yes
+ cmpb $0xfb,%al # STI?
+ je v86sti # Yes
+ movzwl 0x38(%ebp),%ebx # Load V86 SS
+ shll $0x4,%ebx # To offset
+ pushl %ebx # Save
+ addl 0x34(%ebp),%ebx # Add V86 SP
+ movl 0x30(%ebp),%edx # Load V86 flags
+ cmpb $0x9c,%al # PUSHF/PUSHFD?
+ je v86pushf # Yes
+ cmpb $0x9d,%al # POPF/POPFD?
+ je v86popf # Yes
+ cmpb $0xcd,%al # INT imm8?
+ je v86intn # Yes
+ cmpb $0xcf,%al # IRET/IRETD?
+ je v86iret # Yes
+ popl %ebx # Restore
+ popa # Restore
+ jmp except # Handle exception
+v86mon.5: movl %edx,0x30(%ebp) # Save V86 flags
+v86mon.6: popl %edx # V86 SS adjustment
+ subl %edx,%ebx # Save V86
+ movl %ebx,0x34(%ebp) # SP
+v86mon.7: subl %edi,%esi # From linear
+ movl %esi,0x28(%ebp) # Save V86 IP
+ popa # Restore
+ leal 0x8(%esp,1),%esp # Discard int no, error
+ iret # To V86 mode
/*
* Emulate MOV EAX,CR0.
*/
-v86mov: movl %cr0,%eax // CR0 to
- movl %eax,0x1c(%ebp) // saved EAX
- incl %esi // Adjust IP
+v86mov: movl %cr0,%eax # CR0 to
+ movl %eax,0x1c(%ebp) # saved EAX
+ incl %esi # Adjust IP
/*
* Return from emulating a 0x0f prefixed instruction
*/
-v86preret: incl %esi // Adjust IP
- jmp v86mon.7 // Finish up
+v86preret: incl %esi # Adjust IP
+ jmp v86mon.7 # Finish up
/*
* Emulate WBINVD
*/
-v86wbinvd: wbinvd // Write back and invalidate
- // cache
- jmp v86preret // Finish up
+v86wbinvd: wbinvd # Write back and invalidate
+ # cache
+ jmp v86preret # Finish up
/*
* Emulate WRMSR
*/
-v86wrmsr: movl 0x18(%ebp),%ecx // Get user's %ecx
- // (MSR to write)
- movl 0x14(%ebp),%edx // Load the value
- movl 0x1c(%ebp),%eax // to write
- wrmsr // Write MSR
- jmp v86preret // Finish up
+v86wrmsr: movl 0x18(%ebp),%ecx # Get user's %ecx (MSR to write)
+ movl 0x14(%ebp),%edx # Load the value
+ movl 0x1c(%ebp),%eax # to write
+ wrmsr # Write MSR
+ jmp v86preret # Finish up
/*
* Emulate RDMSR
*/
-v86rdmsr: movl 0x18(%ebp),%ecx // MSR to read
- rdmsr // Read the MSR
- movl %eax,0x1c(%ebp) // Return the value of
- movl %edx,0x14(%ebp) // the MSR to the user
- jmp v86preret // Finish up
+v86rdmsr: movl 0x18(%ebp),%ecx # MSR to read
+ rdmsr # Read the MSR
+ movl %eax,0x1c(%ebp) # Return the value of
+ movl %edx,0x14(%ebp) # the MSR to the user
+ jmp v86preret # Finish up
/*
* Emulate CLI.
*/
-v86cli: andb $~0x2,0x31(%ebp) // Clear IF
- jmp v86mon.7 // Finish up
+v86cli: andb $~0x2,0x31(%ebp) # Clear IF
+ jmp v86mon.7 # Finish up
/*
* Emulate STI.
*/
-v86sti: orb $0x2,0x31(%ebp) // Set IF
- jmp v86mon.7 // Finish up
+v86sti: orb $0x2,0x31(%ebp) # Set IF
+ jmp v86mon.7 # Finish up
/*
* Emulate PUSHF/PUSHFD.
*/
-v86pushf: subl %ecx,%ebx // Adjust SP
- cmpb $0x4,%cl // 32-bit
- je v86pushf.1 // Yes
- data16 // 16-bit
-v86pushf.1: movl %edx,(%ebx) // Save flags
- jmp v86mon.6 // Finish up
+v86pushf: subl %ecx,%ebx # Adjust SP
+ cmpb $0x4,%cl # 32-bit
+ je v86pushf.1 # Yes
+ data16 # 16-bit
+v86pushf.1: movl %edx,(%ebx) # Save flags
+ jmp v86mon.6 # Finish up
/*
* Emulate IRET/IRETD.
*/
-v86iret: movzwl (%ebx),%esi // Load V86 IP
- movzwl 0x2(%ebx),%edi // Load V86 CS
- leal 0x4(%ebx),%ebx // Adjust SP
- movl %edi,0x2c(%ebp) // Save V86 CS
- xorl %edi,%edi // No ESI adjustment
+v86iret: movzwl (%ebx),%esi # Load V86 IP
+ movzwl 0x2(%ebx),%edi # Load V86 CS
+ leal 0x4(%ebx),%ebx # Adjust SP
+ movl %edi,0x2c(%ebp) # Save V86 CS
+ xorl %edi,%edi # No ESI adjustment
/*
* Emulate POPF/POPFD (and remainder of IRET/IRETD).
*/
-v86popf: cmpb $0x4,%cl // 32-bit?
- je v86popf.1 // Yes
- movl %edx,%eax // Initialize
- data16 // 16-bit
-v86popf.1: movl (%ebx),%eax // Load flags
- addl %ecx,%ebx // Adjust SP
- andl $V86_FLG,%eax // Merge
- andl $~V86_FLG,%edx // the
- orl %eax,%edx // flags
- jmp v86mon.5 // Finish up
+v86popf: cmpb $0x4,%cl # 32-bit?
+ je v86popf.1 # Yes
+ movl %edx,%eax # Initialize
+ data16 # 16-bit
+v86popf.1: movl (%ebx),%eax # Load flags
+ addl %ecx,%ebx # Adjust SP
+ andl $V86_FLG,%eax # Merge
+ andl $~V86_FLG,%edx # the
+ orl %eax,%edx # flags
+ jmp v86mon.5 # Finish up
/*
* trap int 15, function 87
* reads %es:%si from saved registers on stack to find a GDT containing
@@ -607,566 +606,566 @@ v86popf.1: movl (%ebx),%eax // Load flags
* reads count of words from saved %cx
* returns success by setting %ah to 0
*/
-int15_87: pushl %eax // Save
- pushl %ebx // some information
- pushl %esi // onto the stack.
+int15_87: pushl %eax # Save
+ pushl %ebx # some information
+ pushl %esi # onto the stack.
pushl %edi
- xorl %eax,%eax // clean EAX
- xorl %ebx,%ebx // clean EBX
- movl 0x4(%ebp),%esi // Get user's ESI
- movl 0x3C(%ebp),%ebx // store ES
- movw %si,%ax // store SI
- shll $0x4,%ebx // Make it a seg.
- addl %eax,%ebx // ebx=(es<<4)+si
- movb 0x14(%ebx),%al // Grab the
- movb 0x17(%ebx),%ah // necessary
- shll $0x10,%eax // information
- movw 0x12(%ebx),%ax // from
- movl %eax,%esi // the
- movb 0x1c(%ebx),%al // GDT in order to
- movb 0x1f(%ebx),%ah // have %esi offset
- shll $0x10,%eax // of source and %edi
- movw 0x1a(%ebx),%ax // of destination.
+ xorl %eax,%eax # clean EAX
+ xorl %ebx,%ebx # clean EBX
+ movl 0x4(%ebp),%esi # Get user's ESI
+ movl 0x3C(%ebp),%ebx # store ES
+ movw %si,%ax # store SI
+ shll $0x4,%ebx # Make it a seg.
+ addl %eax,%ebx # ebx=(es<<4)+si
+ movb 0x14(%ebx),%al # Grab the
+ movb 0x17(%ebx),%ah # necessary
+ shll $0x10,%eax # information
+ movw 0x12(%ebx),%ax # from
+ movl %eax,%esi # the
+ movb 0x1c(%ebx),%al # GDT in order to
+ movb 0x1f(%ebx),%ah # have %esi offset
+ shll $0x10,%eax # of source and %edi
+ movw 0x1a(%ebx),%ax # of destination.
movl %eax,%edi
- pushl %ds // Make:
- popl %es // es = ds
- pushl %ecx // stash ECX
- xorl %ecx,%ecx // highw of ECX is clear
- movw 0x18(%ebp),%cx // Get user's ECX
- shll $0x1,%ecx // Convert from num words to num
- // bytes
- rep // repeat...
- movsb // perform copy.
- popl %ecx // Restore
+ pushl %ds # Make:
+ popl %es # es = ds
+ pushl %ecx # stash ECX
+ xorl %ecx,%ecx # highw of ECX is clear
+ movw 0x18(%ebp),%cx # Get user's ECX
+ shll $0x1,%ecx # Convert from num words to num
+ # bytes
+ rep # repeat...
+ movsb # perform copy.
+ popl %ecx # Restore
popl %edi
- popl %esi // previous
- popl %ebx // register
- popl %eax // values.
- movb $0x0,0x1d(%ebp) // set ah = 0 to indicate
- // success
- andb $0xfe,%dl // clear CF
- jmp v86mon.5 // Finish up
+ popl %esi # previous
+ popl %ebx # register
+ popl %eax # values.
+ movb $0x0,0x1d(%ebp) # set ah = 0 to indicate
+ # success
+ andb $0xfe,%dl # clear CF
+ jmp v86mon.5 # Finish up
/*
* Reboot the machine by setting the reboot flag and exiting
*/
-reboot: orb $0x1,btx_hdr+0x7 // Set the reboot flag
- jmp exit // Terminate BTX and reboot
+reboot: orb $0x1,btx_hdr+0x7 # Set the reboot flag
+ jmp exit # Terminate BTX and reboot
/*
* Emulate INT imm8... also make sure to check if it's int 15/87
*/
-v86intn: lodsb // Get int no
- cmpb $0x19,%al // is it int 19?
- je reboot // yes, reboot the machine
- cmpb $0x15,%al // is it int 15?
- jne v86intn.3 // no, skip parse
- pushl %eax // stash EAX
- movl 0x1c(%ebp),%eax // user's saved EAX
- cmpb $0x87,%ah // is it the memcpy subfunction?
- jne v86intn.1 // no, keep checking
- popl %eax // get the stack straight
- jmp int15_87 // it's our cue
-v86intn.1: cmpw $0x4f53,%ax // is it the delete key callout?
- jne v86intn.2 // no, handle the int normally
- movb BDA_KEYFLAGS,%al // get the shift key state
- andb $0xc,%al // mask off just Ctrl and Alt
- cmpb $0xc,%al // are both Ctrl and Alt down?
- jne v86intn.2 // no, handle the int normally
- popl %eax // restore EAX
- jmp reboot // reboot the machine
-v86intn.2: popl %eax // restore EAX
-v86intn.3: subl %edi,%esi // From
- shrl $0x4,%edi // linear
- movw %dx,-0x2(%ebx) // Save flags
- movw %di,-0x4(%ebx) // Save CS
- leal -0x6(%ebx),%ebx // Adjust SP
- movw %si,(%ebx) // Save IP
- shll $0x2,%eax // Scale
- movzwl (%eax),%esi // Load IP
- movzwl 0x2(%eax),%edi // Load CS
- movl %edi,0x2c(%ebp) // Save CS
- xorl %edi,%edi // No ESI adjustment
- andb $~0x1,%dh // Clear TF
- jmp v86mon.5 // Finish up
+v86intn: lodsb # Get int no
+ cmpb $0x19,%al # is it int 19?
+ je reboot # yes, reboot the machine
+ cmpb $0x15,%al # is it int 15?
+ jne v86intn.3 # no, skip parse
+ pushl %eax # stash EAX
+ movl 0x1c(%ebp),%eax # user's saved EAX
+ cmpb $0x87,%ah # is it the memcpy subfunction?
+ jne v86intn.1 # no, keep checking
+ popl %eax # get the stack straight
+ jmp int15_87 # it's our cue
+v86intn.1: cmpw $0x4f53,%ax # is it the delete key callout?
+ jne v86intn.2 # no, handle the int normally
+ movb BDA_KEYFLAGS,%al # get the shift key state
+ andb $0xc,%al # mask off just Ctrl and Alt
+ cmpb $0xc,%al # are both Ctrl and Alt down?
+ jne v86intn.2 # no, handle the int normally
+ popl %eax # restore EAX
+ jmp reboot # reboot the machine
+v86intn.2: popl %eax # restore EAX
+v86intn.3: subl %edi,%esi # From
+ shrl $0x4,%edi # linear
+ movw %dx,-0x2(%ebx) # Save flags
+ movw %di,-0x4(%ebx) # Save CS
+ leal -0x6(%ebx),%ebx # Adjust SP
+ movw %si,(%ebx) # Save IP
+ shll $0x2,%eax # Scale
+ movzwl (%eax),%esi # Load IP
+ movzwl 0x2(%eax),%edi # Load CS
+ movl %edi,0x2c(%ebp) # Save CS
+ xorl %edi,%edi # No ESI adjustment
+ andb $~0x1,%dh # Clear TF
+ jmp v86mon.5 # Finish up
/*
* Hardware interrupt jump table.
*/
-intx20: push $0x8 // Int 0x20: IRQ0
- jmp int_hw // V86 int 0x8
- push $0x9 // Int 0x21: IRQ1
- jmp int_hw // V86 int 0x9
- push $0xa // Int 0x22: IRQ2
- jmp int_hw // V86 int 0xa
- push $0xb // Int 0x23: IRQ3
- jmp int_hw // V86 int 0xb
- push $0xc // Int 0x24: IRQ4
- jmp int_hw // V86 int 0xc
- push $0xd // Int 0x25: IRQ5
- jmp int_hw // V86 int 0xd
- push $0xe // Int 0x26: IRQ6
- jmp int_hw // V86 int 0xe
- push $0xf // Int 0x27: IRQ7
- jmp int_hw // V86 int 0xf
- push $0x70 // Int 0x28: IRQ8
- jmp int_hw // V86 int 0x70
- push $0x71 // Int 0x29: IRQ9
- jmp int_hw // V86 int 0x71
- push $0x72 // Int 0x2a: IRQ10
- jmp int_hw // V86 int 0x72
- push $0x73 // Int 0x2b: IRQ11
- jmp int_hw // V86 int 0x73
- push $0x74 // Int 0x2c: IRQ12
- jmp int_hw // V86 int 0x74
- push $0x75 // Int 0x2d: IRQ13
- jmp int_hw // V86 int 0x75
- push $0x76 // Int 0x2e: IRQ14
- jmp int_hw // V86 int 0x76
- push $0x77 // Int 0x2f: IRQ15
- jmp int_hw // V86 int 0x77
+intx20: push $0x8 # Int 0x20: IRQ0
+ jmp int_hw # V86 int 0x8
+ push $0x9 # Int 0x21: IRQ1
+ jmp int_hw # V86 int 0x9
+ push $0xa # Int 0x22: IRQ2
+ jmp int_hw # V86 int 0xa
+ push $0xb # Int 0x23: IRQ3
+ jmp int_hw # V86 int 0xb
+ push $0xc # Int 0x24: IRQ4
+ jmp int_hw # V86 int 0xc
+ push $0xd # Int 0x25: IRQ5
+ jmp int_hw # V86 int 0xd
+ push $0xe # Int 0x26: IRQ6
+ jmp int_hw # V86 int 0xe
+ push $0xf # Int 0x27: IRQ7
+ jmp int_hw # V86 int 0xf
+ push $0x70 # Int 0x28: IRQ8
+ jmp int_hw # V86 int 0x70
+ push $0x71 # Int 0x29: IRQ9
+ jmp int_hw # V86 int 0x71
+ push $0x72 # Int 0x2a: IRQ10
+ jmp int_hw # V86 int 0x72
+ push $0x73 # Int 0x2b: IRQ11
+ jmp int_hw # V86 int 0x73
+ push $0x74 # Int 0x2c: IRQ12
+ jmp int_hw # V86 int 0x74
+ push $0x75 # Int 0x2d: IRQ13
+ jmp int_hw # V86 int 0x75
+ push $0x76 # Int 0x2e: IRQ14
+ jmp int_hw # V86 int 0x76
+ push $0x77 # Int 0x2f: IRQ15
+ jmp int_hw # V86 int 0x77
/*
* Reflect hardware interrupts.
*/
-int_hw: testb $0x2,0xe(%esp,1) // V86 mode?
- jz intusr // No
- pushl $SEL_SDATA // Address
- popl %ds // data
- xchgl %eax,(%esp,1) // Swap EAX, int no
- pushl %ebp // Address
- movl %esp,%ebp // stack frame
- pushl %ebx // Save
- shll $0x2,%eax // Get int
- movl (%eax),%eax // vector
- subl $0x6,0x14(%ebp) // Adjust V86 ESP
- movzwl 0x18(%ebp),%ebx // V86 SS
- shll $0x4,%ebx // * 0x10
- addl 0x14(%ebp),%ebx // + V86 ESP
- xchgw %ax,0x8(%ebp) // Swap V86 IP
- rorl $0x10,%eax // Swap words
- xchgw %ax,0xc(%ebp) // Swap V86 CS
- roll $0x10,%eax // Swap words
- movl %eax,(%ebx) // CS:IP for IRET
- movl 0x10(%ebp),%eax // V86 flags
- movw %ax,0x4(%ebx) // Flags for IRET
- andb $~0x3,0x11(%ebp) // Clear IF, TF
- popl %ebx // Restore
- popl %ebp // saved
- popl %eax // registers
- iret // To V86 mode
+int_hw: testb $0x2,0xe(%esp,1) # V86 mode?
+ jz intusr # No
+ pushl $SEL_SDATA # Address
+ popl %ds # data
+ xchgl %eax,(%esp,1) # Swap EAX, int no
+ pushl %ebp # Address
+ movl %esp,%ebp # stack frame
+ pushl %ebx # Save
+ shll $0x2,%eax # Get int
+ movl (%eax),%eax # vector
+ subl $0x6,0x14(%ebp) # Adjust V86 ESP
+ movzwl 0x18(%ebp),%ebx # V86 SS
+ shll $0x4,%ebx # * 0x10
+ addl 0x14(%ebp),%ebx # + V86 ESP
+ xchgw %ax,0x8(%ebp) # Swap V86 IP
+ rorl $0x10,%eax # Swap words
+ xchgw %ax,0xc(%ebp) # Swap V86 CS
+ roll $0x10,%eax # Swap words
+ movl %eax,(%ebx) # CS:IP for IRET
+ movl 0x10(%ebp),%eax # V86 flags
+ movw %ax,0x4(%ebx) # Flags for IRET
+ andb $~0x3,0x11(%ebp) # Clear IF, TF
+ popl %ebx # Restore
+ popl %ebp # saved
+ popl %eax # registers
+ iret # To V86 mode
/*
* Invoke V86 interrupt from user mode, with arguments.
*/
-intx31: stc // Have btx_v86
- pushl %eax // Missing int no
+intx31: stc # Have btx_v86
+ pushl %eax # Missing int no
/*
* Invoke V86 interrupt from user mode.
*/
-intusr: std // String ops dec
- pushl %eax // Expand
- pushl %eax // stack
- pushl %eax // frame
- pusha // Save
- pushl %gs // Save
- movl %esp,%eax // seg regs
- pushl %fs // and
- pushl %ds // point
- pushl %es // to them
- push $SEL_SDATA // Set up
- popl %ds // to
- pushl %ds // address
- popl %es // data
- movl $MEM_USR,%ebx // User base
- movl %ebx,%edx // address
- jc intusr.1 // If btx_v86
- xorl %edx,%edx // Control flags
- xorl %ebp,%ebp // btx_v86 pointer
-intusr.1: leal 0x50(%esp,1),%esi // Base of frame
- pushl %esi // Save
- addl -0x4(%esi),%ebx // User ESP
- movl MEM_TSS+TSS_ESP1,%edi // Link stack pointer
- leal -0x4(%edi),%edi // Adjust for push
- xorl %ecx,%ecx // Zero
- movb $0x5,%cl // Push exception
- rep // frame on
- movsl // link stack
- xchgl %eax,%esi // Saved seg regs
- movl 0x40(%esp,1),%eax // Get int no
- testl %edx,%edx // Have btx_v86?
- jz intusr.2 // No
- movl (%ebx),%ebp // btx_v86 pointer
- movb $0x4,%cl // Count
- addl %ecx,%ebx // Adjust for pop
- rep // Push saved seg regs
- movsl // on link stack
- addl %ebp,%edx // Flatten btx_v86 ptr
- leal 0x14(%edx),%esi // Seg regs pointer
- movl 0x4(%edx),%eax // Get int no/address
- movzwl 0x2(%edx),%edx // Get control flags
-intusr.2: movl %ebp,(%edi) // Push btx_v86 and
- movl %edi,MEM_TSS+TSS_ESP1 // save link stack ptr
- popl %edi // Base of frame
- xchgl %eax,%ebp // Save intno/address
- movl 0x48(%esp,1),%eax // Get flags
- testb $0x2,%dl // Simulate CALLF?
- jnz intusr.3 // Yes
- decl %ebx // Push flags
- decl %ebx // on V86
- movw %ax,(%ebx) // stack
-intusr.3: movb $0x4,%cl // Count
- subl %ecx,%ebx // Push return address
- movl $inthlt,(%ebx) // on V86 stack
- rep // Copy seg regs to
- movsl // exception frame
- xchgl %eax,%ecx // Save flags
- movl %ebx,%eax // User ESP
- subl $V86_STK,%eax // Less bytes
- ja intusr.4 // to
- xorl %eax,%eax // keep
-intusr.4: shrl $0x4,%eax // Gives segment
- stosl // Set SS
- shll $0x4,%eax // To bytes
- xchgl %eax,%ebx // Swap
- subl %ebx,%eax // Gives offset
- stosl // Set ESP
- xchgl %eax,%ecx // Get flags
- btsl $0x11,%eax // Set VM
- andb $~0x1,%ah // Clear TF
- stosl // Set EFL
- xchgl %eax,%ebp // Get int no/address
- testb $0x1,%dl // Address?
- jnz intusr.5 // Yes
- shll $0x2,%eax // Scale
- movl (%eax),%eax // Load int vector
-intusr.5: movl %eax,%ecx // Save
- shrl $0x10,%eax // Gives segment
- stosl // Set CS
- movw %cx,%ax // Restore
- stosl // Set EIP
- leal 0x10(%esp,1),%esp // Discard seg regs
- popa // Restore
- iret // To V86 mode
+intusr: std # String ops dec
+ pushl %eax # Expand
+ pushl %eax # stack
+ pushl %eax # frame
+ pusha # Save
+ pushl %gs # Save
+ movl %esp,%eax # seg regs
+ pushl %fs # and
+ pushl %ds # point
+ pushl %es # to them
+ push $SEL_SDATA # Set up
+ popl %ds # to
+ pushl %ds # address
+ popl %es # data
+ movl $MEM_USR,%ebx # User base
+ movl %ebx,%edx # address
+ jc intusr.1 # If btx_v86
+ xorl %edx,%edx # Control flags
+ xorl %ebp,%ebp # btx_v86 pointer
+intusr.1: leal 0x50(%esp,1),%esi # Base of frame
+ pushl %esi # Save
+ addl -0x4(%esi),%ebx # User ESP
+ movl MEM_TSS+TSS_ESP1,%edi # Link stack pointer
+ leal -0x4(%edi),%edi # Adjust for push
+ xorl %ecx,%ecx # Zero
+ movb $0x5,%cl # Push exception
+ rep # frame on
+ movsl # link stack
+ xchgl %eax,%esi # Saved seg regs
+ movl 0x40(%esp,1),%eax # Get int no
+ testl %edx,%edx # Have btx_v86?
+ jz intusr.2 # No
+ movl (%ebx),%ebp # btx_v86 pointer
+ movb $0x4,%cl # Count
+ addl %ecx,%ebx # Adjust for pop
+ rep # Push saved seg regs
+ movsl # on link stack
+ addl %ebp,%edx # Flatten btx_v86 ptr
+ leal 0x14(%edx),%esi # Seg regs pointer
+ movl 0x4(%edx),%eax # Get int no/address
+ movzwl 0x2(%edx),%edx # Get control flags
+intusr.2: movl %ebp,(%edi) # Push btx_v86 and
+ movl %edi,MEM_TSS+TSS_ESP1 # save link stack ptr
+ popl %edi # Base of frame
+ xchgl %eax,%ebp # Save intno/address
+ movl 0x48(%esp,1),%eax # Get flags
+ testb $0x2,%dl # Simulate CALLF?
+ jnz intusr.3 # Yes
+ decl %ebx # Push flags
+ decl %ebx # on V86
+ movw %ax,(%ebx) # stack
+intusr.3: movb $0x4,%cl # Count
+ subl %ecx,%ebx # Push return address
+ movl $inthlt,(%ebx) # on V86 stack
+ rep # Copy seg regs to
+ movsl # exception frame
+ xchgl %eax,%ecx # Save flags
+ movl %ebx,%eax # User ESP
+ subl $V86_STK,%eax # Less bytes
+ ja intusr.4 # to
+ xorl %eax,%eax # keep
+intusr.4: shrl $0x4,%eax # Gives segment
+ stosl # Set SS
+ shll $0x4,%eax # To bytes
+ xchgl %eax,%ebx # Swap
+ subl %ebx,%eax # Gives offset
+ stosl # Set ESP
+ xchgl %eax,%ecx # Get flags
+ btsl $0x11,%eax # Set VM
+ andb $~0x1,%ah # Clear TF
+ stosl # Set EFL
+ xchgl %eax,%ebp # Get int no/address
+ testb $0x1,%dl # Address?
+ jnz intusr.5 # Yes
+ shll $0x2,%eax # Scale
+ movl (%eax),%eax # Load int vector
+intusr.5: movl %eax,%ecx # Save
+ shrl $0x10,%eax # Gives segment
+ stosl # Set CS
+ movw %cx,%ax # Restore
+ stosl # Set EIP
+ leal 0x10(%esp,1),%esp # Discard seg regs
+ popa # Restore
+ iret # To V86 mode
/*
* System Call.
*/
-intx30: cmpl $SYS_EXEC,%eax // Exec system call?
- jne intx30.1 // No
- pushl %ss // Set up
- popl %es // all
- pushl %es // segment
- popl %ds // registers
- pushl %ds // for the
- popl %fs // program
- pushl %fs // we're
- popl %gs // invoking
- movl $MEM_USR,%eax // User base address
- addl 0xc(%esp,1),%eax // Change to user
- leal 0x4(%eax),%esp // stack
+intx30: cmpl $SYS_EXEC,%eax # Exec system call?
+ jne intx30.1 # No
+ pushl %ss # Set up
+ popl %es # all
+ pushl %es # segment
+ popl %ds # registers
+ pushl %ds # for the
+ popl %fs # program
+ pushl %fs # we're
+ popl %gs # invoking
+ movl $MEM_USR,%eax # User base address
+ addl 0xc(%esp,1),%eax # Change to user
+ leal 0x4(%eax),%esp # stack
#ifdef PAGING
- movl %cr0,%eax // Turn
- andl $~0x80000000,%eax // off
- movl %eax,%cr0 // paging
- xorl %eax,%eax // Flush
- movl %eax,%cr3 // TLB
+ movl %cr0,%eax # Turn
+ andl $~0x80000000,%eax # off
+ movl %eax,%cr0 # paging
+ xorl %eax,%eax # Flush
+ movl %eax,%cr3 # TLB
#endif
- popl %eax // Call
- call *%eax // program
-intx30.1: orb $0x1,%ss:btx_hdr+0x7 // Flag reboot
- jmp exit // Exit
+ popl %eax # Call
+ call *%eax # program
+intx30.1: orb $0x1,%ss:btx_hdr+0x7 # Flag reboot
+ jmp exit # Exit
/*
* Dump structure [EBX] to [EDI], using format string [ESI].
*/
-dump.0: stosb // Save char
-dump: lodsb // Load char
- testb %al,%al // End of string?
- jz dump.10 // Yes
- testb $0x80,%al // Control?
- jz dump.0 // No
- movb %al,%ch // Save control
- movb $'=',%al // Append
- stosb // '='
- lodsb // Get offset
- pushl %esi // Save
- movsbl %al,%esi // To
- addl %ebx,%esi // pointer
- testb $DMP_X16,%ch // Dump word?
- jz dump.1 // No
- lodsw // Get and
- call hex16 // dump it
-dump.1: testb $DMP_X32,%ch // Dump long?
- jz dump.2 // No
- lodsl // Get and
- call hex32 // dump it
-dump.2: testb $DMP_MEM,%ch // Dump memory?
- jz dump.8 // No
- pushl %ds // Save
- testb $0x2,0x52(%ebx) // V86 mode?
- jnz dump.3 // Yes
- verr 0x4(%esi) // Readable selector?
- jnz dump.3 // No
- ldsl (%esi),%esi // Load pointer
- jmp dump.4 // Join common code
-dump.3: lodsl // Set offset
- xchgl %eax,%edx // Save
- lodsl // Get segment
- shll $0x4,%eax // * 0x10
- addl %edx,%eax // + offset
- xchgl %eax,%esi // Set pointer
-dump.4: movb $2,%dl // Num lines
-dump.4a: movb $0x10,%cl // Bytes to dump
-dump.5: lodsb // Get byte and
- call hex8 // dump it
- decb %cl // Keep count
- jz dump.6a // If done
- movb $'-',%al // Separator
- cmpb $0x8,%cl // Half way?
- je dump.6 // Yes
- movb $' ',%al // Use space
-dump.6: stosb // Save separator
- jmp dump.5 // Continue
-dump.6a: decb %dl // Keep count
- jz dump.7 // If done
- movb $0xa,%al // Line feed
- stosb // Save one
- movb $7,%cl // Leading
- movb $' ',%al // spaces
-dump.6b: stosb // Dump
- decb %cl // spaces
+dump.0: stosb # Save char
+dump: lodsb # Load char
+ testb %al,%al # End of string?
+ jz dump.10 # Yes
+ testb $0x80,%al # Control?
+ jz dump.0 # No
+ movb %al,%ch # Save control
+ movb $'=',%al # Append
+ stosb # '='
+ lodsb # Get offset
+ pushl %esi # Save
+ movsbl %al,%esi # To
+ addl %ebx,%esi # pointer
+ testb $DMP_X16,%ch # Dump word?
+ jz dump.1 # No
+ lodsw # Get and
+ call hex16 # dump it
+dump.1: testb $DMP_X32,%ch # Dump long?
+ jz dump.2 # No
+ lodsl # Get and
+ call hex32 # dump it
+dump.2: testb $DMP_MEM,%ch # Dump memory?
+ jz dump.8 # No
+ pushl %ds # Save
+ testb $0x2,0x52(%ebx) # V86 mode?
+ jnz dump.3 # Yes
+ verr 0x4(%esi) # Readable selector?
+ jnz dump.3 # No
+ ldsl (%esi),%esi # Load pointer
+ jmp dump.4 # Join common code
+dump.3: lodsl # Set offset
+ xchgl %eax,%edx # Save
+ lodsl # Get segment
+ shll $0x4,%eax # * 0x10
+ addl %edx,%eax # + offset
+ xchgl %eax,%esi # Set pointer
+dump.4: movb $2,%dl # Num lines
+dump.4a: movb $0x10,%cl # Bytes to dump
+dump.5: lodsb # Get byte and
+ call hex8 # dump it
+ decb %cl # Keep count
+ jz dump.6a # If done
+ movb $'-',%al # Separator
+ cmpb $0x8,%cl # Half way?
+ je dump.6 # Yes
+ movb $' ',%al # Use space
+dump.6: stosb # Save separator
+ jmp dump.5 # Continue
+dump.6a: decb %dl # Keep count
+ jz dump.7 # If done
+ movb $0xa,%al # Line feed
+ stosb # Save one
+ movb $7,%cl # Leading
+ movb $' ',%al # spaces
+dump.6b: stosb # Dump
+ decb %cl # spaces
jnz dump.6b
- jmp dump.4a // Next line
-dump.7: popl %ds // Restore
-dump.8: popl %esi // Restore
- movb $0xa,%al // Line feed
- testb $DMP_EOL,%ch // End of line?
- jnz dump.9 // Yes
- movb $' ',%al // Use spaces
- stosb // Save one
-dump.9: jmp dump.0 // Continue
-dump.10: stosb // Terminate string
- ret // To caller
+ jmp dump.4a # Next line
+dump.7: popl %ds # Restore
+dump.8: popl %esi # Restore
+ movb $0xa,%al # Line feed
+ testb $DMP_EOL,%ch # End of line?
+ jnz dump.9 # Yes
+ movb $' ',%al # Use spaces
+ stosb # Save one
+dump.9: jmp dump.0 # Continue
+dump.10: stosb # Terminate string
+ ret # To caller
/*
* Convert EAX, AX, or AL to hex, saving the result to [EDI].
*/
-hex32: pushl %eax // Save
- shrl $0x10,%eax // Do upper
- call hex16 // 16
- popl %eax // Restore
-hex16: call hex16.1 // Do upper 8
-hex16.1: xchgb %ah,%al // Save/restore
-hex8: pushl %eax // Save
- shrb $0x4,%al // Do upper
- call hex8.1 // 4
- popl %eax // Restore
-hex8.1: andb $0xf,%al // Get lower 4
- cmpb $0xa,%al // Convert
- sbbb $0x69,%al // to hex
- das // digit
- orb $0x20,%al // To lower case
- stosb // Save char
- ret // (Recursive)
+hex32: pushl %eax # Save
+ shrl $0x10,%eax # Do upper
+ call hex16 # 16
+ popl %eax # Restore
+hex16: call hex16.1 # Do upper 8
+hex16.1: xchgb %ah,%al # Save/restore
+hex8: pushl %eax # Save
+ shrb $0x4,%al # Do upper
+ call hex8.1 # 4
+ popl %eax # Restore
+hex8.1: andb $0xf,%al # Get lower 4
+ cmpb $0xa,%al # Convert
+ sbbb $0x69,%al # to hex
+ das # digit
+ orb $0x20,%al # To lower case
+ stosb # Save char
+ ret # (Recursive)
/*
* Output zero-terminated string [ESI] to the console.
*/
-putstr.0: call putchr // Output char
-putstr: lodsb // Load char
- testb %al,%al // End of string?
- jnz putstr.0 // No
- ret // To caller
+putstr.0: call putchr # Output char
+putstr: lodsb # Load char
+ testb %al,%al # End of string?
+ jnz putstr.0 # No
+ ret # To caller
#ifdef BTX_SERIAL
- .set SIO_PRT,SIOPRT // Base port
- .set SIO_FMT,SIOFMT // 8N1
- .set SIO_DIV,(115200/SIOSPD) // 115200 / SPD
+ .set SIO_PRT,SIOPRT # Base port
+ .set SIO_FMT,SIOFMT # 8N1
+ .set SIO_DIV,(115200/SIOSPD) # 115200 / SPD
* void sio_init(void)
-sio_init: movw $SIO_PRT+0x3,%dx // Data format reg
- movb $SIO_FMT|0x80,%al // Set format
- outb %al,(%dx) // and DLAB
- pushl %edx // Save
- subb $0x3,%dl // Divisor latch reg
- movw $SIO_DIV,%ax // Set
- outw %ax,(%dx) // BPS
- popl %edx // Restore
- movb $SIO_FMT,%al // Clear
- outb %al,(%dx) // DLAB
- incl %edx // Modem control reg
- movb $0x3,%al // Set RTS,
- outb %al,(%dx) // DTR
- incl %edx // Line status reg
+sio_init: movw $SIO_PRT+0x3,%dx # Data format reg
+ movb $SIO_FMT|0x80,%al # Set format
+ outb %al,(%dx) # and DLAB
+ pushl %edx # Save
+ subb $0x3,%dl # Divisor latch reg
+ movw $SIO_DIV,%ax # Set
+ outw %ax,(%dx) # BPS
+ popl %edx # Restore
+ movb $SIO_FMT,%al # Clear
+ outb %al,(%dx) # DLAB
+ incl %edx # Modem control reg
+ movb $0x3,%al # Set RTS,
+ outb %al,(%dx) # DTR
+ incl %edx # Line status reg
* void sio_flush(void)
-sio_flush.0: call sio_getc.1 // Get character
-sio_flush: call sio_ischar // Check for character
- jnz sio_flush.0 // Till none
- ret // To caller
+sio_flush.0: call sio_getc.1 # Get character
+sio_flush: call sio_ischar # Check for character
+ jnz sio_flush.0 # Till none
+ ret # To caller
* void sio_putc(int c)
-sio_putc: movw $SIO_PRT+0x5,%dx // Line status reg
- xor %ecx,%ecx // Timeout
- movb $0x40,%ch // counter
-sio_putc.1: inb (%dx),%al // Transmitter
- testb $0x20,%al // buffer empty?
- loopz sio_putc.1 // No
- jz sio_putc.2 // If timeout
- movb 0x4(%esp,1),%al // Get character
- subb $0x5,%dl // Transmitter hold reg
- outb %al,(%dx) // Write character
-sio_putc.2: ret $0x4 // To caller
+sio_putc: movw $SIO_PRT+0x5,%dx # Line status reg
+ xor %ecx,%ecx # Timeout
+ movb $0x40,%ch # counter
+sio_putc.1: inb (%dx),%al # Transmitter
+ testb $0x20,%al # buffer empty?
+ loopz sio_putc.1 # No
+ jz sio_putc.2 # If timeout
+ movb 0x4(%esp,1),%al # Get character
+ subb $0x5,%dl # Transmitter hold reg
+ outb %al,(%dx) # Write character
+sio_putc.2: ret $0x4 # To caller
* int sio_getc(void)
-sio_getc: call sio_ischar // Character available?
- jz sio_getc // No
-sio_getc.1: subb $0x5,%dl // Receiver buffer reg
- inb (%dx),%al // Read character
- ret // To caller
+sio_getc: call sio_ischar # Character available?
+ jz sio_getc # No
+sio_getc.1: subb $0x5,%dl # Receiver buffer reg
+ inb (%dx),%al # Read character
+ ret # To caller
* int sio_ischar(void)
-sio_ischar: movw $SIO_PRT+0x5,%dx // Line status register
- xorl %eax,%eax // Zero
- inb (%dx),%al // Received data
- andb $0x1,%al // ready?
- ret // To caller
+sio_ischar: movw $SIO_PRT+0x5,%dx # Line status register
+ xorl %eax,%eax # Zero
+ inb (%dx),%al # Received data
+ andb $0x1,%al # ready?
+ ret # To caller
/*
* Output character AL to the serial console.
*/
-putchr: pusha // Save
- cmpb $10, %al // is it a newline?
- jne putchr.1 // no?, then leave
- push $13 // output a carriage
- call sio_putc // return first
- movb $10, %al // restore %al
-putchr.1: pushl %eax // Push the character
- // onto the stack
- call sio_putc // Output the character
- popa // Restore
- ret // To caller
+putchr: pusha # Save
+ cmpb $10, %al # is it a newline?
+ jne putchr.1 # no?, then leave
+ push $13 # output a carriage
+ call sio_putc # return first
+ movb $10, %al # restore %al
+putchr.1: pushl %eax # Push the character
+ # onto the stack
+ call sio_putc # Output the character
+ popa # Restore
+ ret # To caller
#else
/*
* Output character AL to the console.
*/
-putchr: pusha // Save
- xorl %ecx,%ecx // Zero for loops
- movb $SCR_MAT,%ah // Mode/attribute
- movl $BDA_POS,%ebx // BDA pointer
- movw (%ebx),%dx // Cursor position
- movl $0xb8000,%edi // Regen buffer (color)
- cmpb %ah,BDA_SCR-BDA_POS(%ebx) // Mono mode?
- jne putchr.1 // No
- xorw %di,%di // Regen buffer (mono)
-putchr.1: cmpb $0xa,%al // New line?
- je putchr.2 // Yes
- xchgl %eax,%ecx // Save char
- movb $SCR_COL,%al // Columns per row
- mulb %dh // * row position
- addb %dl,%al // + column
- adcb $0x0,%ah // position
- shll %eax // * 2
- xchgl %eax,%ecx // Swap char, offset
- movw %ax,(%edi,%ecx,1) // Write attr:char
- incl %edx // Bump cursor
- cmpb $SCR_COL,%dl // Beyond row?
- jb putchr.3 // No
-putchr.2: xorb %dl,%dl // Zero column
- incb %dh // Bump row
-putchr.3: cmpb $SCR_ROW,%dh // Beyond screen?
- jb putchr.4 // No
- leal 2*SCR_COL(%edi),%esi // New top line
- movw $(SCR_ROW-1)*SCR_COL/2,%cx // Words to move
- rep // Scroll
- movsl // screen
- movb $0x20,%al // Space
- movb $SCR_COL,%cl // Columns to clear
- rep // Clear
- stosw // line
- movb $SCR_ROW-1,%dh // Bottom line
-putchr.4: movw %dx,(%ebx) // Update position
- popa // Restore
- ret // To caller
+putchr: pusha # Save
+ xorl %ecx,%ecx # Zero for loops
+ movb $SCR_MAT,%ah # Mode/attribute
+ movl $BDA_POS,%ebx # BDA pointer
+ movw (%ebx),%dx # Cursor position
+ movl $0xb8000,%edi # Regen buffer (color)
+ cmpb %ah,BDA_SCR-BDA_POS(%ebx) # Mono mode?
+ jne putchr.1 # No
+ xorw %di,%di # Regen buffer (mono)
+putchr.1: cmpb $0xa,%al # New line?
+ je putchr.2 # Yes
+ xchgl %eax,%ecx # Save char
+ movb $SCR_COL,%al # Columns per row
+ mulb %dh # * row position
+ addb %dl,%al # + column
+ adcb $0x0,%ah # position
+ shll %eax # * 2
+ xchgl %eax,%ecx # Swap char, offset
+ movw %ax,(%edi,%ecx,1) # Write attr:char
+ incl %edx # Bump cursor
+ cmpb $SCR_COL,%dl # Beyond row?
+ jb putchr.3 # No
+putchr.2: xorb %dl,%dl # Zero column
+ incb %dh # Bump row
+putchr.3: cmpb $SCR_ROW,%dh # Beyond screen?
+ jb putchr.4 # No
+ leal 2*SCR_COL(%edi),%esi # New top line
+ movw $(SCR_ROW-1)*SCR_COL/2,%cx # Words to move
+ rep # Scroll
+ movsl # screen
+ movb $0x20,%al # Space
+ movb $SCR_COL,%cl # Columns to clear
+ rep # Clear
+ stosw # line
+ movb $SCR_ROW-1,%dh # Bottom line
+putchr.4: movw %dx,(%ebx) # Update position
+ popa # Restore
+ ret # To caller
#endif
.p2align 4
/*
* Global descriptor table.
*/
-gdt: .word 0x0,0x0,0x0,0x0 // Null entry
- .word 0xffff,0x0,0x9a00,0xcf // SEL_SCODE
- .word 0xffff,0x0,0x9200,0xcf // SEL_SDATA
- .word 0xffff,0x0,0x9a00,0x0 // SEL_RCODE
- .word 0xffff,0x0,0x9200,0x0 // SEL_RDATA
- .word 0xffff,MEM_USR,0xfa00,0xcf// SEL_UCODE
- .word 0xffff,MEM_USR,0xf200,0xcf// SEL_UDATA
- .word _TSSLM,MEM_TSS,0x8900,0x0 // SEL_TSS
+gdt: .word 0x0,0x0,0x0,0x0 # Null entry
+ .word 0xffff,0x0,0x9a00,0xcf # SEL_SCODE
+ .word 0xffff,0x0,0x9200,0xcf # SEL_SDATA
+ .word 0xffff,0x0,0x9a00,0x0 # SEL_RCODE
+ .word 0xffff,0x0,0x9200,0x0 # SEL_RDATA
+ .word 0xffff,MEM_USR,0xfa00,0xcf# SEL_UCODE
+ .word 0xffff,MEM_USR,0xf200,0xcf# SEL_UDATA
+ .word _TSSLM,MEM_TSS,0x8900,0x0 # SEL_TSS
gdt.1:
/*
* Pseudo-descriptors.
*/
-gdtdesc: .word gdt.1-gdt-1,gdt,0x0 // GDT
-idtdesc: .word _IDTLM,MEM_IDT,0x0 // IDT
-ivtdesc: .word 0x400-0x0-1,0x0,0x0 // IVT
+gdtdesc: .word gdt.1-gdt-1,gdt,0x0 # GDT
+idtdesc: .word _IDTLM,MEM_IDT,0x0 # IDT
+ivtdesc: .word 0x400-0x0-1,0x0,0x0 # IVT
/*
* IDT construction control string.
*/
-idtctl: .byte 0x10, 0x8e // Int 0x0-0xf
- .word 0x7dfb,intx00 // (exceptions)
- .byte 0x10, 0x8e // Int 0x10
- .word 0x1, intx10 // (exception)
- .byte 0x10, 0x8e // Int 0x20-0x2f
- .word 0xffff,intx20 // (hardware)
- .byte 0x1, 0xee // int 0x30
- .word 0x1, intx30 // (system call)
- .byte 0x2, 0xee // Int 0x31-0x32
- .word 0x1, intx31 // (V86, null)
- .byte 0x0 // End of string
+idtctl: .byte 0x10, 0x8e # Int 0x0-0xf
+ .word 0x7dfb,intx00 # (exceptions)
+ .byte 0x10, 0x8e # Int 0x10
+ .word 0x1, intx10 # (exception)
+ .byte 0x10, 0x8e # Int 0x20-0x2f
+ .word 0xffff,intx20 # (hardware)
+ .byte 0x1, 0xee # int 0x30
+ .word 0x1, intx30 # (system call)
+ .byte 0x2, 0xee # Int 0x31-0x32
+ .word 0x1, intx31 # (V86, null)
+ .byte 0x0 # End of string
/*
* Dump format string.
*/
-dmpfmt: .byte '\n' // "\n"
- .ascii "int" // "int="
- .byte 0x80|DMP_X32, 0x40 // "00000000 "
- .ascii "err" // "err="
- .byte 0x80|DMP_X32, 0x44 // "00000000 "
- .ascii "efl" // "efl="
- .byte 0x80|DMP_X32, 0x50 // "00000000 "
- .ascii "eip" // "eip="
- .byte 0x80|DMP_X32|DMP_EOL,0x48 // "00000000\n"
- .ascii "eax" // "eax="
- .byte 0x80|DMP_X32, 0x34 // "00000000 "
- .ascii "ebx" // "ebx="
- .byte 0x80|DMP_X32, 0x28 // "00000000 "
- .ascii "ecx" // "ecx="
- .byte 0x80|DMP_X32, 0x30 // "00000000 "
- .ascii "edx" // "edx="
- .byte 0x80|DMP_X32|DMP_EOL,0x2c // "00000000\n"
- .ascii "esi" // "esi="
- .byte 0x80|DMP_X32, 0x1c // "00000000 "
- .ascii "edi" // "edi="
- .byte 0x80|DMP_X32, 0x18 // "00000000 "
- .ascii "ebp" // "ebp="
- .byte 0x80|DMP_X32, 0x20 // "00000000 "
- .ascii "esp" // "esp="
- .byte 0x80|DMP_X32|DMP_EOL,0x0 // "00000000\n"
- .ascii "cs" // "cs="
- .byte 0x80|DMP_X16, 0x4c // "0000 "
- .ascii "ds" // "ds="
- .byte 0x80|DMP_X16, 0xc // "0000 "
- .ascii "es" // "es="
- .byte 0x80|DMP_X16, 0x8 // "0000 "
- .ascii " " // " "
- .ascii "fs" // "fs="
- .byte 0x80|DMP_X16, 0x10 // "0000 "
- .ascii "gs" // "gs="
- .byte 0x80|DMP_X16, 0x14 // "0000 "
- .ascii "ss" // "ss="
- .byte 0x80|DMP_X16|DMP_EOL,0x4 // "0000\n"
- .ascii "cs:eip" // "cs:eip="
- .byte 0x80|DMP_MEM|DMP_EOL,0x48 // "00 00 ... 00 00\n"
- .ascii "ss:esp" // "ss:esp="
- .byte 0x80|DMP_MEM|DMP_EOL,0x0 // "00 00 ... 00 00\n"
- .asciz "BTX halted\n" // End
+dmpfmt: .byte '\n' # "\n"
+ .ascii "int" # "int="
+ .byte 0x80|DMP_X32, 0x40 # "00000000 "
+ .ascii "err" # "err="
+ .byte 0x80|DMP_X32, 0x44 # "00000000 "
+ .ascii "efl" # "efl="
+ .byte 0x80|DMP_X32, 0x50 # "00000000 "
+ .ascii "eip" # "eip="
+ .byte 0x80|DMP_X32|DMP_EOL,0x48 # "00000000\n"
+ .ascii "eax" # "eax="
+ .byte 0x80|DMP_X32, 0x34 # "00000000 "
+ .ascii "ebx" # "ebx="
+ .byte 0x80|DMP_X32, 0x28 # "00000000 "
+ .ascii "ecx" # "ecx="
+ .byte 0x80|DMP_X32, 0x30 # "00000000 "
+ .ascii "edx" # "edx="
+ .byte 0x80|DMP_X32|DMP_EOL,0x2c # "00000000\n"
+ .ascii "esi" # "esi="
+ .byte 0x80|DMP_X32, 0x1c # "00000000 "
+ .ascii "edi" # "edi="
+ .byte 0x80|DMP_X32, 0x18 # "00000000 "
+ .ascii "ebp" # "ebp="
+ .byte 0x80|DMP_X32, 0x20 # "00000000 "
+ .ascii "esp" # "esp="
+ .byte 0x80|DMP_X32|DMP_EOL,0x0 # "00000000\n"
+ .ascii "cs" # "cs="
+ .byte 0x80|DMP_X16, 0x4c # "0000 "
+ .ascii "ds" # "ds="
+ .byte 0x80|DMP_X16, 0xc # "0000 "
+ .ascii "es" # "es="
+ .byte 0x80|DMP_X16, 0x8 # "0000 "
+ .ascii " " # " "
+ .ascii "fs" # "fs="
+ .byte 0x80|DMP_X16, 0x10 # "0000 "
+ .ascii "gs" # "gs="
+ .byte 0x80|DMP_X16, 0x14 # "0000 "
+ .ascii "ss" # "ss="
+ .byte 0x80|DMP_X16|DMP_EOL,0x4 # "0000\n"
+ .ascii "cs:eip" # "cs:eip="
+ .byte 0x80|DMP_MEM|DMP_EOL,0x48 # "00 00 ... 00 00\n"
+ .ascii "ss:esp" # "ss:esp="
+ .byte 0x80|DMP_MEM|DMP_EOL,0x0 # "00 00 ... 00 00\n"
+ .asciz "BTX halted\n" # End
/*
* End of BTX memory.
*/