From dfb441049742e3ba50e19089d5f2a65fb1547220 Mon Sep 17 00:00:00 2001
From: Safiire <safiire@gmail.com>
Date: Thu, 5 Mar 2015 17:21:51 -0800
Subject: [PATCH] Updated the demo, realized anonymous scopes don't work right
 :(

---
 demo.asm                      | 41 ++++++++++++++++++++---------------
 lib/directives/enter_scope.rb | 14 +++++++++---
 2 files changed, 35 insertions(+), 20 deletions(-)

diff --git a/demo.asm b/demo.asm
index e08b9b3..a86ea3b 100644
--- a/demo.asm
+++ b/demo.asm
@@ -25,10 +25,10 @@ sprite:
 .dw irq
 
 
-.org $C000
 ;;;;
 ;  Here is our code entry point, which we'll call main.
-main:
+.org $C000
+.scope main
   ;  Disable interrupts and decimal flag
   sei
   cld
@@ -74,40 +74,43 @@ main:
   cli
   forever:
     jmp forever
+.
 
 
 ;;;;
 ; Set basic PPU registers.  Load background from $0000,
 ; sprites from $1000, and the name table from $2000.
-init_ppu:
+.scope init_ppu
   lda #$88
   sta $2000
   lda #$1E
   sta $2001
   rts
+.
 
 
 ;;;;
 ;  Initialize all the sprites, palettes, nametables, and scrolling
-init_graphics:
+.scope init_graphics
   jsr init_sprites
   jsr load_palette
   jsr load_name_tables
   jsr init_scrolling
   rts
+.
 
 
 ;;;;
 ;  Initialize the controller input, keeping track of the A button
-init_input:
+.scope init_input
   lda #$00
   sta $01    ; $01 = A button
   rts
+.
 
 ;;;;
 ;  Initialize the APU to known values
-init_sound:
-  ; initialize sound hardware
+.scope init_sound
   lda #$01
   sta $4015
   lda #$00
@@ -115,13 +118,14 @@ init_sound:
   lda #$40
   sta $4017
   rts
+.
 
 
 ;;;;
 ;  Clear page #2, which we'll use to hold sprite data
 ;  This subroutine clearly shows why I need to have symbols
 ;  to refer to bits of RAM in the zero page like dx, etc.
-init_sprites:
+.scope init_sprites
   lda #$00
   ldx #$00
   sprite_clear1:
@@ -140,26 +144,28 @@ init_sprites:
   lda #$01
   sta $00                 ;  dx = $00
   rts
+.
 
 ;;;;
 ;  Load palette into $3F00
-load_palette:
+.scope load_palette
   lda #$3F
   ldx #$00
   sta $2006
   stx $2006
-  loady_loop:
+  loop:
     lda palette, X
     sta $2007
     inx
     cpx #$20
-    bne loady_loop
+    bne loop
   rts
+.
 
 ;;;;
 ; Put the ASCII values from bg into the first name table, at $2400
 ; The tile values are conveniently mapped to their ASCII values
-load_name_tables:
+.scope load_name_tables
   ldy #$00
   ldx #$04
   lda #<bg
@@ -170,14 +176,14 @@ load_name_tables:
   sta $2006
   lda #$00
   sta $2006
-  go_back:
+  loop:
     lda ($10), Y
     sta $2007
     iny
-    bne go_back
+    bne loop
     inc $11
     dex
-    bne go_back
+    bne loop
   ;  This now clears the second name table?
   ;  I think this is because writing to $2007 auto increments the
   ;  written value
@@ -191,15 +197,17 @@ load_name_tables:
     dex
     bne back
   rts
+.
 
 
 ;;;;
 ;  This initializes the scrolling storing the scroll
 ;  value in the zero page variable $02
-init_scrolling:
+.scope init_scrolling
   lda #$F0
   sta $02
   rts
+.
 
 
 ;;;;
@@ -217,7 +225,6 @@ update_sprite:
   jsr high_c
   jmp edge_done
 
-
 hit_left:
   ldx #$01
   stx $00                    ;  dx
diff --git a/lib/directives/enter_scope.rb b/lib/directives/enter_scope.rb
index fe31799..7e46e2c 100644
--- a/lib/directives/enter_scope.rb
+++ b/lib/directives/enter_scope.rb
@@ -7,10 +7,16 @@ module Assembler6502
   ##  This directive to include bytes
   class EnterScope < InstructionBase
 
-
     ####
     ##  Try to parse an incbin directive
     def self.parse(line)
+      ##  Anonymous scope
+      match_data = line.match(/^\.scope$/)
+      unless match_data.nil?
+        EnterScope.new
+      end
+
+      ##  Named scope
       match_data = line.match(/^\.scope\s+([a-zA-Z][a-zA-Z0-9_]+)$/)
       return nil if match_data.nil?
       EnterScope.new(match_data[1])
@@ -19,7 +25,7 @@ module Assembler6502
 
     ####
     ##  Initialize with filename
-    def initialize(name)
+    def initialize(name = nil)
       @name = name
     end
 
@@ -32,7 +38,9 @@ module Assembler6502
     ##  name as a label, it can return the address when the scope opened.
     def exec(assembler)
       assembler.symbol_table.enter_scope(@name)
-      assembler.symbol_table.define_symbol("-#{@name}", assembler.program_counter)
+      unless @name.nil?
+        assembler.symbol_table.define_symbol("-#{@name}", assembler.program_counter)
+      end
     end