source: buchla-68k/ram/dformat.c@ 0580615

Last change on this file since 0580615 was 0580615, checked in by Thomas Lopatic <thomas@…>, 7 years ago

Point of no return.

  • Property mode set to 100644
File size: 3.0 KB
Line 
1/*
2 =============================================================================
3 dformat.c -- format a disk for the Buchla 700
4 Version 2 -- 1988-03-28 -- D.N. Lynx Crowe
5 =============================================================================
6*/
7
8#include "stddefs.h"
9#include "biosdefs.h"
10
11#define DF_FREC 6 /* first sector of primary FAT */
12
13#define DF_FSIZ 5 /* FAT size */
14#define DF_DSIZ 7 /* directory size */
15
16extern short defect; /* defect code */
17extern short dferror; /* error code from BIOS or XBIOS */
18
19extern short dftype; /* disk type code */
20extern short dfsides; /* number of sides */
21
22extern unsigned dfbuf[4096]; /* track formatting buffer */
23
24/*
25
26*/
27
28/*
29 =============================================================================
30 dformat() -- format a disk for the Bucla 700
31
32 entry: dt = zero for single sided disk,
33 non-zero for double sided disk
34
35 returns: SUCCESS or FAILURE and:
36
37 defect = formatting error code:
38
39 0 no errors
40 1 unable to format 1st side
41 2 unable to format 2nd side
42 3 unable to write boot sector
43 4 unable to write primary FAT
44 5 unable to write secondary FAT
45 6 unable to write directory
46
47 dferror = BIOS or XBIOS error code if an error occurred
48 =============================================================================
49*/
50
51short dformat(short dt)
52{
53 register short trk;
54
55 if (dt) { /* setup for double sided disk */
56
57 dftype = 3; /* 80 tracks, double sided */
58 dfsides = 2; /* 2 sides */
59
60 } else { /* setup for single sided disk */
61
62 dftype = 2; /* 80 tracks, single sided */
63 dfsides = 1; /* 1 side */
64 }
65
66 /* format each side of each track */
67
68 for (trk = 0; trk < 80; trk++) {
69
70 if (dferror = (short)XBIOS(X_FORMAT, dfbuf, 0L, 0, 9,
71 trk, 0, 1, 0x87654321L, 0xE5E5)) {
72
73 defect = 1; /* unable to format 1st side */
74 return(FAILURE);
75 }
76
77 if (dfsides EQ 2) { /* format second side */
78
79 if (dferror = (short)XBIOS(X_FORMAT, dfbuf, 0L, 0, 9,
80 trk, 1, 1, 0x87654321L, 0xE5E5)) {
81
82 defect = 2; /* unable to format 2nd side */
83 return(FAILURE);
84 }
85 }
86 }
87
88 /* create boot sector */
89
90 memsetw(dfbuf, 0, 4096);
91 XBIOS(X_PRBOOT, dfbuf, 0x01000000L, dftype, 0);
92
93 /* write boot sector to disk */
94
95 if (dferror = (short)XBIOS(X_FLOPWR, dfbuf, 0L, 0, 1, 0, 0, 1)) {
96
97 defect = 3; /* unable to write boot sector */
98 return(FAILURE);
99 }
100
101 /* clear the FATs */
102
103 memsetw(dfbuf, 0, 4096);
104
105 if (dfsides EQ 2) {
106
107 dfbuf[0] = 0xFDFF;
108 dfbuf[1] = 0xFF00;
109
110 } else {
111
112 dfbuf[0] = 0xFCFF;
113 dfbuf[1] = 0xFF00;
114 }
115
116 if (dferror = (short)BIOS(B_RDWR, 3, dfbuf,
117 DF_FSIZ, DF_FREC, 0)) {
118
119 defect = 4; /* unable to write primary FAT */
120 return(FAILURE);
121 }
122
123 if (dferror = (short)BIOS(B_RDWR, 3, dfbuf,
124 DF_FSIZ, DF_FREC-DF_FSIZ, 0)) {
125
126 defect = 5; /* unable to write secondary FAT */
127 return(FAILURE);
128 }
129
130 /* clear the directory */
131
132 memsetw(dfbuf, 0, 4096);
133
134 if (dferror = (short)BIOS(B_RDWR, 3, dfbuf,
135 DF_DSIZ, DF_FREC+DF_FSIZ, 0)) {
136
137 defect = 6; /* unable to write directory */
138 return(FAILURE);
139 }
140
141 defect = 0; /* no errors */
142 return(SUCCESS);
143}
Note: See TracBrowser for help on using the repository browser.