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