]> git.sur5r.net Git - rgb2r-2017/blob - relfile.c
6a2fac74c6939ca230dba64d2cda6d0d7c25eb88
[rgb2r-2017] / relfile.c
1 #include <conio.h>
2 #include <cbm.h>
3 #include <errno.h>
4 #include <stdio.h>
5 #include <stdint.h>
6 #include <stdlib.h>
7 #include <string.h>
8
9 #include "bcd2dec.h"
10
11 struct relfile
12 {
13     uint8_t fd;
14     uint8_t cmdfd;
15     uint8_t devnr;
16     uint8_t sa;
17     uint8_t recsize;
18 };
19
20 #define RELFILENAME_MAX (FILENAME_MAX + 4) // FOO,L,\xFF\0
21
22 uint8_t relfile_open(struct relfile *rf, char* name)
23 {
24     char namebuf[RELFILENAME_MAX];
25
26     if(strlen(name) > FILENAME_MAX)
27         return ENOENT;
28     snprintf(namebuf,RELFILENAME_MAX,"%s,l,%c",name,rf->recsize);
29     cbm_open(rf->fd, rf->devnr, rf->sa, namebuf);
30     if(_oserror)
31         return _oserror;
32
33     cbm_open(rf->cmdfd,rf->devnr,15,NULL);
34     if(_oserror)
35         return _oserror;
36 }
37
38 uint8_t relfile_is_split_record(struct relfile *rf, uint16_t recnum)
39 {
40     return ((recnum * rf->recsize) % 254) < rf->recsize;
41 }
42
43 uint8_t relfile_pos(struct relfile *rf, uint16_t recnum, uint8_t offset)
44 {
45     char cmdbuf[5]; // 'P' (SA) (RECLO) (RECHI) (OFFSET)
46
47     cmdbuf[0]=80; //P
48     cmdbuf[1]=rf->sa + 0x60;
49     cmdbuf[2]=(uint8_t)(recnum & 0x00FF);
50     cmdbuf[3]=(uint8_t)(recnum >> 8);
51     cmdbuf[4]=offset;
52
53     //cprintf("CMD: %2X %2X %2X %2X %2X\r\n", cmdbuf[0], cmdbuf[1], cmdbuf[2], cmdbuf[3], cmdbuf[4]);
54
55     cbm_write(rf->cmdfd,cmdbuf, 5);
56     return _oserror;
57 }
58
59 uint8_t relfile_read(struct relfile *rf, uint8_t *buf)
60 {
61     cbm_read(rf->fd, buf, rf->recsize);
62     return _oserror;
63 }
64
65 uint8_t relfile_write(struct relfile *rf, uint8_t *buf)
66 {
67     cbm_write(rf->fd, buf, rf->recsize);
68     return _oserror;
69 }
70
71 uint8_t relfile_clear(struct relfile *rf)
72 {
73     cbm_write(rf->fd, "\xFF", 1);
74     return _oserror;
75 }
76
77 void relfile_close(struct relfile *rf)
78 {
79     cbm_close(rf->cmdfd);
80     cbm_close(rf->fd);
81 }
82
83 void c128_perror(uint8_t c, char *msg) {
84   cprintf("\r\nError (Code %d) while: %s\r\nOS Error = %d\r\n", c, msg,
85           _oserror);
86 }
87
88 int main(void)
89 {
90     char bla[25];
91     struct relfile rf;
92     uint8_t c=0;
93     uint8_t start_sec, start_tenth;
94     uint8_t end_sec, end_tenth;
95     uint8_t i,j;
96
97     videomode(VIDEOMODE_80x25);
98     fast();
99
100     __asm__("jsr initsystime");
101
102     rf.fd=2;
103     rf.devnr=8;
104     rf.sa=3;
105     rf.recsize=16;
106
107     if(relfile_open(&rf, "reldata"))
108     {
109         c128_perror(c, "relfile_open");
110         return 1;
111     }
112
113     start_tenth = CIA1.tod_10;
114     start_sec = CIA1.tod_sec;
115
116     for(i=1;i<=50;i++)
117     {
118         //cgetc();
119         /*
120         cprintf("P%d\r",i);
121         if(relfile_pos(&rf, i, 0))
122         {
123             c128_perror(c, "relfile_pos1");
124             return 2;
125         }
126         */
127         if(relfile_is_split_record(&rf, i))
128         {
129             cprintf("\r\nSPLIT: %d!\r\n",i);
130         }
131         /*
132         if(relfile_pos(&rf, i, 0))
133         {
134             c128_perror(c, "relfile_pos2");
135             return 2;
136         }
137         cprintf("C%d\r",i);
138         if(relfile_clear(&rf))
139         {
140             c128_perror(c, "relfile_clear");
141             return 2;
142         }
143         */
144         srand(i);
145         for(j=0;j<rf.recsize;j++)
146             bla[j]=rand() & 0x00ff;
147
148         cprintf("W%d\r",i);
149         if(relfile_pos(&rf, i, 0))
150         {
151             c128_perror(c, "relfile_pos3");
152             return 2;
153         }
154         if(relfile_write(&rf, bla))
155         {
156             c128_perror(c, "relfile_write");
157             return 2;
158         }
159     }
160
161     relfile_close(&rf);
162     end_tenth = CIA1.tod_10;
163     end_sec = CIA1.tod_sec;
164     cprintf("\r\n%d.%d -> %d.%d\r\n",start_sec,start_tenth,end_sec,end_tenth);
165
166
167     if(relfile_open(&rf, "reldata"))
168     {
169         c128_perror(0, "relfile_open");
170         return 3;
171     }
172     start_tenth = CIA1.tod_10;
173     start_sec = CIA1.tod_sec;
174
175     for(i=1;i<=50;i++)
176     {
177         cprintf("P%d\r",i);
178         if(relfile_pos(&rf, i, 0))
179         {
180             c128_perror(0, "relfile_pos");
181             return 1;
182         }
183         if(relfile_is_split_record(&rf, i))
184         {
185             cprintf("\r\nSPLIT!\r\n");
186         }
187         cprintf("R%d\r",i);
188         if(relfile_read(&rf, bla))
189         {
190             c128_perror(0, "relfile_read");
191             return 1;
192         }
193
194         cprintf("?%d\r",i);
195         srand(i);
196         for(j=0;j<rf.recsize;j++)
197         {
198             uint8_t exp = rand() & 0x00ff;
199             if(bla[j] != exp)
200             {
201                 cprintf("\r\nMISMATCH(%2d): IS: %2X EXP: %2X\r\n",j,bla[j],exp);
202                 cgetc();
203             }
204         }
205     }
206
207     relfile_close(&rf);
208     end_tenth = CIA1.tod_10;
209     end_sec = CIA1.tod_sec;
210     cprintf("\r\n%d.%d -> %d.%d\r\n",start_sec,start_tenth,end_sec,end_tenth);
211
212     return 0;
213 }
214