summaryrefslogtreecommitdiff
path: root/roms/irqs_with_lcd1.asm
blob: 0abb0407a74b880f74220932b894f595bae03256 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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