diff options
Diffstat (limited to 'roms/simple_ram_test2.asm')
-rw-r--r-- | roms/simple_ram_test2.asm | 162 |
1 files changed, 162 insertions, 0 deletions
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 |