Hемедленно нажми на RESET, lvd!

On Sat, 24 Sep 05 21:44:14 +0400, lvd wrote:

l> Как сделать сабж? Хочется, чтобы 1 - не выдавалась дурацкая надпись
l> ретри-аборт-игноре и иже с ними, 2 - чтобы таки я смог узнать, что была-не была
l> ошибка. Тип ошибки узнать не требуется.
В регистрах всё как при вызове #3D13. Внешние переменные:

int_mode -- режим прерываний: 0, 1, 2.
in_trdos -- не равно 0 при вызове функций tr-dos.

Hа выходе: флаг C установлен если произошла ошибка (была перехвачена),
в противном случае флаг C сброшен. Тип ошибки не возвращается, но
там вариантов-то по моему и не особо много: ошибка чтения/записи,
защита записи. Можно посмотреть в переменные TR-DOS. Да, разумеется
сами функции #3D13 могут возвращать признак ошибки без дурацкой надписи
и проверять всё равно надо (поиск файла, например), для чтения-записи
секторов не актуально конечно.

EXPORT global trdos
; call 0x3d13 in safe way
; CF=1 признак фатального завершения
trdos:
ex af, af'
exx
ld hl, 0x5cc2
ld a, (hl)
push af
ld (hl), 0xc3
ld hl, (0x5cc3)
push hl
ld hl, trdos_catch
ld (0x5cc3), hl
ld hl, (0x5c3d)
push hl
ld hl, trdos_fail
push hl
ld hl, 0
ld (0x5d0f), hl
add hl, sp
ld (trdos_sp), hl
ld (0x5c3d), hl
ld hl, in_trdos
ld (hl), 1 ; for im 2
; DOES NOT WORK!
im 1
ld hl, 0x2758
ld iy, 0x5c3a
exa
exx
call 0x3d13
exa
xor a
ld (in_trdos), a
ld a, (int_mode)
cp 2
jr c,trdos_im0
im 2
trdos_im0:
exx
pop hl
pop hl
ld (0x5c3d), hl
pop hl
ld (0x5cc3), hl
pop af
ld (0x5cc2), a
ld hl, 0x2758
exx
exa
or a
ret

trdos_catch:
ex (sp), hl
push af
push de
push hl
ld a, l
or 0x05
ld l, a
ld de, 0-0x0d6f ; 0d6e, 0d6b
adc hl, de
jr z, trdos_fail0
pop hl
pop de
pop af
ex (sp), hl
ret

trdos_fail0:
ld sp, 0
trdos_sp equ $-2
ret

trdos_fail:
xor a
ld (in_trdos), a
ld a, (int_mode)
cp 2
jr c,trdos_im1
im 2
trdos_im1:
pop hl
ld (0x5c3d), hl
pop hl
ld (0x5cc3), hl
pop af
ld (0x5cc2), a
scf
ret

ENDEXP