@@ -191,17 +191,36 @@ STOP$3: .ASCII <10.>/ src line /
191191;## Need WRST
192192;## Need WRINT
193193; Показ сообщения об ошибке времени выполнения.
194- ; На входе: R0 = номер ошибки, R5 = адрес откуда вызвана процедура.
194+ ; На входе: R5 = адрес откуда вызвана процедура, в которой произошла ошибка.
195+ ; Использование:
196+ ; CALL ERRR
197+ ; .WORD 1234. ; Номер ошибки
195198ERRR:
196- MOV R0 , -(SP)
199+ MOV R5 , -(SP) ; сохраняем адрес
197200 MOV #ERRO$, R0
198201 CALL WRST
199- MOV (SP)+, R0 ; номер ошибки
202+ MOV 2(SP), R0 ; откуда вызвана ERRR
203+ MOV (R0), R0 ; номер ошибки
200204 CALL WRINT
201- ;TODO: Вывести " AT " и адрес R5 в восьмеричном виде
205+ MOV (SP)+, R5 ; адрес откуда вызвали
206+ ; Формируем 8-ричное представление числа R5 в ERRR$
207+ MOV #6, R2 ; счетчик цифр
208+ MOV #ERRR$+5+6, R1 ; указатель на адрес за концом буфера
209+ 1$: MOV R5, R0 ; копия для выделения младших 3 бит
210+ BIC #177770, R0 ; оставить только 0..7
211+ ADD #'0, R0 ; преобразовать в ASCII-символ
212+ MOVB R0, -(R1) ; записать символ в буфер
213+ ASR R5 ; сдвиг числа вправо на 3 бита
214+ ASR R5
215+ ASR R5
216+ SOB R2, 1$ ; повторить
217+ ; Вывести " AT " и адрес R5 в восьмеричном виде
218+ MOV #ERRR$, R0
219+ CALL WRST
202220 BR . ; зацикливаемся здесь
203221;
204222ERRO$: .ASCII <6>/ERROR /
223+ ERRR$: .ASCII <10.>/ AT 000000/
205224 .EVEN
206225
207226;#####################################################################
@@ -299,8 +318,8 @@ IMUL:
299318 RETURN ; возврат
300319;
301320IMULOV: MOV (SP), R5 ; откуда вызвали
302- MOV #1706., R0 ; Ошибка: переполнение
303- JMP ERRR
321+ CALL ERRR
322+ .WORD 1706. ; Ошибка: переполнение
304323
305324;#####################################################################
306325;## IDIV
@@ -320,11 +339,11 @@ IDIV:
320339 RETURN
321340;
322341IDIV0: MOV (SP), R5 ; откуда вызвали
323- MOV #1811., R0 ; Ошибка: деление на ноль
324- JMP ERRR
342+ CALL ERRR
343+ .WORD 1811. ; Ошибка: деление на ноль
325344IDIVOV: MOV (SP), R5 ; откуда вызвали
326- MOV #1806., R0 ; Ошибка: переполнение
327- JMP ERRR
345+ CALL ERRR
346+ .WORD 1806. ; Ошибка: переполнение
328347
329348;#####################################################################
330349;## ITOF
@@ -417,8 +436,8 @@ FTOI:
417436 BCS 6$ ; если знак отрицательный, -32768 допустим
418437;
419438FTOIOV: MOV (SP), R5 ; откуда вызвали
420- MOV #2006., R0 ; Ошибка: недопустимое значение или переполнение
421- JMP ERRR
439+ CALL ERRR
440+ .WORD 2006. ; Ошибка: недопустимое значение или переполнение
422441
423442;#####################################################################
424443;## FFIX
@@ -1263,8 +1282,8 @@ FSQR$E: MOV R0, (SP) ;
12631282FSQR$X: JMP @#000000 ; возврат, адрес подставляется в начале
12641283;
12651284FSQR$K: MOV FSQR$X+2, R5 ; откуда вызвали
1266- MOV #3605., R0 ; Ошибка: корень из отрицательного числа
1267- JMP ERRR
1285+ CALL ERRR
1286+ .WORD 3605. ; Ошибка: корень из отрицательного числа
12681287
12691288;#####################################################################
12701289;## FCOS
@@ -1410,8 +1429,8 @@ FTAN:
14101429 RETURN ; возврат
14111430;
14121431FTAN$0: MOV (SP), R5 ; откуда вызвали
1413- MOV #4111., R0 ; Ошибка: деление на ноль
1414- JMP ERRR
1432+ CALL ERRR
1433+ .WORD 4111. ; Ошибка: деление на ноль
14151434
14161435;#####################################################################
14171436;## FATN
@@ -1585,11 +1604,11 @@ REAI:
15851604 JMP REST ; делаем RESTORE на этот дескриптор
15861605;
15871606REAI$O: MOV (SP), R5 ; откуда вызвали
1588- MOV #4604., R0 ; Ошибка: чтение за концом данных
1589- JMP ERRR
1607+ CALL ERRR
1608+ .WORD 4604. ; Ошибка: чтение за концом данных
15901609REAI$T: MOV (SP), R5 ; откуда вызвали
1591- MOV #4613., R0 ; Ошибка: несоответствие типов данных
1592- JMP ERRR
1610+ CALL ERRR
1611+ .WORD 4613. ; Ошибка: несоответствие типов данных
15931612
15941613;#####################################################################
15951614;## REAF
@@ -1629,11 +1648,11 @@ REAF:
16291648 JMP REST ; делаем RESTORE на этот дескриптор
16301649;
16311650REAF$O: MOV (SP), R5 ; откуда вызвали
1632- MOV #4704., R0 ; Ошибка: чтение за концом данных
1633- JMP ERRR
1651+ CALL ERRR
1652+ .WORD 4704. ; Ошибка: чтение за концом данных
16341653REAF$T: MOV (SP), R5 ; откуда вызвали
1635- MOV #4713., R0 ; Ошибка: несоответствие типов данных
1636- JMP ERRR
1654+ CALL ERRR
1655+ .WORD 4713. ; Ошибка: несоответствие типов данных
16371656
16381657;#####################################################################
16391658;## REAS
@@ -1663,11 +1682,11 @@ REAS:
166316828$: JMP REST ; делаем RESTORE на этот дескриптор
16641683;
16651684REAS$O: MOV (SP), R5 ; откуда вызвали
1666- MOV #4804., R0 ; Ошибка: чтение за концом данных
1667- JMP ERRR
1685+ CALL ERRR
1686+ .WORD 4804. ; Ошибка: чтение за концом данных
16681687REAS$T: MOV (SP), R5 ; откуда вызвали
1669- MOV #4813., R0 ; Ошибка: несоответствие типов данных
1670- JMP ERRR
1688+ CALL ERRR
1689+ .WORD 4813. ; Ошибка: несоответствие типов данных
16711690
16721691;#####################################################################
16731692;## INKEY
0 commit comments