-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLLSTUFF.BAK
More file actions
212 lines (176 loc) · 4.03 KB
/
Copy pathLLSTUFF.BAK
File metadata and controls
212 lines (176 loc) · 4.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
/*
*
* Low level stuff
*
* by Micro-Ed
*
*/
#include "Micro-Ed.H"
#pragma inline
extern unsigned _stklen = 1024 * 12 ;
static int HandleCE (int nErrCode, int AX, int BP, int SI) ;
static void interrupt NewClockHandler (void) ;
static int CtrlBrkHandler (void) ;
static void TestDosVersion (void) ;
static void GetWindowsStatus (void) ;
static void interrupt NewCEHandler (unsigned BP, unsigned DI, unsigned SI,
unsigned DS, unsigned ES, unsigned DX,
unsigned CX, unsigned BX, unsigned AX) ;
void InitLowLevStuff (void)
{
bDodgy = FALSE ;
setvect (0x1c, NewClockHandler) ;
asm {
mov ah, 12h
mov al, 01h
mov bl, 32h
int 10h
} ;
bDodgy = TRUE ;
asm int 03h
bDodgy = FALSE ;
asm {
mov ah, 12h
mov al, 00h
mov bl, 32h
int 10h
} ;
setvect (0x1c, lpOldClockHandler) ;
asm {
int 01h
int 03h
lea bx, lblPatch
mov cs:[bx + 2], 019cdh
lblPatch:
} ;
TestDosVersion () ;
ctrlbrk (CtrlBrkHandler) ;
lpOldCEHandler = getvect (0x24) ;
setvect (0x24, NewCEHandler) ;
GetWindowsStatus () ;
ScrInit () ;
}
void interrupt NewClockHandler (void)
{
if (bDodgy == TRUE)
{
asm cli
Loop:
asm jmp Loop
}
lpOldClockHandler () ;
}
void RestLowLevStuff (void)
{
setvect (0x24, lpOldCEHandler) ;
}
#pragma argsused
void interrupt NewCEHandler (unsigned BP, unsigned DI, unsigned SI,
unsigned DS, unsigned ES, unsigned DX,
unsigned CX, unsigned BX, unsigned AX)
{
enable () ;
AX = HandleCE (DI & 0x00ff, AX, BP, SI) ;
return ;
}
static int HandleCE (int nErrCode, int AX, int BP, int SI)
{
int nLongestStrLen ;
char szErrMessage1 [80], szErrMessage2 [80], szDevice [9], szDrive [20] ;
char szPrompt [] = "Press R to retry operation or ESC to cancel" ;
char far * lpDevAttr ;
static char * szErrors [] =
{
"Write-protected disk ",
"Unknown unit ",
"Not ready ",
"Unknown command " ,
"Data error (CRC) ",
"Bad request-structure length ",
"Seek error ",
"Unknown media type ",
"Sector not found ",
"Printer out of paper ",
"Write fault ",
"Read fault ",
"General failure "
} ;
ceScrPush () ;
DrawMenuBar (NO_DROP_DOWNS, FALSE, FALSE) ;
DrawStatusBar (0) ;
strcpy (szErrMessage1, szErrors [nErrCode]) ;
if (AX & 0x8000) // Character device error or bad FAT:
{
lpDevAttr = MK_FP (BP, SI + 5) ;
if (* lpDevAttr & 0x80) // Character device error.
{
movedata (BP, SI + 10,
FP_SEG ((char far *)szDevice),
FP_OFF ((char far *)szDevice), 8) ;
szDevice [8] = '\x0' ;
sprintf (szErrMessage2, "error accessing device %s", szDevice) ;
}
else
strcpy (szErrMessage2, "(bad memory image of FAT)") ;
}
else // Disk error:
{
sprintf (szDrive, "drive %c", 'A' + AX & 0x00ff) ;
if (nErrCode != 2)
{
if (AX & 0x0100)
strcpy (szErrMessage2, "error writing ") ;
else
strcpy (szErrMessage2, "error reading ") ;
strcat (szErrMessage2, szDrive) ;
}
else
{
strcpy (szErrMessage1, "No disk in ") ;
strcpy (szErrMessage2, szDrive) ;
strcat (szErrMessage2, "!") ;
}
}
strcat (szErrMessage1, szErrMessage2) ;
nLongestStrLen = strlen (szErrMessage1) > strlen (szPrompt)
? strlen (szErrMessage1)
: strlen (szPrompt) ;
DrawBox ("Error", 9, 40 - (nLongestStrLen / 2) - 3,
12, 40 + (nLongestStrLen / 2) + 3) ;
CText (szErrMessage1, nColours [C_ID_NORM], 5, 75, 10) ;
CText (szPrompt, nColours [C_ID_HILIGHT], 5, 75, 11) ;
for (;;)
switch (tolower (KbdGetC () & 0x00ff))
{
case 'r':
ceScrPop () ;
return (1) ;
case ESC_KEY:
ceScrPop () ;
return (3) ;
}
}
int CtrlBrkHandler (void)
{
return (TRUE) ; // Ignore Ctrl+C
}
void TestDosVersion (void)
{
int nMinMaj = 3, nMinMin = 3 ;
if (_osmajor > nMinMaj)
return ;
if (_osmajor == nMinMaj)
if (_osminor >= nMinMin)
return ;
printf ("This program requires MS-DOS %d.%d or greater.\n", nMinMaj, nMinMin) ;
exit (1) ;
}
void GetWindowsStatus (void)
{
_AX = 0x1600 ;
geninterrupt (0x2f) ;
if (_AL == 0x80 || _AL == 0x00)
bWindowsRunning = FALSE ;
else
bWindowsRunning = TRUE ;
}