]> git.sur5r.net Git - rgb2r-2017/blob - relfile.c
Add .gitignore
[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=25;
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<=25;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         cprintf("W%d: ", i);
145         for(j=0;j<rf.recsize;j++)
146         {
147             bla[j]=(i-1==j) ? 0xFF : 0xAA;
148             cprintf("%02X",bla[j]);
149         }
150         cprintf("\r\n");
151
152         if(relfile_pos(&rf, i, 0))
153         {
154             c128_perror(c, "relfile_pos3");
155             return 2;
156         }
157         if(relfile_write(&rf, bla))
158         {
159             c128_perror(c, "relfile_write");
160             return 2;
161         }
162     }
163
164     relfile_close(&rf);
165     end_tenth = CIA1.tod_10;
166     end_sec = CIA1.tod_sec;
167     cprintf("\r\n%d.%d -> %d.%d\r\n",start_sec,start_tenth,end_sec,end_tenth);
168
169
170     if(relfile_open(&rf, "reldata"))
171     {
172         c128_perror(0, "relfile_open");
173         return 3;
174     }
175
176     start_tenth = CIA1.tod_10;
177     start_sec = CIA1.tod_sec;
178
179     for(i=1;i<=25;i++)
180     {
181         cprintf("P%d\r",i);
182         if(relfile_pos(&rf, i, 0))
183         {
184             c128_perror(0, "relfile_pos");
185             return 1;
186         }
187         if(relfile_is_split_record(&rf, i))
188         {
189             cprintf("\r\nSPLIT!\r\n");
190         }
191         cprintf("R%d\r",i);
192         if(relfile_read(&rf, bla))
193         {
194             c128_perror(0, "relfile_read");
195             return 1;
196         }
197
198         cprintf("?%d\r",i);
199         for(j=0;j<rf.recsize;j++)
200         {
201             uint8_t exp=(i-1==j) ? 0xFF : 0xAA;
202             if(bla[j] != exp)
203             {
204                 cprintf("\r\nMISMATCH(%2d): IS: %2X EXP: %2X\r\n",j,bla[j],exp);
205                 cgetc();
206             }
207         }
208     }
209
210     relfile_close(&rf);
211     end_tenth = CIA1.tod_10;
212     end_sec = CIA1.tod_sec;
213     cprintf("\r\n%d.%d -> %d.%d\r\n",start_sec,start_tenth,end_sec,end_tenth);
214
215     return 0;
216 }
217