[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]