[an error occurred while processing this directive]
; Библиотека для работы с TEAC
; Дата написания 10.8.94
; BorSoft
; Copyright 1994
; If You have some changes in this file
; PLEASE Call (095) 188-31-34 ( in Moscow )
chn fheader.asm
chn fwords.asm
org 0-¤1e6
; Смещение до библиотеки и ее длина
Start
dw 0-Start
dw EndLib-BegLib
; Входы в словарь
dw 0 1
dw Dplus 2
dw Val 3
dw Dval 4
dw Ncase 5
dw Search 6
dw Skipstr 7
dw Countstr 8
dw Insstring 9
dw Restoremem 10
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
; Объектные ссылки
dw l000+1
dw l001+1
dw l002+1
dw l003+1
dw l004+1
dw l005+1
dw l006+1
dw l007+1
dw l008+1
dw l009+1
dw l010+1
dw l011+1
dw l012+1
dw l013+1
dw l014+1
dw l015+1
dw l016+1
dw l017+1
dw l018+1
dw l019
dw l020
dw l021
dw l022
dw l023
dw l024
dw l025
dw l027+1
dw l028
dw l029+1
dw l030+1
dw l032+1
dw l033+1
dw l034+1
dw l035+1
dw l036+1
dw l037+1
dw l038
dw l039+1
dw l041+1
dw l042+1
dw l043+1
dw l044+1
dw l045+1
dw l046+1
dw l047+1
dw l048
dw l049
dw l051+1
dw l052+1
dw l053+1
dw l054+1
dw l055+1
dw l056
dw l057
dw l058
dw l059+1
dw l060+1
dw l061+1
dw l062+1
dw l063+1
dw l064+1
dw l065+1
dw l066+1
dw l067+1
dw l068+1
dw l069+1
dw l070+1
dw l071+1
dw l072+1
dw l073+1
dw l074+1
dw l075+1
dw l076+1
dw l077+1
dw l078+1
dw l079
dw l080
dw l081+1
dw l082+1
dw l0821+1
dw l083+1
dw l084+1
dw l085+1
dw l0851+1
dw l086+1
dw l087+1
dw l088+1
dw l089+1
dw l090+1
dw l091+1
dw l092+1
dw l093+1
dw l094+1
dw l095+1
dw l096+1
dw l097+1
dw l098+1
dw l0981+1
dw l0982+1
dw l0983+1
dw l0984+1
dw l100+1
dw l101
dw l102
dw l103+1
dw l104+1
dw l105+1
dw l106+1
dw l107+1
dw l108+1
dw l109+1
dw l110+1
dw l111+1
dw l112+1
dw l113+1
dw l114+1
dw l115+1
dw l116+1
dw l117+1
dw l118+1
dw l119+1
dw l120+1
dw l121+1
dw l122+1
dw l123+1
dw l125+1
dw l126+1
dw l127+1
dw l128+1
dw l129+1
dw l130+1
dw l131+1
dw l132+1
dw l133+1
dw l134+1
dw l135+1
dw l136+1
dw l137+1
dw l138+1
dw l139+1
dw l140+1
dw l141+1
dw l143+1
dw l144+1
dw l145+1
dw l146+1
dw l147+1
dw l148+1
dw l149+1
dw l150
dw l151+1
dw l152+1
dw l153+1
dw l154+1
dw l155+1
dw l156+1
dw l157+1
dw l158+1
dw l159+1
dw l160+1
dw l161+1
dw l162+1
dw l163+1
dw l164+1
dw l165+1
dw l166+1
dw l167+1
dw l200+1
dw l201+1
dw l202+1
dw l203+1
dw l204+1
dw l205+1
dw l208+1
dw l213+1
dw l214+1
dw l216+1
dw l2162+1
dw l219+1
dw l220
dw l221
dw l226+1
dw l227+1
dw l228+1
dw l231
dw l232+1
dw l233+1
dw l234+1
dw l235+1
dw l236+1
dw l300+1
dw l3001
dw l301+1
dw l302+1
dw l303+1
dw l304+1
dw l305+1
dw l306+1
dw l308+1
dw l309+1
dw l311+1
dw l312+1
dw l313+1
dw l315+1
dw l316+1
dw l317+1
dw l318+1
dw l319+1
dw l320+1
dw 0
; Начало библиотеки
BegLib dfb ¤0 Этот байт необходим просто !
; Инициализация библиотеки
Teaclib
dfb ¤87
asc "teacliB"
dw 0
teaclib
jsr lit
l025
dw teac
jsr regtreat
; Обработаем по- своему ошибку.
jsr lit
l028
dw myerr Куда будем переходить
l029
jsr nexterr Куда адрес текущей ошибки
jsr makemyerr
l316
jsr crtlib
l317
jsr memlib
l318
jmp strlib
; Function 0- опознаем слот по номеру в стеке
LookForTeac
sta WorkSlt+1
inc WorkSlt+1
inc WorkSlt+1
inc WorkSlt+1
sta SW+3
ora #¤c0
sta Vrem+1
ldy #¤0
sty WorkSlt
tya
sta (WorkSlt),y
sty Vrem
lda (Vrem),y
cmp #¤a2
bne notteac
ldy #¤c
lda (Vrem),y
cmp #¤bd
bne notteac
; Здесь TEAC уже опознали
ldy #¤0
lda #¤1
sta (WorkSlt),y
iny
lda SW+3
asl a
asl a
asl a
asl a
sta SW+3
sta (WorkSlt),y
ldy #¤4
lda #¤c
l000
jsr TestnRegis
lda #¤3
sty Vrem+4
l001
jsr TestnRegis
bcs w034
lda Vrem+4
ldy #5
sta (WorkSlt),y
w034
clc
rts
notteac
sec
rts
; Вспомогательная процедура
TestnRegis
pha
lda #¤0
sta (WorkSlt),y
iny
sta (WorkSlt),y
iny
sta (WorkSlt),y
iny
pla
pha
and #¤1
ora #¤6
sta (WorkSlt),y
iny
iny
iny
lda #¤ff
sta (WorkSlt),y Мы не знаем где находимся на диске
iny
iny
sty Vrem+5
pla
ldy SW+3
and TeacState,y
beq isit
sec
w036
ldy Vrem+5 Установим новое смещение для адреса слоты
rts
isit
clc
bcc w036
; Function 1- захватить устройство------------------------
DriveOn
ldy SW+2
dey
lda (WorkSlt),y
beq lockit
w049
sec Это фатальная ошибка системы
w050
rts
lockit
lda InProcess
bne w049
lda ID
sta (WorkSlt),y
sta InProcess
iny
lda (WorkSlt),y
ldy SW+3
pha
lda #¤92
sta TeacCtrlReg,y
lda #¤bd
sta ¤c087,y
pla
sta TeacCtrlReg,y Установим нужный привод
lda #¤f
sta TeacCtrlReg,y Включим его
lda #¤4
sta TeacReset,y
lda #¤9
sta TeacReset,y
clc
rts
; Function 2- освободить устройство-----------------------
DriveOff
ldy SW+2
dey
lda (WorkSlt),y
cmp InProcess
bne w036 Ошибка!!!
lda #¤0
sta (WorkSlt),y
sta InProcess Закончили работу с данным устройством
lda #¤e
ldy SW+3
sta TeacCtrlReg,y
clc
rts
;--------------------------
; Вспомогательные процедуры
;--------------------------
; Где мы на диске
GetDiskAdr
l002
jsr FindAdrH
w102
lda TeacSyncReg,x
bpl w102
lda TeacReadReg,x
w302
lda TeacSyncReg,x
bpl w302
lda TeacReadReg,x
rts
; Чтение заголовка поля адреса
FindAdrH
lda #¤95
sta SW+¤c
lda #¤6a
sta SW+¤d
; Прочитаем заголовок трека-------------------------------
ReadHeader
; Задержка на раскрутку
waitt
lda TeacState,x
bmi waitt
lda #Attempts
sta SW+¤b
lda #¤c
sta TeacCtrlReg,x
l13
sta TeacClrSync,x Сбросим ошибки
l0
lda TeacSyncReg,x
asl a
bmi l0 Ждем синхросигнала
lda TeacReadReg,x
sta TeacClrSync,x
l1
lda TeacSyncReg,x Ждем готовности после синхро
bpl l1
lda TeacReadReg,x Возьмем этот байт
cmp SW+¤c
bne tryagain Если не начало блока,то ждем опять
sta TeacClrSync,x
l2
lda TeacSyncReg,x
bpl l2
lda TeacReadReg,x
cmp SW+¤d
bne tryagain
clc
rts
tryagain
dec SW+¤b
bne l13
sec
rts
; Чтение заголовка поля данных----------------------------
FindDatH
lda #¤6a
sta SW+¤c
lda #¤95
sta SW+¤d
l003
jmp ReadHeader
; Поиск нужного поля данных( 28 попыток, если не нашли,
; то С=1 )
FindSector
lda #Attempts
sta SW+7
w004
l004
jsr FindAdrH
bcs erfi
w020
lda TeacSyncReg,x
bpl w020
lda TeacReadReg,x
ldy #¤0
lolo
sta TeacClrSync,x
w021
lda TeacSyncReg,x
bpl w021
lda TeacReadReg,x
cmp SW+0,y
bne tryagain2 Это наш трек?
iny
cpy #¤2
bne lolo
w921
lda TeacSyncReg,x
bpl w921
lda TeacReadReg,x
cmp #¤5a
bne erfi
clc
rts
tryagain2
dec SW+7
bne w004
erfi
sec
rts
; Передвинемся к нужной дорожке---------------------------
MoveToSect
stx SW+8
ldx SW+3
w031
l006
jsr Step
bcc w031
w032
ldy SW+2
iny
lda (WorkSlt),y
iny
iny
sta (WorkSlt),y
ldx SW+8
rts
; Процедура "шаг" для кэша!-------------------------------
Step
ldy SW+2
iny
iny
iny
iny
lda (WorkSlt),y
sec
sbc #¤1
bmi nostep
sta (WorkSlt),y
sta TeacStep,x
lda #¤80
sta SW+¤c
w030
ldy #¤d
w009
dey
bne w009
dec SW+¤c
bne w030
clc
rts
nostep
sec
rts
;-----------------------------------------------------
; Теперь сами функции для драйвера TEAC
;-----------------------------------------------------
; Установим адрес обращения к диску( адрес TS списка
; в SW+9 ) установим адрес для последнего TS в списке
; Установим также и SW+5,6
SetTSAdr
lda Vrem
sta SW+9
lda Vrem+1
sta SW+¤a
lda Vrem+2
sta SW+5
lda Vrem+3
sta SW+6
stx SW+8
ldx SW+3
ldy #¤0
sty SW+4
dec SW+6
nextts
lda (SW+9),y
iny
ora (SW+9),y
beq w312
inc SW+6
inc SW+4
iny
bne nextts
w312
dey
beq errset
dey
dey
tya
clc
adc SW+9
sta SW+9
bcc w313
inc SW+¤a
w313
ldy #¤0
lda (SW+9),y
sta SW+0
cmp #¤a0
bcs errfile
iny
lda (SW+9),y
sta SW+1
ldy SW+2
iny
lda SW+0
sta (WorkSlt),y
and #¤1
ora #¤8
sta TeacCtrlReg,x Выберем головку!!!
lda SW+0
and #¤fe
sta SW+7
iny
lda SW+1
sta (WorkSlt),y
iny
lda (WorkSlt),y
cmp #¤ff Мы знаем где мы на диске?
bne w037
l007
jsr GetDiskAdr
sta (WorkSlt),y
w037
and #¤fe
iny
sec
sbc SW+7
bcc w038
lsr a
sta (WorkSlt),y
lda #¤4
w039
sta TeacCtrlReg,x Выберем направление
ldx SW+8
clc
rts
w038
eor #¤ff
clc
adc #¤1
lsr a
sta (WorkSlt),y
lda #¤5
bne w039
; Если на входе 0 адрес диска- то никакой реакции
errset
ldy SW+2
iny
iny
iny
iny
lda #¤0
sta (WorkSlt),y
clc
rts
errfile
lda #ERRFILE
ldy #¤0
jsr Push
jmp error
; Function 3- считать блок данных по адресу в SW+5,6
; и адресу TS списка в SW+9,10
ReadBlock
ldy #¤0
readnow
lda #Attempts
sta Vrem+¤e
dec SW+4
bmi eofreach
stx SW+8
bitt
ldx SW+3
l008
jsr FindSector Найдем наш сектор
bcs erfind
l005
jsr FindDatH
bcs errrr
; Прoчитаем сектор
ldy #¤0
sty SW+7 Здесь накапливается контрольная сумма
w003
lda TeacSyncReg,x
bpl w003
lda TeacReadReg,x
sta (SW+5),y
adc SW+7
sta SW+7
iny
bne w003
w024
lda TeacSyncReg,x
bpl w024
lda TeacReadReg,x
ldx SW+8 Восстановим старое значение Х
cmp SW+7
beq w310
dec Vrem+¤e
bne bitt
errrr
lda #¤1
sec
rts
erfind
lda #¤0
sec
rts
; Продолжаем процедуру подготовки к чтению след. сектора
w310
lda #¤0
ldy #¤1
sta (SW+9),y
dey
sta (SW+9),y Очистим adres прочитанного сектора
lda SW+9
sec
sbc #¤2
bcs w311
dec SW+¤a
w311
sta SW+9 Уменьшим адрес на TS
dec SW+6 Изменим адрес в памяти
lda SW+4
beq eofreach
lda (SW+9),y
cmp SW+0 Это тот же трек?
bne notsame
contr
iny
lda (SW+9),y
sta SW+1
l009
jmp readnow
; Достигли конца файла
eofreach
clc
rts
; Перейдем к другому треку
notsame
eor SW+0
and #¤fe
bne anothertr Совсем другой трек
; Иначе просто сменим головку
ldx SW+3
lda (SW+9),y
sta SW+0
and #¤1
ora #¤8
sta TeacCtrlReg,x
ldx SW+8
bne contr
; Установим новый адрес на диске
anothertr
l010
jsr SetTSAdr
l011
jsr MoveToSect В конце для кэша !!!
l012
jmp readnow
; Запись блока( с адреса в SW+5,6 )
; по TS списку( адрес в SW+9,10 )-4 функция
; в SW+4 длина блока----------------------------------
WriteBlock
writenow
dec SW+4
bmi eofreach
stx SW+8
ldx SW+3
lda TeacState,x
and #¤20
bne writeok
writeprot
ldx SW+8
lda #¤2
sec
rts
writeok
l032
jsr FindSector Найдем наш сектор
bcs erfind
lda #¤d
sta TeacCtrlReg,x Запись сейчас
lda #¤aa
sta TeacWritReg,x
lda #¤8
sta TeacReset,x
lda #¤5
sta TeacReset,x
; Запишем сектор
ldy #¤9
w800
lda TeacSyncReg,x
bpl w800
lda #¤aa
sta TeacWritReg,x
dey
bne w800
lda #¤a4
l039
jsr WriteByte
titi
lda TeacSyncReg,x
bpl titi
lda #¤ff
sta TeacWritReg,x
sta TeacWriteSyn,x
lda #¤6a
l041
jsr WriteByte
lda #¤95
l042
jsr WriteByte
ldy #¤0
sty SW+¤7
clc
waitgt
lda TeacSyncReg,x
bpl waitgt
lda (SW+5),y
sta TeacWritReg,x
adc SW+7
sta SW+7
iny
bne waitgt
l043
jsr WriteByte
llll
lda TeacSyncReg,x
bpl llll
lda #¤5a
l044
jsr WriteByte
lda #¤aa
l045
jsr WriteByte
lda #¤0
ldy #¤1
sta (SW+9),y
dey
sta (SW+9),y Очистим adres записанного сектора
lda SW+9
sec
sbc #¤2
bcs w911
dec SW+¤a
w911
sta SW+9 Уменьшим адрес на TS
lda #¤4
sta TeacReset,x
lda #¤9
sta TeacReset,x
lda #¤c
sta TeacCtrlReg,x
ldx SW+8 Восстановим старое значение Х
dec SW+6 Изменим адрес в памяти
lda SW+4
beq eofreach1
lda (SW+9),y
cmp SW+0 Это тот же трек?
bne notsame1
contr1
iny
lda (SW+9),y
sta SW+1
l033
jmp writenow
; Достигли конца файла
eofreach1
clc
rts
; Перейдем к другому треку
notsame1
eor SW+0
and #¤fe
bne anothertr1 Совсем другой трек
; Иначе просто сменим головку
ldx SW+3
lda (SW+9),y
sta SW+0
and #¤1
ora #¤8
sta TeacCtrlReg,x
ldx SW+8
bne contr1
; Установим новый адрес на диске
anothertr1
l034
jsr SetTSAdr
l035
jsr MoveToSect
l036
jmp writenow
WriteByte
ldy TeacSyncReg,x
bpl WriteByte
sta TeacWritReg,x
rts
; Выборка файлов по шаблону
; на стеке: Patt_Adr For_Pat_Files Cat_Adr-
; выход: Patt_Adr For_Pat_Files'( измененый )
pickfiles
jsr StackVrem
jsr StackVrem2
jsr Pop
inx
inx
stx Vrem+6
sta Vrem+4
sty Vrem+5
ldy #¤7
sty Vrem+8
ldy #¤0
lda (Vrem+4),y
sta Vrem+9
inc Vrem+9
lda #¤b
NextN
clc
adc Vrem
sta Vrem
bcc ncr
inc Vrem+1
ncr
ldy #¤0
sty Vrem+¤b
lda (Vrem),y
beq NotThisN1
cmp #¤ff
beq NotThisN1
ldx #¤0
lda #¤2
clc
adc Vrem
sta Vrem
bcc NextNmS-1
inc Vrem+1
iny
; Начнем сравнение имени с шаблоном
NextNmS
sty Vrem+¤c
inc Vrem+¤b
ldy Vrem+¤b
lda (Vrem+4),y
sta Vrem+¤d
ldy Vrem+¤c
CmpNextS
lda (Vrem),y
beq NotThisN
cmp #BLANK
beq NameE
pha
lda Vrem+¤b
cmp Vrem+9
beq NotThisN
pla
cmp Vrem+¤d
bne SpecS
ContC
iny
inx
cpx #¤11
bne NextNmS
NameE
lda Vrem+¤d
cmp #'*'
beq LastS?
dec Vrem+¤b
LastS?
ldy Vrem+¤b
iny
cpy Vrem+9
beq RegistrN
NotThisN
lda #¤21
NotThis
dec Vrem+8
bne NextN
ldy #¤0
tya
sta (Vrem+2),y
ldx Vrem+6
jmp Vrem2Stack
NotThisN1
lda #¤23
bne NotThis
SpecS
lda Vrem+¤d
cmp #'*'
beq CmpD
cmp #'?'
beq ContC
bne NotThisN
CmpD
lda (Vrem),y
cmp #DOT
beq NextNmS
iny
inx
cpy #¤11
bne CmpNextS
beq LastS?
RegistrN
ldy #¤0
txa
sta (Vrem+2),y
lda (Vrem),y
sta Vrem+¤b
NxtSmC
txa
beq EndC
iny
lda (Vrem),y
sta (Vrem+2),y
dex
bne NxtSmC
EndC
iny
lda #ENTERKEY
sta (Vrem+2),y
iny
lda Vrem+¤b
sta (Vrem+2),y
iny
tya
clc
adc Vrem+2
sta Vrem+2
bcc NotThisN
inc Vrem+3
bne NotThisN
; Чтение в SYSBUF по стеку
rdzerosys
jsr dup
jsr temp1
jsr store
jsr zero
jsr store
jsr zero
jsr two
jsr store
jsr sysbuf
jsr zero
jsr three
jmp outd
; Поиск имени файла в каталоге
findfile
jsr lit
dw ¤11
l046
jsr rdzerosys Считаем 1100
jsr bran
dw notfind-*-2
setadr
l047
jsr rdzerosys Считаем очередной трек
jsr findinbuf
jsr ddup
jsr zbran
dw notfind-*-2
; Здесь мы нашли( в стеке TS адрес )
rts
notfind
jsr sysbuf
jsr onep
jsr at
jsr ddup
jsr nzbran
dw setadr-*-2
jmp false Все прошли и ничего не нашли
;-------------------------------------------------------
; Процедуры сопряжения с FORTH
;
;
;-------------------------------------------------------
; Поиск накопителя на слоте-------------------------------
TF0
jsr Pop
l013
jsr LookForTeac
bcs w060
ldy #0
iny
iny
lda DevProc
sta (WorkSlt),y
iny
lda DevProc+1
sta (WorkSlt),y Сохраним адрес обработчика в обл. слоты
; Опознали !!
jmp TrueFlag
w060
jmp FalseFlag
; Захватим устройство------------------------------------
TF1
lda #¤ff
sta SystemWait
w961
l014
jsr DriveOn
bcs w961 Пытаемся захватить устройство
lda #¤0
sta SystemWait
rts
; Освободим устройство----------------------------------
TF2
l015
jmp DriveOff
; Считаем/Запишем блок данных- на входе: MemAdr TSAdr R/W
ReadWrite
pha
jsr DisInt
pla
sta Vrem+¤d
jsr Pop
sta Vrem
sty Vrem+1
jsr Pop
sta Vrem+2
sty Vrem+3
l016
jsr SetTSAdr
l017
jsr MoveToSect
bit Vrem+¤d
bmi writee
readd
l018
jsr ReadBlock
bcs w963
noerr
jmp EnbInt Восстановим как было
writee
l037
jsr WriteBlock
bcc noerr
w963
clc
adc #¤10
ldy #¤0
jsr Push
jmp error
; Считаем блок по MEMADR TSADR
TF3
lda #¤0
beq ReadWrite
; Запишем блок как выше
TF4
lda #¤ff
bne ReadWrite
; Операции, связанные с чтением файлов:
; 0- есть файл на диске? стек:FileName
; выход:MemAdrTS FileAdr True/False
; 1- каталог по шаблону( в память ) стек:Pat_Adr MemAdr
TF5
jsr mul2
l027
jsr secrvector
jsr plus
jsr at
jmp exec
; Сами вторичные вектора для операций чтения файла-------
secrvector
jsr Var
l048
dw isfile
l049
dw patcat
dw drverr
dw drverr
dw drverr
dw drverr
; Найдем лишь файл на диске( на стеке адрес имени )
; На выходе:TSListAdr FileAdr True/False
isfile
l051
jsr findfile
jsr nzbran
dw fileiss-*-2
jsr drop
jmp false
fileiss
jsr tor
; Считаем TSList в SYSBUF+¤100
jsr zero
jsr store
jsr zero
jsr two
jsr store
l077
jsr sysbuf1 ++
jsr zero
jsr three
jsr outd
l078
jsr sysbuf1 ++
jsr lit
dw ¤c
jsr plus
jsr fromr
jmp true
; Выделим файлы из каталога в память
patcat
jsr lit
dw ¤11
l052
jsr rdzerosys
loopcat
jsr sysbuf
jsr onep
jsr at
jsr ddup
jsr zbran
dw nomore-*-2
jsr dup
jsr dot
jsr space
l053
jsr rdzerosys
jsr sysbuf
l054
jsr pickfiles
jsr bran
dw loopcat-*-2
nomore
jmp ddrop
chn sys01.lib
[an error occurred while processing this directive]