; 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 ; обработчик ошибки!!!!! 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 ; обработчик ошибки!!!!! Convert_SCLtoTRD: LD A,(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 ;--------------------------------------- ; Доделать!!!!! ; 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 ; обработчик ошибки!!!!! 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,(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 < #C000, "Buffer out of mem bank 2"