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   if (vers<0x30)    version=2;
191      else           version=3;
192   if (modus) printf("CP/M %d erkannt.\n",version);
193   if (vers<0x22) error("cpm 2.2");
194   bdos_hl(14,drive-1);                       /* select drive as default */
195   sys_dpb=bdos_hl(31,0);                     /*  get addr diskparameter */
196   move(sys_dpb,disk,sizeof(struct dpb));    /*  copy it to variable disk */
197   if (version==2) disk.psh=disk.phm=0;
198                                             /* variablen berechnen */
199   woerter=(disk.dsm>=256);                  /* wort oder byte fuer blocknr ? */
200   blocksize=128*potenz2(disk.bsh);
201   sectorsize=128*potenz2(disk.psh);
202   if (modus) {
203                 printf("Blockgroesse= %d Bytes\n",blocksize);
204                 printf("phys. Sectorgroesse=%d Bytes\n",sectorsize);
205              }
206 }
207