;Cat.asm - п/п работы с каталогом для RAMG v3.0 ;04.1997-08.04.1998 (с) АльтПро (написано RSC по заказу) ;29.04.1998 - nomera wersij ; Информация для программистов: ;Tаблица модулей содержит 64 элемента (для 64 К) ;и состоит из записей, их кол-во можно получить ;по системному запросу "Общая информация". ; Запись о модуле имеет длину 16 ; и состоит из следующих полей: NAME.=0 ;Имя модуля (состоит из двух байтов: ; 1 байт - идентификатор автора, ; 1 байт - идентификатор модуля) ;Авторы: "$" - системная ; "R" - все Reiter'ы ;Лучше называть модули печатаемыми символами LEN.=2 ;длина модуля в словах PRI.=4 ;Флаги модуля: PEREM$=2 ;Перемещаемость модуля (0 - да) ;предп. нахождение пустого мес- ;та путем перемещения модуля NEXT$=4 ;Можно ли "разбивать" (0 - да) ;модуль располагается в 2 ;сегментах, подключаемых под- ;ряд (max len - 10000) DELEX$=10 ;Удалять по EXIT(0 - да) RUN$=20 ;Запускаемость (1 - да): ;макс. длина - 10000 слов ;располож. в сегментах 2-3 ; 6-7 DELN$=40 ;удалять низя, если есть род. ;модуль DELRUN$=100 ;перед удалением/мовированием ;запустить END-2 (отличаются по ;содерж. в R0: 0 - DELETE) NAMH.=6 ;Имя модуля создателя SMEN.=10 ;Смещение до имени (полного) <0 - нету ;имя должно кончаться кодом 0. SME.=12 ;Смещение до модуля от начала сегмента SEG.=14 ;Номер сегмента (логический) в байте! TABPP: .WORD JMPN$,CALN$,RDWN$ ;параметры: (SP) - имя/сегмент ; 2(SP) - смещение ; R0=0 - ошибка JMPG$: MOV #TABPR-2-TAB,R5 PP2: MOV (SP),R4 MOV 121124(R5),-(SP) ;TAB-TABPR-2+TABPP(R5),-(SP) PUSH R3 PUSH R1 MOV PC,R1 MOV 10(SP),R5 CALL NAMEADR ;R4 - сегмент ;R5 - смещение BCS ERROR MOV #SEG.1,R3 MOV R5,2(R3) MOV R4,(R3) MOV #1,R2 CALL TRANSF2 MOV R4,10(SP) MOV R5,6(SP) POP R5 POP R3 MOV #MAIN$+2,R4 JMP @(SP)+ ;PP: .WORD 0 ERROR: CLR R1 TST (SP)+ POP R5 TST (SP)+ JMP EXG3 ;MOVG$ - п/п копирования и обена массивов ;2(SP) - имя/сегмент источника (=377 - ДОС) ;(SP) - имя/сегмент приемника (=376 - WORK + осн. ОЗУ) ;1 б.=0 + сегмент ; R2=0 - ошибка ;R0 - адрес/смещение источника ;R1 - адрес/смещение приемника ;R2 - длина (<0 - SWAP - обмен) MOVG$: PUSH R3 ;PC MOV #240,COM TST R2 BPL 1222 MOV (PC)+,@(PC)+ NEG R2 .WORD COM NEG R2 1222: MOV R2,(PC)+ ML$: .WORD 0 MOV 4(SP),R4 ;источник MOV R0,R5 ;источник CALL NAMEADR BCS 223 MOV R4,SEG.1 MOV R5,SME.1 MOV 2(SP),R4 ;приемник MOV R1,R5 ;приемник PUSH SEG.1 PUSH SME.1 CALL NAMEADR POP SME.1 POP SEG.1 BCS 223 MOV R4,SEG.2 MOV R5,SME.2 0: CALL MINLEN BCS 222 CALL TRANSF CALL COM ;копирование BR 0 223: CLR R2 BR .+4 222: MOV PC,R2 POP R5 JMP EXG3 MINLEN: MOV ML$,R2 BEQ 1SEC CMP SEG.1,#376 BEQ 2SEG CMP SEG.1,#377 BEQ 2SEG MOV #SEG.1,R1 CALL LENSEG2 CMP R1,R2 BHIS 2SEG MOV R1,R2 2SEG: CMP SEG.2,#376 BEQ 1CCC CMP SEG.2,#377 BEQ 1CCC MOV #SEG.2,R1 CALL LENSEG2 CMP R1,R2 BHIS 1CCC MOV R1,R2 1CCC: SUB R2,ML$ TST (PC)+ 1SEC: SEC RET TRANSF: ;Рез-тат: 6(SP) - smod ; 4(SP) - dmod ; R0 - sadr ; R1 - dadr ; INC сегментов и CLR смещений ; ADR=LEN*2+ADR MOV #SEG.1,R3 CALL TRANSF2 MOV R5,6(SP) MOV R4,R0 MOV #SEG.2,R3 CALL TRANSF2 MOV R5,4(SP) MOV R4,R1 RET TRANSF2: PUSH R0 CMP (R3),#377 BEQ 1WORK CMP (R3),#376 BEQ 1TEK MOV (R3),R5 ASL R5 MOV TABSEG(R5),R5 MOV ADRBK,R4 ;предп. адрес MOV #20000,R0 ;предп. длина TST R5 BPL 1ADR MOV #120000,R4 BIT #40,R5 BNE 1$ PUSH R4 MOV #140,R4 XOR R4,R5 POP R4 1$: 1ADR: BIT #40000,R5 BEQ 2ADR SUB #10000,R0 ;длина на 10000 меньше PUSH R5 BIC #74000,R5 CMP R5,#102160 BNE 3$ CMP R5,#102020 BNE 3$ ADD #10000,R4 ;Адрес - 130000 3$: POP R5 2ADR: BIT #4000,R5 BEQ 3ADR ADD #10000,R4 3ADR: BIT #20000,R5 BEQ 1LEN SUB #650,R0 1LEN: BIT #10000,R5 BEQ 2LEN SUB #350,R0 2LEN: BIC #174000,R5 BIT #40,R5 BNE 3333 BIS #40000,R5 3333: ADD 2(R3),R4 ADD R2,2(R3) ADD R2,2(R3) CMP 2(R3),R0 BLO 4 INC (R3) CLR 2(R3) BR 4 1TEK: MOV @WRK,R5 BR 2WORK 1WORK: MOV WRKTOP,R5 2WORK: BIT #40,R5 BNE 3333$ BIS #40000,R5 3333$: MOV 2(R3),R4 ADD R2,2(R3) ADD R2,2(R3) CMP 2(R3),#100000 BHI 4 BIS #100000,R5 4: POP R0 RET NAMEADR:;Аргументы: R4 - имя/сегмент ;R5 - адрес/смещение ;Результаты: R4 - сегмент ;R5 - смещение PUSH R1 PUSH R2 CMP R4,#400 BLO 1NONAME MOV R4,R1 CALL FINAME BCS 1SEC CALL FISM BR 1CCC 1NONAME: 1CCC: TST (PC)+ 1SEC: SEC POP R2 POP R1 RET FISM: ;R4 - запись, R5 - смещение ;R4 - сегмент, R5 - смещение MOV SEG.(R2),SEG.1 MOV SME.(R2),SME.1 MOV #77,SEG.2 CCC ROR R5 333: PUSH R5 CALL LENSEG POP R5 CCC SUB R4,R5 BCC 333 ASL R5 DEC SEG.1 MOV SEG.1,R4 ASL R4 ADD #20000,R5 BIT #40000,TABSEG(R4) BEQ 445 SUB #10000,R5 445: BIT #20000,TABSEG(R4) BEQ 446 SUB #650,R5 446: BIT #10000,TABSEG(R4) BEQ 447 SUB #350,R5 447: MOV SEG.1,R4 RET ;CAT$ - п/п работы с каталогом позволяет узнавать ин- ;формацию, создавать, удалят модули, читать/записывать ;информацию в записи каталога CAT$: ADD R0,PC BR CREATE ;Создание BR DEL0 ;Удаление без проверок и запусков BR DEL1 ;То же с запуском - не реализовано BR DEL2 ;То же с проверкой - не реализовано BR RWKAT ;Запись/чтение слов записи в каталоге JMP INF ;Возврат информации о RAMG v3.0 PUSH R3 MOV PC,R1 MOV 2(SP),R4 MOV 4(SP),R5 CALL NAMEADR ;R4 - сегмент ;R5 - смещение BCS 1ERROR MOV #SEG.1,R3 MOV R5,2(R3) MOV R4,(R3) MOV #1,R2 CALL TRANSF2 MOV R4,R1 ;Смещение MOV R5,R2 ;Режим POP R5 BR .+4 1ERROR: CLR R2 JMP EXG3 RWKAT: ;Аргументы после вызова: имя, смещение(100000 - запись) ;обмен производится через R1, R0=0 - ошибка ;Отлажено PUSH R3 PUSH R1 MOV 6(SP),R1 CALL FINAME ;R2 - адрес BCS 1EXIT MOV 4(SP),R1 TST R1 BMI 1SAVE ADD R1,R2 MOV (R2),(SP) BR 2EXIT 1SAVE: BIC #100000,R1 ADD R1,R2 MOV (SP),(R2) BR 2EXIT 1EXIT: CLR R0 2EXIT: POP R1 POP R5 BR EXG3 ;DEL2: CALL DELMOD ; BR EXG? ; CALL FINAME ; BCS NOT ; BEQ DEL$ ; MOV NAMH.(R2),R1 ; BEQ DEL$ ; PUSH R2 ; CALL FINAME ; POP R2 ; BCS DEL$ ; BR NOT DEL1: CALL FINAME BCS NOT DELTEK: DEL$: BIT #DELRUN$,PRI.(R2) BEQ DEL PUSH R2 MOV R1,NAME$$ MOV LEN.(R2),LEN$$ DEC LEN$$ ASL LEN$$ MOV #CONZAP,R1 MOV #CONZAP-NACZAP,R2 ASR R2 MOV -(R1),-(SP) SOB R2,.-2 CALL (SP) ADD #CONZAP-NACZAP,SP POP R2 BR DEL DEL0: ;Удаление модуля по имени из R1: R2=0 - нет такого ;Отлажен CALL FINAME BCS NOT DEL: DEC KOLMOD MOV R2,R5 ADD #16,R5 1: MOV (R5)+,(R2)+ CMP R5,#KOLMOD+894. BLO 1 BR NOT+2 NOT: CLR R2 TST R3 ;не смещеать относительно NOT BEQ RETDEL DEL2: MOV (PC)+,@(PC)+ BR .+10 .WORD SST CALL DELMOD BR EXG2 RETDEL: RET CREATE: ;П/п #0 - отлажено ;Аргументы: R1 - адрес записи (основное ОЗУ) ;Результаты: R0=0 - невозможно создать, R0<0 - есть уже ;1. LEN.(R1) - длина в словах ;2. PRI.(R1) - флаги: NEXT$ - можно ли разбивать ; RUN$ - запускаемость ;3. SME.(R2) - адрес в сегменте (>0 - нету) ;3. R3 - номер физ. сегмента (=0 - нету) ;Прим.: R2 и RUN$ без NEXT$ не работает. PUSH R3 PUSH R1 PUSH R2 MOV (R1),R1 CALL FINAME POP R2 POP R1 BCC 1ESTX CALL FINDM ;Поиск места BCS 1 ;R0 - адрес, незабыть переслать сегмент ;и смещение INC KOLMOD MOV #TABMOD+894.,R4 MOV R4,R3 SUB #16,R3 222: MOV -(R3),-(R4) CMP R3,R0 BNE 222 MOV #7,R2 MOV (R1)+,(R0)+ SOB R2,.-2 MOV SP,R0 BR 222$ 1ESTX: MOV PC,R0 BR 222$ 1: CLR R0 222$: POP R5 BR EXG INF: ;П/п #12 - отлажено ;Агрументов нету ;Результаты: ;Номер версии в R0 (x.yy: X*100.+YY) ;Адрес таблицы модулей в R1 и конец ; таблицы сегментов ;Кол-во модулей в R2 CALL TABSEG 1: MOV RBVERS,R0 MOV #TABMOD,R1 MOV KOLMOD,R2 ;Возвращение, если нет аргументов после вызова EXG2: MOV R3,R5 EXG: CMP -(R5),-(R5) ;Возвращение, если аргументы есть EXG3: CMP (SP)+,(SP)+ ;Пропустим аргументы JMP TOEX2$ ; MOV @WRK,R4 ;Режим ; JSR R4,@#MOD$J ;Возврат в ПЗУ ; .WORD EX$ FINDM: ;Поиск места для модуля ;Аргументы: R1 - адрес записи, R2 - сегмент MOV KOLMOD,R3 CMP R3,#64. BEQ 1SEC INC R3 MOV #TABMOD-16,R0 1NEXT: ADD #16,R0 CALL PLACE ;Запись в SEG.1, SEG.2, ;SME.1, SME.2 параметров места CALL TESTPL ;Проверка места на вхождение и его кор- ;ректировка. BCC 1SEC SOB R3,1NEXT SEC 1SEC: RET PLACE: PUSH R5 PUSH R4 CMP R0,#TABMOD BNE 1ZAP CLR SEG.1 CLR SME.1 BR 2ZAP 1ZAP: MOV SEG.-16(R0),SEG.1 MOV SME.-16(R0),SME.1 MOV #77,SEG.2 MOV LEN.-16(R0),R5 333: PUSH R5 CALL LENSEG POP R5 CCC SUB R4,R5 BCC 333 ASL R5 DEC SEG.1 MOV SEG.1,R4 ASL R4 ADD #20000,R5 BIT #40000,TABSEG(R4) BEQ 445 SUB #10000,R5 445: BIT #20000,TABSEG(R4) BEQ 446 SUB #650,R5 446: BIT #10000,TABSEG(R4) BEQ 447 SUB #350,R5 447: MOV R5,SME.1 2ZAP: CMP R3,#1 BNE 3ZAP MOV KOLSEG,SEG.2 CLR SME.2 BR 4ZAP 3ZAP: MOV SEG.(R0),SEG.2 MOV SME.(R0),SME.2 4ZAP: POP R4 POP R5 RET TESTPL: BIT #NEXT$,PRI.(R1) ;Тип проверки BEQ 1OK ;Проверка посегментно 1NEXT: MOV SEG.1,SEG.(R1) TST SME.(R1) BPL 1STD PUSH SME.(R1) BIC #160000,SME.(R1) CMP SME.(R1),SME.1 POP SME.(R1) BLO 1SEC MOV SME.(R1),SME.1 BIC #160000,SME.1 1STD: MOV SME.1,SME.(R1) CALL LENSEG ;R4 - длина в словах ;R5 - физ. номер BCS 1SEC CMP LEN.(R1),R4 BHI 1NEXT BIT RUN$,PRI.(R1) BEQ 2 TST R5 BPL 1NEXT 2: TST R2 BEQ 1CCC CMP R2,R5 BNE 1NEXT BR 1CCC 1OK: MOV SEG.1,SEG.(R1) MOV SME.1,SME.(R1) PUSH R0 CLR R0 CLR R4 2OK: CCC ADD R4,R0 BCS 2CCC CALL LENSEG BCC 2OK CMP LEN.(R1),R0 BHI 2SEC 2CCC: POP R0 1CCC: TST (PC)+ 1SEC: SEC RET 2SEC: SEC POP R0 RET LENSEG2: MOV (R1),R5 ASL R5 MOV TABSEG(R5),R5 MOV #20000,R4 BIT #40000,R5 BEQ 44 SUB #10000,R4 44: BIT #20000,R5 BEQ 45 SUB #650,R4 45: BIT #10000,R5 BEQ 46 SUB #350,R4 46: 2: SUB 2(R1),R4 ASR R4 BR 1CCC 1CMP: SUB SME.1,R4 ASR R4 1CCC: MOV R4,R1 RET LENSEG: CMP SEG.1,SEG.2 BEQ 1CMP MOV SEG.1,R5 ASL R5 MOV TABSEG(R5),R5 MOV #20000,R4 BIT #40000,R5 BEQ 44 SUB #10000,R4 44: BIT #20000,R5 BEQ 45 SUB #650,R4 45: BIT #10000,R5 BEQ 46 SUB #350,R4 46: 2: SUB SME.1,R4 ASR R4 INC SEG.1 CLR SME.1 BR 1CCC 1CMP: CMP SME.1,SME.2 BEQ 1SEC MOV SEG.1,R5 ASL R5 MOV TABSEG(R5),R5 MOV SME.2,R4 SUB SME.1,R4 ASR R4 MOV SME.2,SME.1 1CCC: BIC #74000,R5 TST (PC)+ 1SEC: SEC RET FINAME: ;R1 - имя, R2 - адрес, C - нету PUSH R0 MOV #TABMOD-16,R2 MOV KOLMOD,R0 3: DEC R0 BMI 1SEC ADD #16,R2 CMP (R2),R1 BNE 3 TST (PC)+ 1SEC: SEC POP R0 RET ;-------------------------------------------------------------- ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; MOV PRI.(R2),R0 ; COM R0 ; BIT PARAM,R0 ; BNE +удалять ;Циклический процесс удаления безродных модулей и, при условии ;PARAM=DELEX$, удаления модулей помеченных DELEX$. DDL: MOV #32762,SST DELMOD: PUSH R2 PUSH R4 A1: MOV KOLMOD,R4 ;б. 2: BEQ A5 PUSH R4 MOV #TABMOD,R2 A3: SST: BIT #DELEX$,PRI.(R2) ;ё BEQ 1DEL ;Tэто смещать нельзя BIT #DELN$,PRI.(R2) ;¦ BNE 1NODEL MOV NAMH.(R2),R1 BEQ 1NODEL PUSH R2 CALL FINAME POP R2 BCC 1NODEL 1DEL: PUSH R4 PUSH R2 PUSH R3 CLR R3 CALL DELTEK POP R3 POP R2 POP R4 1NODEL: ADD #16,R2 SOB R4,A3 CMP KOLMOD,(SP)+ BNE A1 A5: POP R4 POP R2 RET ;-------------------------------------------------------------- NACZAP: JSR R5,@#167516 LEN$$: .WORD 0 NAME$$: .WORD 0 MOV @SP,R4 JMP @#MOD$S ; MOV #6,@#177130 ; MOV #2160,@#177130 ; RET CONZAP: SEG.1: .WORD 0 SME.1: .WORD 0 SEG.2: .WORD 0 SME.2: .WORD 0 KOLMOD: .WORD 0 ADRBK: .WORD 100000 KOLSEG: .WORD 204 ;Изначальная длина таблицы + 2 TABSEG: NOP ;2 MOV R2,ADRBK ;6 MOV R1,WRKTOP ;12 MOV R1,WRKTOP-10 ;16 MOV #240,INF ;22 MOV #240,INF+2 ;26 RET ;30 .BLKB 150 ;#100000 - расположение по адресу 120000, возможность ;ПЗУ - режима. ;#40000 - длина 10000 ;#20000 - длина уменьшается на 650 (@#177130) ;#10000 - --/-- уменьшается на 350 (модем) ;#4000 - адрес+10000 .WORD 206 ;Изначальная длина таблицы + 4 TABMOD: .BLKB 894. .END