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