1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13 ; ;AN002; P1132 & P1136
15 ; ;AN004; P2683 - bad diskette in b:
17 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
18 INCLUDE MAC_EQU
.INC ;AN000;
19 INCLUDE PANEL
.MAC
;AN000;
20 INCLUDE STRUC.INC ;AN000;
21 INCLUDE MACROS
.INC ;AN000;
22 INCLUDE MACROS8
.INC ;AN000;
23 INCLUDE VARSTRUC
.INC ;AN000;
24 INCLUDE EXT
.INC ;AN000;
25 INCLUDE PAN
-LIST
.INC ;AN000;
26 INCLUDE CASEXTRN
.INC ;AN000;
27 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
29 EXTRN HANDLE_PANEL_CALL2
:FAR ;AN000;
30 EXTRN HANDLE_PANEL_CALL3
:FAR ;AN111;JW
31 EXTRN FIND_FILE_ROUTINE
:FAR ;AN000;
32 EXTRN DISPLAY_MESSAGE_ROUTINE
:FAR ;AN000;DT
33 EXTRN BEEP_ROUTINE
:FAR ;AN000;DT
35 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
36 DATA SEGMENT BYTE PUBLIC 'DATA' ;AN000;
37 NULl_DEVICE
DB 'nul',0 ;AN000;
38 CON_DEVICE
DB 'con',0 ;AN000;
39 SUB_PROGRAM
DB 0 ;AN000;
41 PUBLIC DSKCPY_WHICH
,DSKCPY_PAN1
,DSKCPY_PAN2
;AN000;
42 PUBLIC DSKCPY_PAN3
,DSKCPY_OPTION
,DSKCPY_SOURCE
;AN000;
43 DSKCPY_WHICH
DB 0 ;AN000;DT
44 ;DSKCPY_TO_A_720 EQU 0 ;AN000;DT (MACROS8.INC for actual equates)
45 ;DSKCPY_TO_A_360 EQU 1 ;AN000;DT
46 ;DSKCPY_TO_B EQU 2 ;AN000;DT
48 DSKCPY_OPTION
DB 0 ;AN000;DT
49 ;SOURCE1 EQU 0 ;AN000;DT
50 ;NO_SOURCE1 EQU 1 ;AN000;DT
52 DSKCPY_SOURCE
DW 0 ;AN000;DT offset of filename to check for on diskette
53 DSKCPY_PAN1
DW 0 ;AN000;DT
54 DSKCPY_PAN2
DW 0 ;AN000;DT
55 DSKCPY_PAN3
DW 0 ;AN000;DT
57 PUBLIC DSKCPY_ERR
;AN000;
58 DSKCPY_ERR
DB 0 ;AN000;
61 DATA ENDS
;AN000; DATA
62 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
64 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
65 EXTRN CHK_W_PROTECT_FLAG
:BYTE ;AN000;
66 EXTRN W_PROTECT_FLAG
:BYTE ;AN000;
67 EXTRN EXIT_SELECT
:FAR ;AN000;
68 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
71 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
72 CODE_FAR
SEGMENT PARA
PUBLIC 'CODE' ;AN000; Segment for far routine
73 ASSUME
CS:CODE_FAR
,DS:DATA ;AN000;
74 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
76 ; The critical error handler. This routine should be placed in the CODE segment.
78 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
79 OLD_STACK_SEG
DW ?
;AN001;GHG
80 OLD_STACK_OFF
DW ?
;AN001;GHG
82 PUBLIC INT_24_VECTOR
;AN000;
83 INT_24_VECTOR: ;AN000;
85 PUSHH
<BX,CX,DX,SI,DI,ES,DS> ;AN000;
90 MOV AX,CS ;AN002;S;GHG
92 MOV OLD_STACK_SEG
,SS ;AN002;S;GHG
93 MOV OLD_STACK_OFF
,SP ;AN002;S;GHG
94 MOV SS,AX ;AN002;S;GHG
95 LEA SP,NEW_STACK_START
;AN002;S;GHG
98 AND DI, 0FFH ;AN000; Mask off the high byte
99 .IF < CHK_W_PROTECT_FLAG
EQ TRUE
> ;AN000; Is this a check for write protect?
100 .IF < DI EQ 0 > ;AN000; Is this a write protect error?
101 MOV W_PROTECT_FLAG
, TRUE
;AN000; If so, indicate to the calling program
103 MOV AL, 3 ;AN000; Get DOS to trash this call
104 JMP EXIT_THE_INT
;AN000; Exit the interrupt
107 .IF < DI eq 0 > ;AN002;GHG
108 HANDLE_ERROR PAN_WRITE_PROT
,2 ;AN002;GHG
110 .ELSEIF
< DI eq 2 > ;AN002;GHG
111 HANDLE_ERROR PAN_DRIVE_ERROR
,2 ;AN002;GHG
114 .IF < SUB_PROGRAM
EQ TRUE
> ;AN000;
115 JMP END_SUB_PROGRAM
;AN000;
117 MOV AL, 3 ;AN000; Fail this system call
119 EXIT_THE_INT: ;AN000;
120 MOV SS,OLD_STACK_SEG
;AN002;S;GHG
121 MOV SP,OLD_STACK_OFF
;AN002;S;GHG
122 POPP
<DS,ES,DI,SI,DX,CX,BX> ;AN000;
123 IRET ;AN000; Return from the interrupt
125 END_SUB_PROGRAM: ;AN000;
126 MOV SS,OLD_STACK_SEG
;AN002;S;GHG
127 MOV SP,OLD_STACK_OFF
;AN002;S;GHG
128 POPP
<DS,ES,DI,SI,DX,CX,BX> ;AN000;
134 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
136 ; The DISKCOPY INT 2F INTERFACE
138 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
141 NEW_STACK
DW 200 DUP('S') ;AN001;GHG
142 NEW_STACK_START
DW 0 ;AN001;GHG
144 FIRST_CALL
DB 0 ;AN001;GHG
146 PUBLIC INT_2F_VECTOR
;AN001;GHG
147 INT_2F_VECTOR: ;AN001;GHG
148 .IF < AX EQ 0ADC1H > near ;AN001;GHG
150 PUSHH
<BX,CX,DX,SI,DI,ES,DS> ;AN001;GHG
151 MOV AX,DATA ;AN001;GHG
155 MOV AX,CS ;AN001;S;GHG
157 MOV OLD_STACK_SEG
,SS ;AN001;S;GHG
158 MOV OLD_STACK_OFF
,SP ;AN001;S;GHG
159 MOV SS,AX ;AN001;S;GHG
160 LEA SP,NEW_STACK_START
;AN001;S;GHG
164 .IF < DSKCPY_WHICH
eq DSKCPY_TO_B
> near ;AN000;DT
166 .IF < BX EQ 9 > and ;AN000;DT
167 .IF < DSKCPY_PAN1 ne NOPANEL
> ;AN000;DT
169 MOV BX,PAN_INSTALL_DOS
;AN000;DT
170 MOV AX,DSKCPY_PAN1
;AN000;DT
171 CALL HANDLE_PANEL_CALL2
;AN000;DT
172 CALL HANDLE_KEYSTROKE
;AN000;DT
173 MOV DI, DSKCPY_SOURCE
;AN000;DT
175 CALL FIND_FILE_ROUTINE
;AN000;DT
176 .LEAVE < nc
> ;AN000;DT
177 MOV BX,ERR_DOS_DISK
;AN000;DT
178 CALL INT2F_ERROR
;AN000;DT
182 MOV BX,PAN_INSTALL_DOS
;AN000;DT
183 MOV AX,DSKCPY_PAN2
;AN000;DT
184 CALL HANDLE_PANEL_CALL2
;AN000;DT
186 .ELSEIF
<BX eq 13 > ;AN000;DT
187 MOV BX,PAN_DRIVE_ERROR
;AN000;
188 CALL INT2F_ERROR
;AN000;DT
190 .ELSEIF
<BX eq 14 > ;AN001;GHG write protect
191 MOV BX,PAN_WRITE_PROT
;AN000;
192 CALL INT2F_ERROR
;AN000;DT
194 .ELSEIF
<BX eq 23 > or ;AN004;JW
195 .IF <BX eq 11 > or ;AN004;JW
196 .IF <BX eq 12 > or ;AN004;JW
197 .IF <BX eq 18 > or ;AN004;JW
198 .IF <BX eq 20 > ;AN004;JW
199 MOV BX,PAN_BAD_DISKET
;AN004;JW Bad diskette in b:
200 CALL INT2F_ERROR
;AN004;JW
201 MOV N_DSKCPY_ERR
,E_DSKCPY_RETRY
;AN004;JW
203 .ELSEIF
<BX eq 16 > ;AN001;GHG
204 MOV FIRST_CALL
,0 ;AN001;GHG
205 .ELSEIF
<BX ne
2 > and ;AN001;GHG
206 .IF <BX ne
7 > and ;AN001;GHG
207 .IF <BX ne
8 > and ;AN001;GHG
208 .IF <BX ne
9 > and ;AN000;DT
209 .IF <BX ne
10 > and ;AN003;JW
210 .IF <BX ne
15 > and ;AN001;GHG
211 .IF <BX ne
17 > and ;AN001;GHG
212 .IF <BX ne
21 > and ;AN001;GHG
213 .IF <BX ne
26 > ;AN001;GHG
214 MOV BX,ERR_GENERAL
;AN000;
215 CALL INT2F_ERROR
;AN000;DT
217 MOV AX,0FFFFH ;AN000;DT
219 .ELSEIF
< DSKCPY_WHICH
eq DSKCPY_TO_A_360
> near ;AN000;DT
220 .IF < BX EQ 8 > ;AN001;GHG
221 .IF < DSKCPY_OPTION
eq SOURCE1
> or;AN000;
222 .IF <FIRST_CALL ne
0 > ;AN001;GHG
224 MOV BX,PAN_INSTALL_DOS
;AN000;DT
225 MOV AX,DSKCPY_PAN1
;AN000;DT
226 CALL HANDLE_PANEL_CALL2
;AN000;DT
227 CALL HANDLE_KEYSTROKE
;AN000;DT
229 MOV DI, DSKCPY_SOURCE
;AN000;DT
231 CALL FIND_FILE_ROUTINE
;AN000;DT
232 .LEAVE < nc
> ;AN000;DT
233 MOV BX,ERR_DOS_DISK
;AN000;DT
234 CALL INT2F_ERROR
;AN000;DT
238 MOV BX,PAN_INSTALL_DOS
;AN000;DT
239 MOV AX,DSKCPY_PAN2
;AN000;DT
240 CALL HANDLE_PANEL_CALL2
;AN000;DT
241 MOV FIRST_CALL
,1 ;AN000;GHG
242 .ELSEIF
<BX eq 9 > ;AN001;GHG
243 MOV BX,PAN_INSTALL_DOS
;AN000;DT
244 MOV AX,DSKCPY_PAN3
;AN000;DT
245 CALL HANDLE_PANEL_CALL2
;AN000;DT
246 CALL HANDLE_KEYSTROKE
;AN000;DT
247 MOV BX,PAN_INSTALL_DOS
;AN000;DT
248 MOV AX,DSKCPY_PAN2
;AN000;DT
249 CALL HANDLE_PANEL_CALL2
;AN000;DT
250 .ELSEIF
<BX eq 13 > ;AN000;DT
251 MOV BX,PAN_DRIVE_ERROR
;AN000;
252 CALL INT2F_ERROR
;AN000;DT
254 .ELSEIF
<BX eq 14 > ;AN001;GHG write protect
255 MOV BX,PAN_WRITE_PROT
;AN000;
256 CALL INT2F_ERROR
;AN000;
258 .ELSEIF
<BX eq 23 > or ;AN004;JW
259 .IF <BX eq 11 > or ;AN004;JW
260 .IF <BX eq 12 > or ;AN004;JW
261 .IF <BX eq 18 > or ;AN004;JW
262 .IF <BX eq 20 > ;AN004;JW
263 MOV BX,PAN_BAD_DISKET
;AN004;JW Bad diskette in b:
264 CALL INT2F_ERROR
;AN004;JW
265 MOV N_DSKCPY_ERR
,E_DSKCPY_RETRY
;AN004;JW
267 .ELSEIF
<BX eq 16 > ;AN001;GHG
268 MOV FIRST_CALL
,0 ;AN001;GHG
269 .ELSEIF
<BX ne
2 > and ;AN001;GHG
270 .IF <BX ne
7 > and ;AN001;GHG
271 .IF <BX ne
10 > and ;AN003;JW
272 .IF <BX ne
15 > and ;AN001;GHG
273 .IF <BX ne
17 > and ;AN001;GHG
274 .IF <BX ne
21 > and ;AN001;GHG
275 .IF <BX ne
26 > ;AN001;GHG
276 MOV BX,ERR_GENERAL
;AN000;
277 CALL INT2F_ERROR
;AN000;
280 MOV AX,0FFFFH ;AN001;GHG
282 .IF < BX EQ 9 > ;AN001;GHG
283 MOV AX,PAN_DSKCPY_SRC
;AN001;GHG
284 CALL HANDLE_PANEL_CALL
;AN001;GHG
285 CALL HANDLE_KEYSTROKE
;AN001;GHG
286 MOV AX,PAN_DSKCPY_CPY
;AN001;GHG
287 CALL HANDLE_PANEL_CALL
;AN001;GHG
288 .ELSEIF
<BX eq 8 > ;AN001;GHG
289 .IF <FIRST_CALL ne
0 > ;AN001;GHG
290 MOV AX,PAN_DSKCPY_TAR
;AN001;GHG
291 CALL HANDLE_PANEL_CALL
;AN001;GHG
292 CALL HANDLE_KEYSTROKE
;AN001;GHG
294 MOV FIRST_CALL
,1 ;AN001;GHG
296 MOV AX,PAN_DSKCPY_CPY
;AN001;GHG
297 CALL HANDLE_PANEL_CALL
;AN001;GHG
298 .ELSEIF
<BX eq 16 > ;AN001;GHG
299 MOV AX,0FFFFH ;AN001;GHG
300 MOV FIRST_CALL
,0 ;AN001;GHG
301 JMP INT2F_1
;AN001;GHG
302 .ELSEIF
<BX eq 13 > ;AN000;DT drive not ready
303 MOV BX,PAN_DRIVE_ERROR
;AN000;
304 CALL INT2F_ERROR
;AN000;DT
305 .ELSEIF
<BX eq 14 > ;AN001;GHG write protect
306 MOV BX,PAN_WRITE_PROT
;AN000;
307 CALL INT2F_ERROR
;AN000;DT
308 .ELSEIF
<BX eq 23 > or ;AN004;JW
309 .IF <BX eq 11 > or ;AN004;JW
310 .IF <BX eq 12 > or ;AN004;JW
311 .IF <BX eq 18 > or ;AN004;JW
312 .IF <BX eq 20 > ;AN004;JW
313 MOV BX,PAN_BAD_DISKET
;AN004;JW Bad diskette in b:
314 CALL INT2F_ERROR
;AN004;JW
315 MOV N_DSKCPY_ERR
,E_DSKCPY_RETRY
;AN004;JW
317 .ELSEIF
<BX ne
2 > and ;AN001;GHG
318 .IF <BX ne
7 > and ;AN001;GHG
319 .IF <BX ne
10 > and ;AN001;GHG
320 .IF <BX ne
15 > and ;AN001;GHG
321 .IF <BX ne
17 > and ;AN001;GHG
322 .IF <BX ne
21 > and ;AN001;GHG
323 .IF <BX ne
26 > ;AN001;GHG
324 MOV BX,ERR_GENERAL
;AN000;
325 CALL INT2F_ERROR
;AN000;DT
328 MOV AX,0FFFFH ;AN001;GHG
332 INT2F_1: MOV SS,OLD_STACK_SEG
;AN001;S;GHG
333 MOV SP,OLD_STACK_OFF
;AN001;S;GHG
336 POPP
<DS,ES,DI,SI,DX,CX,BX> ;AN001;GHG
341 JMP CS:OLD_INT_2F
;AN001;GHG
343 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
345 ; The FORMAT INT2F interrupt routine
347 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
348 PUBLIC INT_2F_FORMAT
;AN111;JW
349 INT_2F_FORMAT: ;AN111;JW
350 .IF < AX EQ 0ADC1H > near ;AN111;JW
352 PUSHH
<BX,CX,DX,SI,DI,ES,DS> ;AN111;JW
353 MOV AX,DATA ;AN111;JW
359 MOV OLD_STACK_SEG
,SS ;AN111;JW
360 MOV OLD_STACK_OFF
,SP ;AN111;JW
362 LEA SP,NEW_STACK_START
;AN111;JW
365 .IF < FORMAT_WHICH
eq STARTUP
> ;AN111;JW
366 MOV AX,SUB_INS_STARTT_S360
;AN111;JW
368 MOV AX,SUB_INS_SHELL_S360
;AN111;JW
370 MOV BX,PAN_INST_PROMPT
;AN111;JW
371 CALL HANDLE_PANEL_CALL2
;AN111;JW
372 CALL HANDLE_KEYSTROKE
;AN111;JW
374 .IF < FORMAT_WHICH
eq STARTUP
> ;AN111;JW
375 MOV AX,FORMAT_STARTUP
;AN111;JW
377 MOV AX,FORMAT_SHELL
;AN111;JW
379 CALL HANDLE_PANEL_CALL3
;AN111;JW
381 MOV SS,OLD_STACK_SEG
;AN111;JW
382 MOV SP,OLD_STACK_OFF
;AN111;JW
383 POPP
<DS,ES,DI,SI,DX,CX,BX> ;AN111;JW
386 JMP CS:OLD_INT_2F
;AN111;JW
388 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
390 ; The DISKCOPY INT 2F ERROR ROUTINE
392 ; Input: BX = error panel
396 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
397 INT2F_ERROR PROC
NEAR ;AN000;DT
398 MOV CX,2 ;AN000;DT allow ESC and ENTER
399 CALL HANDLE_ERROR_CALL
;AN000;DT display error panel
400 JNC INT2F_ERROR_EXIT
;AN000;DT if ENTER pressed, then ok
402 MOV DSKCPY_ERR
,DSKCPY_EXIT
;AN000;DT indicate user wants to exit
403 MOV AX,4C01H
;AN000;DT and error message already up DOS
404 INT 21H
;AN000;DT exit with error
406 INT2F_ERROR_EXIT: ;AN000;DT
408 INT2F_ERROR ENDP
;AN000;DT
411 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
413 ; The DISKCOPY INT 2F INTERFACE (256KB DISKCOPY)
415 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
416 PUBLIC INT_2F_256KB
;AN000;DT
417 INT_2F_256KB: ;AN000;DT
418 .IF < AX EQ 0ADC1H > near ;AN000;DT
420 PUSHH
<BX,CX,DX,SI,DI,ES,DS> ;AN000;DT
421 MOV AX,DATA ;AN000;DT
427 MOV OLD_STACK_SEG
,SS ;AN000;DT
428 MOV OLD_STACK_OFF
,SP ;AN000;DT
430 LEA SP,NEW_STACK_START
;AN000;DT
432 .IF < BX EQ 9 > ;AN000;DT
433 CLEAR_SCREEN
;AN000;DT
434 DISPLAY_MESSAGE
14 ;AN000;DT insert INSTALL
435 CALL HANDLE_KEY256KB
;AN000;DT
436 CLEAR_SCREEN
;AN000;DT
437 DISPLAY_MESSAGE
15 ;AN000;DT Copying diskettes
438 .ELSEIF
<BX eq 8 > ;AN000;DT
439 .IF <FIRST_CALL ne
0 > ;AN000;DT
440 CLEAR_SCREEN
;AN000;DT
441 DISPLAY_MESSAGE
13 ;AN000;DT insert INSTALL COPY
442 CALL HANDLE_KEY256KB
;AN000;DT
444 MOV FIRST_CALL
,1 ;AN000;DT
446 CLEAR_SCREEN
;AN000;DT
447 DISPLAY_MESSAGE
15 ;AN000;DT Copying diskettes
448 .ELSEIF
<BX eq 16 > ;AN000;DT
449 MOV AX,0FFFFH ;AN000;DT
450 MOV FIRST_CALL
,0 ;AN000;DT
451 JMP INT2F_1_ALT
;AN000;DT
452 .ELSEIF
<BX eq 13 > ;AN000;DT
453 CLEAR_SCREEN
;AN000;DT
454 DISPLAY_MESSAGE
16 ;AN000;DT Drive door open
455 CALL INT2F_ERRALT
;AN000;DT
456 .ELSEIF
<BX eq 14 > ;AN000;DT
457 CLEAR_SCREEN
;AN000;DT
458 DISPLAY_MESSAGE
17 ;AN000;DT Write Protect error
459 CALL INT2F_ERRALT
;AN000;DT
461 .ELSEIF
<BX ne
2 > and ;AN000;DT
462 .IF <BX ne
7 > and ;AN000;DT
463 .IF <BX ne
10 > and ;AN000;DT
464 .IF <BX ne
15 > and ;AN000;DT
465 .IF <BX ne
17 > and ;AN000;DT
466 .IF <BX ne
21 > and ;AN000;DT
467 .IF <BX ne
26 > ;AN000;DT
468 CLEAR_SCREEN
;AN000;DT
469 DISPLAY_MESSAGE
18 ;AN000;DT General error
470 CALL INT2F_ERRALT
;AN000;DT
473 MOV AX,0FFFFH ;AN000;DT
475 INT2F_1_ALT: MOV SS,OLD_STACK_SEG
;AN000;DT
476 MOV SP,OLD_STACK_OFF
;AN000;DT
478 POPP
<DS,ES,DI,SI,DX,CX,BX> ;AN000;DT
481 JMP CS:OLD_INT_2F
;AN000;DT
484 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
486 ; The DISKCOPY INT 2F ERROR ROUTINE (256KB)
488 ; Input: BX = error panel
492 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
493 INT2F_ERRALT PROC
NEAR ;AN000;DT
496 INT 16H
;AN000;DT get keystroke
497 CMP AL,13 ;AN000;DT If ENTER the continue
498 JE INT2F_ERRALT_EXIT
;AN000;DT
499 CMP AL,27 ;AN000;DT If not ESC the again
500 JE INT2F_ALT_ABORT
;AN000;
501 DISPLAY_MESSAGE
11 ;AN000;DT BEEP
502 JMP INT2F_AGN
;AN000;DT
503 INT2F_ALT_ABORT: ;AN000;DT else ESC
504 MOV DSKCPY_ERR
,DSKCPY_EXIT
;AN000;DT indicate user wants to exit
505 MOV AX,4C01H
;AN000;DT and error message already up DOS
506 INT 21H
;AN000;DT exit with error
508 INT2F_ERRALT_EXIT: ;AN000;DT
510 INT2F_ERRALT ENDP
;AN000;DT
512 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
514 ; The INT23 interrupt routine (CTRL-BREAK)
516 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
518 PUBLIC INT_23_VECTOR
;AN074;SEH
519 INT_23_VECTOR: ;AN074;SEH
521 IRET ;AN074;SEH ignore ctrl-break and return
523 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
525 ; The DISKCOPY GET KEY ROUTINE (256KB)
531 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
532 HANDLE_KEY256KB PROC
NEAR ;AN000;DT
535 INT 16H
;AN000;DT get keystroke
536 CMP AL,13 ;AN000;DT If ENTER the continue
537 JE HAKEY_EXIT
;AN000;DT
538 DISPLAY_MESSAGE
11 ;AN000;DT BEEP
539 JMP HAKEY_AGN
;AN000;DT
541 HAKEY_EXIT: ;AN000;DT
543 HANDLE_KEY256KB ENDP
;AN000;DT
545 CODE_FAR ENDS
;AN000;