1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-06-03 07:29:37 +00:00
kickc/src/test/ref/examples/c64/irq/irq-hyperscreen.log
2024-01-02 19:21:16 +01:00

654 lines
28 KiB
Plaintext

Resolved forward reference irq_bottom_1 to __interrupt(hardware_clobber) void irq_bottom_1()
Resolved forward reference irq_bottom_2 to __interrupt(hardware_clobber) void irq_bottom_2()
Inlined call vicSelectGfxBank::$0 = call toDd00(vicSelectGfxBank::gfx)
CONTROL FLOW GRAPH SSA
void main()
main: scope:[main] from __start
*GHOST_BYTE = 0
asm { sei }
*((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL
*((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) & $7f
*((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fa
*((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_ENABLE) = IRQ_RASTER
*HARDWARE_IRQ = &irq_bottom_1
*PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
*PROCPORT = PROCPORT_RAM_IO
asm { cli }
to:main::@1
main::@1: scope:[main] from main main::@1
to:main::@1
main::@return: scope:[main] from
return
to:@return
__interrupt(hardware_clobber) void irq_bottom_1()
irq_bottom_1: scope:[irq_bottom_1] from
*((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = WHITE
*((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) & $ff^VICII_RSEL
*((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS) = IRQ_RASTER
*((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fd
*HARDWARE_IRQ = &irq_bottom_2
*((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = RED
to:irq_bottom_1::@return
irq_bottom_1::@return: scope:[irq_bottom_1] from irq_bottom_1
return
to:@return
__interrupt(hardware_clobber) void irq_bottom_2()
irq_bottom_2: scope:[irq_bottom_2] from
*((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = WHITE
*((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_RSEL
*((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS) = IRQ_RASTER
*((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fa
*HARDWARE_IRQ = &irq_bottom_1
*((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = RED
to:irq_bottom_2::@return
irq_bottom_2::@return: scope:[irq_bottom_2] from irq_bottom_2
return
to:@return
void __start()
__start: scope:[__start] from
call main
to:__start::@1
__start::@1: scope:[__start] from __start
to:__start::@return
__start::@return: scope:[__start] from __start::@1
return
to:@return
SYMBOL TABLE SSA
__constant struct MOS6526_CIA * const CIA1 = (struct MOS6526_CIA *)$dc00
__constant const char CIA_INTERRUPT_CLEAR_ALL = $7f
__constant char * const GHOST_BYTE = (char *)$3fff
__constant void (** const HARDWARE_IRQ)() = (void (**)())$fffe
__constant const char IRQ_RASTER = 1
__constant char OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d
__constant char OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR = $20
__constant char OFFSET_STRUCT_MOS6569_VICII_CONTROL1 = $11
__constant char OFFSET_STRUCT_MOS6569_VICII_IRQ_ENABLE = $1a
__constant char OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS = $19
__constant char OFFSET_STRUCT_MOS6569_VICII_RASTER = $12
__constant char * const PROCPORT = (char *)1
__constant char * const PROCPORT_DDR = (char *)0
__constant const char PROCPORT_DDR_MEMORY_MASK = 7
__constant const char PROCPORT_RAM_IO = 5
__constant const char RED = 2
__constant struct MOS6569_VICII * const VICII = (struct MOS6569_VICII *)$d000
__constant const char VICII_RSEL = 8
__constant const char WHITE = 1
void __start()
__interrupt(hardware_clobber) void irq_bottom_1()
__interrupt(hardware_clobber) void irq_bottom_2()
void main()
Adding number conversion cast (unumber) 0 in *GHOST_BYTE = 0
Adding number conversion cast (unumber) $7f in *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) & $7f
Adding number conversion cast (unumber) $fa in *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fa
Adding number conversion cast (unumber) $ff^VICII_RSEL in *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) & $ff^VICII_RSEL
Adding number conversion cast (unumber) $ff in *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) & (unumber)$ff^VICII_RSEL
Adding number conversion cast (unumber) $fd in *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fd
Adding number conversion cast (unumber) $fa in *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fa
Successful SSA optimization PassNAddNumberTypeConversions
Inlining cast *GHOST_BYTE = (unumber)0
Inlining cast *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = (unumber)$fa
Inlining cast *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = (unumber)$fd
Inlining cast *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = (unumber)$fa
Successful SSA optimization Pass2InlineCast
Simplifying constant pointer cast (char *) 0
Simplifying constant pointer cast (char *) 1
Simplifying constant pointer cast (struct MOS6569_VICII *) 53248
Simplifying constant pointer cast (struct MOS6526_CIA *) 56320
Simplifying constant pointer cast (void (**)()) 65534
Simplifying constant pointer cast (char *) 16383
Simplifying constant integer cast 0
Simplifying constant integer cast $7f
Simplifying constant integer cast $fa
Simplifying constant integer cast (unumber)$ff^VICII_RSEL
Simplifying constant integer cast $ff
Simplifying constant integer cast $fd
Simplifying constant integer cast $fa
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) $7f
Finalized unsigned number type (char) $fa
Finalized unsigned number type (char) $ff
Finalized unsigned number type (char) $fd
Finalized unsigned number type (char) $fa
Successful SSA optimization PassNFinalizeNumberTypeConversions
Removing unused block main::@return
Successful SSA optimization Pass2EliminateUnusedBlocks
Removing unused procedure __start
Removing unused procedure block __start
Removing unused procedure block __start::@1
Removing unused procedure block __start::@return
Successful SSA optimization PassNEliminateEmptyStart
Adding NOP phi() at start of main::@1
CALL GRAPH
Created 0 initial phi equivalence classes
Coalesced down to 0 phi equivalence classes
Adding NOP phi() at start of main::@1
FINAL CONTROL FLOW GRAPH
__interrupt(hardware_clobber) void irq_bottom_2()
irq_bottom_2: scope:[irq_bottom_2] from
[0] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = WHITE
[1] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_RSEL
[2] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS) = IRQ_RASTER
[3] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fa
[4] *HARDWARE_IRQ = &irq_bottom_1
[5] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = RED
to:irq_bottom_2::@return
irq_bottom_2::@return: scope:[irq_bottom_2] from irq_bottom_2
[6] return
to:@return
__interrupt(hardware_clobber) void irq_bottom_1()
irq_bottom_1: scope:[irq_bottom_1] from
[7] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = WHITE
[8] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) & $ff^VICII_RSEL
[9] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS) = IRQ_RASTER
[10] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fd
[11] *HARDWARE_IRQ = &irq_bottom_2
[12] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = RED
to:irq_bottom_1::@return
irq_bottom_1::@return: scope:[irq_bottom_1] from irq_bottom_1
[13] return
to:@return
void main()
main: scope:[main] from
[14] *GHOST_BYTE = 0
asm { sei }
[16] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL
[17] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) & $7f
[18] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fa
[19] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_ENABLE) = IRQ_RASTER
[20] *HARDWARE_IRQ = &irq_bottom_1
[21] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
[22] *PROCPORT = PROCPORT_RAM_IO
asm { cli }
to:main::@1
main::@1: scope:[main] from main main::@1
[24] phi()
to:main::@1
VARIABLE REGISTER WEIGHTS
__interrupt(hardware_clobber) void irq_bottom_1()
__interrupt(hardware_clobber) void irq_bottom_2()
void main()
Initial phi equivalence classes
Complete equivalence classes
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [0] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = WHITE [ ] ( [ ] { } ) always clobbers reg byte a
Statement [1] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_RSEL [ ] ( [ ] { } ) always clobbers reg byte a
Statement [2] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS) = IRQ_RASTER [ ] ( [ ] { } ) always clobbers reg byte a
Statement [3] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fa [ ] ( [ ] { } ) always clobbers reg byte a
Statement [4] *HARDWARE_IRQ = &irq_bottom_1 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [5] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = RED [ ] ( [ ] { } ) always clobbers reg byte a
Statement [6] return [ ] ( [ ] { } ) always clobbers reg byte a reg byte x reg byte y
Statement [7] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = WHITE [ ] ( [ ] { } ) always clobbers reg byte a
Statement [8] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) & $ff^VICII_RSEL [ ] ( [ ] { } ) always clobbers reg byte a
Statement [9] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS) = IRQ_RASTER [ ] ( [ ] { } ) always clobbers reg byte a
Statement [10] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fd [ ] ( [ ] { } ) always clobbers reg byte a
Statement [11] *HARDWARE_IRQ = &irq_bottom_2 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [12] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = RED [ ] ( [ ] { } ) always clobbers reg byte a
Statement [13] return [ ] ( [ ] { } ) always clobbers reg byte a reg byte x reg byte y
Statement [14] *GHOST_BYTE = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [16] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL [ ] ( [ ] { } ) always clobbers reg byte a
Statement [17] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) & $7f [ ] ( [ ] { } ) always clobbers reg byte a
Statement [18] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fa [ ] ( [ ] { } ) always clobbers reg byte a
Statement [19] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_ENABLE) = IRQ_RASTER [ ] ( [ ] { } ) always clobbers reg byte a
Statement [20] *HARDWARE_IRQ = &irq_bottom_1 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [21] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( [ ] { } ) always clobbers reg byte a
Statement [22] *PROCPORT = PROCPORT_RAM_IO [ ] ( [ ] { } ) always clobbers reg byte a
REGISTER UPLIFT SCOPES
Uplift Scope [MOS6526_CIA]
Uplift Scope [MOS6569_VICII]
Uplift Scope [MOS6581_SID]
Uplift Scope [main]
Uplift Scope [irq_bottom_1]
Uplift Scope [irq_bottom_2]
Uplift Scope []
Uplifting [MOS6526_CIA] best 698 combination
Uplifting [MOS6569_VICII] best 698 combination
Uplifting [MOS6581_SID] best 698 combination
Uplifting [main] best 698 combination
Uplifting [irq_bottom_1] best 698 combination
Uplifting [irq_bottom_2] best 698 combination
Uplifting [] best 698 combination
Interrupt procedure irq_bottom_1 clobbers AnzP
Interrupt procedure irq_bottom_2 clobbers AnzP
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
// A raster IRQ that opens the top/bottom border.
/// @file
/// Commodore 64 Registers and Constants
/// @file
/// The MOS 6526 Complex Interface Adapter (CIA)
///
/// http://archive.6502.org/datasheets/mos_6526_cia_recreated.pdf
// Upstart
// Commodore 64 PRG executable file
.file [name="irq-hyperscreen.prg", type="prg", segments="Program"]
.segmentdef Program [segments="Basic, Code, Data"]
.segmentdef Basic [start=$0801]
.segmentdef Code [start=$80d]
.segmentdef Data [startAfter="Code"]
.segment Basic
:BasicUpstart(main)
// Global Constants & labels
/// Value that disables all CIA interrupts when stored to the CIA Interrupt registers
.const CIA_INTERRUPT_CLEAR_ALL = $7f
/// $D011 Control Register #1 Bit#3: RSEL Switch betweem 25 or 24 visible rows
/// RSEL| Display window height | First line | Last line
/// ----+--------------------------+-------------+----------
/// 0 | 24 text lines/192 pixels | 55 ($37) | 246 ($f6)
/// 1 | 25 text lines/200 pixels | 51 ($33) | 250 ($fa)
.const VICII_RSEL = 8
/// VICII IRQ Status/Enable Raster
// @see #IRQ_ENABLE #IRQ_STATUS
/// 0 | RST| Reaching a certain raster line. The line is specified by writing
/// | | to register 0xd012 and bit 7 of $d011 and internally stored by
/// | | the VIC for the raster compare. The test for reaching the
/// | | interrupt raster line is done in cycle 0 of every line (for line
/// | | 0, in cycle 1).
.const IRQ_RASTER = 1
/// Mask for PROCESSOR_PORT_DDR which allows only memory configuration to be written
.const PROCPORT_DDR_MEMORY_MASK = 7
/// RAM in 0xA000, 0xE000 I/O in 0xD000
.const PROCPORT_RAM_IO = 5
.const WHITE = 1
.const RED = 2
.const OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d
.const OFFSET_STRUCT_MOS6569_VICII_CONTROL1 = $11
.const OFFSET_STRUCT_MOS6569_VICII_RASTER = $12
.const OFFSET_STRUCT_MOS6569_VICII_IRQ_ENABLE = $1a
.const OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR = $20
.const OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS = $19
/// Processor port data direction register
.label PROCPORT_DDR = 0
/// Processor Port Register controlling RAM/ROM configuration and the datasette
.label PROCPORT = 1
/// The VIC-II MOS 6567/6569
.label VICII = $d000
/// The CIA#1: keyboard matrix, joystick #1/#2
.label CIA1 = $dc00
/// The vector used when the HARDWARE serves IRQ interrupts
.label HARDWARE_IRQ = $fffe
.label GHOST_BYTE = $3fff
.segment Code
// irq_bottom_2
// Interrupt Routine 2
irq_bottom_2: {
// interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry
sta rega+1
// [0] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = WHITE -- _deref_pbuc1=vbuc2
lda #WHITE
sta VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR
// [1] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_RSEL -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2
// Set screen height back to 25 lines (preparing for the next screen)
lda #VICII_RSEL
ora VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
// [2] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS) = IRQ_RASTER -- _deref_pbuc1=vbuc2
// Acknowledge the IRQ
lda #IRQ_RASTER
sta VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS
// [3] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fa -- _deref_pbuc1=vbuc2
// Trigger IRQ 1 at line 0xfa
lda #$fa
sta VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER
// [4] *HARDWARE_IRQ = &irq_bottom_1 -- _deref_qprc1=pprc2
lda #<irq_bottom_1
sta HARDWARE_IRQ
lda #>irq_bottom_1
sta HARDWARE_IRQ+1
// [5] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = RED -- _deref_pbuc1=vbuc2
lda #RED
sta VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR
jmp __breturn
// irq_bottom_2::@return
__breturn:
// [6] return
// interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit
rega:
lda #0
rti
}
// irq_bottom_1
// Interrupt Routine 1
irq_bottom_1: {
// interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry
sta rega+1
// [7] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = WHITE -- _deref_pbuc1=vbuc2
lda #WHITE
sta VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR
// [8] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) & $ff^VICII_RSEL -- _deref_pbuc1=_deref_pbuc1_band_vbuc2
// Set screen height to 24 lines - this is done after the border should have started drawing - so it wont start
lda #$ff^VICII_RSEL
and VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
// [9] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS) = IRQ_RASTER -- _deref_pbuc1=vbuc2
// Acknowledge the IRQ
lda #IRQ_RASTER
sta VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS
// [10] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fd -- _deref_pbuc1=vbuc2
// Trigger IRQ 2 at line 0xfd
lda #$fd
sta VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER
// [11] *HARDWARE_IRQ = &irq_bottom_2 -- _deref_qprc1=pprc2
lda #<irq_bottom_2
sta HARDWARE_IRQ
lda #>irq_bottom_2
sta HARDWARE_IRQ+1
// [12] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = RED -- _deref_pbuc1=vbuc2
lda #RED
sta VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR
jmp __breturn
// irq_bottom_1::@return
__breturn:
// [13] return
// interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit
rega:
lda #0
rti
}
// main
main: {
// [14] *GHOST_BYTE = 0 -- _deref_pbuc1=vbuc2
lda #0
sta GHOST_BYTE
// asm { sei }
sei
// [16] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL -- _deref_pbuc1=vbuc2
// Disable CIA 1 Timer IRQ
lda #CIA_INTERRUPT_CLEAR_ALL
sta CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT
// [17] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) & $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2
// Set raster line to 0xfa
lda #$7f
and VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
// [18] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fa -- _deref_pbuc1=vbuc2
lda #$fa
sta VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER
// [19] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_ENABLE) = IRQ_RASTER -- _deref_pbuc1=vbuc2
// Enable Raster Interrupt
lda #IRQ_RASTER
sta VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_ENABLE
// [20] *HARDWARE_IRQ = &irq_bottom_1 -- _deref_qprc1=pprc2
// Set the IRQ routine
lda #<irq_bottom_1
sta HARDWARE_IRQ
lda #>irq_bottom_1
sta HARDWARE_IRQ+1
// [21] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2
// no kernal or BASIC rom visible
lda #PROCPORT_DDR_MEMORY_MASK
sta.z PROCPORT_DDR
// [22] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2
lda #PROCPORT_RAM_IO
sta.z PROCPORT
// asm { cli }
cli
// [24] phi from main main::@1 to main::@1 [phi:main/main::@1->main::@1]
__b1_from_main:
__b1_from___b1:
jmp __b1
// main::@1
__b1:
jmp __b1_from___b1
}
// File Data
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __breturn
Removing instruction jmp __breturn
Removing instruction jmp __b1
Succesful ASM optimization Pass5NextJumpElimination
Replacing label __b1_from___b1 with __b1
Removing instruction __breturn:
Removing instruction __breturn:
Removing instruction __b1_from_main:
Removing instruction __b1_from___b1:
Succesful ASM optimization Pass5RedundantLabelElimination
FINAL SYMBOL TABLE
__constant struct MOS6526_CIA * const CIA1 = (struct MOS6526_CIA *) 56320
__constant const char CIA_INTERRUPT_CLEAR_ALL = $7f
__constant char * const GHOST_BYTE = (char *) 16383
__constant void (** const HARDWARE_IRQ)() = (void (**)()) 65534
__constant const char IRQ_RASTER = 1
__constant char OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d
__constant char OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR = $20
__constant char OFFSET_STRUCT_MOS6569_VICII_CONTROL1 = $11
__constant char OFFSET_STRUCT_MOS6569_VICII_IRQ_ENABLE = $1a
__constant char OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS = $19
__constant char OFFSET_STRUCT_MOS6569_VICII_RASTER = $12
__constant char * const PROCPORT = (char *) 1
__constant char * const PROCPORT_DDR = (char *) 0
__constant const char PROCPORT_DDR_MEMORY_MASK = 7
__constant const char PROCPORT_RAM_IO = 5
__constant const char RED = 2
__constant struct MOS6569_VICII * const VICII = (struct MOS6569_VICII *) 53248
__constant const char VICII_RSEL = 8
__constant const char WHITE = 1
__interrupt(hardware_clobber) void irq_bottom_1()
__interrupt(hardware_clobber) void irq_bottom_2()
void main()
FINAL ASSEMBLER
Score: 422
// File Comments
// A raster IRQ that opens the top/bottom border.
/// @file
/// Commodore 64 Registers and Constants
/// @file
/// The MOS 6526 Complex Interface Adapter (CIA)
///
/// http://archive.6502.org/datasheets/mos_6526_cia_recreated.pdf
// Upstart
// Commodore 64 PRG executable file
.file [name="irq-hyperscreen.prg", type="prg", segments="Program"]
.segmentdef Program [segments="Basic, Code, Data"]
.segmentdef Basic [start=$0801]
.segmentdef Code [start=$80d]
.segmentdef Data [startAfter="Code"]
.segment Basic
:BasicUpstart(main)
// Global Constants & labels
/// Value that disables all CIA interrupts when stored to the CIA Interrupt registers
.const CIA_INTERRUPT_CLEAR_ALL = $7f
/// $D011 Control Register #1 Bit#3: RSEL Switch betweem 25 or 24 visible rows
/// RSEL| Display window height | First line | Last line
/// ----+--------------------------+-------------+----------
/// 0 | 24 text lines/192 pixels | 55 ($37) | 246 ($f6)
/// 1 | 25 text lines/200 pixels | 51 ($33) | 250 ($fa)
.const VICII_RSEL = 8
/// VICII IRQ Status/Enable Raster
// @see #IRQ_ENABLE #IRQ_STATUS
/// 0 | RST| Reaching a certain raster line. The line is specified by writing
/// | | to register 0xd012 and bit 7 of $d011 and internally stored by
/// | | the VIC for the raster compare. The test for reaching the
/// | | interrupt raster line is done in cycle 0 of every line (for line
/// | | 0, in cycle 1).
.const IRQ_RASTER = 1
/// Mask for PROCESSOR_PORT_DDR which allows only memory configuration to be written
.const PROCPORT_DDR_MEMORY_MASK = 7
/// RAM in 0xA000, 0xE000 I/O in 0xD000
.const PROCPORT_RAM_IO = 5
.const WHITE = 1
.const RED = 2
.const OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d
.const OFFSET_STRUCT_MOS6569_VICII_CONTROL1 = $11
.const OFFSET_STRUCT_MOS6569_VICII_RASTER = $12
.const OFFSET_STRUCT_MOS6569_VICII_IRQ_ENABLE = $1a
.const OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR = $20
.const OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS = $19
/// Processor port data direction register
.label PROCPORT_DDR = 0
/// Processor Port Register controlling RAM/ROM configuration and the datasette
.label PROCPORT = 1
/// The VIC-II MOS 6567/6569
.label VICII = $d000
/// The CIA#1: keyboard matrix, joystick #1/#2
.label CIA1 = $dc00
/// The vector used when the HARDWARE serves IRQ interrupts
.label HARDWARE_IRQ = $fffe
.label GHOST_BYTE = $3fff
.segment Code
// irq_bottom_2
// Interrupt Routine 2
irq_bottom_2: {
// interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry
sta rega+1
// VICII->BORDER_COLOR = WHITE
// [0] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = WHITE -- _deref_pbuc1=vbuc2
lda #WHITE
sta VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR
// VICII->CONTROL1 |= VICII_RSEL
// [1] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_RSEL -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2
// Set screen height back to 25 lines (preparing for the next screen)
lda #VICII_RSEL
ora VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
// VICII->IRQ_STATUS = IRQ_RASTER
// [2] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS) = IRQ_RASTER -- _deref_pbuc1=vbuc2
// Acknowledge the IRQ
lda #IRQ_RASTER
sta VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS
// VICII->RASTER = 0xfa
// [3] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fa -- _deref_pbuc1=vbuc2
// Trigger IRQ 1 at line 0xfa
lda #$fa
sta VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER
// *HARDWARE_IRQ = &irq_bottom_1
// [4] *HARDWARE_IRQ = &irq_bottom_1 -- _deref_qprc1=pprc2
lda #<irq_bottom_1
sta HARDWARE_IRQ
lda #>irq_bottom_1
sta HARDWARE_IRQ+1
// VICII->BORDER_COLOR = RED
// [5] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = RED -- _deref_pbuc1=vbuc2
lda #RED
sta VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR
// irq_bottom_2::@return
// }
// [6] return
// interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit
rega:
lda #0
rti
}
// irq_bottom_1
// Interrupt Routine 1
irq_bottom_1: {
// interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry
sta rega+1
// VICII->BORDER_COLOR = WHITE
// [7] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = WHITE -- _deref_pbuc1=vbuc2
lda #WHITE
sta VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR
// VICII->CONTROL1 &= (0xff^VICII_RSEL)
// [8] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) & $ff^VICII_RSEL -- _deref_pbuc1=_deref_pbuc1_band_vbuc2
// Set screen height to 24 lines - this is done after the border should have started drawing - so it wont start
lda #$ff^VICII_RSEL
and VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
// VICII->IRQ_STATUS = IRQ_RASTER
// [9] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS) = IRQ_RASTER -- _deref_pbuc1=vbuc2
// Acknowledge the IRQ
lda #IRQ_RASTER
sta VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS
// VICII->RASTER = 0xfd
// [10] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fd -- _deref_pbuc1=vbuc2
// Trigger IRQ 2 at line 0xfd
lda #$fd
sta VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER
// *HARDWARE_IRQ = &irq_bottom_2
// [11] *HARDWARE_IRQ = &irq_bottom_2 -- _deref_qprc1=pprc2
lda #<irq_bottom_2
sta HARDWARE_IRQ
lda #>irq_bottom_2
sta HARDWARE_IRQ+1
// VICII->BORDER_COLOR = RED
// [12] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = RED -- _deref_pbuc1=vbuc2
lda #RED
sta VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR
// irq_bottom_1::@return
// }
// [13] return
// interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit
rega:
lda #0
rti
}
// main
main: {
// *GHOST_BYTE = 0
// [14] *GHOST_BYTE = 0 -- _deref_pbuc1=vbuc2
lda #0
sta GHOST_BYTE
// asm
// asm { sei }
sei
// CIA1->INTERRUPT = CIA_INTERRUPT_CLEAR_ALL
// [16] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL -- _deref_pbuc1=vbuc2
// Disable CIA 1 Timer IRQ
lda #CIA_INTERRUPT_CLEAR_ALL
sta CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT
// VICII->CONTROL1 &= 0x7f
// [17] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) & $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2
// Set raster line to 0xfa
lda #$7f
and VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
// VICII->RASTER = 0xfa
// [18] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) = $fa -- _deref_pbuc1=vbuc2
lda #$fa
sta VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER
// VICII->IRQ_ENABLE = IRQ_RASTER
// [19] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_ENABLE) = IRQ_RASTER -- _deref_pbuc1=vbuc2
// Enable Raster Interrupt
lda #IRQ_RASTER
sta VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_ENABLE
// *HARDWARE_IRQ = &irq_bottom_1
// [20] *HARDWARE_IRQ = &irq_bottom_1 -- _deref_qprc1=pprc2
// Set the IRQ routine
lda #<irq_bottom_1
sta HARDWARE_IRQ
lda #>irq_bottom_1
sta HARDWARE_IRQ+1
// *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
// [21] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2
// no kernal or BASIC rom visible
lda #PROCPORT_DDR_MEMORY_MASK
sta.z PROCPORT_DDR
// *PROCPORT = PROCPORT_RAM_IO
// [22] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2
lda #PROCPORT_RAM_IO
sta.z PROCPORT
// asm
// asm { cli }
cli
// [24] phi from main main::@1 to main::@1 [phi:main/main::@1->main::@1]
// main::@1
__b1:
jmp __b1
}
// File Data