Решил ради интереса попробовать как работают ALR в BASIC-11. Подробно расписывать не буду, все описано в Installation Guide, User Guide и Language Reference. На пробу собрал BASIC, понимающий две подпрограммы PEEK и POKE для работы с памятью.
Простенькая программка, печатающая строку на экран через регистры терминала:
Код:
LIST
TTREG 25-MAR-15 18:18:23
10 C%=OCT('177564') \ B%=OCT('177566')
20 S$=CHR$(13)&CHR$(10)&'*** HELLO, WORLD! ***'&CHR$(13)&CHR$(10)
30 FOR I%=1% TO LEN(S$)
40 O%=ASC(SEG$(S$,I%,I%))
50 CALL 'PEEK'(C%,V%) \ IF V%<>128 THEN 50 \ CALL 'POKE'(B%,O%)
60 NEXT I%
READY
RUN
TTREG 25-MAR-15 18:22:16
*** HELLO, WORLD! ***
READY
Принцип такой: берется дистрибутив BASIC-11 (в архиве должен быть, я выкладывал), копируется файл BSCLI.MAC в MYCLI.MAC, по метке FTBL добавляются ссылки на функции:
Код:
FTBL: .WORD PEEKNM,POKENM ;АДРЕСА ДЕСКРИПТОРОВ ПОДПРОГРАММ
.WORD 0 ;КОНЕЦ СПИСКА
Ниже перед строчкой ".GLOBL UACTST" добавляем дескрипторы и сами подпрограммы:
Код:
PEEKNM: .ASCII <4>/PEEK/ ;<ДЛИНА>/ИМЯ/
.EVEN ;ВЫРАВНИВАНИЕ
.WORD PEEKST ;АДРЕС ПОДПРОГРАММЫ
POKENM: .ASCII <4>/POKE/
.EVEN
.WORD POKEST
;+
;ПОДПРОГРАММА ПОЛУЧЕНИЯ ДВУХ АРГУМЕНТОВ С ПРОВЕРКОЙ
;ТИПА (ПОДДЕРЖИВАЕТСЯ ТОЛЬКО INTEGER).
;-
GETARG: MOV -2(R5),R4 ;СОХРАНЯЕМ ССЫЛКУ НА
;ДЕСКРИПТОРЫ АРГУМЕНТОВ
CMP #101002,(R5)+ ;ПРОВЕРЯЕМ ЧТО ДВА АРГУМЕНТА
BNE ARGERR ;НЕТ
MOV (R5)+,R1 ;ПОЛУЧАЕМ ССЫЛКУ НА АРГ 1
MOV (R5)+,R2 ;ПОЛУЧАЕМ ССЫЛКУ НА АРГ 2
.TRPSET #AREA,#BUSTMO ;ПЕРЕХВАТЫВАЕМ ПРЕРЫВАНИЯ 4/10
CALL @PC ;ВЫПОЛНЯЕМ ДВАЖДЫ
MOV @R4,R0 ;ОПИСАНИЕ АРГУМЕНТА
BIC #^C177,R0 ;УБИРАЕМ ЛИШНЕЕ
CMP #23,R0 ;ТИП INTEGER?
BNE ARGERR ;НЕТ
BIT #200,(R4)+ ;ПРОВЕРЯЕМ ПЕРЕМЕННАЯ/ВЫРАЖЕНИЕ
RETURN ;ВОЗВРАТ
ARGERR: JMP $ARGER ;ОШИБКА: НЕВЕРНЫЕ АРГУМЕНТЫ
BUSTMO: MOV #BUSERR,@SP ;ПЕРЕДАЕМ АПРАВЛЕНИЕ НА BUSERR
RTI ;
BUSERR: JSR R1,$BOMB ;ПЕЧАТЬ СООБЩЕНИЯ ОБ ОШИБКЕ
.ASCIZ /INVALID ADDRESS/
.EVEN
RETURN ;ВОЗВРАТ
PEEKST: CALL GETARG ;ПОЛУЧАЕМ АРГУМЕНТЫ
BNE ARGERR ;ВТОРОЯ АРГУМЕНТ - КОНСТАНТА - КЮ!
MOV @(R1)+,@R2 ;ЧИТАЕМ СОДЕРЖИМОЕ ПАМЯТИ
RETURN: .TRPSET #AREA,#0 ;ОТКЛЮЧАЕМ ПЕРЕХВАТ ПРЕРЫВАНИЯ
RETURN ;ВОЗВРАТ
POKEST: CALL GETARG ;ПОЛУЧАЕМ АРГУМЕНТЫ
MOV @R2,@(R1)+ ;ПИШЕМ В ПАМЯТЬ
BR RETURN ;ВОЗВРАТ
AREA: .BLKW 2 ;БЛОК EMT
Компилируем модуль командой "MAC BSASM+BSMAC+MYCLI/OB" и выполняем генерацию BASIC-11:
Код:
.RU BASIC
BASIC-11/RT-11 V02-03S
OPTIONAL FUNCTIONS (ALL, NONE, OR INDIVIDUAL)? A
READY
RUN SUCNFG
BASIC-11/RT-11 V02 Configuration Program
Type "?<ret>" after any prompt for HELP.
.SAV and .COM file name (default is BASIC):
Do you want a map? (Y or N; default is N):
Background or Foreground ? (B or F; default is B):
Do you want PRINT USING? (Y or N; default is Y):
Do you want CALL support? (Y or N; default is N): Y
Enter module names (one per line): MYCLI
Module name: BSCLLB
Module name:
Single or Double precision math? (S or D; default is S):
Arithmetic hardware (NONE, EAE, EIS, FIS, or FPU; default is NONE): FPU
Do you want the transcendental functions? (Y or N; default is Y):
Do you want the SUB command? (Y or N, default is Y):
Do you want the RESEQ command? (Y or N, default is Y):
Do you want long error messages? (Y or N; default is Y):
Overlay structure type (1, 2, 3, 4, or 5; default is 1):
To create the BASIC that you have just defined,
type "BYE<ret>" after BASIC prints "READY". When the system
prompts for input, type "@BASIC<ret>" to link the new BASIC.
You may type "R BASIC<ret>" to run it.
run it by typing only "BASIC<ret>".
READY
BYE
.@BASIC
Собственно все