; Cлужебный (девятый cектоp в облаcти каталога) иcпользуетcя cиcтемой ; для хpанения инфоpмации о cамой диcкете. В таблице пpиведен его фоpмат: ; ╔═══════════════╤═══════╤═══════════════════════════════════════════╗ ; ║Cмещение от │ Длина │ Значение ║ ; ║начала cектоpа │ │ ║ ; ╟───────────────┼───────┼───────────────────────────────────────────║ ; ║ #00 │ 1 │ Байт 0 ║ ; ║ #01 │ 224 │ Hе иcпользуетcя (заполнено байтом 0) ║ ; ║ #E1 │ 1 │ Hомеp пеpвого незанятого cектоpа на диcке ║ ; ║ #E2 │ 1 │ Hомеp доpожки пеpвого незанятого cектоpа ║ ; ║ #E3 │ 1 │ Тип диcкеты ║ ; ║ #E4 │ 1 │ Количеcтво файлов ║ ; ║ #E5 │ 2 │ Количеcтво cвободных cектоpов ║ ; ║ #E7 │ 1 │ Идентификационный код TR-DOS (#10) ║ ; ║ #E8 │ 2 │ Hе иcпользуетcя (заполнено байтом 0) ║ ; ║ #EA │ 9 │ Hе иcпользуетcя (заполнено байтом 32) ║ ; ║ #F3 │ 1 │ Hе иcпользуетcя (заполнено байтом 0) ║ ; ║ #F4 │ 1 │ Количеcтво удаленных файлов ║ ; ║ #F5 │ 8 │ Hазвание диcкеты ║ ; ║ #FD │ 3 │ Hе иcпользуетcя (заполнено байтом 0) ║ ; ╚═══════════════╧═══════╧═══════════════════════════════════════════╝ STRUCT SEEK FirstFreeSec BYTE 0 FirstFreeTrk BYTE 1 DiskType BYTE #16 AllFilesNum BYTE 0 FreeSectors WORD 0 ; beta version TRDOS_ID BYTE #10 notuse1 WORD 0 notuse2 BLOCK 9,32 notuse3 BYTE 0 DelFilesNum BYTE 0 DiskName TEXT 8,{" "} ; beta version ENDS ; SYS_SECTOR: ; DB 0 ; BLOCK 224,0 ; .FirstFreeSec: DB 0 ; .FirstFreeTrk: DB 1 ; .DiskType DB #16 ; #16 = 80-2, #17 = 40-2, #18 = 80-1, #19 = 40-1 ; .AllFilesNum: DB 0 ; .FreeSectors: DW 2544 ; DB #10 ; DW 0000 ; BLOCK 9,32 ; DB 0 ; .DelFilesNum: DB 0 ; .DiskName: BLOCK 8,32 ; BLOCK 3,0 ; ; ╔═════════╤═════╤═════════════════════╗ ; ║Cмещение │Длина│ Hазначение ║ ; ║от начала│ │ ║ ; ╟─────────┼─────┼─────────────────────╢ ; ║ #00 │ 8 │ Имя файла ║ ; ║ #08 │ 1 │ Тип файла ║ ; ║ #09 │ 2 │ Паpаметp START ║ ; ║ #0B │ 2 │ Паpаметp LENGTH ║ ; ║ #0D │ 1 │ Количеcтво cектоpов ║ ; ║ #0E │ 1 │ Hомеp 1го cектоpа ║ ; ║ #0F │ 1 │ Hомеp доpожки ║ ; ╚═════════╧═════╧═════════════════════╝ ; CAT_ELEMENT: ; .Name BLOCK 8,32 ; .Type DB 0 ; .Start DW 0000 ; .Length DW 0000 ; .Sectors DB 0 ; .FirstSector DB 0 ; .FirstTrack DB 0 STRUCT CAT_Elements Name BLOCK 8 Type BYTE Start WORD Length WORD Sectors BYTE FirstSector BYTE FirstTrack BYTE ENDS STRUCT SclOffsets ID BLOCK 8 Files BYTE FileBlock CAT_Elements ENDS ; 655360 kb = 160 tracks * 16 sectors * 256 bites ; 80 tracks * 2 heads * 16 sectors * 256 bites = 655360 kb ; Page = 64 sectors = 4 tracks ;-----------[] ;-------[Метка диска - имя файла]------- Load_SCL: LD HL,ONE_FILE LD DE,SCL_Buffer LD BC,#0300+Dss.EX_Path RST ToDSS JR C,.skip LD HL,SCL_Buffer LD A,'.' LD BC,0008 LD DE,SYS_SECTOR.DiskName .loop: CP (HL) JR Z,.skip LDI JP PE,.loop .skip: ;-------[проверка хедэра SINCLAIR]------ LD A,(IMAGE_HANDLER) LD HL,SCL_Buffer LD DE,8 ; байтов LD C,Dss.Read RST ToDSS RET C ; обработчик ошибки LD HL,SCL_Buffer LD DE,SCL_HEADER LD B,8 .check_header: LD A,(DE) CP (HL) JR NZ,.error_header INC HL INC DE DJNZ .check_header JR .get_size .error_header: SCF RET ;------[вычисление размера для TRD]----- .get_size: ; LD A,(IMAGE_HANDLER) ; LD HL,0 ; LD IX,SclOffsets.Files ; LD B,L ; LD C,Dss.Move_FP ; RST ToDSS ; указатель на байт количества блоков (файлов) ; RET C ; обработчик ошибки!!!!! LD A,(IMAGE_HANDLER) LD HL,SCL_Buffer LD DE,#701 LD C,Dss.Read RST ToDSS ; !FIXIT сделать контроль ошибки? ; читаем байт количества блоков (файлов) ; LD A,(SCL_Buffer) LD L,A XOR A LD H,A ; ADD HL,HL ;*2 PUSH HL ADD HL,HL ;*4 LD D,H LD E,L ADD HL,HL ;*8 ADD HL,DE ;*12 POP DE ADD HL,DE ; в HL значение A*14 ADD HL,BC LD DE,SclOffsets.FileBlock ADD HL,DE ; в HL размер от начала SCL до начала блока данных (header_length) PUSH HL ; LD A,(IMAGE_HANDLER) LD HL,0 LD IX,4 ; игнорим контрольную сумму scl файла LD B,2 LD C,Dss.Move_FP RST ToDSS ; указатель на конец файла JR NC,1F ;!FIXIT обработчик ошибки!!!!! POP HL RET 1: PUSH IX POP DE ; значение младших 16 бит размера файла EX (SP),HL ; значение header_length в HL, старшая часть размера файла на стеке EX DE,HL ; в HL значение младших 16 бит размера файла, в DE - header_length SBC HL,DE LD DE,0 EX (SP),HL ; младшая часть размера файла на стеке SBC HL,DE ; в HL старшая часть размера файла EX (SP),HL ; старшая часть размера файла на стеке LD DE,#1000 ADD HL,DE EX (SP),HL ; младшая часть размера файла на стеке LD DE,0 ADC HL,DE POP DE ; тут в hl:de размер для trd ;--------------------------------------- CALL Get_RAM_Disk_E RET C ;!FIXIT обработчик ошибки!!!!! Convert_SCLtoTRD: LD A,(Load_IMAGE_File.MEM_BLK) OUT (SLOT3),A ; вставляем первую страницу RAM-диска LD HL,SCL_Buffer LD B,(HL) ; CAT_Elements INC HL LD DE,#C000 ; RAM-drive's track 0 LD IX,SYS_SECTOR LD (ix+SEEK.AllFilesNum),B .cat_loop: PUSH BC LD A,(HL) CP 1 JR NZ,1F ; this file is not deleted INC (ix+SEEK.DelFilesNum) 1: LD BC,CAT_Elements-2 ; ld bc,#0D LDIR ; copy 14 bites of scl files table to trd image catalog LD A,(SYS_SECTOR.FirstFreeSec) LD (DE),A LD C,A ;!---[v 1] INC DE LD A,(SYS_SECTOR.FirstFreeTrk) LD (DE),A INC DE ; Pointer on next filename in RAM drive DEC HL ; set to number of sectors LD A,(HL) ; get file length in sectors from scl-table AND #0F ADD A,C ;!---[^ 1] LD C,A ;!---[v 2] AND #0F LD (SYS_SECTOR.FirstFreeSec),A LD A,#F0 AND C ;!---[^ 2] JR Z,1F INC (ix+SEEK.FirstFreeTrk) 1: LD A,(HL) SRL A SRL A SRL A SRL A ADD A,(ix+SEEK.FirstFreeTrk) LD (SYS_SECTOR.FirstFreeTrk),A INC HL ; Pointer on next filename in SCL_Buffer POP BC DJNZ .cat_loop XOR A LD (DE),A ; file table end marker ;--------------------------------------- ;!TODO Доделать!!!!! ; SYS_SECTOR.FreeSectors ; push hl ; байт в буфере откуда в SCL начинаются данные (HL-SCL_Buffer) ; push de ; байт в ram диске trd где заканчивается таблица последнего файла XOR A LD DE,SCL_Buffer-8 ; вычисляем значение смещения в файле из значения смещения в буфере SBC HL,DE PUSH HL POP IX LD A,(IMAGE_HANDLER) LD HL,0 LD B,L ; b=0 - от начала файла LD C,Dss.Move_FP RST ToDSS ; указатель на первый байт данных JR NC,1F ; обработчик ошибки!!!!! POP DE RET 1: DI LD HL,SYS_SECTOR_START LD DE,#C800 ; sys sector of tr-dos disk in bank3 of ram-disk ACC_SetBlockSize LD A,0 ACC_CopyBlock LD A,(HL) LD (DE),A ACC_Off ;EI LD A,(IMAGE_HANDLER) LD HL,#D000 ; догрузить до конца страницы LD DE,#3000 LD C,Dss.Read RST ToDSS JP C,ERROR_IN_READ ;!FIXIT обработчик ошибки!!!!! LD HL,MSG_LOAD_IMAGE ; loading image LD C,Dss.PChars RST ToDSS LD HL,PROGRES_IND ; loading TRD LD C,Dss.PChars RST ToDSS DI LD A,(Load_IMAGE_File.MEM_BLK) JP Load_IMAGE_File.scl_read_next ;-----------[] SCL_HEADER: DB 'SINCLAIR' ;------------[переменные]--------------- SYS_SECTOR_START: DB 0 BLOCK 224,0 SYS_SECTOR SEEK SYS_SECTOR_END: BLOCK 3,0 SCL_FILE_ID: DB 0 ; ;-----------[в самый конец]------------- ; SCL_Buffer EQU $ ; ASSERT SCL_Buffer+#701<#A000,"Buffer out of mem bank 2"