; RAM.AS ;Адреса ERR$,WRK$,MAIN$,CHWRK$,PZP$ ; не должны меняться от версии к версии !!! ;Базовая часть RAM-BIOS, (c) АльтПро, 1998-2002 ;Автор: Новак В. Е., незначительная модификация RSC .ORG 120000 EXIT$=167527 MOV$=167342 EXCH$=167364 EEND=167412 SIGNL$=167412 BEG$R5=167460 CHW$EX=167616 ;NEW$SP RET$$=167656 EX$SP=167666 EX$=167670 RETS$=167706 ;CH$WRK MOD$S=167744 MOD$J=167752 MOD$=167754 MOD$0=167766 STP$=167712 ARTI$=167714 ;===== НАЧАЛО ===== .WORD 0 ;блокир. JMP @#120000 RBVERS: .WORD 305 ERR$: .BYTE 0,111 ;111 - необязат.контрол.код PZP$: .WORD PZP ;====== АДРЕСА ГЛОБАЛЬНЫХ ТОЧЕК ВХОДА .WORD MAIN$ ;<- для проверки сохранности из ПЗУ MAIN$: .WORD MAIN WLIM: .WORD WRKBOT+10 ;предел опускания стека WRK ;располож.непоср.после MAIN$ ! WRK$: ;указ.на тек.режим, наход.на вершине ;стека режимов (виртуальных п/п) WRK: .WORD WRKTOP-10 ;выше подниматься не будет, ;выше - данные режима ДОС DOS$: .WORD WRKTOP ;указ.на реж.DOS для возм.внешн.измен. CHWRK$: BR CHWRK ;точка входа FIS$RT: JMP FISRT ;глоб.т.вх.для возвр.из FIS в др.стран. .BLKW 21 ;резерв SSP: .WORD SSPTOP ;указ.на стек сохран.раб.обл.осн.ОЗУ SPLIM: .WORD SSPBOT+50 ;44 - для СТОП + 2 x -(SP) MAIN: CMP R4,ENDBIO ;<==== ОСНОВНАЯ ТОЧКА ВХОДА П/П ;R4=MAIN$+2 BNE ERR1 ;контроль сохранн.конца BIOS SUB #BEG$R5,R5 ASL R5 JMP @TAB(R5) CHWRK: MOV @WRK,R4 ;быстр.перекл.режима, RAM-часть TST R0 ;нов.режим или: BLE 1$ ;- не менять MOV R0,@WRK 1$: MOV #177130,R0 ;стек не используется ! MOV #6,@R0 JMP @#CHW$EX ;обратно в ПЗУ PZP: ;======= ОБРАБОТКА ПЕРЕЗАПУСКА С КОДОМ КЛАВИШ ; КРОМЕ 3,40-47,>100 ;ВХОД: R0=KEY или 0, R1=STD mode (60/100140) ;@SP=old_R2=40 - при RTS не портить! ;R2=адр.возврата с STD-загрузкой (см...) PUSH R0 PUSH R2 PUSH R1 SWAB R0 BISB #'$,R0 SWAB R0 MOV R0,R1 CALL FINAME POP R1 POP R2 BCS 111 PUSH R3 CMP -(SP),-(SP) PUSH #0 PUSH R0 JMP JMPG$ 111: POP R0 CMPB R0,#14 BNE 222 JSR R5,@#EXIT$ 222: RTS R2 ;СОХРАНЕНИЕ ОБЛАСТИ ОСНОВНОЙ ПАМЯТИ ;ВЫЗОВ: JSR R5,@#SAVE$ ;ВХОД: R0 - адрес вершины; R1 - длина (вниз), байт; к стеку не ; обращается (т.е. он может быть в доп. памяти). ;НОРМ.ВЫХОД: R0,R1 не портятся. НЕТ МЕСТА ДЛЯ СОХРАНЕНИЯ: R0=0. ;Сохранение и восстановление (в резидентн. программах) должно ;быть в одном вызове (прерывании), иначе мож.нарушиться порядок SAV$: MOV R3,R5 ;будет адр. возврата MOV SP,R3 MOV SSP,SP MOV SP,R4 SUB R1,R4 CMP R4,SPLIM BLOS ERRSSP MOV R4,SP ADD R1,R4 MOV R1,-(SP) MOV R0,-(SP) ;длина и адр.тоже сохраняются ASR R1 1$: MOV -(R0),-(R4) SOB R1,1$ MOV -(R4),R1 ;=2(SP), длина MOV @SP,R0 ;top addr MOV SP,SSP SAV$EX: ADD #4,R3 ;коррекц.SP,PC на arg1,arg2, к-рых нет SUB #4,R5 ;теор. CMP (Rn)+,(Rn)+ низя MOV @WRK,R4 JSR R4,@#MOD$J .WORD EX$SP ERRSSP: CLR R0 ;признак ошибки BR SAV$EX ;ВОССТАНОВЛЕНИЕ ОБЛАСТИ ПАМЯТИ, СОХРАНЕННОЙ П/П SAVE$ ;Регистры не портит, к стеку не обращается. RSTO$: MOV R3,R5 ;будет адр.возврата MOV SP,R3 MOV SSP,SP CMP SP,#SSPTOP-4 BHIS ERRSTO MOV SP,R4 MOV R0,-(SP) MOV R1,-(SP) MOV (R4)+,R0 ;адрес MOV (R4)+,R1 ;длина SUB R1,R0 ;->нач. ASR R1 1$: MOV (R4)+,(R0)+ SOB R1,1$ MOV (SP)+,R1 MOV (SP)+,R0 MOV R4,SSP BR SAV$EX ; MOVB @PC,R0 ;ошибка #4 ; BR ER$ ; MOVB @PC,R0 ;3 ; BR ER$ OVERFW: ;эти 2 ошибки различ.по содержимому WRK ERRET: MOVB @PC,R0 ;ошибка #2 - нарушение стека режимов BR ER$ ERR: MOVB @PC,R0 ;1 - несуществующий запрос BIOS BR ER$ ERRSTO: MOVB (PC)+,R0 ;340 - ошибка восст-я ОЗУ,стека ERR1: MOVB @PC,R0 ;100 - разрушен конец RAM-BIOS ER$: ASR R0 MOVB R0,ERR$ ;еще быв.ош.без # - испорч.MAIN$-2 JMP @#SIGNL$ ;проверять сперва MAIN$-2 CALN$: ;ВЫЗОВ: JSR R5,@#CAL$N ; .WORD addr,mode CMP (R4)+,@R4 ;WLIM,WRK BHI OVERFW MOV @R4,R5 MOV R3,-(R5) ;адр.RTS MOV 6(SP),-(R5) ;PS & @#6 MOV 4(SP),-(R5) ;@#4 MOV (SP)+,-(R5) ;нов.режим = арг2 MOV R5,@R4 ;WRK MOV @R5,R4 ;нов.режим MOV (SP)+,R5 ;нов.адр.= арг1 CMP (SP)+,(SP)+ ;@#4,PS старые не устанавл. MOV (SP)+,R3 MOV @SP,-(SP) ;R4 MOV 4(SP),2(SP) ;R5 MOV #RET$$,4(SP) ;т.вх.(ПЗУ) возврата из режима ;останется на вершине стека TORETS: JSR R4,@#MOD$J .WORD RETS$ JMPN$: ;ВЫЗОВ: JSR R5,@#JMP$N ; .WORD addr,mode MOV (SP)+,R4 ;нов.режим MOV R4,@WRK MOV (SP)+,R5 ;нов.адр. CMP (SP)+,(SP)+ ;@#4, PS будут заблокированы ! MOV (SP)+,R3 ;=JSR R4,@#MOD$J BR TORETS ;.WORD RETS$-2 EXI$: CALL DDL ;Удаление модулей!!! MOV #WRKTOP-10,WRK ;-> будет реж. ДОС MOV #SSPTOP,SSP RET$: CMP (SP)+,(SP)+ ;arg1,arg2 & R3 (PC) - не нужны MOV WRK,R3 TST (R3)+ ;old режим MOV (R3)+,@SP ;@#4 MOV (R3)+,2(SP) ;PS & @#6 MOV (R3)+,R5 ;PC MOV @R3,R4 ;режим CMP R3,#WRKTOP BHIS 1$ MOV R3,WRK BR 1DEL 1$: BNE ERRET ;испорчен стек WRK MOV R4,@WRK ;текущ.= режим ДОС 1DEL: BR TOEX$ ;ЧТЕНИЕ И ОБМЕН СЛОВ. ВЫЗОВ: JSR R5,@#RDW$N или @#CHW$N ; .WORD addr, mode & flags ;Читает в R0 или обменивает R0. ;Флаги и 0 означают то же, что и в MOV$N. ;Чтение/обмен обеспечиваются и при отсутст. ПЗУ в треб. режиме, ;хотя и медленнее., CHWN$: CLR R5 ;признак обмена RDWN$: MOV (SP),R4 ;mode MOV R3,-(SP) ;PC MOV R2,-(SP) MOV R1,-(SP) MOV R0,-(SP) MOV SP,R1 ;dadr = сохраненный R0 MOV 12(SP),R0 ;sadr MOV #1,R2 ;1 слово TST R5 BNE 1$ NEG R2 ;обмен 1$: CALL MA$ ;передаем и -> EXWRK$ EXWRK$: MOV (SP)+,R0 MOV (SP)+,R1 MOV (SP)+,R2 EXWRK$$: MOV (SP)+,R5 ;PC CMP (SP)+,(SP)+ ;arg1,arg2 TOEX2$: MOV @WRK,R4 TOEX$: JSR R4,@#MOD$J .WORD EX$ ;ПЕРЕСЫЛКА И ОБМЕН МАССИВОВ (вызов по коду и адресу): ; ;ВЫЗОВ: MOV sadr,R0 ;адрес источника ; MOV dadr,R1 ;адрес приемника ; MOV n,R2 ;длина массива - n слов ; JSR R5,@#MOV$N ;обязательно абс.адресация ; .WORD smod,dmod ;коды режимов ист.,приемн. ; ; Все регистры сохраняются, стек должен быть в основном ОЗУ, ;остальное - произвольно; перекрытие массив. приведет к ошибке, ;если приемник выше источника; если заданы несовпадающ. режимы, ;пересылка ведется через осн.ОЗУ (с адреса = SP) с его сохране- ;нием, перекрытия недопустимы. Внимание! В случае несовпадающих ;режимов пересылка ИЗ ПЗУ недопустима! (Рекомендуется при пере- ;сылке из ПЗУ устанавливать для 1 из режимов флаг 100000). ; Правильность установки флагов режимов не контролируется. ; ;режимы = код включения + флаги: ; 100000 = "любой" (устан., если массив в основном ОЗУ); ; 40000 = без ПЗУ (устан., если в этом режиме в сегменте ; 160000... отсутствует ROM-BIOS (ПЗУ или его ; копия), п/п пересылки будут в стеке); ; т. е. нет п/п MOV$,EXCH$ ;режим = 0 означает режим WORK (берется из WRK$); ;длина массива < 0 (по NEG) - признак ОБМЕНА массивов. MOVN$: MOV R3,-(SP) ;PC CALL MOVN2 BR EXWRK$$ COM: .WORD 240 MOVN2: MOV R2,-(SP) ;n MOV R1,-(SP) MOV R0,-(SP) MOV R1,-(SP) ;dadr MOV R0,-(SP) ;sadr MOV 16(SP),R5 ;dmod MOV 20(SP),R4 ;smod BMI 1$ ;любая стр. TST R5 BMI MA1 ;любая стр. CMP R4,R5 BNE TWIC ;через осн.ОЗУ BR MA1 1$: MOV R5,R4 MA1: CALL MA$ CMP (SP)+,(SP)+ ;рабочие POP R0 POP R1 POP R2 RET TWIC: TST R2 BMI 1$ NEG R2 ;обмены для сохр.осн.ОЗУ 1$: MOV R2,-(SP) MOV SP,R1 ADD #30,R1 ;(dadr) в осн.ОЗУ MOV R1,-(SP) CALL MA$ ;обмен осн.ОЗУ с источн. MOV @SP,R0 ;(sadr) MOV 6(SP),R1 ;dadr MOV 22(SP),R4 ;dmod MOV 14(SP),R2 ;n real CALL MA$ ;пересыл. в приемник MOV (SP)+,R1 ;(dadr) MOV (SP)+,R2 ;(n) MOV @SP,R0 ;sadr MOV 20(SP),R4 ;smod BR MA1 ;обмен ОЗУ - источник MA$: TST R4 BNE MA$1 ;0 = WORK MOV @WRK,R4 MA$1: MOV #MOV$,R5 TST R2 BPL 1$ NEG R2 ADD #EXCH$-MOV$,R5 ;обмен 1$: MOV #40000,R3 ;2-ное использ.! BIT R3,R4 BEQ 2$ ADD #EEND-EXCH$,R5 ;без ПЗУ MOV #EEND-EXCH$,R3 ASR R3 MOV #2,-(SP) ;RTI MOV #161716,-(SP) ;SUB @PC,@SP - блокир.СТОП MOV SP,@#4 ;будет тоже в стеке 3$: MOV -(R5),-(SP) SOB R3,3$ MOV SP,R5 ;=адр. п/п 2$: MOV R5,-(SP) MOV #177130,R5 TST R4 BMI 4$ ;- без строба страница не подкл. MOV #6,@R5 4$: JSR PC,@(SP)+ ;п/п в ПЗУ либо в стеке MOV R3,@R5 ;40000 из ПЗУ, 0 - из стека BNE 5$ MOV #STP$,@#4 ADD #4+EEND-EXCH$,SP ;восст.стек 5$: RTS PC FS$: JMP ERR FISRT: JMP ERR ;R45RTI:MOV @WRK,R4 ;возврат из внеш.обраб.прерыв. ; MOV #ARTI$,R5 ;с восст. R4,R5 & RTI ; JMP TORETS ;->MOV (SP)+,R4, RTS R5 -> RTI ;выход с восстановлением стека возм.через EX$SP, см. SAV$EX .INCLUD /CAT31.OBJ/ ;ТАБЛИЦА ПОДПРОГРАММ TAB: .WORD ERR,ERR,ERR,ERR,ERR,ERR,ERR,ERR,ERR,ERR .WORD ERR,ERR,ERR,ERR,ERR,ERR,ERR,ERR,ERR,ERR .WORD ERR,ERR,ERR,ERR,ERR,ERR,ERR,ERR,ERR,PP2 TABPR: .WORD PP2,PP2,MOVG$,CAT$,CALN$ .WORD JMPN$,RDWN$,CHWN$,MOVN$,EXI$ .WORD SAV$,RSTO$,ERR,ERR,ERR .WORD FS$,ERR,ERR,ERR,RET$ WRKBOT: .BLKB 242 ;на 20. вызовов .WORD 60,100442,0,100000 ;предполаг.парам.режима ДОС WRKTOP: .WORD 60 ;для БК10 SSPBOT: .BLKB 1054 ;стек сохран.обл.осн.ОЗУ SSPTOP: ENDBIO: .WORD MAIN$+2 .END ** *