summaryrefslogtreecommitdiff
path: root/roms
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2020-11-17 19:12:00 +0100
committerAndreas Baumann <mail@andreasbaumann.cc>2020-11-17 19:12:00 +0100
commit63d0944063b6f240fe0c68ef9b61d4dd906d9fc1 (patch)
treefb083c1284fd6d58944b1961297c652dc32b515d /roms
download6502-63d0944063b6f240fe0c68ef9b61d4dd906d9fc1.tar.gz
6502-63d0944063b6f240fe0c68ef9b61d4dd906d9fc1.tar.bz2
initial checkin
Diffstat (limited to 'roms')
-rw-r--r--roms/7seg_counter_irq_timer.asm112
-rw-r--r--roms/7seg_counter_reset_on_irq.asm89
-rw-r--r--roms/7seg_counter_reset_on_irq_delay.asm106
-rw-r--r--roms/7seg_print_one.asm62
-rw-r--r--roms/7seg_print_one_subroutine.asm66
-rw-r--r--roms/7segment_rom.hex128
-rw-r--r--roms/README24
-rw-r--r--roms/blinken_lights.asm14
-rw-r--r--roms/blinken_lights.hex128
-rw-r--r--roms/clear_zero_page.asm132
-rw-r--r--roms/counting_lights.asm13
-rw-r--r--roms/entry.hex128
-rw-r--r--roms/irqs_with_lcd1.asm132
-rw-r--r--roms/irqs_with_via.asm137
-rw-r--r--roms/lcd_no_ram.asm132
-rw-r--r--roms/lcd_with_ram.asm82
-rw-r--r--roms/lcd_with_ram_busy_check.asm112
-rw-r--r--roms/lcd_with_ram_busy_check_and_string_print.asm112
-rw-r--r--roms/read_write.hex128
-rw-r--r--roms/simple_ram_test.asm16
-rw-r--r--roms/simple_ram_test2.asm162
-rw-r--r--roms/wait.hex128
22 files changed, 2143 insertions, 0 deletions
diff --git a/roms/7seg_counter_irq_timer.asm b/roms/7seg_counter_irq_timer.asm
new file mode 100644
index 0000000..29a3b54
--- /dev/null
+++ b/roms/7seg_counter_irq_timer.asm
@@ -0,0 +1,112 @@
+PORTA = $6001
+DDRA = $6003
+T1LCL = $6004
+T1LCH = $6005
+ACR = $600b
+PCR = $600c
+IER = $600e
+IFR = $600f
+
+SER = %00000001
+RCLK = %00000010
+SRCLK = %00000100
+
+INTERVAL = 33 ; increase counter 3 times per scond
+
+COUNTER = $0 ; visible counter
+TICKS = $3 ; internal ticks counter (on overflow increment counter)
+
+ .org #$f800
+
+reset:
+ sei ; disallow interrupts during initialization
+
+ ldx #$FF ; initialize call stack to $1FF
+ txs
+
+ lda #%11000010 ; enable CA1 and timer1 interrupts
+ sta IER
+ lda #$0 ; negative edge triggering
+ sta PCR
+
+ lda ACR
+ AND #$7F
+ ORA #%01000000 ; setup timer for free running timer1, no PB7
+ sta ACR
+
+ lda #%00000111 ; set output on 7seg control pins of PORTA
+ sta DDRA
+
+ lda #$0 ; initialize 8-bit counter and tick counter
+ sta COUNTER
+ lda #INTERVAL
+ sta TICKS
+
+ lda ACR
+
+ lda #$0F ; initialize counter of VIA timer1 ($270f = 9999 at 1MHz)
+ sta T1LCL
+ lda #$27
+ sta T1LCH
+
+ cli ; allow interrupts now
+
+mainloop: ; main loop, just print value of counter
+ lda COUNTER
+ jsr print7seg
+ jmp mainloop
+
+print7seg:
+ ldy #$8 ; 8 bits to shift
+loop7seg:
+ rol a
+ bcc zerobit ; C=0, bang a zero to SER
+onebit:
+ ldx #(SER) ; C=1, bang a one to SER
+ stx PORTA
+ ldx #(SER | SRCLK)
+ stx PORTA
+ ldx #(SER)
+ stx PORTA
+ jmp next
+zerobit:
+ ldx #$0 ; C=0, bang a zero to SER
+ stx PORTA
+ ldx #SRCLK
+ stx PORTA
+ ldx #$0
+ stx PORTA
+ jmp next
+next:
+ dey
+ bne loop7seg
+ rol a ; restore A register
+output:
+ ldx #0 ; bang RCLK to store output in latch
+ stx PORTA
+ ldx #RCLK
+ stx PORTA
+ ldx #0
+ stx PORTA
+ rts
+
+nmi:
+ rti
+
+irq:
+ pha
+ bit T1LCL ; clear timer1 interrupt
+ bit PORTA ; clear CA1 interrupt
+ dec TICKS
+ bne irq_done
+ lda #INTERVAL
+ sta TICKS
+ inc COUNTER
+irq_done:
+ pla
+ rti
+
+ .org #$fffa
+ .word nmi
+ .word reset
+ .word irq
diff --git a/roms/7seg_counter_reset_on_irq.asm b/roms/7seg_counter_reset_on_irq.asm
new file mode 100644
index 0000000..b7581e8
--- /dev/null
+++ b/roms/7seg_counter_reset_on_irq.asm
@@ -0,0 +1,89 @@
+PORTA = $6001
+DDRA = $6003
+PCR = $600c
+IER = $600e
+
+SER = %00000001
+RCLK = %00000010
+SRCLK = %00000100
+
+COUNTER = $0
+
+ .org #$f800
+
+reset:
+ sei ; disallow interrupts during initialization
+
+ ldx #$FF ; initialize call stack to $1FF
+ txs
+
+ lda #%10000010 ; enable CA1 interrupt
+ sta IER
+ lda #$0 ; negative edge triggering
+ sta PCR
+
+ ldx #%00000111 ; set output on 7seg control pins of PORTA
+ stx DDRA
+
+ ldx $0 ; initialize 8-bit counter
+ stx COUNTER
+
+ cli ; allow interrupts now
+
+mainloop: ; main loop, load counter and print it
+ sei
+ inc COUNTER
+ lda COUNTER
+ cli
+ jsr print7seg
+ jmp mainloop
+
+print7seg:
+ ldy #$8 ; 8 bits to shift
+loop7seg:
+ rol a
+ bcc zerobit ; C=0, bang a zero to SER
+onebit:
+ ldx #(SER) ; C=1, bang a one to SER
+ stx PORTA
+ ldx #(SER | SRCLK)
+ stx PORTA
+ ldx #(SER)
+ stx PORTA
+ jmp next
+zerobit:
+ ldx #$0 ; C=0, bang a zero to SER
+ stx PORTA
+ ldx #SRCLK
+ stx PORTA
+ ldx #$0
+ stx PORTA
+ jmp next
+next:
+ dey
+ bne loop7seg
+ rol a ; restore A register
+output:
+ ldx #0 ; bang RCLK to store output in latch
+ stx PORTA
+ ldx #RCLK
+ stx PORTA
+ ldx #0
+ stx PORTA
+ rts
+
+nmi:
+ rti
+
+irq:
+ pha
+ bit PORTA ; clear interrupt on port A
+ lda #$0
+ sta COUNTER ; reset counter
+ pla
+ rti
+
+ .org #$fffa
+ .word nmi
+ .word reset
+ .word irq
diff --git a/roms/7seg_counter_reset_on_irq_delay.asm b/roms/7seg_counter_reset_on_irq_delay.asm
new file mode 100644
index 0000000..007402e
--- /dev/null
+++ b/roms/7seg_counter_reset_on_irq_delay.asm
@@ -0,0 +1,106 @@
+PORTA = $6001
+DDRA = $6003
+PCR = $600c
+IER = $600e
+
+SER = %00000001
+RCLK = %00000010
+SRCLK = %00000100
+
+COUNTER = $0
+
+ .org #$f800
+
+reset:
+ sei ; disallow interrupts during initialization
+
+ ldx #$FF ; initialize call stack to $1FF
+ txs
+
+ lda #%10000010 ; enable CA1 interrupt
+ sta IER
+ lda #$0 ; negative edge triggering
+ sta PCR
+
+ ldx #%00000111 ; set output on 7seg control pins of PORTA
+ stx DDRA
+
+ ldx #$0 ; initialize 8-bit counter
+ stx COUNTER
+
+ cli ; allow interrupts now
+
+mainloop: ; main loop, load counter and print it
+ jsr print7seg
+ ldx #0 ; ca 500'000 cycles, at 1 Mhz 2 ticks per second
+ ldy #0
+ lda #150
+ jsr delay
+ inc COUNTER
+ lda COUNTER
+ jmp mainloop
+
+print7seg:
+ ldy #$8 ; 8 bits to shift
+loop7seg:
+ rol a
+ bcc zerobit ; C=0, bang a zero to SER
+onebit:
+ ldx #(SER) ; C=1, bang a one to SER
+ stx PORTA
+ ldx #(SER | SRCLK)
+ stx PORTA
+ ldx #(SER)
+ stx PORTA
+ jmp next
+zerobit:
+ ldx #$0 ; C=0, bang a zero to SER
+ stx PORTA
+ ldx #SRCLK
+ stx PORTA
+ ldx #$0
+ stx PORTA
+ jmp next
+next:
+ dey
+ bne loop7seg
+ rol a ; restore A register
+output:
+ ldx #0 ; bang RCLK to store output in latch
+ stx PORTA
+ ldx #RCLK
+ stx PORTA
+ ldx #0
+ stx PORTA
+ rts
+
+; delay 18+13(65536Y+256A+X) cycles
+delay:
+ iny
+delay1:
+ nop
+ nop
+delay2:
+ cpx #$1
+ dex
+ sbc #$0
+ bcs delay1
+ dey
+ bne delay2
+ rts
+
+nmi:
+ rti
+
+irq:
+ pha
+ bit PORTA ; clear interrupt on port A
+ lda #$0
+ sta COUNTER ; reset counter
+ pla
+ rti
+
+ .org #$fffa
+ .word nmi
+ .word reset
+ .word irq
diff --git a/roms/7seg_print_one.asm b/roms/7seg_print_one.asm
new file mode 100644
index 0000000..00725ef
--- /dev/null
+++ b/roms/7seg_print_one.asm
@@ -0,0 +1,62 @@
+PORTA = $6001
+DDRA = $6003
+
+SER = %00000001
+RCLK = %00000010
+SRCLK = %00000100
+
+ .org #$f800
+
+reset:
+ ldx #$FF ; initialize call stack to $1FF
+ txs
+
+ ldx #%00000111 ; set output on 7seg control pins of PORTA
+ stx DDRA
+
+ lda #$a5 ; 10100101, data to show
+ ldy #$8 ; 8 bits to shift
+loop:
+ rol a
+ bcc zerobit ; C=0, bang a zero to SER
+onebit:
+ ldx #(SER) ; C=1, bang a one to SER
+ stx PORTA
+ ldx #(SER | SRCLK)
+ stx PORTA
+ ldx #(SER)
+ stx PORTA
+ jmp next
+zerobit:
+ ldx #$0 ; C=0, bang a zero to SER
+ stx PORTA
+ ldx #SRCLK
+ stx PORTA
+ ldx #$0
+ stx PORTA
+ jmp next
+next:
+ dey
+ bne loop
+
+output:
+ ldx #0 ; bang RCLK to store output in latch
+ stx PORTA
+ ldx #RCLK
+ stx PORTA
+ ldx #0
+ stx PORTA
+
+term:
+ jmp term
+
+nmi:
+ rti
+
+irq:
+ rti
+
+ .org #$fffa
+ .word nmi
+ .word reset
+ .word irq
diff --git a/roms/7seg_print_one_subroutine.asm b/roms/7seg_print_one_subroutine.asm
new file mode 100644
index 0000000..4a1839f
--- /dev/null
+++ b/roms/7seg_print_one_subroutine.asm
@@ -0,0 +1,66 @@
+PORTA = $6001
+DDRA = $6003
+
+SER = %00000001
+RCLK = %00000010
+SRCLK = %00000100
+
+ .org #$f800
+
+reset:
+ ldx #$FF ; initialize call stack to $1FF
+ txs
+
+ ldx #%00000111 ; set output on 7seg control pins of PORTA
+ stx DDRA
+
+ lda #$a5 ; 10100101, data to show
+ jsr print7seg
+
+print7seg:
+ ldy #$8 ; 8 bits to shift
+loop:
+ rol a
+ bcc zerobit ; C=0, bang a zero to SER
+onebit:
+ ldx #(SER) ; C=1, bang a one to SER
+ stx PORTA
+ ldx #(SER | SRCLK)
+ stx PORTA
+ ldx #(SER)
+ stx PORTA
+ jmp next
+zerobit:
+ ldx #$0 ; C=0, bang a zero to SER
+ stx PORTA
+ ldx #SRCLK
+ stx PORTA
+ ldx #$0
+ stx PORTA
+ jmp next
+next:
+ dey
+ bne loop
+ rol a ; restore A register
+output:
+ ldx #0 ; bang RCLK to store output in latch
+ stx PORTA
+ ldx #RCLK
+ stx PORTA
+ ldx #0
+ stx PORTA
+ rts
+
+term:
+ jmp term
+
+nmi:
+ rti
+
+irq:
+ rti
+
+ .org #$fffa
+ .word nmi
+ .word reset
+ .word irq
diff --git a/roms/7segment_rom.hex b/roms/7segment_rom.hex
new file mode 100644
index 0000000..6781ac3
--- /dev/null
+++ b/roms/7segment_rom.hex
@@ -0,0 +1,128 @@
+00000000: 7e48 3d6d 4b67 774c 7f6f 5f73 3679 3717 ................
+00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000080: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000090: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000000d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000000e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000000f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000100: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000110: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000120: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000130: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000140: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000150: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000160: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000170: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000180: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000190: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000001a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000001b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000001c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000001d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000001f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000200: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000210: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000220: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000230: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000240: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000250: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000260: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000270: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000280: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000290: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000002a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000002b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000002c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000002d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000002e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000002f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000300: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000310: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000320: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000330: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000340: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000350: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000360: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000370: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000380: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000390: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000003a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000003b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000003c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000003d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000003e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000003f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000400: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000410: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000420: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000430: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000440: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000450: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000460: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000470: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000480: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000490: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000004a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000004b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000004c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000004d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000004e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000004f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000500: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000510: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000520: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000530: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000540: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000550: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000560: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000570: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000580: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000590: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000005a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000005b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000005c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000005d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000005e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000005f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000600: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000610: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000620: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000630: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000640: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000650: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000660: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000670: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000680: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000690: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000006a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000006b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000006c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000006d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000006e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000006f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000700: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000710: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000720: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000730: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000740: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000750: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000760: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000770: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000780: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00000790: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000007a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000007b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000007c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000007d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000007e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+000007f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
diff --git a/roms/README b/roms/README
new file mode 100644
index 0000000..9ba01d1
--- /dev/null
+++ b/roms/README
@@ -0,0 +1,24 @@
+entry.hex - base minimal, set reset vector to $f800 and execute only nops
+read_write.hex - read/write value on bus, to test Arduino Mega monitor
+blinken_lights.asm - alternating $55 and $aa patterns on via to test data port
+blinken_lights.hex - same as blinken_lights.asm in HEX only (no assembler)
+clear_zero_page.asm - deterministic LCD test with clearing zero page in RAM
+counting_lights.asm - binary counter, 8 LEDS on VIA
+irqs_with_lcd1.asm - IRQ/NMIs directly on button
+irqs_with_via.asm - IRQ handshaked on CA1
+lcd_no_ram.asm - primitive output on LCD, no RAM chip
+lcd_with_ram.asm - output on LCD, RAM chip with zero and stack page (512 bytes)
+lcd_with_ram_busy_check_and_string_print.asm - better code
+lcd_with_ram_busy_check.asm - busy check on LCD, needed for 1MHz to work
+simple_ram_test2.asm - test zero page by writting and reading to it, print ok/nok
+ result to LCD
+simple_ram_test.asm - test $ff ram address continuously by writing and reading
+ a counter variable from there (to debug RAM on Mega monitor)
+wait.hex - test 65C02 WAI special opcode
+7segment_rom.hex - ROM for 7-segment display, 16 digits from 0-f
+ address of EPROM is binary input, output is
+ pins of 7-segment display
+7seg_print_one.asm - print $a5 (10100101) on 7-seg display
+7seg_print_one_subroutine.asm - same as 7seg_print_one.asm with a subroutine
+7seg_counter_reset_on_irq.asm - counter, reset on IRQ (usable at 1 KHz)
+7seg_counter_reset_on_irq_delay.asm - counter, reset on ORQ (usable at 1 MHz)
diff --git a/roms/blinken_lights.asm b/roms/blinken_lights.asm
new file mode 100644
index 0000000..90f04e8
--- /dev/null
+++ b/roms/blinken_lights.asm
@@ -0,0 +1,14 @@
+ .org #$f800
+reset:
+ lda #$ff
+ sta $6002
+loop:
+ lda #$55
+ sta $6000
+ lda #$aa
+ sta $6000
+ jmp loop
+
+ .org #$fffc
+ .word reset
+ .word $0000
diff --git a/roms/blinken_lights.hex b/roms/blinken_lights.hex
new file mode 100644
index 0000000..ea347e2
--- /dev/null
+++ b/roms/blinken_lights.hex
@@ -0,0 +1,128 @@
+00000000: a9ff 8d02 60a9 558d 0060 a9aa 8d00 604c ................
+00000010: 05f8 eaea eaea eaea eaea eaea eaea eaea ................
+00000020: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000030: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000040: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000050: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000060: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000070: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000080: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000090: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000100: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000110: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000120: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000130: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000140: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000150: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000160: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000170: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000180: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000190: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000200: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000210: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000220: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000230: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000240: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000250: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000260: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000270: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000280: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000290: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000300: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000310: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000320: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000330: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000340: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000350: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000360: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000370: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000380: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000390: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000400: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000410: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000420: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000430: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000440: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000450: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000460: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000470: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000480: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000490: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000500: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000510: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000520: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000530: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000540: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000550: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000560: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000570: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000580: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000590: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000600: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000610: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000620: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000630: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000640: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000650: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000660: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000670: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000680: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000690: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000700: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000710: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000720: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000730: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000740: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000750: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000760: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000770: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000780: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000790: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007f0: eaea eaea eaea eaea eaea eaea 00f8 eaea ................
diff --git a/roms/clear_zero_page.asm b/roms/clear_zero_page.asm
new file mode 100644
index 0000000..36fa1df
--- /dev/null
+++ b/roms/clear_zero_page.asm
@@ -0,0 +1,132 @@
+PORTB = $6000
+PORTA = $6001
+DDRB = $6002
+DDRA = $6003
+
+E = %10000000
+RW = %01000000
+RS = %00100000
+
+ .org #$f800
+
+reset:
+ ldx #$FF ; initialize call stack to $1FF
+ txs
+
+ lda #%11111111 ; set output on all pins of PORTB
+ sta DDRB
+
+ lda #%11100000 ; set output on LCD control pins of PORTA
+ sta DDRA
+
+ lda #%00111000 ; set 8-bit, 2-line display, 5x8 font
+ jsr lcd_send_command
+
+ lda #%00001110 ; display on, cursor on, no blink
+ jsr lcd_send_command
+
+ lda #%00000001 ; clear display
+ jsr lcd_send_command
+
+ lda #%00000010 ; return home
+ jsr lcd_send_command
+
+ lda #%00000110 ; set entry mode: increment, no shift
+ jsr lcd_send_command
+
+clear_memory_start:
+ lda #0
+ ldx #$FF
+ ldy #0
+clear_memory_loop:
+ sta $0, y
+ iny
+ dex
+ bne clear_memory_loop
+
+ ldx #0
+msg_loop:
+ lda message_memory_clear, x
+ beq msg_end
+ jsr lcd_send_data
+ inx
+ jmp msg_loop
+msg_end:
+
+finish:
+ jmp finish
+
+term:
+ jmp term
+
+lcd_wait:
+ pha
+ lda #%00000000 ; port B to all input
+ sta DDRB
+
+lcd_wait_loop:
+ lda #RW
+ sta PORTA
+
+ lda #(RW | E)
+ sta PORTA
+
+ lda PORTB
+ and #%10000000
+ bne lcd_wait_loop
+
+ lda #RW
+ sta PORTA
+ lda #%11111111 ; port B back to output
+ sta DDRB
+
+ pla
+ rts
+
+lcd_send_command:
+
+ jsr lcd_wait
+
+ sta PORTB
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #E ; clear RS/RW, set E, send instruction
+ sta PORTA
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ rts
+
+lcd_send_data:
+
+ jsr lcd_wait
+
+ sta PORTB ; data to send to port B
+
+ lda #RS ; clear RW, E, set RS for data
+ sta PORTA
+
+ lda #( E | RS ) ; clear RW, set E/RS, send data
+ sta PORTA
+
+ lda #RS ; clear RS, E, keep RS
+ sta PORTA
+
+ rts
+
+nmi:
+ rti
+
+irq:
+ rti
+
+message_memory_clear:
+ .asciiz "memory cleared"
+
+ .org #$fffa
+ .word nmi
+ .word reset
+ .word irq
diff --git a/roms/counting_lights.asm b/roms/counting_lights.asm
new file mode 100644
index 0000000..30423cf
--- /dev/null
+++ b/roms/counting_lights.asm
@@ -0,0 +1,13 @@
+ .org #$f800
+reset:
+ lda #$ff
+ sta $6002
+ ldx #$0
+loop:
+ stx $6000
+ inx
+ jmp loop
+
+ .org #$fffc
+ .word reset
+ .word $0000
diff --git a/roms/entry.hex b/roms/entry.hex
new file mode 100644
index 0000000..35e2c57
--- /dev/null
+++ b/roms/entry.hex
@@ -0,0 +1,128 @@
+00000000: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000010: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000020: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000030: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000040: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000050: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000060: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000070: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000080: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000090: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000100: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000110: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000120: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000130: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000140: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000150: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000160: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000170: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000180: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000190: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000200: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000210: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000220: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000230: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000240: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000250: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000260: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000270: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000280: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000290: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000300: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000310: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000320: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000330: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000340: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000350: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000360: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000370: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000380: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000390: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000400: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000410: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000420: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000430: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000440: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000450: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000460: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000470: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000480: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000490: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000500: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000510: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000520: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000530: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000540: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000550: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000560: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000570: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000580: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000590: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000600: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000610: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000620: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000630: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000640: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000650: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000660: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000670: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000680: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000690: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000700: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000710: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000720: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000730: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000740: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000750: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000760: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000770: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000780: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000790: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007f0: eaea eaea eaea eaea eaea eaea 00f8 eaea ................
diff --git a/roms/irqs_with_lcd1.asm b/roms/irqs_with_lcd1.asm
new file mode 100644
index 0000000..0abb040
--- /dev/null
+++ b/roms/irqs_with_lcd1.asm
@@ -0,0 +1,132 @@
+PORTB = $6000
+PORTA = $6001
+DDRB = $6002
+DDRA = $6003
+
+E = %10000000
+RW = %01000000
+RS = %00100000
+
+ .org #$f800
+
+reset:
+ ldx #$FF ; initialize call stack to $1FF
+ txs
+
+ lda #%11111111 ; set output on all pins of PORTB
+ sta DDRB
+
+ lda #%11100000 ; set output on LCD control pins of PORTA
+ sta DDRA
+
+ lda #%00111000 ; set 8-bit, 2-line display, 5x8 font
+ jsr lcd_send_command
+
+ lda #%00001110 ; display on, cursor on, no blink
+ jsr lcd_send_command
+
+ lda #%00000001 ; clear display
+ jsr lcd_send_command
+
+ lda #%00000010 ; return home
+ jsr lcd_send_command
+
+ lda #%00000110 ; set entry mode: increment, no shift
+ jsr lcd_send_command
+
+ cli ; allow interrupts now, LCD is ready
+
+msg_again:
+ ldx #0
+msg_loop:
+ lda message, x ; string to send
+ beq msg_end
+ jsr lcd_send_data
+ inx
+ jmp msg_loop
+msg_end:
+
+ jmp msg_again
+
+term:
+ jmp term
+
+lcd_wait:
+ pha
+ lda #%00000000 ; port B to all input
+ sta DDRB
+
+lcd_wait_loop:
+ lda #RW
+ sta PORTA
+
+ lda #(RW | E)
+ sta PORTA
+
+ lda PORTB
+ and #%10000000
+ bne lcd_wait_loop
+
+ lda #RW
+ sta PORTA
+ lda #%11111111 ; port B back to output
+ sta DDRB
+
+ pla
+ rts
+
+lcd_send_command:
+
+ jsr lcd_wait
+
+ sta PORTB
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #E ; clear RS/RW, set E, send instruction
+ sta PORTA
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ rts
+
+lcd_send_data:
+
+ jsr lcd_wait
+
+ sta PORTB ; data to send to port B
+
+ lda #RS ; clear RW, E, set RS for data
+ sta PORTA
+
+ lda #( E | RS ) ; clear RW, set E/RS, send data
+ sta PORTA
+
+ lda #RS ; clear RS, E, keep RS
+ sta PORTA
+
+ rts
+
+nmi:
+ pha
+ lda #'I'
+ jsr lcd_send_data
+ pla
+ rti
+
+irq:
+ pha
+ lda #'i'
+ jsr lcd_send_data
+ pla
+ rti
+
+message:
+ .asciiz "6502 "
+
+ .org #$fffa
+ .word nmi
+ .word reset
+ .word irq
diff --git a/roms/irqs_with_via.asm b/roms/irqs_with_via.asm
new file mode 100644
index 0000000..4a8d5f8
--- /dev/null
+++ b/roms/irqs_with_via.asm
@@ -0,0 +1,137 @@
+PORTB = $6000
+PORTA = $6001
+DDRB = $6002
+DDRA = $6003
+PCR = $600c
+IFR = $600d
+IER = $600e
+
+E = %10000000
+RW = %01000000
+RS = %00100000
+
+ .org #$f800
+
+reset:
+ ldx #$FF ; initialize call stack to $1FF
+ txs
+
+ lda #%10000010 ; enable CA1 interrupt
+ sta IER
+ lda #$0 ; negative edge triggering
+ sta PCR
+
+ lda #%11111111 ; set output on all pins of PORTB
+ sta DDRB
+
+ lda #%11100000 ; set output on LCD control pins of PORTA
+ sta DDRA
+
+ lda #%00111000 ; set 8-bit, 2-line display, 5x8 font
+ jsr lcd_send_command
+
+ lda #%00001110 ; display on, cursor on, no blink
+ jsr lcd_send_command
+
+ lda #%00000001 ; clear display
+ jsr lcd_send_command
+
+ lda #%00000010 ; return home
+ jsr lcd_send_command
+
+ lda #%00000110 ; set entry mode: increment, no shift
+ jsr lcd_send_command
+
+ cli ; allow interrupts now, LCD is ready
+
+msg_again:
+ ldx #0
+msg_loop:
+ lda message, x ; string to send
+ beq msg_end
+ jsr lcd_send_data
+ inx
+ jmp msg_loop
+msg_end:
+
+ jmp msg_again
+
+term:
+ jmp term
+
+lcd_wait:
+ pha
+ lda #%00000000 ; port B to all input
+ sta DDRB
+
+lcd_wait_loop:
+ lda #RW
+ sta PORTA
+
+ lda #(RW | E)
+ sta PORTA
+
+ lda PORTB
+ and #%10000000
+ bne lcd_wait_loop
+
+ lda #RW
+ sta PORTA
+ lda #%11111111 ; port B back to output
+ sta DDRB
+
+ pla
+ rts
+
+lcd_send_command:
+
+ jsr lcd_wait
+
+ sta PORTB
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #E ; clear RS/RW, set E, send instruction
+ sta PORTA
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ rts
+
+lcd_send_data:
+
+ jsr lcd_wait
+
+ sta PORTB ; data to send to port B
+
+ lda #RS ; clear RW, E, set RS for data
+ sta PORTA
+
+ lda #( E | RS ) ; clear RW, set E/RS, send data
+ sta PORTA
+
+ lda #RS ; clear RS, E, keep RS
+ sta PORTA
+
+ rts
+
+nmi:
+ rti
+
+irq:
+ pha
+ lda #'i'
+ jsr lcd_send_data
+ pla
+ bit PORTA ; clear interrupt on port A
+ rti
+
+message:
+ .asciiz "6502 "
+
+ .org #$fffa
+ .word nmi
+ .word reset
+ .word irq
diff --git a/roms/lcd_no_ram.asm b/roms/lcd_no_ram.asm
new file mode 100644
index 0000000..7616dcf
--- /dev/null
+++ b/roms/lcd_no_ram.asm
@@ -0,0 +1,132 @@
+PORTB = $6000
+PORTA = $6001
+DDRB = $6002
+DDRA = $6003
+
+E = %10000000
+RW = %01000000
+RS = %00100000
+
+ .org #$f800
+
+reset:
+ lda #%11111111 ; set output on all pins of PORTB
+ sta DDRB
+
+ lda #%11100000 ; set output on LCD control pins of PORTA
+ sta DDRA
+
+ lda #%00111000 ; set 8-bit, 2-line display, 5x8 font
+ sta PORTB
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #E ; clear RS/RW, set E, send instruction
+ sta PORTA
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #%00001110 ; display on, cursor on, no blink
+ sta PORTB
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #E ; clear RS/RW, set E, send instruction
+ sta PORTA
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #%00000001 ; clear display
+ sta PORTB
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #E ; clear RS/RW, set E, send instruction
+ sta PORTA
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #%00000010 ; return home
+ sta PORTB
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #E ; clear RS/RW, set E, send instruction
+ sta PORTA
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #%00000110 ; set entry mode: increment, no shift
+ sta PORTB
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #E ; clear RS/RW, set E, send instruction
+ sta PORTA
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #'6' ; data to send
+ sta PORTB
+
+ lda #RS ; clear RW, E, set RS for data
+ sta PORTA
+
+ lda #( E | RS ) ; clear RW, set E/RS, send data
+ sta PORTA
+
+ lda #RS ; clear RS, E, keep RS
+ sta PORTA
+
+ lda #'5' ; data to send
+ sta PORTB
+
+ lda #RS ; clear RW, E, set RS for data
+ sta PORTA
+
+ lda #( E | RS ) ; clear RW, set E/RS, send data
+ sta PORTA
+
+ lda #RS ; clear RS, E, keep RS
+ sta PORTA
+
+ lda #'0' ; data to send
+ sta PORTB
+
+ lda #RS ; clear RW, E, set RS for data
+ sta PORTA
+
+ lda #( E | RS ) ; clear RW, set E/RS, send data
+ sta PORTA
+
+ lda #RS ; clear RS, E, keep RS
+ sta PORTA
+
+ lda #'2' ; data to send
+ sta PORTB
+
+ lda #RS ; clear RW, E, set RS for data
+ sta PORTA
+
+ lda #( E | RS ) ; clear RW, set E/RS, send data
+ sta PORTA
+
+ lda #RS ; clear RS, E, keep RS
+ sta PORTA
+
+end:
+ jmp end
+
+ .org #$fffc
+ .word reset
+ .word $0000
diff --git a/roms/lcd_with_ram.asm b/roms/lcd_with_ram.asm
new file mode 100644
index 0000000..7340c71
--- /dev/null
+++ b/roms/lcd_with_ram.asm
@@ -0,0 +1,82 @@
+PORTB = $6000
+PORTA = $6001
+DDRB = $6002
+DDRA = $6003
+
+E = %10000000
+RW = %01000000
+RS = %00100000
+
+ .org #$f800
+
+reset:
+ ldx #$FF ; initialize call stack to $1FF
+ txs
+
+ lda #%11111111 ; set output on all pins of PORTB
+ sta DDRB
+
+ lda #%11100000 ; set output on LCD control pins of PORTA
+ sta DDRA
+
+ lda #%00111000 ; set 8-bit, 2-line display, 5x8 font
+ jsr lcd_send_command
+
+ lda #%00001110 ; display on, cursor on, no blink
+ jsr lcd_send_command
+
+ lda #%00000001 ; clear display
+ jsr lcd_send_command
+
+ lda #%00000010 ; return home
+ jsr lcd_send_command
+
+ lda #%00000110 ; set entry mode: increment, no shift
+ jsr lcd_send_command
+
+ lda #'6' ; data to send
+ jsr lcd_send_data
+
+ lda #'5' ; data to send
+ jsr lcd_send_data
+
+ lda #'0' ; data to send
+ jsr lcd_send_data
+
+ lda #'2' ; data to send
+ jsr lcd_send_data
+
+term:
+ jmp term
+
+lcd_send_command:
+ sta PORTB
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #E ; clear RS/RW, set E, send instruction
+ sta PORTA
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ rts
+
+lcd_send_data:
+ sta PORTB ; data to send to port B
+
+ lda #RS ; clear RW, E, set RS for data
+ sta PORTA
+
+ lda #( E | RS ) ; clear RW, set E/RS, send data
+ sta PORTA
+
+ lda #RS ; clear RS, E, keep RS
+ sta PORTA
+
+ rts
+
+ .org #$fffc
+ .word reset
+ .word $0000
diff --git a/roms/lcd_with_ram_busy_check.asm b/roms/lcd_with_ram_busy_check.asm
new file mode 100644
index 0000000..01bd1d1
--- /dev/null
+++ b/roms/lcd_with_ram_busy_check.asm
@@ -0,0 +1,112 @@
+PORTB = $6000
+PORTA = $6001
+DDRB = $6002
+DDRA = $6003
+
+E = %10000000
+RW = %01000000
+RS = %00100000
+
+ .org #$f800
+
+reset:
+ ldx #$FF ; initialize call stack to $1FF
+ txs
+
+ lda #%11111111 ; set output on all pins of PORTB
+ sta DDRB
+
+ lda #%11100000 ; set output on LCD control pins of PORTA
+ sta DDRA
+
+ lda #%00111000 ; set 8-bit, 2-line display, 5x8 font
+ jsr lcd_send_command
+
+ lda #%00001110 ; display on, cursor on, no blink
+ jsr lcd_send_command
+
+ lda #%00000001 ; clear display
+ jsr lcd_send_command
+
+ lda #%00000010 ; return home
+ jsr lcd_send_command
+
+ lda #%00000110 ; set entry mode: increment, no shift
+ jsr lcd_send_command
+
+ lda #'6' ; data to send
+ jsr lcd_send_data
+
+ lda #'5' ; data to send
+ jsr lcd_send_data
+
+ lda #'0' ; data to send
+ jsr lcd_send_data
+
+ lda #'2' ; data to send
+ jsr lcd_send_data
+
+term:
+ jmp term
+
+lcd_wait:
+ pha
+ lda #%00000000 ; port B to all input
+ sta DDRB
+
+lcd_wait_loop:
+ lda #RW
+ sta PORTA
+
+ lda #(RW | E)
+ sta PORTA
+
+ lda PORTB
+ and #%10000000
+ bne lcd_wait_loop
+
+ lda #RW
+ sta PORTA
+ lda #%11111111 ; port B back to output
+ sta DDRB
+
+ pla
+ rts
+
+lcd_send_command:
+
+ jsr lcd_wait
+
+ sta PORTB
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #E ; clear RS/RW, set E, send instruction
+ sta PORTA
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ rts
+
+lcd_send_data:
+
+ jsr lcd_wait
+
+ sta PORTB ; data to send to port B
+
+ lda #RS ; clear RW, E, set RS for data
+ sta PORTA
+
+ lda #( E | RS ) ; clear RW, set E/RS, send data
+ sta PORTA
+
+ lda #RS ; clear RS, E, keep RS
+ sta PORTA
+
+ rts
+
+ .org #$fffc
+ .word reset
+ .word $0000
diff --git a/roms/lcd_with_ram_busy_check_and_string_print.asm b/roms/lcd_with_ram_busy_check_and_string_print.asm
new file mode 100644
index 0000000..34b78b4
--- /dev/null
+++ b/roms/lcd_with_ram_busy_check_and_string_print.asm
@@ -0,0 +1,112 @@
+PORTB = $6000
+PORTA = $6001
+DDRB = $6002
+DDRA = $6003
+
+E = %10000000
+RW = %01000000
+RS = %00100000
+
+ .org #$f800
+
+reset:
+ ldx #$FF ; initialize call stack to $1FF
+ txs
+
+ lda #%11111111 ; set output on all pins of PORTB
+ sta DDRB
+
+ lda #%11100000 ; set output on LCD control pins of PORTA
+ sta DDRA
+
+ lda #%00111000 ; set 8-bit, 2-line display, 5x8 font
+ jsr lcd_send_command
+
+ lda #%00001110 ; display on, cursor on, no blink
+ jsr lcd_send_command
+
+ lda #%00000001 ; clear display
+ jsr lcd_send_command
+
+ lda #%00000010 ; return home
+ jsr lcd_send_command
+
+ lda #%00000110 ; set entry mode: increment, no shift
+ jsr lcd_send_command
+
+ ldx #0
+msg_loop:
+ lda message, x ; string to send
+ beq msg_end
+ jsr lcd_send_data
+ inx
+ jmp msg_loop
+msg_end:
+
+term:
+ jmp term
+
+lcd_wait:
+ pha
+ lda #%00000000 ; port B to all input
+ sta DDRB
+
+lcd_wait_loop:
+ lda #RW
+ sta PORTA
+
+ lda #(RW | E)
+ sta PORTA
+
+ lda PORTB
+ and #%10000000
+ bne lcd_wait_loop
+
+ lda #RW
+ sta PORTA
+ lda #%11111111 ; port B back to output
+ sta DDRB
+
+ pla
+ rts
+
+lcd_send_command:
+
+ jsr lcd_wait
+
+ sta PORTB
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #E ; clear RS/RW, set E, send instruction
+ sta PORTA
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ rts
+
+lcd_send_data:
+
+ jsr lcd_wait
+
+ sta PORTB ; data to send to port B
+
+ lda #RS ; clear RW, E, set RS for data
+ sta PORTA
+
+ lda #( E | RS ) ; clear RW, set E/RS, send data
+ sta PORTA
+
+ lda #RS ; clear RS, E, keep RS
+ sta PORTA
+
+ rts
+
+message:
+ .asciiz "6502"
+
+ .org #$fffc
+ .word reset
+ .word $0000
diff --git a/roms/read_write.hex b/roms/read_write.hex
new file mode 100644
index 0000000..b31b2ac
--- /dev/null
+++ b/roms/read_write.hex
@@ -0,0 +1,128 @@
+00000000: a942 8d00 60cb eaea eaea eaea eaea eaea ................
+00000010: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000020: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000030: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000040: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000050: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000060: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000070: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000080: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000090: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000100: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000110: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000120: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000130: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000140: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000150: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000160: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000170: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000180: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000190: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000200: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000210: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000220: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000230: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000240: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000250: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000260: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000270: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000280: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000290: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000300: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000310: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000320: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000330: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000340: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000350: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000360: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000370: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000380: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000390: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000400: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000410: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000420: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000430: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000440: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000450: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000460: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000470: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000480: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000490: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000500: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000510: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000520: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000530: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000540: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000550: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000560: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000570: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000580: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000590: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000600: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000610: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000620: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000630: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000640: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000650: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000660: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000670: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000680: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000690: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000700: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000710: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000720: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000730: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000740: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000750: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000760: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000770: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000780: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000790: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007f0: eaea eaea eaea eaea eaea eaea 00f8 eaea ................
diff --git a/roms/simple_ram_test.asm b/roms/simple_ram_test.asm
new file mode 100644
index 0000000..4b5e285
--- /dev/null
+++ b/roms/simple_ram_test.asm
@@ -0,0 +1,16 @@
+ .org #$f800
+
+MEM = $ff
+
+reset:
+ ldx #$0
+ stx MEM
+loop:
+ ldx MEM
+ inx
+ stx MEM
+ jmp loop
+
+ .org #$fffc
+ .word reset
+ .word $0000
diff --git a/roms/simple_ram_test2.asm b/roms/simple_ram_test2.asm
new file mode 100644
index 0000000..9803056
--- /dev/null
+++ b/roms/simple_ram_test2.asm
@@ -0,0 +1,162 @@
+PORTB = $6000
+PORTA = $6001
+DDRB = $6002
+DDRA = $6003
+
+E = %10000000
+RW = %01000000
+RS = %00100000
+
+ .org #$f800
+
+reset:
+ ldx #$FF ; initialize call stack to $1FF
+ txs
+
+ lda #%11111111 ; set output on all pins of PORTB
+ sta DDRB
+
+ lda #%11100000 ; set output on LCD control pins of PORTA
+ sta DDRA
+
+ lda #%00111000 ; set 8-bit, 2-line display, 5x8 font
+ jsr lcd_send_command
+
+ lda #%00001110 ; display on, cursor on, no blink
+ jsr lcd_send_command
+
+ lda #%00000001 ; clear display
+ jsr lcd_send_command
+
+ lda #%00000010 ; return home
+ jsr lcd_send_command
+
+ lda #%00000110 ; set entry mode: increment, no shift
+ jsr lcd_send_command
+
+set_memory:
+ ldy #$0
+ ldx #$FF
+set_memory_loop:
+ sty $0, x
+ iny
+ dex
+ bne set_memory_loop
+
+test_memory:
+ ldy #$0
+ ldx #$FF
+test_memory_loop:
+ tya
+ pha
+ lda $0, x
+ cmp $1FF ; stack was empty so Y is now on top of stack
+ bne test_memory_bad
+ pla
+ tay
+ iny
+ dex
+ bne test_memory_loop
+ jmp test_memory_ok
+
+test_memory_bad:
+ ldx #0
+msg_loop_bad:
+ lda message_memory_bad, x
+ beq msg_end_bad
+ jsr lcd_send_data
+ inx
+ jmp msg_loop_bad
+msg_end_bad:
+ jmp finish
+
+test_memory_ok:
+ ldx #0
+msg_loop_ok:
+ lda message_memory_ok, x
+ beq msg_end_ok
+ jsr lcd_send_data
+ inx
+ jmp msg_loop_ok
+msg_end_ok
+
+finish:
+ jmp finish
+
+term:
+ jmp term
+
+lcd_wait:
+ pha
+ lda #%00000000 ; port B to all input
+ sta DDRB
+
+lcd_wait_loop:
+ lda #RW
+ sta PORTA
+
+ lda #(RW | E)
+ sta PORTA
+
+ lda PORTB
+ and #%10000000
+ bne lcd_wait_loop
+
+ lda #RW
+ sta PORTA
+ lda #%11111111 ; port B back to output
+ sta DDRB
+
+ pla
+ rts
+
+lcd_send_command:
+
+ jsr lcd_wait
+
+ sta PORTB
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ lda #E ; clear RS/RW, set E, send instruction
+ sta PORTA
+
+ lda #$0 ; clear RS/RW/E
+ sta PORTA
+
+ rts
+
+lcd_send_data:
+
+ jsr lcd_wait
+
+ sta PORTB ; data to send to port B
+
+ lda #RS ; clear RW, E, set RS for data
+ sta PORTA
+
+ lda #( E | RS ) ; clear RW, set E/RS, send data
+ sta PORTA
+
+ lda #RS ; clear RS, E, keep RS
+ sta PORTA
+
+ rts
+
+nmi:
+ rti
+
+irq:
+ rti
+
+message_memory_bad:
+ .asciiz "mem bad"
+
+message_memory_ok:
+ .asciiz "mem ok"
+
+ .org #$fffa
+ .word nmi
+ .word reset
+ .word irq
diff --git a/roms/wait.hex b/roms/wait.hex
new file mode 100644
index 0000000..c9241fd
--- /dev/null
+++ b/roms/wait.hex
@@ -0,0 +1,128 @@
+00000000: cbea eaea eaea eaea eaea eaea eaea eaea ................
+00000010: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000020: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000030: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000040: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000050: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000060: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000070: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000080: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000090: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000000f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000100: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000110: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000120: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000130: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000140: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000150: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000160: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000170: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000180: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000190: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000001f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000200: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000210: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000220: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000230: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000240: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000250: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000260: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000270: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000280: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000290: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000002f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000300: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000310: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000320: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000330: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000340: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000350: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000360: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000370: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000380: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000390: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000003f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000400: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000410: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000420: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000430: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000440: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000450: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000460: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000470: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000480: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000490: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000004f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000500: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000510: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000520: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000530: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000540: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000550: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000560: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000570: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000580: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000590: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000005f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000600: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000610: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000620: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000630: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000640: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000650: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000660: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000670: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000680: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000690: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000006f0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000700: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000710: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000720: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000730: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000740: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000750: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000760: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000770: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000780: eaea eaea eaea eaea eaea eaea eaea eaea ................
+00000790: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007a0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007b0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007c0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007d0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007e0: eaea eaea eaea eaea eaea eaea eaea eaea ................
+000007f0: eaea eaea eaea eaea eaea eaea 00f8 eaea ................