ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
test_6502_fp.c
Go to the documentation of this file.
1#include "../tester.h"
2
3static double test_fp_6502_add_op( Environment * _environment, double _first, double _second ) {
4
5 char * asmFileNameRoot = get_temporary_filename( _environment );
6 char asmFileName[MAX_TEMPORARY_STORAGE];
7 sprintf( asmFileName, "%s.asm", asmFileNameRoot );
8
9 _environment->asmFile = fopen( asmFileName, "wt");
10 deploy( vars, src_hw_atari_vars_asm);
11 setup_text_variables( _environment );
12 deploy( startup, src_hw_atari_startup_asm);
14 int result[4];
15 cpu_float_single_from_double_to_int_array( _environment, _first, &result[0] );
16 outline1("LDA #$%2.2x", result[0] );
17 outline0("STA X1" );
18 outline1("LDA #$%2.2x", result[1] );
19 outline0("STA M1" );
20 outline1("LDA #$%2.2x", result[2] );
21 outline0("STA M1+1" );
22 outline1("LDA #$%2.2x", result[3] );
23 outline0("STA M1+2" );
24 cpu_float_single_from_double_to_int_array( _environment, _second, &result[0] );
25 outline1("LDA #$%2.2x", result[0] );
26 outline0("STA X2" );
27 outline1("LDA #$%2.2x", result[1] );
28 outline0("STA M2" );
29 outline1("LDA #$%2.2x", result[2] );
30 outline0("STA M2+1" );
31 outline1("LDA #$%2.2x", result[3] );
32 outline0("STA M2+2" );
33 outline0("JSR FADD" );
34 outline0("LDA X1" );
35 outline0("STA FP1X" );
36 outline0("LDA M1" );
37 outline0("STA FP1X+1" );
38 outline0("LDA M1+1" );
39 outline0("STA FP1X+2" );
40 outline0("LDA M1+2" );
41 outline0("STA FP1X+3" );
42 outline0("BRK" );
43 outline0("FP1X: .byte $0, $0, $0, $0" );
44 Variable * v = malloc( sizeof( Variable ) );
45 memset( v, 0, sizeof( Variable ) );
46 v->type = VT_FLOAT;
47 v->name = strdup( "FP1X" );
48 buffered_output( _environment, _environment->asmFile );
49 fclose( _environment->asmFile );
50 execute6502( _environment, asmFileName, v );
51 remove( asmFileName );
52 return v->valueFloating;
53
54}
55
56void test_fp_6502_add( Environment * _environment, double _first, double _second, double _expected ) {
57
58 Environment * environment = malloc( sizeof( Environment ) );
59 memset( environment, 0, sizeof( Environment ) );
60
61 double result = test_fp_6502_add_op( environment, _first, _second );
62
63 if ( (result - _expected) < 0.01 ) {
64 printf( "." );
65 } else {
66 printf( "\n %f + %f = %f ... FAILED!", _first, _second, _expected );
67 printf( " got: %f !\n", result);
68 }
69
70}
71
72static double test_fp_6502_sub_op( Environment * _environment, double _first, double _second ) {
73
74 char * asmFileNameRoot = get_temporary_filename( _environment );
75 char asmFileName[MAX_TEMPORARY_STORAGE];
76 sprintf( asmFileName, "%s.asm", asmFileNameRoot );
77
78 _environment->asmFile = fopen( asmFileName, "wt");
79 deploy( vars, src_hw_atari_vars_asm);
80 setup_text_variables( _environment );
81 deploy( startup, src_hw_atari_startup_asm);
83 int result[4];
84 cpu_float_single_from_double_to_int_array( _environment, _first, &result[0] );
85 outline1("LDA #$%2.2x", result[0] );
86 outline0("STA X1" );
87 outline1("LDA #$%2.2x", result[1] );
88 outline0("STA M1" );
89 outline1("LDA #$%2.2x", result[2] );
90 outline0("STA M1+1" );
91 outline1("LDA #$%2.2x", result[3] );
92 outline0("STA M1+2" );
93 cpu_float_single_from_double_to_int_array( _environment, _second, &result[0] );
94 outline1("LDA #$%2.2x", result[0] );
95 outline0("STA X2" );
96 outline1("LDA #$%2.2x", result[1] );
97 outline0("STA M2" );
98 outline1("LDA #$%2.2x", result[2] );
99 outline0("STA M2+1" );
100 outline1("LDA #$%2.2x", result[3] );
101 outline0("STA M2+2" );
102 outline0("JSR FSUB" );
103 outline0("LDA X1" );
104 outline0("STA FP1X" );
105 outline0("LDA M1" );
106 outline0("STA FP1X+1" );
107 outline0("LDA M1+1" );
108 outline0("STA FP1X+2" );
109 outline0("LDA M1+2" );
110 outline0("STA FP1X+3" );
111 outline0("BRK" );
112 outline0("FP1X: .byte $0, $0, $0, $0" );
113 Variable * v = malloc( sizeof( Variable ) );
114 memset( v, 0, sizeof( Variable ) );
115 v->type = VT_FLOAT;
116 v->name = strdup( "FP1X" );
117 buffered_output( _environment, _environment->asmFile );
118 fclose( _environment->asmFile );
119 execute6502( _environment, asmFileName, v );
120 remove( asmFileName );
121
122 return v->valueFloating;
123
124}
125
126void test_fp_6502_sub( Environment * _environment, double _first, double _second, double _expected ) {
127
128 Environment * environment = malloc( sizeof( Environment ) );
129 memset( environment, 0, sizeof( Environment ) );
130
131 double result = test_fp_6502_sub_op( environment, _first, _second );
132
133 if ( (result - _expected) < 0.01 ) {
134 printf( "." );
135 } else {
136 printf( "\n %f - %f = %f ... FAILED!", _first, _second, _expected );
137 printf( " got: %f !\n", result);
138 }
139
140}
void cpu_float_single_from_double_to_int_array(Environment *_environment, double _value, int _result[])
Definition 6309.c:6747
unsigned char src_hw_6502_fp_routines_asm[]
char * get_temporary_filename(Environment *_environment)
void buffered_output(Environment *_environment, FILE *_stream)
void setup_text_variables(Environment *_environment)
Definition _init.c:61
FILE * asmFile
Definition ugbc.h:3309
double valueFloating
Definition ugbc.h:1046
char * name
Definition ugbc.h:979
VariableType type
Definition ugbc.h:988
void test_fp_6502_add(Environment *_environment, double _first, double _second, double _expected)
void test_fp_6502_sub(Environment *_environment, double _first, double _second, double _expected)
void execute6502(Environment *_environment, char *_asm_filename, Variable *_variable)
Definition worker_6502.c:3
void * malloc(YYSIZE_T)
#define MAX_TEMPORARY_STORAGE
Definition ugbc.h:563
struct _Variable Variable
Structure of a single variable.
struct _Environment Environment
Structure of compilation environment.
@ VT_FLOAT
Definition ugbc.h:522
#define outline0(s)
Definition ugbc.h:4252
#define outline1(s, a)
Definition ugbc.h:4253
#define deploy(s, e)
Definition ugbc.h:4288