File tree 9 files changed +127
-6
lines changed
9 files changed +127
-6
lines changed Original file line number Diff line number Diff line change
1
+ ROM_START .equ $8000
2
+
3
+ RESET_VECTOR .equ $fffc
4
+
5
+ .org ROM_START
6
+
7
+ data_display:
8
+ ldx #$00 ; Initialize counter
9
+ loop_data:
10
+ lda data ,x ; Load data bytes from address data + x
11
+ beq end_prog ; On end of stream move to end of program
12
+ jsr write_data
13
+ inx ; Increase counter
14
+ jmp loop_data
15
+ end_prog:
16
+ cli
17
+ loop:
18
+ jmp loop
19
+
20
+ write_data:
21
+ jsr pulse ; Pulse 6522
22
+ rts ; Return
23
+
24
+ pulse:
25
+ sta $ff00
26
+ rts ; Return from subroutine
27
+
28
+ data:
29
+ string "Merry Christmas!"
30
+
31
+ interrupt:
32
+ pha
33
+ lda #$42
34
+ pla
35
+ rti
36
+
37
+ .org RESET_VECTOR
38
+ word data_display
39
+ word interrupt
40
+
Original file line number Diff line number Diff line change
1
+ vasm6502_oldstyle -dotdir -wdc02 -Fbin int_test.asm -L int_test.lst -o int_test.bin
2
+ hexdump -C int_test.bin
Original file line number Diff line number Diff line change
1
+ #! /bin/bash
2
+ x6502 int_test.bin
Original file line number Diff line number Diff line change @@ -16,11 +16,13 @@ cpu * new_cpu() {
16
16
memset (m -> mem , 0xFF , MEMORY_SIZE );
17
17
m -> v1 = new_via ();
18
18
m -> l = new_lcd ();
19
+ m -> k = new_keys ();
19
20
return m ;
20
21
}
21
22
22
23
void destroy_cpu (cpu * m ) {
23
24
destroy_via (m -> v1 );
24
25
destroy_lcd (m -> l );
26
+ destroy_keys (m -> k );
25
27
free (m );
26
28
}
Original file line number Diff line number Diff line change 5
5
#include <stdbool.h>
6
6
#include "via.h"
7
7
#include "lcd.h"
8
+ #include "keys.h"
8
9
9
10
#define MEMORY_SIZE 65536
10
11
#define STACK_START 0x0100
@@ -58,8 +59,8 @@ typedef struct {
58
59
via * v1 ;
59
60
// LCD
60
61
lcd * l ;
61
- // noninteractive mode
62
- bool noninteractive ;
62
+ // keys
63
+ keys * k ;
63
64
} cpu ;
64
65
65
66
cpu * new_cpu ();
Original file line number Diff line number Diff line change @@ -215,6 +215,12 @@ void update_gui(cpu *m) {
215
215
} else {
216
216
input_cycle_skip = 0 ;
217
217
218
+ m -> k -> key_up = false;
219
+ m -> k -> key_down = false;
220
+ m -> k -> key_left = false;
221
+ m -> k -> key_right = false;
222
+ m -> k -> key_enter = false;
223
+
218
224
switch (m -> clock_mode ) {
219
225
case CLOCK_SPRINT :
220
226
case CLOCK_FAST :
@@ -253,6 +259,26 @@ void update_gui(cpu *m) {
253
259
m -> clock_mode = CLOCK_FAST ;
254
260
}
255
261
break ;
262
+ case 10 :
263
+ m -> k -> key_enter = true;
264
+ keep_going = true;
265
+ break ;
266
+ case KEY_UP :
267
+ m -> k -> key_up = true;
268
+ keep_going = true;
269
+ break ;
270
+ case KEY_DOWN :
271
+ m -> k -> key_down = true;
272
+ keep_going = true;
273
+ break ;
274
+ case KEY_LEFT :
275
+ m -> k -> key_left = true;
276
+ keep_going = true;
277
+ break ;
278
+ case KEY_RIGHT :
279
+ m -> k -> key_right = true;
280
+ keep_going = true;
281
+ break ;
256
282
case '[' :
257
283
if (memory_start > 0x00 ) {
258
284
memory_start -- ;
@@ -277,10 +303,6 @@ void update_gui(cpu *m) {
277
303
memory_start = 0xfe ;
278
304
}
279
305
break ;
280
- default :
281
- m -> interrupt_waiting = 0x01 ;
282
- m -> mem [IO_GETCHAR ] = read ;
283
- keep_going = true;
284
306
}
285
307
}
286
308
} while (!keep_going && m -> clock_mode != CLOCK_SPRINT );
Original file line number Diff line number Diff line change @@ -45,9 +45,21 @@ void handle_io(cpu *m, bool rwb) {
45
45
}
46
46
}
47
47
} else {
48
+ uint8_t old_porta_input = m -> v1 -> porta & ~m -> v1 -> ddra ;
49
+
48
50
m -> v1 -> portb &= m -> v1 -> ddrb ;
49
51
m -> v1 -> portb |= (m -> l -> data & ~m -> v1 -> ddrb );
50
52
m -> v1 -> porta &= m -> v1 -> ddra ;
53
+ m -> v1 -> porta |= m -> k -> key_enter ? 0x01 : 0 ;
54
+ m -> v1 -> porta |= m -> k -> key_up ? 0x02 : 0 ;
55
+ m -> v1 -> porta |= m -> k -> key_down ? 0x04 : 0 ;
56
+ m -> v1 -> porta |= m -> k -> key_left ? 0x08 : 0 ;
57
+ m -> v1 -> porta |= m -> k -> key_right ? 0x10 : 0 ;
58
+
59
+ if (old_porta_input != (m -> v1 -> porta & ~m -> v1 -> ddra )) {
60
+ m -> interrupt_waiting = 0x01 ;
61
+ }
62
+
51
63
// read operation
52
64
m -> mem [0x6000 ] = m -> v1 -> portb ;
53
65
m -> mem [0x6001 ] = m -> v1 -> porta ;
Original file line number Diff line number Diff line change
1
+ #include "keys.h"
2
+ #include <stdlib.h>
3
+ #include <stdio.h>
4
+
5
+ keys * new_keys () {
6
+ keys * k = malloc (sizeof (keys ));
7
+
8
+ k -> key_up = false;
9
+ k -> key_down = false;
10
+ k -> key_left = false;
11
+ k -> key_right = false;
12
+ k -> key_enter = false;
13
+
14
+ return k ;
15
+ }
16
+
17
+ void destroy_keys (keys * k ) {
18
+ free (k );
19
+ }
20
+
Original file line number Diff line number Diff line change
1
+ #ifndef __6502_KEYS__
2
+ #define __6502_KEYS__
3
+
4
+ #include <stdint.h>
5
+ #include <stdbool.h>
6
+
7
+ typedef struct {
8
+ // key states
9
+ bool key_up ;
10
+ bool key_down ;
11
+ bool key_left ;
12
+ bool key_right ;
13
+ bool key_enter ;
14
+ } keys ;
15
+
16
+ keys * new_keys ();
17
+
18
+ void destroy_keys (keys * l );
19
+
20
+ #endif
You can’t perform that action at this time.
0 commit comments