[an error occurred while processing this directive]
; Файл библиотеки для поддержания текстового ; режима и оконного интерфейса ; Дата написания 23.8.94 ; BorSoft ; Copyright 1994 ; If You have some changes in this file ; PLEASE Call (095) 188-31-34 ( in Moscow ) ; Состав библиотеки: ; Window - Установить текущим окно ; Формат обращения( абсолютные координаты ) ; WLeft WTop WRight WBottom - ; ClrScr - Oчистить текущее окно ; PushWindow - Запомнить область экрана в стеке ; Формат обращения( абсолютные координаты ) ; PopWindow - Вспомнить из стека область экрана ; Формат обращения( абсолютные координаты ) ; GetWindow - Выдать коор. рабочей области на экране ; GoToXY - Передвинуть курсор по относительным коор. ; SetColor - Установить цвет символов( 32*32 ) ; GetColor - Взять значение текущего цвета ; SetPalette - Установить палитру( 1..4 ) ; GetPalette - Взять значение палитры ; GetScrAdr - Взять адрес начала текущего экрана ; Flash - Установить для 32*32 мерцание ; Inverse - Установить для 32*32 инверсию символов ; Normal - Понятно ; GetChar - Возьмем символ по координатам ; Border - Нарисуем рамку ; Формат обращения( абсолютные координаты ) ; X1 Y1 X2 Y2 BorderNo - ; PushState - Запомнить текущее состояние экрана ; PopState - Восстановить прошлое состояние экрана ; Home - Курсор в ЛевоВерх окна ; SSP@ - Взять адрес текущего положения экр. стека ; SSP! - Сбросить экранный стек ; ShowList - Показать на текущем окне по адресу ; в стеке текстовый список( OUTS- просто ) ; ShowString - Показать на текущей строке стр. из памяти ; ToBegStr - В начало текущей строки ; ShowBorder - Нарисуем свою рамку ; Формат обращения: ; X1 Y1 X2 Y2 MyBorderAdr - ; Примечание: MyBorderAdr- адрес описателя ; рамки, состоящий из 6 байт( на примере ) ; ; 12222223 ; 4 4 ; 4 4 ; 62222225 ; Начальная инициализация Crtlib dfb ¤86 asc "crtliB" dw 0 crtlib l100 jsr sspsto jsr lit l101 dw settext32 jsr scrdrivers jsr twop jsr store Запомним процедуру установки TEXT32 jsr lit l102 dw home jsr jumpkeytab jsr lit dw ¤18 jsr plus jmp store Установим CTRL-L ;--------------------------------------------------------- ; Сначала ассемблерные процедуры ; ; На входе в стеке координаты на выходе VREM смещение MakeOffs jsr Pop Возьмем со стека координату Y ldy #¤0 sty Vrem sta Vrem+1 clc ror Vrem+1 Умножим на ¤40 ror Vrem ror Vrem+1 ror Vrem jsr Pop Возьмем со стека координату X sta Vrem+2 lda Mode cmp #TEXT64 beq b100 asl Vrem+2 b100 lda Vrem+2 clc adc Vrem Получим смещение от начала экрана sta Vrem rts ; По координатам на стеке установим во VREM реальный адрес GetRealAdr l103 jsr CheckBound Проконтролируем границы bcs badout l104 jsr MakeOffs Сделаем смещение от угла окна lda BegPos+1 Прибавим адрес начала экрана and #¤f8 clc adc Vrem+1 sta Vrem+1 b119 inx Восстановим стек inx inx inx badout rts ; Установим адрес для относительных координат GetOffsAdr l105 jsr CheckOffsBound bcs badout l106 jsr MakeOffs lda BegPos clc adc Vrem sta Vrem lda BegPos+1 adc Vrem+1 sta Vrem+1 l107 jmp b119 ; Контроль координат на стеке( если плохие, то стек чист ) CheckBound jsr Pop cmp #¤20 bcs b101 jsr Pop ldy Mode cpy #TEXT64 beq b102 asl a b102 cmp #¤40 bcs b103 b120 inx inx inx inx rts b101 dex dex b103 rts ; Проконтролируем относительные координаты CheckOffsBound jsr Pop cmp WinDepth bcs b101 jsr Pop cmp WinWidth bcs b103 bcc b120 ; Установим адрес в ячейках FORTH по VREM SetScrAdr lda Vrem sta CurrPos lda Vrem+1 sta CurrPos+1 rts ; Положим в экранный стек слово с регистров PushS sta ¤c083 Включим старшую половину на адреса D000-DFFF sty Vrem+¤a ldy #¤0 sta (TxtStack),y iny lda Vrem+¤a sta (TxtStack),y lda TxtStack clc adc #¤2 Изменим адрес экранного стека savesstack sta TxtStack bcc b104 inc TxtStack+1 b104 sta ¤c08b Восстановим конфигурацию памяти rts ; Возьмем со стека число в регистры PopS sta ¤c083 lda TxtStack beq b199 b198 lda TxtStack sec sbc #¤2 sta TxtStack bcs b105 dec TxtStack+1 b105 ldy #¤1 lda (TxtStack),y sta Vrem+¤a dey lda (TxtStack),y ldy Vrem+¤a sta ¤c08b rts b199 lda TxtStack+1 cmp #¤d0 beq b104 bne b198 ; Положим на экранный стек строку по адресу в VREM ; и длиной в Y PushSString sta ¤c083 sty Vrem+¤a ldy #¤0 b106 lda (Vrem),y sta (TxtStack),y iny cpy Vrem+¤a bne b106 clc lda TxtStack adc Vrem+¤a l108 jmp savesstack ; Возьмем с экранного стека строку как выше PopSString sta ¤c083 sty Vrem+¤a lda TxtStack beq whatsit b197 lda TxtStack sec sbc Vrem+¤a sta TxtStack bcs b108 dec TxtStack+1 b108 ldy #¤0 b109 lda (TxtStack),y sta (Vrem),y iny cpy Vrem+¤a bne b109 beq b104 whatsit lda TxtStack+1 cmp #¤d0 bne b197 beq b104 ; Если не текстовый режим, то пропустим процедуру IsTextMode lda Mode cmp #TEXT64 beq okoutt cmp #TEXT32 beq okoutt sec rts okoutt clc rts ; Процедура входа в текстовую процедуру CrtIn l109 jsr IsTextMode Если не текстовый режим, то пропустим bcs nowaygr jsr DisInt Замаскируем прерывания jmp CursorOff nowaygr pla pla rts ; Процедура выхода из текстовой процедуры CrtOut jsr CursorOn jmp EnbInt ; Переместим курсор в нулевые координаты SetNullPos ldy #¤0 tya b114 sta PosX,y iny cpy #¤4 bne b114 rts ; Установим следующую строку для VREM NextVrem lda #¤40 clc adc Vrem sta Vrem bcc b139 inc Vrem+1 b139 rts ; Установим предыдущий VREM PrevVrem lda Vrem sec sbc #¤40 sta Vrem bcs b139 dec Vrem+1 rts ; Установим режим текста 32*32-------------------- settext32 jsr swap jsr dup jsr two jsr less jsr zbran dw m301-*-2 jsr settext jsr lit dw ¤27 jsr atribute jsr store jsr t32 jsr winwidth jsr store jmp true m301 jsr ddrop jmp false ; Выдадим на стек число символов по числу строк howmuchsymb jsr Pop sta Vrem+4 Число строк jsr StackVrem ldy #¤0 sty Vrem+2 sty Vrem+3 Обнулим счетчик b130 lda (Vrem),y beq endlist cmp #ENTERKEY beq findcr b132 inc Vrem+2 bne b131 inc Vrem+3 b131 iny bne b130 inc Vrem+1 bne b130 findcr dec Vrem+4 bne b132 endlist lda Vrem+2 ora Vrem+3 beq dropstack Если символов 0, то уберем из стека адрес inx inx dropstack jsr Vrem2Stack rts ; Нарисуем полосу в любом месте ShowHorLine lda Vrem+4 sta Vrem+3 sty Vrem+6 ldy #¤1 lda (Vrem+¤a),y ldy Vrem+6 b196 dec Vrem+3 beq b195 l160 jsr OutBordPart bne b196 b195 rts ; Выведем одну частичку бордера OutBordPart sta (Vrem),y pha lda Mode iny cmp #TEXT64 beq outahere lda Atribute sta (Vrem),y iny outahere pla rts ;-------------------------------------------------------- ; Процедуры связи с FORTH ; ; ; Переместить курсор по координатам на стеке Gotoxy dfb ¤86 asc "gotoxY" dw Crtlib gotoxy l110 jsr CrtIn l111 jsr GetOffsAdr Установим адрес для курсора( ot bcs badcoor Координаты не устраивают jsr Pop sta PosY jsr Pop sta PosX l112 jsr SetScrAdr badcoor l113 jmp CrtOut ; Очистим экран текстовой консоли Clrscr dfb ¤86 asc "clrscR" dw Gotoxy clrscr l114 jsr CrtIn lda WinDepth sta Vrem+3 lda BegPos sta Vrem lda BegPos+1 sta Vrem+1 lda WinWidth sta Vrem+2 lda Mode cmp #TEXT64 beq nextline asl Vrem+2 nextline ldy #¤0 curline lda #BLANK sta (Vrem),y lda Mode cmp #TEXT64 beq b112 iny lda Atribute sta (Vrem),y b112 iny cpy Vrem+2 bne curline Цикл по текущей строке l115 jsr NextVrem Прибавим ¤40 к содержимому VREM dec Vrem+3 bne nextline l116 jmp CrtOut ; Объявим окно для последующего вывода Window dfb ¤86 asc "windoW" dw Clrscr window l117 jsr CrtIn l118 jsr GetRealAdr bcs noway jsr Pop sta Vrem+4 Координата нижнего угла окна по У jsr Pop sta Vrem+5 Координата нижнего угла окна по Х lda Vrem Сохраним адрес нижнего угла sta Vrem+7 lda Vrem+1 sta Vrem+8 l119 jsr GetRealAdr bcs noway1 jsr Pop sta WinY sta Vrem+9 Координата верхнего угла окна по Х jsr Pop sta WinX sta Vrem+¤a Координата верхнего угла окна по У lda Vrem+4 sec sbc Vrem+9 sta WinDepth inc WinDepth lda Vrem+5 sec sbc Vrem+¤a sta WinWidth inc WinWidth l120 jsr SetScrAdr Установим адрес начала окна lda Vrem+1 sta BegPos+1 lda Vrem sta BegPos and #¤3f Установим адрес начала последней линии окна sta Vrem lda Vrem+7 and #¤c0 ora Vrem sta EndPos lda Vrem+8 sta EndPos+1 l121 jsr SetNullPos l122 jmp CrtOut noway jsr Pop jsr Pop noway1 l123 jmp CrtOut ; Положим окно на сохранение в стек Pushwindow dfb ¤8a asc "pushwindoW" dw 0 pushwindow jsr dswap l125 jsr CrtIn l126 jsr GetRealAdr bcs noway lda Vrem+2 sta Vrem+¤a Сохраним смещение от 0 позиции для верха jsr Pop sta Vrem+4 Сохраним адрес werha сохраняемого окна jsr Pop sta Vrem+5 l127 jsr GetRealAdr bcs noway1 jsr Pop sec sbc Vrem+4 sta Vrem+4 inc Vrem+4 jsr Pop sec sbc Vrem+5 sta Vrem+5 inc Vrem+5 lda Mode cmp #TEXT64 beq b116 asl Vrem+5 b116 lda Vrem Установимся на начало низа сохран. окна and #¤c0 ora Vrem+¤a sta Vrem lda Vrem+4 sta Vrem+2 loopallwin ldy Vrem+5 l129 jsr PushSString l128 jsr PrevVrem dec Vrem+2 bne loopallwin ldy Vrem+5 lda Vrem+4 l130 jsr PushS Сохраним объемные параметры окна jsr CursorOn jmp EnbInt ; Восстановим окно из экранного стека на экран Popwindow dfb ¤89 asc "popwindoW" dw Writefile popwindow l131 jsr CrtIn l132 jsr GetRealAdr bcs badout1 l133 jsr PopS Восстановим объемные параметры окна sta Vrem+4 Глубина окна sty Vrem+5 Ширина окна b117 ldy Vrem+5 l134 jsr PopSString l135 jsr NextVrem dec Vrem+4 bne b117 jsr Pop jsr Pop badout1 l136 jmp CrtOut ; Сохраним экранные параметры в экранном стеке Pushstate dfb ¤89 asc "pushstatE" dw Popwindow pushstate jsr DisInt lda #>EndPos sta Vrem lda #<EndPos sta Vrem+1 Установим адрес для сохранения экр. парам. ldy #¤14 l137 jsr PushSString jmp EnbInt ; Восстановим экранные параметры из стека Popstate dfb ¤88 asc "popstatE" dw Readfile popstate jsr DisInt jsr CursorOff lda #>EndPos sta Vrem lda #<EndPos sta Vrem+1 ldy #¤14 l138 jsr PopSString jsr CursorOn jmp EnbInt ; Возьмем по абсолютным координатам символ с экрана Getchar dfb ¤87 asc "getchaR" dw Sysbuf1 getchar jsr CursorOff l139 jsr GetRealAdr bcs nexxt jsr Pop jsr Pop ldy #¤0 sty Vrem+3 lda Mode cmp #TEXT64 beq justgetit iny lda (Vrem),y sta Vrem+3 dey justgetit lda (Vrem),y sta Vrem+2 jsr Vrem2Stack nexxt jmp CursorOn ; Переместим курсор в угол окна Home dfb ¤84 asc "homE" dw 0 home l140 jsr clrscr jsr zero jsr zero l167 jmp gotoxy ; Установим экранный стек в начальное положение Sspsto dfb ¤84 asc "ssp!" dw Home sspsto lda #¤0 sta TxtStack lda #¤d0 sta TxtStack+1 rts ; Возьмем на стек текущее положение экранного стека Sspat dfb ¤84 asc "ssp@" dw Sspsto sspat lda TxtStack ldy TxtStack+1 jmp PushNext ; Покажем на всем окне текст( на стеке адрес ) Showlist dfb ¤88 asc "showlisT" dw Popstate showlist l141 jsr tobegstr jsr windepth jsr at l143 jsr howmuchsymb Выдадим на стек число символов ; в экране jmp type Выведем все на окно ; Покажем на строке по адресу на стеке Showstring dfb ¤8a asc "showstrinG" dw Pushwindow showstring l144 jsr tobegstr Перейдем к началу строки jsr one l145 jsr howmuchsymb jmp type ; Перейдем к началу строки Tobegstr dfb ¤88 asc "tobegstR" dw Showlist tobegstr jsr zero jsr posy jsr at l146 jmp gotoxy ; Установим цвет для режим32 Setcolor dfb ¤88 asc "setcoloR" dw Tobegstr setcolor lda Mode cmp #TEXT32 bne not32 jsr Pop and #¤7 sta Vrem lda Atribute and #¤f8 ora Vrem sta Atribute not32 rts ; Возьмем цвет для режим32 Getcolor dfb ¤88 asc "getcoloR" dw Setcolor getcolor lda Atribute and #¤7 ldy #¤0 jmp PushNext ; Установим палитру для текста и графики Setpalette dfb ¤8a asc "setpalettE" dw Showstring setpalette jsr Pop and #¤3 l147 sta mypalette ldy #¤0 sty Vrem+2 sty Vrem+3 ror a rol Vrem+2 ror a rol Vrem+3 ldy Vrem+2 lda ¤c058,y ldy Vrem+3 lda ¤c05a,y fuck rts ; Возьмем номер текущей палитры Getpalette dfb ¤8a asc "getpalettE" dw Setpalette getpalette l148 lda mypalette ldy #¤0 jmp PushNext mypalette dfb ¤0 ; Возьмем адрес начала текущего экрана Getscradr dfb ¤89 asc "getscradR" dw Pushstate getscradr l149 jsr IsTextMode bcs fuck lda BegPos+1 and #¤f8 tay ldy #¤0 jmp PushNext ; Установим мерцание для режим32 Flash dfb ¤85 asc "flasH" dw Bank5 flash lda #¤8 sta Vrem myset lda Mode cmp #TEXT32 bne fuck lda Atribute and #¤d7 ora Vrem sta Atribute rts ; Установим инверсию для режим32 Inverse dfb ¤87 asc "inversE" dw Getchar inverse lda #¤0 sta Vrem beq myset ; Нормальное отбражение Normal dfb ¤86 asc "normaL" dw Window normal lda #¤28 sta Vrem bne myset ; Нарисуем рамку для окна( в стеке номер рамки ) Border dfb ¤86 asc "bordeR" dw Normal border jsr three jsr min jsr lit dw ¤7 jsr star jsr lit l150 dw myborders jsr plus Получили адрес начала описания рамки l151 jmp showborder ; Описатели рамок myborders dfb ¤6,¤10,¤1b,¤12,¤5c,¤1f,¤1d dfb ¤6,¤09,¤1b,¤0a,¤5c,¤0b,¤0c ASC ¤6,"" ASC ¤6," " nowayy jmp ddrop ; Нарисуем рамку на абсолютном экране ; на стеке: TopX TopY BotX BotY BorderAdr - Showborder dfb ¤8a asc "showbordeR" dw Getpalette showborder jsr onep l152 jsr CrtIn jsr Pop sta Vrem+¤a sty Vrem+¤b l153 jsr GetRealAdr bcs nowayy jsr Pop sta Vrem+5 НизУ jsr Pop sta Vrem+4 НизХ l154 jsr GetRealAdr bcs nowayy jsr Pop sta Vrem+6 lda Vrem+5 sec sbc Vrem+6 sta Vrem+5 ГлубинаУ jsr Pop sta Vrem+6 lda Vrem+4 sec sbc Vrem+6 sta Vrem+4 ДлинаХ ; ВерхЛевоУгол ldy #¤0 lda (Vrem+¤a),y l161 jsr OutBordPart ; Рисуем полоску l155 jsr ShowHorLine ; ВерхПравоУгол sty Vrem+3 ldy #¤2 lda (Vrem+¤a),y ldy Vrem+3 l162 jsr OutBordPart ; Рисуем вертикальные полоски lda Vrem+4 sta Vrem+6 lda Mode cmp #TEXT64 beq not322 asl Vrem+6 not322 ldy #¤3 lda (Vrem+¤a),y b193 pha l156 jsr NextVrem pla ldy #¤0 dec Vrem+5 beq b192 l163 jsr OutBordPart ldy Vrem+6 l164 jsr OutBordPart l157 jmp b193 b192 ; НизЛевоУгол ldy #¤5 lda (Vrem+¤a),y ldy #¤0 l165 jsr OutBordPart ; Нарисуем горизонтальную полосу внизу l158 jsr ShowHorLine ; НизПравоУгол sty Vrem+3 ldy #¤4 lda (Vrem+¤a),y ldy Vrem+3 l166 jsr OutBordPart l159 jmp CrtOut ; Возьмем в стек параметры окна ; TopX TopY BotX BotY Getwindow dfb ¤89 asc "getwindoW" dw Getscradr getwindow jsr winx jsr at jsr winy jsr at jsr over jsr winwidth jsr at jsr plus jsr onem jsr over jsr windepth jsr at jsr plus jmp onem ; Дополнительные константы экрана и клавиатуры Black dfb ¤85 asc "blacK" dw Flash black jsr Cons dw 0 Red dfb ¤83 asc "reD" dw 0 red jsr Cons dw 1 Green dfb ¤85 asc "greeN" dw Black green jsr Cons dw 2 Yellow dfb ¤86 asc "yelloW" dw Border yellow jsr Cons dw 3 Blue dfb ¤84 asc "bluE" dw Sspat blue jsr Cons dw 4 Violet dfb ¤86 asc "violeT" dw Yellow violet jsr Cons dw 5 Lightblue dfb ¤89 asc "lightbluE" dw Getwindow lightblue jsr Cons dw 6 White dfb ¤85 asc "whitE" dw Green white jsr Cons dw 7 Escapekey dfb ¤89 asc "escapekeY" dw Lightblue escapekey jsr Cons dw ¤9b Enterkey dfb ¤88 asc "enterkeY" dw Getcolor enterkey jsr Cons dw ¤8d Rightkey dfb ¤88 asc "rightkeY" dw Enterkey rightkey jsr Cons dw ¤95 Leftkey dfb ¤87 asc "leftkeY" dw Inverse leftkey jsr Cons dw ¤88 Upkey dfb ¤85 asc "upkeY" dw White upkey jsr Cons dw ¤99 Downkey dfb ¤87 asc "downkeY" dw Leftkey downkey jsr Cons dw ¤9a ; Описываем расширенные процедуры для экрана Screen dfb ¤86 asc "screeN" dw Violet screen jsr setscreen jsr showscreen jsr lit dw ¤8c jmp out Con dfb ¤83 asc "coN" dw Red con jsr false jsr cursorstate jsr store jmp CursorOn Coff dfb ¤84 asc "cofF" dw Blue coff jsr CursorOff jsr true jsr cursorstate jmp store chn sys2.lib[an error occurred while processing this directive]