@@ -10,13 +10,24 @@ volatile int32_t count = 0;
10
10
// vblank.asm
11
11
extern void vblank_handler ();
12
12
extern void fast_vdu (uint8_t * data , int len );
13
+ // misc.asm
14
+ extern uint8_t getsysvar_gp (void );
15
+ extern void delay_1sec (void );
13
16
14
17
// called from vblank_handler
15
18
void on_vblank ()
16
19
{
17
20
count ++ ;
18
21
}
19
22
23
+ static void vdu_gp (uint8_t msg )
24
+ {
25
+ putch (23 ); // Send a general poll packet
26
+ putch (0 );
27
+ putch (0x80 );
28
+ putch (msg );
29
+ }
30
+
20
31
#define AGON_CLK 18.432f
21
32
22
33
#define PUSH_ALL "\tpush af\n" \
@@ -33,28 +44,21 @@ void on_vblank()
33
44
"\tpop af\n"
34
45
35
46
int main () {
36
- printf ("Agon Bench 1.03\n" );
47
+ // mode 0: make sure we have a 60hz mode for timing
48
+ putch (22 ); putch (0 );
49
+
50
+ printf ("Agon Bench 1.04\n" );
37
51
printf ("===============\n\n" );
38
52
vblank_handler_t old_handler = mos_setintvector (0x32 , & vblank_handler );
39
53
40
54
{
41
55
for (count = -1 ; count ; ) {} // clear counter and let current frame finish
42
- int iters = 0 ;
43
- while (count < 60 ) {
44
- iters ++ ;
45
- }
46
- printf ("%d C loop iters per second (%.3f MHz ez80 equivalent)\n" , iters , AGON_CLK * (float )iters / 292668.0f );
47
- }
48
- {
49
- for (count = -1 ; count ; ) {} // clear counter and let current frame finish
50
- int iters = 0 ;
51
- while (count < 60 ) {
52
- asm(" mlt bc\n"
53
- :::"bc" );
54
- iters ++ ;
55
- }
56
- printf ("%d C loop mlt iters per second (%.3f MHz ez80 equivalent)\n" , iters , AGON_CLK * (float )iters / 236407.0f );
56
+ delay_1sec (); // should really be 1 second if 18.432MHz cpu
57
+ delay_1sec ();
58
+ printf ("ez80 frequency: %.3f MHz\n" , 2 * AGON_CLK * 60.0f / count );
57
59
}
60
+ printf ("\n" );
61
+
58
62
{
59
63
for (count = -1 ; count ; ) {} // clear counter and let current frame finish
60
64
int iters = 0 ;
@@ -66,15 +70,34 @@ int main() {
66
70
);
67
71
iters ++ ;
68
72
}
69
- printf ("%d MOS calls (%.2f x Agon Light)\n" , iters , (float )iters / 77478.0f );
73
+ printf ("Syscalls per second %d MOS calls (%.2f x Agon Light)\n" , iters , (float )iters / 77478.0f );
70
74
}
75
+ printf ("\n" );
76
+
77
+ {
78
+ for (count = -1 ; count ; ) {} // clear counter and let current frame finish
79
+ for (int j = 0 ; j < 10 ; j ++ ) {
80
+ uint8_t i = 0 ;
81
+ while (i < 255 ) {
82
+ vdu_gp (i );
83
+ while (getsysvar_gp () != i ) {}
84
+ i ++ ;
85
+ }
86
+ }
87
+ float elapsed = (float )count / 60.0f ;
88
+ printf ("ez80 <-> VDP round-trips per second %.0f\n" , 2550.0f / elapsed );
89
+ printf ("ez80 <-> VDP round-trip latency %.2f ms\n" , 1000.0f * elapsed / 2550.0f );
90
+ }
91
+
92
+
71
93
{
72
94
for (count = -1 ; count ; ) {} // clear counter and let current frame finish
73
95
// load 64KiB of junk into the vdp
74
96
vdp_load_bitmap (128 , 128 , (uint32_t * )0x40000 );
75
97
float elapsed = (float )count / 60.0f ;
76
- printf ("%.2f seconds to upload 64KiB to VDP ( %.2f KiB/sec, %.2f KBit/sec)\n" , elapsed , 64.0f / elapsed , 8.0f * 64.0f / elapsed );
98
+ printf ("ez80 to VDP %.2f KiB/sec ( %.2f KBit/sec)\n" , 64.0f / elapsed , 8.0f * 64.0f / elapsed );
77
99
}
100
+
78
101
{
79
102
for (count = -1 ; count ; ) {} // clear counter and let current frame finish
80
103
// load 64KiB of junk into the vdp
@@ -83,9 +106,24 @@ int main() {
83
106
putch (128 ); putch (0 );
84
107
fast_vdu ((uint8_t * )0x40000 , 65536 );
85
108
float elapsed = (float )count / 60.0f ;
86
- printf ("%.2f seconds to upload 64KiB to VDP with fast_vdu() ( %.2f KiB/sec, %.2f KBit/sec)\n" , elapsed , 64.0f / elapsed , 8.0f * 64.0f / elapsed );
109
+ printf ("ez80 to VDP (fast_vdu) %.2f KiB/sec ( %.2f KBit/sec)\n" , 64.0f / elapsed , 8.0f * 64.0f / elapsed );
87
110
}
111
+ printf ("\n" );
88
112
113
+ mos_del ("agon-bench.tmp" );
114
+ {
115
+ for (count = -1 ; count ; ) {} // clear counter and let current frame finish
116
+ mos_save ("agon-bench.tmp" , 0xa0000 , 65536 );
117
+ float elapsed = (float )count / 60.0f ;
118
+ printf ("SDCard write %.2f KiB/sec\n" , 64.0f / elapsed );
119
+ }
120
+ {
121
+ for (count = -1 ; count ; ) {} // clear counter and let current frame finish
122
+ mos_load ("agon-bench.tmp" , 0xa0000 , 65536 );
123
+ float elapsed = (float )count / 60.0f ;
124
+ printf ("SDCard read %.2f KiB/sec\n" , 64.0f / elapsed );
125
+ }
126
+ mos_del ("agon-bench.tmp" );
89
127
90
128
mos_setintvector (0x32 , old_handler );
91
129
0 commit comments