1
0
mirror of https://github.com/safiire/n65.git synced 2024-12-22 18:29:36 +00:00

We can now create C like structs using .scope and .space, however, when we load zero page values from the symbol table, they create absolute addressed instructions, so that needs to be fixed

This commit is contained in:
Safiire 2015-03-05 21:55:13 -08:00
parent 17dcd185c8
commit 8e788a19d1
3 changed files with 68 additions and 13 deletions

View File

@ -13,10 +13,18 @@
; Here is a good spot to associate zero page memory addresses
; with quick access variables in the program.
.segment prog 0
.org $0200
sprite:
;;;;
; We can use scope to declare a C like struct at $0200
.org $0200
.scope sprite
.space y 1
.space pattern 1
.space color 1
.space x 1
.
;;;;
; Setup the interrupt vectors
.org $FFFA
@ -135,10 +143,10 @@ sprite:
; initialize Sprite 0
lda #$70
sta $0200 ; sprite Y coordinate
sta sprite.y ; Store sprite y coordinate ;sta $0200 ; sprite Y coordinate
lda #$01
sta $0201 ; sprite + 1 Pattern number
sta $0203 ; sprite + 3 X coordinate, sprite + 2, color, stays 0.
sta sprite.pattern ; sta $0201 ; sprite + 1 Pattern number
sta sprite.x ;sta $0203 ; sprite + 3 X coordinate, sprite + 2, color, stays 0.
; Set initial value of dx
lda #$01
@ -215,7 +223,7 @@ sprite:
update_sprite:
lda #>sprite
sta $4014 ; Jam page $200-$2FF into SPR-RAM
lda $0203 ; sprite+3 Is this right???
lda sprite.x
beq hit_left
cmp #$F7
bne edge_done
@ -233,7 +241,7 @@ hit_left:
edge_done: ; update X and store it.
clc
adc $00 ; dx
sta $0203 ; sprite+3 Is this right?
sta sprite.x
rts
react_to_input:
@ -259,21 +267,21 @@ react_to_input:
lda $4016 ; Up
and #$01
beq not_up
ldx sprite ; Load Y value
ldx sprite.y ; Load Y value
cpx #$07
beq not_up ; No going past the top of the screen
beq not_up ; No going past the top of the screen
dex
stx sprite
stx sprite.y
not_up:
lda $4016 ; Down
and #$01
beq not_dn
ldx sprite
ldx sprite.y
cpx #$DF ; No going past the bottom of the screen.
beq not_dn
inx
stx sprite
stx sprite.y
not_dn:
rts ; Ignore left and right, we don't use 'em

46
lib/directives/space.rb Normal file
View File

@ -0,0 +1,46 @@
require_relative '../instruction_base'
module Assembler6502
####
## This directive gives a symbolic name for memory and creates space for a variable in RAM
class Space < InstructionBase
####
## Try to parse a .space directive
def self.parse(line)
match_data = line.match(/^.space\s+([a-zA-Z]?[a-zA-Z0-9_]+?)\s+([0-9]+)$/)
return nil if match_data.nil?
_, name, size = match_data.to_a
Space.new(name, size.to_i)
end
####
## Initialize some memory space with a name
def initialize(name, size)
@name = name
@size = size
end
####
## .space creates a symbol at the current PC, and then advances PC by size
def exec(assembler)
program_counter = assembler.program_counter
assembler.symbol_table.define_symbol(@name, program_counter)
assembler.program_counter += @size
end
####
## Display
def to_s
".space #{@name} #{@size}"
end
end
end

View File

@ -12,6 +12,7 @@ module Assembler6502
require_relative 'directives/label'
require_relative 'directives/enter_scope'
require_relative 'directives/exit_scope'
require_relative 'directives/space'
####
@ -24,7 +25,7 @@ module Assembler6502
class CannotParse < StandardError; end
Directives = [INESHeader, Org, Segment, IncBin, DW, Bytes, ASCII, EnterScope, ExitScope]
Directives = [INESHeader, Org, Segment, IncBin, DW, Bytes, ASCII, EnterScope, ExitScope, Space]
####
## Parses a line of program source into an object