From 63d0944063b6f240fe0c68ef9b61d4dd906d9fc1 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Tue, 17 Nov 2020 19:12:00 +0100 Subject: initial checkin --- roms/7seg_counter_irq_timer.asm | 112 +++++++++++++++ roms/7seg_counter_reset_on_irq.asm | 89 ++++++++++++ roms/7seg_counter_reset_on_irq_delay.asm | 106 ++++++++++++++ roms/7seg_print_one.asm | 62 +++++++++ roms/7seg_print_one_subroutine.asm | 66 +++++++++ roms/7segment_rom.hex | 128 +++++++++++++++++ roms/README | 24 ++++ roms/blinken_lights.asm | 14 ++ roms/blinken_lights.hex | 128 +++++++++++++++++ roms/clear_zero_page.asm | 132 ++++++++++++++++++ roms/counting_lights.asm | 13 ++ roms/entry.hex | 128 +++++++++++++++++ roms/irqs_with_lcd1.asm | 132 ++++++++++++++++++ roms/irqs_with_via.asm | 137 ++++++++++++++++++ roms/lcd_no_ram.asm | 132 ++++++++++++++++++ roms/lcd_with_ram.asm | 82 +++++++++++ roms/lcd_with_ram_busy_check.asm | 112 +++++++++++++++ roms/lcd_with_ram_busy_check_and_string_print.asm | 112 +++++++++++++++ roms/read_write.hex | 128 +++++++++++++++++ roms/simple_ram_test.asm | 16 +++ roms/simple_ram_test2.asm | 162 ++++++++++++++++++++++ roms/wait.hex | 128 +++++++++++++++++ 22 files changed, 2143 insertions(+) create mode 100644 roms/7seg_counter_irq_timer.asm create mode 100644 roms/7seg_counter_reset_on_irq.asm create mode 100644 roms/7seg_counter_reset_on_irq_delay.asm create mode 100644 roms/7seg_print_one.asm create mode 100644 roms/7seg_print_one_subroutine.asm create mode 100644 roms/7segment_rom.hex create mode 100644 roms/README create mode 100644 roms/blinken_lights.asm create mode 100644 roms/blinken_lights.hex create mode 100644 roms/clear_zero_page.asm create mode 100644 roms/counting_lights.asm create mode 100644 roms/entry.hex create mode 100644 roms/irqs_with_lcd1.asm create mode 100644 roms/irqs_with_via.asm create mode 100644 roms/lcd_no_ram.asm create mode 100644 roms/lcd_with_ram.asm create mode 100644 roms/lcd_with_ram_busy_check.asm create mode 100644 roms/lcd_with_ram_busy_check_and_string_print.asm create mode 100644 roms/read_write.hex create mode 100644 roms/simple_ram_test.asm create mode 100644 roms/simple_ram_test2.asm create mode 100644 roms/wait.hex (limited to 'roms') 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 ................ -- cgit v1.2.3-54-g00ecf