@@ -864,7 +864,7 @@ GRIZT: MOV (SP)+,R3 ;
864864;#####################################################################
865865;## FADD
866866;## Need ERRR
867- ; Сложение для плавающих чисел, эмуляция FIS, параметры B и A на стеке.
867+ ; Сложение для плавающих чисел, параметры B и A на стеке.
868868; На основе кода процедуры ADR из реализации Бейсик Вильнюс для БК-0010.
869869; На входе: (SP) - адрес возврата
870870; (SP+2)(SP+4) - плавающее число B (старшее, младшее слово)
@@ -891,16 +891,16 @@ FADD:
891891 ROR 6(SP)
892892 MOV 4(SP),10(SP)
893893 MOV 6(SP),12(SP)
894- BR 50$ ; X=0 => РЕЗУЛЬТАТ - B
894+ BR 50$ ; X=0 => результат - B
895895;A1:
8968961$: ROLB 1(SP) ; запомнить знак A
897897 MOVB #1,11(SP)
898898 MOVB #1,5(SP)
899- SUB R3,R2 ; РАЗНОСТЬ ПОРЯДКОВ ЧИСЕЛ А И B => R2
899+ SUB R3,R2 ; разность порядков чисел А И B => R2
900900 BGT 2$
901901;
902- MOV 10(SP),R0 ; В R0,R1 - МАНТИССА ЧИСЛА
903- MOV 12(SP),R1 ; С МЕНЬШИМ ПОРЯДКОМ
902+ MOV 10(SP),R0 ; в R0,R1 - мантисса числа
903+ MOV 12(SP),R1 ; с меньшим порядком
904904 BR 20$
905905;A2:
9069062$: ADD R2,R3
@@ -911,22 +911,22 @@ FADD:
911911 SWAB (SP)
912912 NEG R2
913913;CMZ:
914- 20$: CMPB 1(SP),(SP) ; ЕСЛИ ЗНАКИ ЧИСЕЛ НЕ=
915- BEQ 21$ ; ИЗМЕНИТЬ ЗНАК МЕНЬШЕГО ЧИСЛА
914+ 20$: CMPB 1(SP),(SP) ; если знаки чисел не равны
915+ BEQ 21$ ; изменить знак меньшего числа
916916 NEG R1
917917 ADC R0
918918 NEG R0
919919;Z1:
920- 21$: TST R2 ; ЕСЛИ R2 = 0 - выполнить сложение
920+ 21$: TST R2 ; если R2 = 0 - выполнить сложение
921921 BEQ 30$
922- CMP #-31,R2 ; ЕСЛИ R2 > 31 => REZ=ЧИСЛО С БОЛЬШИМ ПОРЯДКОМ
922+ CMP #-31,R2 ; если R2 > 31 => REZ=ЧИСЛО С БОЛЬШИМ ПОРЯДКОМ
923923 BLE 22$
924924 MOV 4(SP),R0
925925 MOV 6(SP),R1
926926 BR 7$
927927;Z2
928- 22$: CMP #-10,R2 ; ПРИВЕСТИ СЛАГАЕМЫЕ К ОДИНАКОВОМУ
929- BLE 6$ ; ПОРЯДКУ
928+ 22$: CMP #-10,R2 ; привести слагаемые к одинаковому порядку
929+ BLE 6$
930930 CLR R4
931931 TST R0
932932 BPL 3$
@@ -955,13 +955,13 @@ FADD:
955955 INC R2
956956 BLT 6$
957957;SUM:
958- 30$: ADD 4(SP),R0 ; СЛОЖИТЬ ЧИСЛА
958+ 30$: ADD 4(SP),R0 ; сложить числа
959959 ADD 6(SP),R1
960960 ADC R0
961961;
962- CMPB 1(SP),(SP) ; ЗНАКИ СЛАГАЕМЫХ РАЗЛИЧНЫ ?
962+ CMPB 1(SP),(SP) ; знаки слагаемых различны ?
963963 BNE 8$
964- BIT R0,#1000 ; РЕЗУЛЬТАТ НОРМАЛИЗОВАН ?
964+ BIT R0,#1000 ; результат нормализован ?
965965 BEQ 7$
966966 ASR R0
967967 ROR R1
@@ -970,8 +970,8 @@ FADD:
970970 BNE FADD$O ; переполнение порядка
971971;
972972 BISB R0,R3
973- ROR (SP) ; СФОРМИРОВАТЬ РЕЗ-Т В ВИДЕ ЧИСЛА
974- ROR R3 ; С ПЛАВАЮЩЕЙ ЗАПЯТОЙ
973+ ROR (SP) ; сформировать результат в виде числа с плавающей запятой
974+ ROR R3
975975 ROR R1
976976 ADC R1
977977 ADC R3
@@ -988,12 +988,12 @@ FADD:
9889888$: TST R0
989989 BGT 9$
990990 BEQ 10$
991- NEG R0 ; ИЗМЕНИТЬ ЗНАК РЕЗУЛЬТАТА
991+ NEG R0 ; изменить знак результата
992992 NEG R1
993993 SBC R0
994994 SWAB (SP)
995995;A9:
996- 9$: BIT R0,#400 ; НОРМАЛИЗОВАТЬ МАНТИССУ РЕЗУЛЬТАТА
996+ 9$: BIT R0,#400 ; нормализовать мантиссу результата
997997 BNE 11$
998998 DEC R3
999999 ASL R1
@@ -1002,7 +1002,7 @@ FADD:
10021002;A10:
1003100310$: TST R1
10041004 BEQ 12$
1005- SWAB R1 ; НОРМАЛИЗОВАТЬ МАНТИССУ РЕЗУЛЬТАТА
1005+ SWAB R1 ; нормализовать мантиссу результата
10061006 BISB R1,R0
10071007 CLRB R1
10081008 SUB #10,R3
@@ -1022,23 +1022,144 @@ FADD$O: MOV (SP), R5 ;
10221022;#####################################################################
10231023;## FSUB
10241024;## Need FADD
1025- ; Вычитание для float, эмуляция FIS, параметры B и A на стеке.
1025+ ; Вычитание для float, параметры B и A на стеке.
10261026; На входе: (SP) - адрес возврата
10271027; (SP+2)(SP+4) - плавающее число B (старшее, младшее слово)
10281028; (SP+6)(SP+10) - плавающее число A (старшее, младшее слово)
10291029; Результат: (SP)(SP+2) - плавающее число (старшее слово, младшее слово)
10301030FSUB:
1031- TST 2(SP) ; проверяем старше слово
1031+ TST 2(SP) ; проверяем старше слово B
10321032 BEQ 1$ ; ноль =>
10331033 ADD #100000,2(SP) ; изменить знак операнда
103410341$: JMP FADD ; идём на сложение: A-B = A+(-B)
10351035
10361036;#####################################################################
10371037;## FMUL
1038- ; Умножение для float, эмуляция FIS, параметры B и A на стеке
1038+ ; Умножение для плавающих чисел, параметры B и A на стеке
1039+ ; На основе кода процедуры MLR из реализации Бейсик Вильнюс для БК-0010.
1040+ ; На входе: (SP) - адрес возврата
1041+ ; (SP+2)(SP+4) - плавающее число B (старшее, младшее слово)
1042+ ; (SP+6)(SP+10) - плавающее число A (старшее, младшее слово)
1043+ ; Результат: (SP)(SP+2) - плавающее число (старшее слово, младшее слово)
10391044FMUL:
1040- ;TODO
1041- RETURN ;STUB
1045+ MOV (SP)+, FMUL$X+2 ; снимаем и подставляем адрес возврата
1046+ ; На стеке: ст.B мл.B, ст.A мл.A
1047+ MOV R5,-(SP) ; Сохраняем регистры
1048+ MOV R4,-(SP)
1049+ ;MOV R3,-(SP)
1050+ ; Подготовительные действия
1051+ ; На стеке: R4, R5, ст.B мл.B, ст.A мл.A
1052+ MOV 4(SP),R2 ; R2 <- порядок числа B
1053+ ASL R2
1054+ ROL -(SP) ; запомнить знак числа B
1055+ CLR -(SP)
1056+ ; На стеке: 0, знак, R4, R5, (SP+10)ст.B мл.B, (SP+14)ст.A мл.A
1057+ SWAB R2
1058+ MOVB R2,(SP) ; запомнить порядок числа B
1059+ BEQ FMUL$0 ; B = 0 => результат - 0
1060+ SEC
1061+ ROR R2 ; формирование мантиссы
1062+ CLRB R2 ; числа B в регистрах R2/R3
1063+ BISB 13(SP),R2
1064+ CLR R3
1065+ BISB 12(SP),R3
1066+ SWAB R3
1067+ ASL 14(SP) ; формирование в нулевом бите
1068+ ADC 2(SP) ; знака мантисы результата
1069+ TSTB 15(SP)
1070+ BEQ FMUL$0 ; A = 0 => результат - 0
1071+ ROR 14(SP) ; восстановление мантиссы A
1072+ ; Умножение мантисс
1073+ CLR R0 ; подготовка R0/R1
1074+ CLR R1 ; для резултата умножения
1075+ MOV 16(SP),R4 ; выделить младшую часть мантиссы A
1076+ BEQ 1$ ; если 0 - умножать не надо
1077+ MOV #17,R5 ; умножение B на
1078+ CALL FMUL$P ; младшую часть
1079+ CALL FMUL$D ; мантиссы A
1080+ ;
1081+ 1$: MOV 14(SP),R4
1082+ MOV #7,R5 ; умножение на
1083+ CALL FMUL$D ; старшую часть
1084+ CALL FMUL$E ; мантиссы A
1085+ ; Сложение порядков
1086+ ADD (SP)+,R4
1087+ ; На стеке: знак, R4, R5, (SP+6)ст.B мл.B, (SP+12)ст.A мл.A
1088+ ; Нормализация мантиссы
1089+ ROL R1
1090+ ROL R0
1091+ BCS 2$
1092+ ROL R1
1093+ ROL R0
1094+ DEC R4
1095+ ; Формирование и контроль порядка
1096+ 2$: SUB #200,R4
1097+ BLE FMUL$N ; исчезновение порядка
1098+ CMP #377,R4
1099+ BLT FMUL$O ; переполнение порядка
1100+ ; Формирование результата
1101+ CLRB R1 ; формирование мантиссы
1102+ BISB R0,R1
1103+ SWAB R1
1104+ CLRB R0
1105+ BISB R4,R0 ; присоединение порядка
1106+ SWAB R0
1107+ ROR (SP)+ ; присоединение знака
1108+ ROR R0
1109+ ROR R1
1110+ ADC R1 ; округление
1111+ ADC R0
1112+ BCS FMUL$O ; контроль переполнения
1113+ BVS FMUL$O ; порядка
1114+ ; На стеке: R4, R5, (SP+4)ст.B мл.B, (SP+10)ст.A мл.A
1115+ ;MEND:
1116+ FMUL$M: MOV R0,10(SP) ; пересылка в стек на место числа A
1117+ MOV R1,12(SP) ; младшее слово
1118+ ;ENDM: Завершение
1119+ ;MOV (SP)+,R3 ; восстановление регистров
1120+ MOV (SP)+,R4
1121+ MOV (SP)+,R5
1122+ CMP (SP)+,(SP)+ ; удаление числа B из стека
1123+ FMUL$X: JMP @#000000 ; возврат
1124+ ;
1125+ ;MREZ0: Формирование нулевого результата
1126+ FMUL$0: TST (SP)+ ; очистка стека
1127+ ; Обработка исчезновения порядка
1128+ FMUL$N: TST (SP)+ ; очистка стека
1129+ CLR R0 ; формирование результата 0
1130+ CLR R1
1131+ BR FMUL$M
1132+ ;
1133+ ; Ошибка: переполнение порядка
1134+ FMUL$O: MOV FMUL$X+2, R5 ; откуда вызвали
1135+ MOV #3006., R0 ; Ошибка: переполнение
1136+ JMP ERRR
1137+ ;
1138+ ;DAUGYB: Подпрограмма умножения
1139+ FMUL$D: ASR R4
1140+ BCC FMUL$F ; если 0 - сдвинуть
1141+ FMUL$E: ADD R3,R1 ; если 1 - сложить
1142+ ADC R0
1143+ BCS FMUL$G ; перенос
1144+ ADD R2,R0
1145+ FMUL$F: ROR R0 ; сдвиг
1146+ ROR R1
1147+ DEC R5 ; на все ли биты
1148+ BGT FMUL$D ; перемножено?
1149+ RETURN
1150+ FMUL$G: ADD R2,R0 ; сложение при переносе
1151+ SEC
1152+ BR FMUL$F
1153+ ;
1154+ ;DAUGP: Подпрограмма умножения старших байтов
1155+ FMUL$P: ASR R4
1156+ BCC 2$ ; если 0 - сдвинуть
1157+ ADD R2,R0 ; если 1 - сложить
1158+ 2$: ROR R0 ; сдвиг
1159+ ROR R1
1160+ DEC R5 ; на все ли биты
1161+ BGT FMUL$P ; перемножено?
1162+ RETURN
10421163
10431164;#####################################################################
10441165;## FDIV
0 commit comments