Subversion Repositories SvarDOS

Rev

Rev 1864 | Rev 1867 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1864 Rev 1866
Line 457... Line 457...
457
;
457
;
458
; =============================================================================
458
; =============================================================================
459
HANDLER_24H:    ; +46Ch
459
HANDLER_24H:    ; +46Ch
460
 
460
 
461
; save registers so I can restore them later
461
; save registers so I can restore them later
-
 
462
; this is not needed, DOS saves it already before calling the int 24h handler
462
push ax
463
;push ax
463
push bx
464
;push bx
464
push cx
465
;push cx
465
push dx
466
;push dx
466
push ds
467
;push ds
467
pushf
468
;pushf
468
 
469
 
469
; set DS to myself
470
; set DS to myself
470
push cs
471
push cs
471
pop ds
472
pop ds
472
 
473
 
Line 506... Line 507...
506
hlt;
507
hlt;
507
jmp HALT
508
jmp HALT
508
 
509
 
509
DISKERROR:
510
DISKERROR:
510
; disk errors produce this message:
511
; disk errors produce this message:
511
; CRITICAL ERROR - DRIVE A: - READ|WRITE FAILURE
512
; A: - READ|WRITE FAILURE
512
; (A)bort, (R)etry, (F)ail
513
; (A)bort, (R)etry, (I)gnore, (F)ail
513
mov dh, ah      ; backup AH flags into CH
514
mov ch, ah      ; backup AH flags into CH
514
add al, 'A'
515
add al, 'A'
515
mov [CRITERRDISK+6], al
516
mov [CRITERRDISK], al
516
mov ah, 0x09
517
mov ah, 0x09
517
mov dx, CRITERR
-
 
518
int 0x21
-
 
519
mov dx, CRITERRDISK
518
mov dx, CRITERRDISK
520
int 0x21
519
int 0x21
521
; READ / WRITE (test flag 0x01, set = write, read otherwise)
520
; READ / WRITE (test flag 0x01, set = write, read otherwise)
522
mov dx, CRITERRDSK_WRITE
521
mov dx, CRITERRDSK_WRITE
523
test ch, 1
522
test ch, 1
524
jnz WRITE
523
jnz WRITE
525
mov dx, CRITERRDSK_READ
524
mov dx, CRITERRDSK_READ
526
WRITE:
525
WRITE:
527
int 0x21
526
int 0x21
-
 
527
mov dx, CRLF
-
 
528
int 0x21
-
 
529
; print available options (abort=always, 0x10=retry, 0x20=ignore, 0x08=fail)
-
 
530
CRITERR_ASKCHOICE:
-
 
531
mov dx, CRITERR_ABORT
-
 
532
int 0x21
-
 
533
; retry?
-
 
534
test ch, 0x10
-
 
535
jz NORETRY
-
 
536
mov dx, CRITERR_COMMA
-
 
537
int 0x21
-
 
538
mov dx, CRITERR_RETRY
-
 
539
int 0x21
-
 
540
NORETRY:
-
 
541
; ignore?
-
 
542
test ch, 0x20
-
 
543
jz NOIGNORE
-
 
544
mov dx, CRITERR_COMMA
-
 
545
int 0x21
-
 
546
mov dx, CRITERR_IGNOR
-
 
547
int 0x21
-
 
548
NOIGNORE:
-
 
549
; fail?
-
 
550
test ch, 0x08
-
 
551
jz NOFAIL
-
 
552
mov dx, CRITERR_COMMA
-
 
553
int 0x21
528
mov dx, CRITERRDSK_FAIL
554
mov dx, CRITERR_FAIL
-
 
555
int 0x21
-
 
556
NOFAIL:
-
 
557
; output "? "
-
 
558
mov ah, 0x06
-
 
559
mov dl, '?'
-
 
560
int 0x21
-
 
561
mov dl, ' '
529
int 0x21
562
int 0x21
530
jmp HALT
-
 
531
 
563
 
532
; restore registers and quit the handler
564
; wait for user key press and return (iret) with AL set accordingly:
533
popf
-
 
534
pop ds
565
;   AL=0  ignore
535
pop dx
-
 
536
pop cx
566
;   AL=1  retry
537
pop bx
567
;   AL=2  abort
538
pop ax
568
;   AL=3  fail
539
 
569
 
-
 
570
mov ah, 0x07  ; key input, no ctrl+c check
-
 
571
int 0x21
-
 
572
and al, 0xdf   ; switch AL to upper-case so key check is case-insensitive
-
 
573
mov cl, al     ; save pressed key in CL (AL is easily overwritten by DOS calls)
-
 
574
; print the pressed key
-
 
575
mov ah, 0x06
-
 
576
mov dl, cl
-
 
577
int 0x21
-
 
578
mov ah, 0x09
-
 
579
mov dx, CRLF
-
 
580
int 0x21
-
 
581
 
-
 
582
; was it abort?
-
 
583
cmp cl, [CRITERR_KEYS]
-
 
584
jne SKIP_ABORT
-
 
585
mov ah, 0x09
-
 
586
mov dx, CRITERRSYST
-
 
587
int 0x21
-
 
588
mov al, 2     ; AL=2 -> "abort"
-
 
589
iret
-
 
590
SKIP_ABORT:
-
 
591
; if retry is allowed - was it retry?
-
 
592
test ch, 0x10
-
 
593
jz SKIP_RETRY
-
 
594
cmp cl, [CRITERR_KEYS+1]
-
 
595
jne SKIP_RETRY
-
 
596
mov al, 1     ; AL=1 -> "retry"
-
 
597
iret
-
 
598
SKIP_RETRY:
-
 
599
; if ignore is allowed - was it ignore?
-
 
600
test ch, 0x20
-
 
601
jz SKIP_IGN
-
 
602
cmp cl, [CRITERR_KEYS+2]
-
 
603
jne SKIP_IGN
-
 
604
xor al, al    ; AL=0 -> "ignore"
540
iret
605
iret
-
 
606
SKIP_IGN:
-
 
607
; if fail is allowed - was it fail?
-
 
608
test ch, 0x08
-
 
609
;jz SKIP_FAIL
-
 
610
cmp cl, [CRITERR_KEYS+3]
-
 
611
jne SKIP_FAIL
-
 
612
mov al, 3     ; AL=3 -> "fail"
-
 
613
iret
-
 
614
SKIP_FAIL:
-
 
615
 
-
 
616
jmp CRITERR_ASKCHOICE   ; invalid answer -> ask again
541
 
617
 
-
 
618
; restore registers and quit the handler
-
 
619
;popf
-
 
620
;pop ds
-
 
621
;pop dx
-
 
622
;pop cx
-
 
623
;pop bx
-
 
624
;pop ax
-
 
625
 
-
 
626
 
542
CRITERR db "CRITICAL ERROR - $"
627
CRITERR db "CRITICAL ERROR $"
543
CRITERRSYST db "#XXX SYSTEM HALTED$"
628
CRITERRSYST db "#XXX - SYSTEM HALTED$"
544
CRITERRDISK db "DRIVE @: - $"
629
CRITERRDISK db "@: - $"
545
CRITERRDSK_READ db "READ$"
630
CRITERRDSK_READ db "READ FAILURE$"
546
CRITERRDSK_WRITE db "WRITE$"
631
CRITERRDSK_WRITE db "WRITE FAILURE$"
-
 
632
CRLF db 0x0A, 0x0D, "$"
-
 
633
CRITERR_ABORT db "(A)bort$"
-
 
634
CRITERR_RETRY db "(R)etry$"
-
 
635
CRITERR_IGNOR db "(I)gnore$"
547
CRITERRDSK_FAIL db " FAILURE$"
636
CRITERR_FAIL  db "(F)ail$"
-
 
637
CRITERR_KEYS  db "ARIF"
-
 
638
CRITERR_COMMA db ", $"