Skip to content

Commit cd315e9

Browse files
committed
WIP FMUL for BK0010
1 parent e1695dd commit cd315e9

1 file changed

Lines changed: 145 additions & 24 deletions

File tree

runtime-BK0010.tmac

Lines changed: 145 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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:
896896
1$: 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:
906906
2$: 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:
988988
8$: 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:
10031003
10$: 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) - плавающее число (старшее слово, младшее слово)
10301030
FSUB:
1031-
TST 2(SP) ; проверяем старше слово
1031+
TST 2(SP) ; проверяем старше слово B
10321032
BEQ 1$ ; ноль =>
10331033
ADD #100000,2(SP) ; изменить знак операнда
10341034
1$: 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) - плавающее число (старшее слово, младшее слово)
10391044
FMUL:
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

Comments
 (0)