[an error occurred while processing this directive]
; Продолжение для библиотеки TEAC ; Пишем записывающие ф-ии------------------------------ ; 0- Стереть файл из каталога. Вход: FName ; 1- Создать файл. Вход: FType FLen FName ; Вых.: MemAdrTS True/False ; 2- Переименовать файл. Вход: NewFType NewFName ; LastFName ; ; ; TF6 jsr mul2 l055 jsr secwvectors jsr plus jsr at jmp exec ; Вторичные вектора для операций записи secwvectors jsr Var l056 dw delfile l057 dw makefile l058 dw renamefile dw drverr dw drverr dw drverr ; Выделим место по одному сектору BITMAP ; Вход:MemAdr4TS QBlocks BitMapNo MemAdrWhereBitMap ; Вых.:MemAdr4TS' QBlocks' AllocWas/No allocsect jsr StackVrem jsr Pop sta Vrem+¤d sec sbc #¤1 and #¤38 sta Vrem+¤b jsr Pop sta Vrem+¤c jsr StackVrem2 lda #¤0 sta Vrem+7 Адрес байта относительно начала BITMAP sta Vrem+6 Было/Нет выделение( для UPDATE ) ldy Vrem+¤b allocdm lda #¤14 sta Vrem+¤b allocdm1 lda #¤80 sta Vrem+5 allocnext lda Vrem+5 and (Vrem),y bne catchts contalloc lda Vrem+¤c beq alldone1 dec Vrem+¤b Положение в sectore бита bmi nextsect clc ror Vrem+5 bne allocnext inc Vrem+7 iny bne allocdm1 nextsect inc Vrem+7 inc Vrem+7 iny iny bne allocdm alldone1 jsr Vrem2Stack lda Vrem+¤c ldy #¤0 jsr Push tya sta (Vrem+2),y lda Vrem+6 jmp PushNext catchts eor (Vrem),y sta (Vrem),y sty Vrem+¤4 ldy #¤1 lda Vrem+¤b sta (Vrem+2),y pha lda Vrem+7 lsr a lsr a sta Vrem+¤e pla ora Vrem+¤e beq contalloc lda Vrem+¤e ldy Vrem+¤d clc l059 adc TSPlus,y ldy #¤0 sta (Vrem+2),y clc lda #¤2 adc Vrem+2 sta Vrem+2 bcc exithere1 inc Vrem+3 exithere1 ldy Vrem+4 dec Vrem+¤c inc Vrem+6 bne contalloc TSPlus dfb ¤0,¤32,¤72 ; Основной модуль освобождения BITMAP ; Вход:TSAdr BitMapNo BitMapAdr ; Вых.:TSAdr Все_освоб./нет Были_освоб./нет freesect jsr StackVrem VREM+0,1 адрес где BITMAP jsr Pop sta Vrem+7 VREM+7 номер BITMAP sec sbc #¤1 and #¤38 sta Vrem+6 VREM+6 смещение от начала сектора jsr StackVrem2 VREM+2,3 адрес где TS список ldy #¤0 sty Vrem+8 VREM+8 все освободили или нет sty Vrem+9 -!!-+9 были изменения sty Vrem+¤a -!!-+10 общий счетчик TS списка nexttsadr lda (Vrem+2),y Конец списка? beq allfree? cmp #¤ff Это пустой?? beq cant inc Vrem+¤a Увеличим счетчик TS l083 jsr FreeIfMay Можем освободить? bcs cant Если нет, то не было изменений inc Vrem+9 inc Vrem+8 Число освобожденных TS cant iny iny bne nexttsadr allfree? inx inx ldy #¤0 lda Vrem+¤9 cmp Vrem+¤a Все освободили? beq fflag dey fflag tya jsr Push Если да, то ЛОЖЬ lda Vrem+8 ldy #¤0 jmp PushNext Положим на стек изменения ; Процедура "Освободим TS, если можем" FreeIfMay sty Vrem+5 ldy #¤2 findcont l084 cmp TSPlus,y bcs low dey bpl findcont cmp? sec exxt ldy Vrem+5 rts low cpy Vrem+7 bne cmp? sec l085 sbc TSPlus,y clc asl a asl a sta Vrem+4 Выделим адрес до 4 байт ldy Vrem+5 lda #¤ff sta (Vrem+2),y iny lda (Vrem+2),y pha clc adc #¤3 lsr a lsr a lsr a tay l0851 lda Offs,y clc adc Vrem+4 adc Vrem+6 sta Vrem+4 Получим уже адрес битика pla and #¤7 tay l086 lda BitMask,y Получим маску на битик ldy Vrem+4 ora (Vrem),y Установим его sta (Vrem),y И запишем обратно clc bcc exxt BitMask dfb ¤8,¤10,¤20,¤40,¤80,¤1,¤2,¤4 Offs dfb ¤2,¤1,¤0 ; Создадим или нет в текущем секторе каталога новый файл ; Вход:FType FName AdrCatSect ; Вых.:NewFileInMem/FName True/False makenewfile jsr StackVrem jsr StackVrem2 ldy #¤7 sty Vrem+5 VREM+5 число файлов в секторе ldy #¤0 lda (Vrem+2),y sta Vrem+4 VREM+4 длина имени lda #¤b nxtnmtst clc adc Vrem sta Vrem bcc ncrr inc Vrem+1 ncrr lda (Vrem),y beq regnmm cmp #¤ff beq regnmm nxtnm lda #¤23 dec Vrem+5 bne nxtnmtst inx inx jmp FalseFlag regnmm lda #¤0 sta (Vrem),y jsr Pop ldy #¤2 sta (Vrem),y jsr VremStack ldy #¤1 cfile2cat lda (Vrem+2),y iny iny sta (Vrem),y dey dec Vrem+4 bne cfile2cat lda #BLANK iny iny clrnm sta (Vrem),y iny cpy #¤23 bne clrnm jmp TrueFlag ; Сохраним из SYSBUF измененный BITMAP ; Вход:QBlockLeft BitMapChange? updatebitmap jsr zbran dw nobitmapc-*-2 jsr temp1 jsr at jsr zero jsr store jsr sysbuf Если получилось, то jsr zero jsr four jsr outd Запишем измененный BITMAP nobitmapc jsr ddup jsr nzbran dw nobitmapch-*-2 jsr drop jsr zero jsr lev nobitmapch jsr lev rts ; Для сектора BITMAP на стеке выделим место ; вход:MemAdr4TS QBlocks BitMapNo ; allocfromsys jsr sysbuf l060 jsr allocsect Попробуем резервировать текущий BITMAP l087 jsr updatebitmap ; Зарезервировать место на диске ; на входе: MemAdr4TS QBlocks allocdskspace jsr lit dw ¤11 l061 jsr rdzerosys jsr zero l062 jsr allocfromsys Резервируем 0 BITMAP jsr lit dw ¤32 l063 jsr rdzerosys jsr one l064 jsr allocfromsys Резервируем 1 BITMAP jsr lit dw ¤72 l065 jsr rdzerosys jsr two l066 jsr allocfromsys Резервируем 2 BITMAP jsr swap jmp drop Возвратим число зарезервированных блоков ; Освободим по TS списку DSK память( на одном BITMAP ) ; Вход:AdrWhereTSList freesys jsr sysbuf l088 jsr freesect l089 jsr updatebitmap ; Освободим полностью память ; Вход:AdrWhereTSList( не SYSBUF ) TSListSect( TS adress ) freedskspace jsr over jsr twom jsr store Удаляем также и текущий сектор jsr twom jsr lit dw ¤11 l090 jsr rdzerosys jsr zero l091 jsr freesys jsr drop jsr lit dw ¤32 l092 jsr rdzerosys jsr one l093 jsr freesys jsr drop jsr lit dw ¤72 l094 jsr rdzerosys jsr two l095 jsr freesys jsr drop jsr lit dw FATERR jmp error ; Создадим TS список на диске. Вход:FLen ; Вых.:TSAdrInMem TSInDsk maketsstr l067 jsr sysbuf1 jsr lit dw ¤100 jsr erase l068 jsr sysbuf1 jsr lit dw ¤a jsr plus jsr dup jsr tor jsr swap jsr onep l069 jsr allocdskspace jsr zbran dw allocok-*-2 ; Нет места на диске jsr fromr Восстановим адрес начала TSLIST в памяти jsr dup jsr at l070 jsr freedskspace Очистим занятые сектора jsr lit dw NODSKMEM jmp error allocok jsr fromr TSAdrInMem jsr dup TSAdrInMem TSAdrInMem jsr at TSAdrInMem TSAdrForTSList jsr over jsr zero jsr swap jsr store Запишем 0 в первый элемент TS списка jsr swap jsr twop jmp swap На выходе: TSAdrInMem+2 AdrForTSList ; Сохраним измененный сектор катлога updatecat jsr temp1 jsr at jsr zero jsr store jsr sysbuf jsr zero jsr four jmp outd Запишем текущий сектор каталога ; Создадим файл в каталоге. Вход:FType FName ; Вых.:FileAdrInMem makefilecat jsr lit dw ¤11 l072 jsr rdzerosys myreadcat jsr sysbuf jsr onep jsr at jsr ddup jsr zbran dw nomem4file-*-2 l073 jsr rdzerosys jsr sysbuf l074 jsr makenewfile jsr zbran dw myreadcat-*-2 rts nomem4file jsr lit dw NODSKMEM jmp error ; Создадим новый файл. Вход:FType FName FLen ; Вых.:TSAdr makefile jsr dup jsr tor l075 jsr maketsstr jsr tor jsr eight jsr store l076 jsr makefilecat jsr i jsr over jsr store Запомним TS адрес файла jsr srp Восстановим длину файла jsr swap jsr lit dw ¤21 jsr plus jsr store Запомним длину файла l096 jsr updatecat jsr fromr jsr lev jsr zero jsr store l071 jsr sysbuf1 TSAdrInMem jsr zero jsr four jsr outd Запишем TS список на диск jsr eight jmp at ; Удалим файл по имени. Вход:FName delfile jsr zero jsr lit dw ¤5 jsr outd Найдем файл jsr zbran dw nosuchf-*-2 jsr tor jsr i jsr at jsr i jsr cat jsr i jsr lit dw ¤22 jsr plus jsr cstor jsr true jsr fromr jsr cstor Стерли файл из каталога l097 jsr updatecat l098 jsr freedskspace jmp drop nosuchf rts ; Переименуем файл. Вход:NewFType NewFName LastFName renamefile rts ; Установим слотовые параметры для TEAC( на стеке адрес ; слотовой области) TFA setsltpar jsr Pop sta WorkSlt sty WorkSlt+1 ldy #¤1 lda (WorkSlt),y sta SW+3 iny iny iny w073 lda (WorkSlt),y cmp CurrDevNo bne w074 iny iny iny sty SW+2 rts w074 iny lda (WorkSlt),y tay bne w073 lda #FATERR ldy #¤0 jsr Push jmp error ; Опишем связующую процедуру teac jsr Does dw makechoice ; PFA+ 2 l019 dw TF0 l020 dw TF1 l021 dw TF2 l022 dw TF3 l038 dw TF4 Функция записи блока есть l023 dw TF5 Операции чтения файла( чтение, фиктивное..) l079 dw TF6 ; ( запись, удаление, переименование и т.д. ) dw drverr Чтение байта недоступно dw drverr Запись байта недоступна dw drverr Инициализации пока нет( форматирование ) l024 dw TFA Установка параметров ; Моя обработка ошибок myerr jsr currdevno jsr at jsr zbran dw notneedoff-*-2 jsr two jsr outd notneedoff l030 jsr nexterr jsr at jmp exec nexterr jsr Var dw 0 ; Считаем файл по адресу в стеке------------------------- ; На стеке AdrFileName MemAdr - Readfile dfb ¤88 asc "readfilE" dw 0 readfile jsr one jsr outd jsr swap на стеке MemAdr AdrFileName ; Найдем файл на диске на выходе адрес TS на диске jsr zero jsr lit dw ¤5 jsr outd jsr zequ jsr lit dw NOFILE Ошибка будет, если нет файла jsr qerr jsr drop Сотрем смещение ; Считаем по TS сам файл jsr three jsr outd jsr two jmp outd Выключим устройство ; Запишем файл ; на входе: FromMemAdr FType FName FLen Writefile dfb ¤89 asc "writefilE" dw 0 writefile jsr one jsr outd jsr over jsr zero jsr lit dw ¤6 jsr outd Сотрем файл jsr one jsr lit dw ¤6 jsr outd Создадим файл jsr four jsr outd Запишем файл jsr two jmp outd ; 1 системный буфер Sysbuf1 dfb ¤87 asc "sysbuf1" dw Teaclib sysbuf1 jsr Cons dw SysBuf+¤100 ; Чтение файла по имени за этим словом Loadq dfb ¤c5 asc ¤load"¤ dw 0 loadq jsr lit dw KAVICHKI jsr state jsr at jsr zbran dw justload-*-2 jsr comp l080 dw loadf jsr word jsr here jsr cat jsr onep jmp allot justload jsr word jsr here jsr bran dw loadit-*-2 ; Чтение файла по имени loadf jsr fromr jsr dup jsr dup jsr cat jsr onep jsr plus jsr tor loadit jsr three l0981 jsr setid jsr one l0982 jsr alloc jsr zequ jsr lit dw ERRMEM jsr qerr jsr one l0983 jsr setmem l081 jsr bank5 l082 jsr readfile l0821 jsr bank5 jsr execfile l0984 jmp free ; Банковая память Bank5 dfb ¤85 asc "bank5" dw Loadq bank5 jsr Cons dw ¤a000 chn sys1.lib[an error occurred while processing this directive]