summaryrefslogtreecommitdiff
path: root/roms/lcd_with_ram.asm
diff options
context:
space:
mode:
Diffstat (limited to 'roms/lcd_with_ram.asm')
-rw-r--r--roms/lcd_with_ram.asm82
1 files changed, 82 insertions, 0 deletions
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