[an error occurred while processing this directive]
; Библиотека для работы с текстовыми строками ; поддерживаются только счетные строки ; Дата написания: 30.08.94 ; BorSoft ; Copyright 1994 ; All rights reserved ; If You have some changes in this file ; PLEASE Call (095) 188-31-34 ( in Moscow ) ; Содержание библиотеки: ; ¤Constant - Объявить текстовую константу ; Пример: ¤Constant MyGreating "Hello!!" ; ( ; ¤Variable - Объявить текстовую переменную ; Пример: 25 ¤Variable ForMyWork ; ( ; ¤! - Перености строку( как ! ) ; Пример: MyGreating MyWork ¤! ; ¤" - Принять из потока строку( на вых. адрес ) ; Пример: ¤" This is mine" outs>This is mine ; ¤In - Ввести строку ; Пример: ¤In>?MyString+<ENTER> outs>MyString ; ¤Left - Выделить левую часть строки ; Пример: MyGreating 2 ¤Left outs>My ; ¤Right - Выделить правую часть строки ; Пример: MyGreating 8 ¤Right outs>Greating ; ¤Mid - Выделить середину строки ; Пример: MyGreating 1 3 ¤Mid outs>yGr ; ¤+ - Соединить строки в памяти ; Пример: ForMyWork MyGreating ¤+ outs> ; MyGreatingMyGreating ; ¤Compare - Сравненить строк ; Пример: ¤" FuckIt" MyGreating ¤Compare .> ; 1 ;- ¤Str - Перевести одинарное число на стеке в строку ; Пример: 23 ¤Str outs>23 ; ; Дополнительные возможности для работы с памятью: ; InsString - Вставить строку в память ; Пример: ; Search - Искать вхождение строки по памяти ; Пример: 1000 MyGreating Search ; ; Дополнительные возможности со строками в памяти ; SkipStr - Пропустить строки в памяти ; Пример: 5 SkipStr( -5 SkipStr ) ;- Val - Перевести строку в число на стеке ; Формат: StrAdr ; Выход: NumberL NumberH True/False ; Ncase - Создать "аппаратный" переключатель для ; кодов в стеке. ; Пример: 1 2 2 ncase my two one default ; ^ ^ ^ ^ ^ ^ ^ ; первый код------+ ! ! ! ! ! + по-умолч. ; второй код--------+ ! ! ! +-для кода 1 ; число кодов----------+ ! +-для кода 2 ; +-имя переключателя ; ; ; Начальная инициализация библиотеки Strlib dfb ¤86 asc "strliB" dw Setmem strlib rts ; Уменьшим на 1 содержимое VREM DecVrem lda Vrem bne justdvr dec Vrem+1 justdvr dec Vrem rts ; Двигаем строку( по ее адресу и длине по адресу ) movestr jsr StackVrem Куда jsr Pop sta Vrem+4 Сколько jsr StackVrem2 Откуда ldy #¤0 lda Vrem+4 sta (Vrem),y Запишем длину b303 lda Vrem+4 beq allisdone lda (Vrem+2),y iny sta (Vrem),y dec Vrem+4 l300 jmp b303 allisdone rts ; Oбъявим текстовую константу Dconstant dfb ¤89,¤24 asc "constanT" dw Freeblock dconstant jsr create jsr smug jsr lit dw KAVICHKI jsr word jsr here jsr cat jsr onep jsr allot Запомним строку после слова jsr pscode DCons pla tay pla iny bne b300 clc adc #¤1 b300 sty Vrem tay lda Vrem jmp PushNext Выдаем адрес константы в стек ; Объявим место для текстовой переменной Dvariable dfb ¤89,¤24 asc "variablE" dw Dconstant dvariable jsr create jsr smug jsr allot jsr pscode DVar pla tay pla iny bne b301 clc adc #¤1 b301 sty Vrem tay lda Vrem jmp PushNext Выдаем адрес переменной в стек ; Перенесем строку( на верху стека КУДА ниже ОТКУДА ) Dstore dfb ¤82,¤24 asc "!" dw 0 dstore jsr StackVrem Куда jsr StackVrem2 Откуда ldy #¤0 lda (Vrem+2),y Число символов для переноса sta Vrem+4 inc Vrem+4 movestr1 lda Vrem+4 beq allstrmove dec Vrem+4 lda (Vrem+2),y sta (Vrem),y iny bne movestr1 allstrmove rts ; Принять строку из потока в PAD( ограничитель " ) Dquote dfb ¤c2,¤24 asc ¤"¤ dw Dstore dquote jsr lit dw KAVICHKI jsr state jsr at jsr zbran dw notcompmode-*-2 jsr comp l3001 dw quote jsr word jsr here jsr cat jsr onep jmp allot notcompmode jsr word jsr here jsr pad l301 jsr dstore jmp pad quote jsr fromr jsr onep jsr dup jsr count jsr onem jsr plus jsr tor rts ; Ввести строку из ввода в PAD( ограничитель <ENTER> ) Din dfb ¤83,¤24 asc "iN" dw Con din jsr pad jsr onep jsr t32 jsr gets jsr span jsr at jsr pad jsr cstor jmp pad ; Выделить левую часть строки в PAD Dleft dfb ¤85,¤24 asc "lefT" dw Getid dleft jsr tor jsr count jsr fromr jsr min jsr pad l302 jsr movestr jmp pad ; Выделить правую часть строки в PAD Dright dfb ¤86,¤24 asc "righT" dw Strlib dright jsr tor jsr count jsr dup jsr fromr jsr min jsr tor Реальное число символов справа на возвратах jsr i jsr sub jsr plus Получим реальный адрес строки на стеке jsr fromr jsr pad l303 jsr movestr jmp pad ; Выделить середину строки в PAD( StrAdr From StrLen- ) Dmid dfb ¤84,¤24 asc "miD" dw Free dmid l304 jsr makestr jsr pad l305 jsr movestr jmp pad makestr jsr Pop sta Vrem+2 jsr Pop sta Vrem+3 jsr StackVrem ldy #¤0 lda (Vrem),y sta Vrem+4 cmp Vrem+3 bcs noswap sta Vrem+3 noswap sec sbc Vrem+3 sta Vrem+5 Оставшаяся длина строки cmp Vrem+2 bcs noclip Если осталось>=чем нужно, то не обрезаем sta Vrem+2 noclip lda Vrem+3 sec adc Vrem sta Vrem bcc noincvrem inc Vrem+1 noincvrem jsr VremStack lda Vrem+2 ldy #¤0 jmp PushNext ; Присоединить строку 1 к строке 2 и поместить в PAD Dplus dfb ¤82,¤24 asc "+" dw Dquote dplusa jsr tor jsr pad l306 jsr dstore jsr pad jsr count jsr plus Получили адрес конца строки в PAD jsr fromr jsr count jsr tor jsr i jsr rot На стеке: Str2+1 Str2Len Pad+Str1Len- jsr swap jsr cmove jsr pad Изменим длину строки jsr cat jsr fromr jsr plus jsr pad jsr cstor jmp pad ; Сравнить посимвольно две строки на стек результат: ; 0 :строки равны ; 1 :1 строка > ; -1:2 строка > Dcompare dfb ¤88,¤24 asc "comparE" dw Getmembl dcompare jsr StackVrem Восстановим адреса строк в VREM, VREM+2 jsr StackVrem2 ldy #¤0 lda (Vrem),y cmp (Vrem+2),y bcc firstless lda (Vrem+2),y firstless sta Vrem+4 Длина строк выровнена nextsymb iny lda Vrem+4 beq equals dec Vrem+4 lda (Vrem),y cmp (Vrem+2),y beq nextsymb bcs greata lessa lda #¤ff b310 tay b398 jmp PushNext greata lda #¤1 ldy #¤0 beq b398 equals lda #¤0 beq b310 ; Скопируем как CMOVE только от старших к младшим адресов Lscmove dfb ¤86,¤3c asc "cmovE" dw Dright lscmove jsr Pop sta Vrem+4 sty Vrem+5 Восстановим длину копируемого блока jsr StackVrem Куда jsr StackVrem2 Откуда ldy #¤0 lda Vrem+4 Установимся на конец КУДА clc adc Vrem sta Vrem lda Vrem+5 adc Vrem+1 sta Vrem+1 lda Vrem+4 Установимся на конец ОТКУДА clc adc Vrem+2 sta Vrem+2 lda Vrem+5 adc Vrem+3 sta Vrem+3 copyit lda (Vrem+2),y sta (Vrem),y lda Vrem bne b311 dec Vrem+1 b311 dec Vrem lda Vrem+2 bne b312 dec Vrem+3 b312 dec Vrem+2 lda Vrem+4 bne b313 lda Vrem+5 beq alldone dec Vrem+5 b313 dec Vrem+4 l308 jmp copyit alldone rts ; Перевести число на стеке в строку на PAD ; Вставить строку в память( для текстового редактора ) ; на стеке: MemAdr MemBlockLen DeltaMem- ; если DELTAMEM<0, то нужно смыкать, иначе размыкать Insstring dfb ¤89 asc "insstrinG" dw Dvariable insstring jsr Pop sta Vrem+8 sty Vrem+9 ora #¤0 beq notneedmove jsr StackVrem2 jsr StackVrem lda Vrem+9 bmi justcmove ; Здесь готовим переход на <CMOVE( раздвинем ) inx inx clc lda Vrem+8 adc Vrem sta Vrem bcc b314 inc Vrem+1 Увеличим адрес КУДА b314 jsr VremStack jsr Vrem2Stack l309 jmp lscmove ; Здесь готовим переход на CMOVE( сдвинем ) justcmove sec lda Vrem sbc Vrem+8 pha lda Vrem+1 sbc Vrem+9 tay pla jsr Push jsr VremStack jsr Vrem2Stack jmp cmove ; Здесь не нужно ничего notneedmove jmp ddrop ; Искать строку в интервале памяти( LimAdr BegAdr StrAdr ) Search dfb ¤86 asc "searcH" dw Lscmove search jsr StackVrem ldy #¤0 lda (Vrem),y sta Vrem+4 jsr IncVrem jsr StackVrem2 jsr Pop sta Vrem+6 Предел для поиска sty Vrem+7 searchit lda Vrem+3 cmp Vrem+7 bne contsearch lda Vrem+2 cmp Vrem+6 beq endreach contsearch ldy #¤0 contony lda (Vrem),y cmp (Vrem+2),y bne nextx iny cpy Vrem+4 bne contony ; Здесь мы нашли нашу строку и выдадим в стек ее адрес ; ( строка понятно несчетная ) jsr Vrem2Stack jmp TrueFlag nextx inc Vrem+2 bne searchit inc Vrem+3 bne searchit endreach jmp FalseFlag ; Пропустить строку( и ) в памяти( ограничитель <ВВОД> ) Skipstr dfb ¤87 asc "skipstR" dw Setvmem skipstr jsr StackVrem2 jsr StackVrem ldy #¤0 lda Vrem+3 bmi backward1 ; Здесь прямой пропуск строк в памяти forward lda Vrem+2 bne ntstvr3 lda Vrem+3 beq allskipf dec Vrem+3 ntstvr3 dec Vrem+2 nextss lda (Vrem),y beq allskipf Нулевая строка cmp #ENTERKEY beq nextss1 jsr IncVrem l311 jmp nextss nextss1 jsr IncVrem l312 jmp forward ; Здесь обратный пропуск строк в памяти backward1 lda (Vrem),y beq allskipbz backward lda Vrem+2 bne rrr lda Vrem+3 beq allskipf rrr inc Vrem+2 bne rrrrr inc Vrem+3 rrrrr ; Ищем конец предыдущей строки prevss l313 jsr DecVrem lda (Vrem),y beq allskipf cmp #ENTERKEY bne prevss ; Нашли конец- ищем начало searchbstr l319 jsr DecVrem lda (Vrem),y beq titix cmp #ENTERKEY bne searchbstr titix jsr IncVrem bne backward allskipf jmp VremStack В стек адрес начала строки после пропуска allskipbz l315 jsr DecVrem jmp VremStack ; Измерим длину строки, ограниченной <ENTER> Strln dfb ¤85 asc "strlN" dw Dleft strln jsr StackVrem ldy #¤1 sty Vrem+2 dey lookenter lda (Vrem),y beq nlstr cmp #ENTERKEY beq allstr inc Vrem+2 iny bne lookenter inc Vrem+1 bne lookenter nlstr lda #¤0 sta Vrem+2 allstr lda Vrem+2 ldy #¤0 jmp PushNext ; Процедура стуктуризации программы ; формат обращения: KeyCode1 . . . . KeyCodeN N ; NCase <NAMECASE> ; KeyProcN . . . . KeyProc1 ProcOtherWise Ncase dfb ¤c5 asc "ncasE" dw Strln ncase jsr create jsr rbrac jsr dup jsr ccom jsr zero jsr xdo caseloop jsr dfind jsr zequ jsr lit dw NOTFOUND jsr qerr jsr drop jsr cfa jsr i jsr srp jsr equal jsr nzbran dw notcomkey-*-2 jsr swap jsr ccom Скомпилируем ее ключ notcomkey jsr comma Скомпилируем адрес процедуры jsr xloo dw caseloop-*-2 jsr lbrac jsr pscode ; Реальный ПЕРЕКЛЮЧАТЕЛЬ pla sta Vrem pla sta Vrem+1 ldy #¤1 lda (Vrem),y sta Vrem+2 jsr Pop ldy #¤2 nextkey cmp (Vrem),y beq findkey iny iny iny dec Vrem+2 bne nextkey dey findkey iny lda (Vrem),y sta Vrem+2 iny lda (Vrem),y tay lda Vrem+2 jsr Push jmp exec ; Подсчет строк текста по начальному и конечному адресу Countstr dfb ¤88 asc "countstR" dw Dcompare countstr jsr StackVrem jsr StackVrem2 ldy Vrem+2 lda #¤0 sta Vrem+2 sta Vrem+4 Число строк уже пройденных check4lim cpy Vrem bne contcount lda Vrem+1 cmp Vrem+3 bne contcount lda Vrem+4 ldy #¤0 jmp PushNext contcount lda (Vrem+2),y cmp #ENTERKEY bne incworkadr inc Vrem+4 incworkadr iny bne check4lim inc Vrem+3 bne check4lim ; Переведем счетную строку в число на стеке и флаг Dval dfb ¤84,¤24 asc "vaL" dw Dmid dval jsr dup jsr tor jsr ifnotdig jsr tor jsr rot jsr drop jsr fromr jsr fromr jsr count jsr plus jmp equal ; Переведем счетнуя строку в число на стеке Val dfb ¤83 asc "vaL" dw Din val l320 jsr dval jmp drop EndLib[an error occurred while processing this directive]