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