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