1 #include <stdio.h>
2 #include <disk.h>
3
4 extern int blocksize, version, old_user, old_drive;
5 extern int modus, drive, woerter, sectorsize;
6 extern FILE datei;
7 extern struct dpb disk;
8
my_alloc(n)9 char *my_alloc(n) /* wie malloc(),aber mit fehlerabfrage */
10 unsigned n;
11 {
12 char * new=calloc(1,n); /* setzt alle speicherstellen auf 0 (wichtig) */
13 if (new) return new;
14 error("Speicherplatz");
15 }
16
bdos_hl(nummer,de)17 int bdos_hl(nummer,de) /* returnt HL-registerinhalt */
18 int nummer,de;
19 {
20 #asm
21 pop hl ; ruecksprungadr
22 pop bc ; c=nummer
23 pop de
24 push de
25 push bc
26 push hl
27 call 5
28 #endasm
29 }
30
bdos_a(nummer,de)31 int bdos_a(nummer,de) /* returnt A-registerinhalt */
32 int nummer,de;
33 {
34 #asm
35 pop hl ; ruecksprungadr
36 pop bc ; c=nummer
37 pop de
38 push de
39 push bc
40 push hl
41 call 5
42 ld h,0
43 ld l,a
44 #endasm
45 }
46
move(hl,de,bc)47 move(hl,de,bc) /* im speicher BC bytes von HL nach DE kopieren */
48 int hl,de,bc;
49 {
50 #asm
51 pop ix ; returnadr
52 pop hl
53 pop de
54 pop bc
55 push bc
56 push de
57 push hl
58 push ix
59 ldir
60 #endasm
61 }
62
space()63 unsigned int space() /* verbleibenden Speicher ermitteln */
64 {
65 int * ptr=malloc(blocksize);
66 if (!ptr) return 0; /* testet in vielfachen von */
67 else { /* blocksize */
68 unsigned int x=space()+blocksize;
69 cfree(ptr);
70 return x;
71 }
72 }
73
74
potenz2(x)75 potenz2(x) /* zweierpotenz von x berechnen */
76 int x;
77 { if (x) return 2*potenz2(x-1);
78 else return 1;
79 }
80
bios_a(nummer,a,bc,de)81 int bios_a(nummer,a,bc,de) /* BIOS -aufruf ueber BDOS-func.50 */
82 int nummer,a,bc,de;
83 {
84 #asm
85 pop ix
86 ld (rueck),ix
87 call bios_hl
88 ld h,0
89 ld l,a ; return a-register
90 ld ix,(rueck)
91 jp (ix)
92 dseg
93 rueck: dw 0
94 cseg
95 #endasm
96 }
97
98 int bios_hl(nummer,a,bc,de)
99 int nummer,a,bc,de;
100 {
101 static struct biospb { BYTE func;
102 BYTE areg;
103 WORT bcreg;
104 WORT dereg;
105 WORT hlreg;
106 } parameter;
107 if (version==2) return bios2hl(3*(nummer-1),a,bc,de);
108 else
109 {
110 parameter.func=nummer;
111 parameter.areg=a;
112 parameter.bcreg=bc;
113 parameter.dereg=de;
114 parameter.hlreg=0;
115 return bdos_hl(50,parameter); /* direct bios call */
116 }
117 }
118
119 bios2hl(offs,a,bc,de)
120 int offs,a,bc,de;
121 {
122 #asm
123 ld hl,(1)
124 pop ix ; ruecksprungadr
125 pop bc ; offs
126 add hl,bc
127 pop bc ; a
128 ld a,c
129 pop bc ;bc
130 pop de ;de
131 push de
132 push bc
133 push af
134 push bc
135 push ix
136 jp (hl)
137 #endasm
138 }
139
140 char upcase(ch)
141 char ch;
142 { if ((ch>='a')&&(ch<='z')) ch-='a'-'A';
143 return ch;
144 }
145
146 reset()
147 {
148 bdos_hl(13,0); /* reset disk system (wegen pufferung von cpm3 */
149 bdos_hl(14,old_drive); /* select old drive as default */
150 set_user(old_user);
151 red_out(0);
152 red_in(0);
153 }
154
155 my_exit()
156 {
157 reset();
158 exit();
159 }
160
161 set_user(nr)
162 int nr;
163 {
164 bdos_a(32,nr);
165 }
166
167 int get_user()
168 {
169 return bdos_a(32,0xff);
170 }
171
172 fgets(datei,zeile)
173 FILE *datei;
174 char *zeile;
175 {
176 while(!(datei->eol)) *(zeile++)=getc(datei);
177 *zeile=0; /* ende setzen */
178 if(datei->eof) return;
179
180 getc(datei); /* CR ueberlesen */
181 getc(datei); /* LF ueberlesen */
182 }
183
184 setdisk() /* Systeminitialisierungen,setzt einige */
185 { /* variablen */
186 struct dpb *sys_dpb;
187 int vers=bdos_hl(12,0);
188 if (modus)
189 /* printf("Untersuche Betriebssystem (cpm2.2 oder 3) und Disks . "); */
190 printf("Examine operating System (cpm2.2 or 3) und disks . ");
191 if (vers<0x30) version=2;
192 else version=3;
193 /* if (modus) printf("CP/M %d erkannt.\n",version); */
194 if (modus) printf("Identify CP/M %d .\n",version);
195 if (vers<0x22) error("cpm 2.2");
196 bdos_hl(14,drive-1); /* select drive as default */
197 sys_dpb=bdos_hl(31,0); /* get addr diskparameter */
198 move(sys_dpb,disk,sizeof(struct dpb)); /* copy it to variable disk */
199 if (version==2) disk.psh=disk.phm=0;
200 /* variablen berechnen */
201 woerter=(disk.dsm>=256); /* wort oder byte fuer blocknr ? */
202 blocksize=128*potenz2(disk.bsh);
203 sectorsize=128*potenz2(disk.psh);
204 if (modus) {
205 /* printf("Blockgroesse= %d Bytes\n",blocksize);
206 * printf("phys. Sectorgroesse=%d Bytes\n",sectorsize);
207 */
208 printf("block size = %d bytes\n",blocksize);
209 printf("phys. sector size = %d bytes\n",sectorsize);
210 }
211 }
212