Удаление в знак протеста против действий MM
Вид для печати
Удаление в знак протеста против действий MM
Удаление в знак протеста против действий MM
У каждого -- свой таймер, так что нет, не все равно :) Источник прерываний у них один, подключается и отключается раздельно через биты 8, 9 регистра 177054 на шине ПП
Удаление в знак протеста против действий MM
Хрень делается элементарно, вместо СА на шину ЦП. Можно адаптировать софт от БКшки, если повесить музычку на адрес 177714 ( как в БКшке ).
В основном по софту - коррекция по быстродействию, а так же подгонка под требования RT-11 ( т.е. косметика ). Сложнее будет с графикой для музычки от БК - там прямой совместимости не особо.
Базовую Э3 подключения сопра лучше взять от Э3 господина Воланда и его новодела БК0011М.
Удаление в знак протеста против действий MM
Ну если так - тогда есть поле для опытов. Делаем на ВП1-065 частоту 7.5 мгц, скорость выставляем как для 19200, получаем итоговую 31.25 кбод. На выход телеграфа ( RS232 ) прикручиваем первую попавшуюся MIDI-игрушку (или 26-пин модуль для звуковых карт, ему, правда, понадобится плюс и минус 15 вольт ). Это конечно при условии , что софт тоже возникнет сам по себе и бесплатно. Зато "Саунд" будет вполне себе достойный, не мышиные скрипы от ЭВМ 1980-х.
Удаление в знак протеста против действий MM
Исходник и готовый .SAV программы MEMMAP -- сканер портов, подобный IOSCAN (спасибо MiX за наводку):
http://www.classiccmp.org/PDP-11/RT-...or1/memmap.mac
http://www.classiccmp.org/PDP-11/RT-...or1/memmap.sav
Удаление в знак протеста против действий MM
Удаление в знак протеста против действий MM
Удаление в знак протеста против действий MM
Подскажите, каким образом из ЦП можно напечатать что-нибудь в служебной или информационной строке?
Попробовал через EMT 52, что-то у меня так не получилось.
МОЖНО же необходимый высоты-ширины спрайт повесить прямо по адресу экранному?
- - - Добавлено - - -
что то он каким-то раритетным получился. исходников нет.
CL.SYS только в составе собранных систем попадается в архиве.
Отдельного реализа "в упор не вижу" (
Уважаемые знатоки!
Имеется вот такой результат компиляции:
Здесь секция MAIN -- это собственно код, TILES -- константные данные.Код:RT-11 LINK V05.45 Load Map Saturday 01-Apr-2017 19:38 Page 1
EXPRES.SAV Title: EXPRES Ident:
Section Addr Size Global Value Global Value Global Value
. ABS. 000000 001000 = 256. words (RW,I,GBL,ABS,OVR)
MAIN 001000 026600 = 5824. words (RW,I,GBL,REL,OVR)
START 001000
TILES 027600 022022 = 4617. words (RO,D,LCL,REL,CON)
Z27040 027600 Z27700 030440 Z30300 031040
Z31200 031740 Z31240 032000 Z31264 032024
Z34604 033424 Z37006 037426 Z41210 043430
Z43412 047432 Z44274 051034
DSECT 051622 024720 = 5352. words (RW,D,LCL,REL,CON)
Y00000 051634 Y01106 052742 Y02506 054342
Y04106 055742 Y24000 065742 Y34377 076341
STACK 076342
Transfer address = 000001, High limit = 076540 = 16048. words
Секция DSECT -- это переменные и массивы, которые нужны уже только после запуска.
Сейчас вся секция DSECT -- это нули, и она включена в SAV-файл, что собственно только расходует лишние блоки на диске.
Внимание, вопрос:
Как сделать так чтобы секция DSECT могла использоваться в программе как и сейчас -- т.е. чтобы под неё выделялась память, но чтобы она НЕ включалась в готовый SAV-файл?
Сам код выглядит так:
Код:.TITLE EXPRES
.MCALL .EXIT
.CSECT MAIN
START::
...
.PSECT TILES,RO,D
.INCLUDE /TILES.MAC/
.PSECT DSECT,RW,D
...
STACK:: .BLKW 100 ; Под стек
.END
В RT-11 наверное никак - там линкер автоматом включает в SAV все, что декларировалось - независимо от использования (в отличие от RSX к примеру - там метка сама по себе еще не основание считать, что это часть файла). Как вариант - сделать пустую секцию в конце программы, а после вызывать .SETTOP для проверки места или в XM мапить окно.
Да, помнится, после ассемблера Системы-360 мне тоже сильно не хватало аппарата фиктивных секций - не столько для экономии места, сколько для манипулирования разнообразными таблицами, которые расположены не здесь в программе, а где-то в другом месте. В Системе-360 все просто: описал таблицу в отдельном DSECT'е, занес ее адрес в какой-то регистр, сделал для этого регистра USING на начало этой фиктивной секции и пиши имена полей из таблицы, как будто это твои переменные.
А здесь - изба фигвам. Регистров мало (у Системы-360 их 16), привязка какой-то секции к регистру не предусмотрена, такой стиль программирования (очень удобный, кстати) здесь просто не предусмотрен.
Для работы с таблицами я, помнится, сочинил какую-то макрокоманду, которая позволяла компактно описать таблицу, присваивая именам ее полей значения смещений от ее начала, после чего пользовал их в явном виде (типа MOV NAME1(R5),R0, здесь NAME1 - имя какого-то поля из таблицы, начальный адрес которой лежит в R5), что явно лучше, чем MOV 12(R5),R0. А вот в том виде, в каком эта задача поставлена, она не решается вообще...
Удаление в знак протеста против действий MM
Что-то подзабыл про CL. Выложил сюда.
Удаление в знак протеста против действий MM
MacBuster, посмотрел! Красиво и цвет радует - фиолетовый не обычный для УК-НЦ по определению, правда при рендеринге и расширению приближённому к реальному монитору планетку плющит сбоков и по Y растягивает до
яйцевидной формы.
Удаление в знак протеста против действий MM
Поздно увидел... Ну, может ещё пригодится. Я делал примерно так:
Библиотечные функцииКод:.MACRO $COMMON NAME=<.$$$$.>
.PSECT 'NAME', RW, D, OVR, GBL
.ENDM $COMMON
.MACRO $CODE
.PSECT $CODE$, I, RO
.ENDM $CODE
.MACRO $IDATA
.PSECT $IDATA, D, RW
.ENDM $IDATA
.MACRO $PDATA
.PSECT $PDATA, D, RO
.ENDM $PDATA
.MACRO $ASCII
.PSECT $ASCII, D, RO
.ENDM $ASCII
.MACRO $VBOT
.PSECT .99997, D, RW
.ENDM $VBOT
.MACRO $VIRT
.PSECT .99998, D, RW
.ENDM $VIRT
.MACRO $VTOP
.PSECT .99999, D, RW
.ENDM $VTOP
.MACRO $USER
.ENDM $USER
.MACRO VINIT
.SAVE
$VIRT
.IF NDF ..VB.
..VB. =: .
..VC. = ^O<0>
.MACRO $VSET
.BLKW
.MACRO $VSET
.ENDM $VSET
.ENDM $VSET
.IFF
.IF NE ..VC.
..VB. =: .
.WORD ..VC.
..VC. = ^O<0>
.ENDC
.MACRO $VSET
.ENDM $VSET
.ENDC
.RESTORE
.ENDM VINIT
.MACRO V.EVEN
..VC.=<..VC.+^O<1>>&^C<1>
.ENDM V.EVEN
.MACRO V.ODD
..VC.=<..VC.&^C<1>>+^O<1>
.ENDM V.ODD
.MACRO V.BLKW LAB LEN=<1>
VALLOC LAB LEN WORDS
.ENDM V.BLKW
.MACRO V.BLKB LAB LEN=<1>
VALLOC LAB LEN BYTES
.ENDM V.BLKB
.MACRO VALLOC LAB LEN UNIT
.SAVE
$VIRT
LAB =: ..VB.+..VC.
.IF NB LEN
.IF IDN <LEN>, <BYTE>
$VSET
..VC.=..VC.+^O<1>
.RESTORE
.MEXIT
.ENDC
.IF IDN <LEN>, <WORD>
.IIF NE ..VC.&^O<1> .ERROR ; ODD count
V.EVEN
$VSET
..VC.=..VC.+^O<2>
.RESTORE
.MEXIT
.ENDC
..VM.=^O<0>
.IIF IDN <UNIT>, <BYTES> ..VM.=^O<1>
.IIF IDN <UNIT>, <WORDS> ..VM.=^O<2>
.IF EQ ..VM.
.ERROR ; Invalid units - 'UNIT'
.RESTORE
.MEXIT
.ENDC
.IF EQ ..VM.-^O<2>
.IIF NE ..VC.&^O<1> .ERROR ; ODD count
V.EVEN
.ENDC
$VSET
..VC.=<'LEN'>*..VM.+..VC.
.ENDC
.RESTORE
.ENDM VALLOC
.MACRO $ORDER
.SAVE
$CODE
$ASCII
$PDATA
$IDATA
$USER
$VBOT
$VIRT
$VTOP
VINIT
.RESTORE
.ENDM $ORDER
.MACRO ADJUST
.SAVE
$PDATA
.EVEN
$IDATA
.EVEN
$ASCII
.EVEN
$VIRT
V.EVEN
.RESTORE
.ENDM ADJUST
Код:; 00009
.INCLUDE /LB:[MACROS]MACROS.MAC/
MODULE VM0, VER=03, LIBR=YES, COMM=<Подпрограммы виртуальной памяти>
.IIF DF R$$T11 FROM SYSMAC IMPORT .SETTOP
.IIF DF R$$11M FROM SYSMAC IMPORT GREG$S, EXTK$S
EXPORT QUALIFIED VTOP, INIVM, CLRVM, CLRMEM
;+
;
; INIVM - Инициализация системы вирт. памяти
; Вход:
; Выход:
; VTOP - Первый неиспользуемый байт памяти
;
;
; CLRVM - Обнуление вирт. памяти
; Вход:
; Выход:
;
;
; CLRMEM- Обнуление области памяти
; Вход:
; R1 - Стартовый адрес
; R2 - Длина в байтах
; Выход:
;
;-
$IDATA
VTOP: .BLKW
$VBOT
BOT:
$VTOP
TOP:
MOV #240, INIVM ; !!! NOP !!!
MOV #207, INIVM+2 ; !!! RTS %7 !!!
MOV #BOT, VTOP
PUSH R0
MOV #TOP, R0
SUB #BOT, R0
IF RESULT IS EQ THEN
POP R0
RETURN
END
.SAVR1
ASR R0
MOV #BOT, R1
CLR R2
THRU R0
ADD (R1)+, R2
END
.IF DF R$$T11
ADD #TOP-2, R2
.SETTOP R2
IF R2 HIS R0 THEN
ADD #2, R2
MOV R2, VTOP
END
.ENDC
.IF DF R$$11M
ADD #TOP, R2
MOV #TOP, R3 ; получить размер задачи в памяти
GREG$S , R3 ; от Executive'а
MOV G.RGRS(R3), R3
ASH #6, R3 ; в байты
SUB R2, R3
NEG R3
ADD #100, R3 ; выравнивание
ASH #-6, R3 ; в кол-во 100(8) байтных блоков
EXTK$S R3 ; расширить
MOV #TOP, R3 ; получить новый размер задачи
GREG$S , R3 ; от Executive'а
MOV G.RGRS(R3), R3 ; в R1
ASH #6, R3 ; в байты
CMP R3, R2 ;
.ENDC
POP R0
RETURN
PROCEDURE INIVM
BEGIN
JMP TOP
END INIVM
PROCEDURE CLRVM
BEGIN
PUSH <R1, R2>
MOV #BOT, R1
MOV VTOP, R2
SUB R1, R2
ADD #2, R2
CALL CLRMEM
POP <R2, R1>
RETURN
END CLRVM
PROCEDURE CLRMEM
BEGIN
PUSH <R1, R2>
IF #1 SET.IN R1 THEN
CLRB (R1)+
DEC R2
END
ASR R2
ROL -(SP)
THRU R2
CLR (R1)+
END
ROR (SP)+
IF RESULT IS CS THEN
CLRB (R1)+
END
POP <R2, R1>
RETURN
END CLRMEM
END VM0
.END
Пример использования
- - - Добавлено - - -Код:;
; MODULE VM0
;
PROCEDURE INIVM EXTERNAL
PROCEDURE CLRVM EXTERNAL
$VIRT
V.BLKW ELDEST REST
V.BLKW ELD NCODES
V.BLKB CHARS REST
V.BLKB CHAR NCODES
V.EVEN
...
PROCEDURE MAIN
BEGIN
CALL INIVM
ON.ERROR THEN
PRINT$ #PRFX, #'$
PRINT <Не хватает памяти>, #'+
EXIT$S
END
LOOP
CALL CLRVM
...
END
END MAIN
Ещё мне память подсказывает, что вроде начиная с какой версии MACRO-11 появилась .VSECT, с аналогичным поведением (место в готовой проге не выделяется), но.. надо вспоминать - так ли это и как работать...
- - - Добавлено - - -
Или это было с прицелом на FORTRAN с VIRTUAL объявлением под RSX...
- - - Добавлено - - -
Не, похоже такое мог делать только компилятор с FORTRAN. MACRO послал :)
- - - Добавлено - - -
Никогда не говори Никогда :)
В разделе УК-НЦ, в папке Alphaprog, на образе sysimage.dsk
(ух! какая легенда чуете? как в сказке да?) есть исходник программы
(C) by Alex_K
SCAN .MAC 3 12-Sep-1994
- сканкоды кнопок УК-НЦ читает вроде бы, но там комментариев нет,
программа написана на МАКРО-11 естественно ) Эти дискеты прилагались
к ранним версиям UKNCBTL когда-то )
добрый вечер.
подскажите как сделать или есть ли шаблончик для вывода на экран содержимого двух ячеек памяти или регистров в бинарном виде, а следом в строке в О виде.
чтобы как то так:
регистр1, ячейка1 0110100001101010 64152
регистр2, ячейка2 1110100011111111 164377
Код:.TITLE TEST
.MCALL .EXIT,.PRINT
START:: MOV #DATA,R5
CALL PRDAT
.EXIT
PRDAT:: CALL @PC ;PROPAGATE CODE TWO TIMES
MOV #BUFF,R0 ;BUFFER ADDRESS
MOV @R5,R1 ;VALUE
MOV #16.,R2 ;BIT COUNT
10$: CLR -(SP) ;INIT CHAR
ROL R1 ;SHIFT OUT
ROL @SP ;SHIFT IN
BIS #'0,@SP ;CONVERT TO ASCII
MOVB (SP)+,(R0)+ ;PUT INTO BUFFER
SOB R2,10$ ;TO NEXT BIT
MOVB #<' >,(R0)+ ;SPACE
MOV (R5)+,R1 ;VALUE
CLR R2 ;SUPPRESS LEADING ZEROS
CALL $CBOMG ;CONVERT TO ASCII
CLRB @R0 ;MAKE ASCIZ
.PRINT #BUFF ;PRINT
RETURN ;RETURN
DATA: .WORD 64152,164377
BUFF: .BLKB 80.
.END START
Подпрограмма $CBOMG есть в родном SYSLIB от RT-11. Если вместо CLR R2 сделать перед вызовом MOV PC,R2, то ведущие нули подавляться не будут.Код:.EX TEST
0110100001101010 64152
1110100011111111 164377
.
В RTшном руководстве по системной библиотеке $CBOMG не описан. Он просто есть как минимум начиная с RT-11 V5.0. Описание есть в RSXовском руководстве по SYSLIB. Для простоты вот хелп по нему - больше по сути и не нужно ничего:Здесь написано про R2=0 или 1, но на самом деле 0 и не 0 :)Код:>HELP SYSL CBOMG
Convert binary to octal magnitude
Input: Output:
R0 = Address of output buffer R0 = Points to next byte in output
buffer after converted string
R1 = Binary value to be converted
R2 = Zero suppression flag:
R2 = 0 => Suppress leading zeros
R2 = 1 => Do not suppress leading zeros
Call:
CALL $CBOMG
>
- - - Добавлено - - -
Если что, я портировал в свое время самые интересные подпрограммы из RSX, в теме софта можно поискать RSXLIB. Там много полезного уже готового :)
- - - Добавлено - - -
Небольшое упрощение:Код:PRDAT:: CALL @PC ;PROPAGATE CODE TWO TIMES
MOV #BUFF,R0 ;BUFFER ADDRESS
MOV @R5,R1 ;VALUE
MOV #16.,R2 ;BIT COUNT
10$: MOVB #'0,@R0 ;INIT CHAR
ROL R1 ;GET BIT
ADCB (R0)+ ;CONVERT TO ASCII
SOB R2,10$ ;TO NEXT BIT
MOVB #<' >,(R0)+ ;SPACE
MOV (R5)+,R1 ;VALUE
CLR R2 ;SUPPRESS LEADING ZEROS
CALL $CBOMG ;CONVERT TO ASCII
CLRB @R0 ;MAKE ASCIZ
.PRINT #BUFF ;PRINT
RETURN ;RETURN
осталось найти
и по идее счастье должно наступить:)Цитата:
Описание работы с лексическим разбором
можно найти в
RSX-11M/M+/MicroRSX/IAS I/O
Operations Reference Manual.
После строчки CALL @PC ещё строчка CALL @PC
Только срабатывать будет степень двойки количество раз - 1, 2, 4, 8 и т.д.
Вроде не ошибся :)