p6as
p6as is a microcode assembler for Intel P6 architecture processors (Pentium Pro, Pentium II, Pentium III, Pentium M, Core, Core 2), part of p6microcode-tools. It compiles Intel P6 microcode assembly language into 80-bit microinstructions through a two-pass process:
Pass 0: Collect label definitions and store assembly lines
Pass 1: Assemble instructions and resolve labels
argument -h - Show help message and exit
argument -t type - Set CPU type. Valid types: pentiumpro, pentium2, pentium3, pentiumm, core, core2
argument -L label_spec - Add label or load labels from file
Format: LABEL=addr (e.g., -L my_label=0x1234)
Or: @filename to load labels from a file (e.g., -L @labels.lbl)
argument input_file - Assembly file to process. Use '-' for stdin
UROM_XXXX instruction
The address must be in format UROM_ followed by exactly 4 hexadecimal digits.
Labels can be referenced in branch targets and .write_creg_offsets directives.
For more information on assembly syntax, see uops page
Syntax:
.if condition
Arguments:
condition - Must be: 0, 1, false, or true
Example:
Syntax: .ifdef symbol_name
Arguments: symbol_name - Label to check for existence (label must already exist, i.e. be defined from commandline -L argument (or via labelfile), or BEFORE .ifdef
Example:
Syntax:
.else
Example:
Syntax:
.endif
Notes:
Conditional directives can be nested up to 32 levels deep
All .if/.ifdef blocks must be closed with .endif
Conditions affect all subsequent lines including other directives
Syntax:
.org address
Arguments:
address - Hexadecimal (with or without 0x prefix) or decimal value
Note: Using .org when .utripletbits is pending will cause an error.
Syntax:
.utripletbits binary_string
Arguments:
binary_string - String of '0' and '1' characters
Example:
.utripletbits 0101010101010101
Note: This directive must be used at addresses aligned to 4-byte boundaries (address & 3 == 0).
Syntax:
.end
Syntax:
.write_creg register mask value
Arguments:
register - 32-bit register address (decimal or hex with 0x prefix)
mask - 32-bit mask value
value - 32-bit value to write
Example:
.write_creg 0x1B2 0x00000000 0x003E0035
Maximum: 128 .write_creg directives per file
Syntax:
.write_creg_offsets register offset1 offset2
Arguments:
register - 32-bit register address (decimal or hex with 0x prefix)
offset1 - 16-bit offset (numeric value or label reference)
offset2 - 16-bit offset (numeric value or label reference)
Example:
Note: offset1 becomes bits [31:16] and offset2 becomes bits [15:0] of the value field.
Syntax:
.header_ver value
p6as arguments
p6as [-h] [-t type] [-L label_spec] p6as -t pentium3 microcode.asm > output.triad
p6as -L entry_point=0x100 -L @common_labels.lbl code.asm
p6as - < input.asm > output.triad
p6as source code syntax
Comments
p6as supports C-style block comments and line comments that start with #, //, or ;# This is a line comment
// This is also a line comment
; This is also a line comment
/* This is a
block comment */
Address Specification
Instructions can have explicit addresses or use implicit addressing: Implicit Addressing
If no UROM_ prefix is present, the assembler uses the current address counter, which auto-increments. The counter can be set using the .org directive. Labels
Labels are defined with a colon and must contain only alphanumeric characters and underscores:my_label:
instruction
another_label: instruction_on_same_line
p6as directives
All directives start with a dot (.). Conditional Assembly Directives
.if
Start a conditional block based on a boolean condition..if 1
; This code is assembled
.endif
.if 0
; This code is skipped
.endif
.ifdef
Start a conditional block if a label/symbol is defined..ifdef FEATURE_ENABLED
; Code if FEATURE_ENABLED label exists
.endif
.else
Toggle the condition state within a conditional block..if 0
; This is skipped
.else
; This is assembled
.endif
.endif
End a conditional block. .org
Sets the current address for subsequent instructions. .utripletbits
Specifies unknown triplet bits for the current address (must be aligned to address & 3 == 0). .end
Stops further processing of the input file. Useful for placing additional data or comments after the assembly code. Directives passed to p6scrambler / p6patchtool
These directives are passed through unchanged to downstream tools in the processing pipeline. .write_creg
Specifies a CRBUS register write operation. .write_creg_offsets
Similar to .write_creg but for MATCH-PATCH CRBUS registers. The mask field is always zero, and two 16-bit offsets are concatenated into the value field..write_creg_offsets 0x200 0x1000 0x2000
.write_creg_offsets 0x200 start_label end_label
.header_ver
Specifies the header version field. update_rev
Argument: numeric 32-bit value date_bcd
Argument: numeric 32-bit value proc_sig
Argument: numeric 32-bit value checksum
Argument: numeric 32-bit value loader_rev
Argument: numeric 32-bit value proc_flags
Argument: numeric 32-bit value data_size
Argument: numeric 32-bit value total_size
Argument: numeric 32-bit value key_seed
Argument: numeric 32-bit value unknown
Argument: numeric 32-bit value update_rev2
Argument: numeric 32-bit value