; DEFINE NEW_RAMDRV_READ 0 DISK_REDIR: PUSH HL PUSH BC LD A,(ZX_VARS.OPER_DISK) AND 3 LD C,BIOS.GET_DRV_ST CALL EXP_FNS ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;EI ; POP BC POP HL RET R_W_REDIR: CALL DISK_REDIR CP 4 JR C,RECALL_1E70 CP 20 JR C,RECALL_RAMD ERROR_DISK: JP AUTO_3EE7 ; переход на ошибку диска RECALL_1E70: CALL RES_1440 LD A,(ZX_VARS.RD_WR_COM) PUSH BC PUSH HL CALL READ_TRK_NUM JP AUTO_1E70 RECALL_RAMD: SUB 4 CALL TEST_RAMD JR C,ERROR_DISK SCF JR Z,ERROR_DISK JP READ_WRITE_RAMD RECALL_MSD: JR ERROR_DISK ; переход на ошибку диска TEST_RAMD: PUSH HL LD C,BIOS.GET_RAMD_ST CALL EXP_FNS ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;EI ; POP HL RET RAMD_X12: ; проверка диска LD (ZX_VARS.OPER_DISK),A CALL DISK_REDIR CP 4 JR C,X_AUTO_3DCE CP 20 RET C ; JR C,RAMD_TEST NO_DISK2: JP AUTO_3EE7 ; NO_DISK X_AUTO_3DCE: CALL RES_1440 LD A,(ZX_VARS.OPER_DISK) JP AUTO_3DCE ;************************************* RAMD_X14: ; FORMATING CALL get_disk_type PUSH AF PUSH BC PUSH HL CALL DISK_REDIR CP 4 JR C,DISK_FORM CP 20 JR C,RAMD_FORMAT JP READ_ONLY DISK_FORM: LD A,(ZX_VARS.MED_START+1) CP #14 JR Z,QVICK_FORMAT POP HL POP BC POP AF JP AUTO_1EE0 QVICK_FORMAT: POP HL POP BC POP AF JR Q_FORM_1 RAMD_FORMAT: SUB 4 CALL TEST_RAMD JP C,READ_ONLY CALL NZ,CLEAR_RAMD POP HL POP BC POP AF LD B,#28 ; размер 640K CALL DISK_REDIR SUB 4 CALL GET_RAM_BLK ; ВЫДЕЛЕНИЕ ПАМЯТИ ; LD C,A ; КЛЮЧ RAM-Disk Q_FORM_1: LD HL,ZX_VARS.BUFFER ; CLEAR DISK ZX_VARS.BUFFER LD DE,ZX_VARS.BUFFER+1 LD BC,#FF LD (HL),0 LDIR LD DE,0 RAMD_F_LOOP: LD HL,ZX_VARS.BUFFER LD B,1 PUSH DE CALL WRITE_DISK POP DE INC E LD A,E CP 8 JR NZ,RAMD_F_LOOP LD HL,2544 LD A,22 JP AUTO_1F55 ;************************************* CLEAR_RAMD_X: CALL RAMD_SYM JR NC,CLEAR_RMD_A DEC DE LD A,(DE) CP 13 SCF RET NZ CLEAR_RAMD: CALL DISK_REDIR CLEAR_NEXT: SUB 4 RET C CP SYS_PAGE.RAMD_KEYS.NUM CCF RET C CLEAR_RMD_A: PUSH HL PUSH DE PUSH BC LD C,BIOS.FreeMemRMD CALL EXP_FNS ; вызвать функцию ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;EI ; POP BC POP DE POP HL RET ;********************************************************* ; B - ЧИСЛО ТРЕБУЕМЫХ БЛОКОВ, A - КЛЮЧ RAM-Disk GET_RMD_A: GET_RAM_BLK: LD C,BIOS.GetMemRMD CALL EXP_FNS ; A,L - КЛЮЧ RAM-Disk - номер первого блока ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;EI ; RET NC NO_MEM: LD HL,NO_MEMORY JP ERR_EXIT ;********************************************************* READ_ONLY: LD HL,READ_ONLY_MSG ; Read only !! JP ERR_EXIT FDD_SET: LD A,(ZX_VARS.OPER_DISK) LD B,A LD C,BIOS.FDD_TO_DRV ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то JP EXP_FNS ;CALL EXP_FNS ;EI ;RET ; RAMD_SET: CALL RAMD_SYM RET C RAMD_SET1: PUSH AF LD A,(ZX_VARS.OPER_DISK) LD B,A POP AF LD C,BIOS.RAMD_TO_DRV ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то JP EXP_FNS ;CALL EXP_FNS ;EI ;RET ; RAMD_SYM: LD A,(DE) INC DE CP ' ' JR Z,RAMD_SYM AND %1101'1111 CP 'E' RET C SUB 'E' CP 16 CCF RET C PUSH AF LD A,(DE) CP ':' INC DE JR Z,RAMD_SYM_OK DEC DE CP ' '+1 JR C,RAMD_SYM_OK POP AF SCF RET RAMD_SYM_OK: POP AF RET ; ;======================================================================- ; READ_WRITE_RAMD: ; ; CALL DISK_REDIR ; SUB 4 ; RET C ; CP 16 ; CCF ; RET C ; ; PUSH HL ; LD HL,RAMD_KEYS ; ADD A,L ; LD L,A ; IN A,(SLOT3) ; LD C,A ; LD A,SYS_PAGE ; DI ; OUT (SLOT3),A ; LD L,(HL) ; LD A,C ; OUT (SLOT3),A ; EI ; LD A,L ; 1-st block ; POP HL ; ; AND A ; SCF ; RET Z ; EX AF,AF' ; ; IN A,(RGADR) ; PUSH AF ; ; PUSH HL ; PUSH DE ; PUSH BC ; ; LD DE,(ZX_VARS.CONT_SEC) ; LD A,D ; ФИЗИЧЕСКИЕ -> ЛОГИЧЕСКИЕ !!! ; RRCA ; RRCA ; RRCA ; RRCA ; LD D,A ; AND 0F0H ; OR E ; LD E,A ; LD A,D ; AND 0FH ; LD D,A ; ; LD A,(ZX_VARS.RD_WR_COM) ; AND A ; JR Z,RAMD_READ ; PUSH AF ; LD A,0C0H ; OUT (RGADR),A ; POP AF ;RAMD_READ: ; ; POP BC ; PUSH BC ; LD C,0C8H ; DI ; EX AF,AF' ; CALL EXP_FNS ; чтение/запись RAM-Disk ; EI ; POP BC ; POP DE ; POP HL ; POP AF ; OUT (RGADR),A ; LD DE,(ZX_VARS.CONT_SEC) ; ; LD A,B ; ;RAMD_TRK_CONT: ; SUB 16 ; JR C,RAMD_NO_TRK ; INC D ; JR RAMD_TRK_CONT ; ;RAMD_NO_TRK: ; ADD A,16 ; ADD A,E ; CP 16 ; JR C,RAMD_NO_TRK1 ; SUB 16 ; INC D ;RAMD_NO_TRK1: ; LD E,A ; ; LD A,H ; ADD A,B ; LD H,A ; ; LD B,0 ; ; LD (ZX_VARS.CONT_SEC),DE ; AND A ; RET ;======================================================================- ;*********************************************************************** READ_WRITE_RAMD: IFN NEW_RAMDRV_READ ; ╔═══════════════════════════════════╗ ; ║ RD/WR SECTOR ║\ ; ║ HL - BUFFER ║\ ; ║ CONT_SEC - SEC/TRK FOR READ/WRITE ║\ ; ║ RD_WR_COM - команда чтение/запись ║\ ; ║ 0 - чтение, 255 - запись ║\ ; ╚═══════════════════════════════════╝\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ INC B WD_WR_RAMD_LOOP: DEC B RET Z PUSH BC PUSH HL CALL RD_WR_1SEC POP HL CALL RAMD_NEXT_SEC POP BC JR WD_WR_RAMD_LOOP RAMD_NEXT_SEC: PUSH HL LD HL,ZX_VARS.CONT_SEC LD A,16 INC (HL) CP (HL) JR NZ,.RAMD_NEXT_1 LD (HL),0 INC HL INC (HL) .RAMD_NEXT_1: POP HL LD BC,#100 ADD HL,BC RET RD_WR_1SEC: LD DE,(ZX_VARS.CONT_SEC) CALL PAGE_CALC2 DI ;!TEST ;LD A,(ZX_VARS.RD_WR_COM) ;AND #C0 LD A,#C0 ; OUT (RGADR),A LD A,H CP #A0 LD A,(ZX_VARS.RD_WR_COM) LD E,0 LD D,C SET 6,D JR C,.RD_WR_C000 ;RD_WR_4000: RES 7,D ; DE - адрес данных RAMD LD C,SLOT1 EX AF,AF' IN A,(C) EX AF,AF' OUT (C),B ; ПЕРЕМЕЩЕНИЕ ДАННЫХ LD BC,#100 AND A JR NZ,.MOVE_NOT_EX3 EX DE,HL .MOVE_NOT_EX3: LDIR ; работать здесь же, в TR-DOS !!! AND A JR NZ,.MOVE_NOT_EX4 EX DE,HL .MOVE_NOT_EX4: ;******************* EX AF,AF' OUT (SLOT1),A EX AF,AF' ; RET_PAGE1 .MOVE_RET: LD A,0 OUT (RGADR),A EI RET ; .RD_WR_C000: SET 7,D LD C,SLOT3 EX AF,AF' IN A,(C) EX AF,AF' OUT (C),B ; ПЕРЕМЕЩЕНИЕ ДАННЫХ LD BC,#100 AND A JR NZ,.MOVE_NOT_EX1 EX DE,HL .MOVE_NOT_EX1: LDIR ; работать здесь же, в TR-DOS !!! AND A JR NZ,.MOVE_NOT_EX2 EX DE,HL ;******************** .MOVE_NOT_EX2: EX AF,AF' OUT (SLOT3),A EX AF,AF' ; RET_PAGE3 JR .MOVE_RET ;********************************************** PAGE_CALC2: LD A,D ; ФИЗИЧЕСКИЕ -> ЛОГИЧЕСКИЕ !!! RRCA RRCA RRCA RRCA LD D,A AND #F0 OR E LD E,A LD A,D AND #0F LD D,A PUSH HL LD C,BIOS.RAMD_CALC_PAGE CALL DISK_REDIR SUB 4 CALL EXP_FNS ; вычисление адреса и страницы RAM-Disk ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;EI ; LD B,A LD C,H POP HL ;EI RET NC JP ERROR_DISK ;******************************************** ELSE ;******************************************** ; ╔═══════════════════════════════════╗ ; ║ RD/WR SECTOR ║\ ; ║ HL - BUFFER ║\ ; ║ B - Number of sectors ║\ ; ║ CONT_SEC - SEC/TRK FOR READ/WRITE ║\ ; ║ RD_WR_COM - команда чтение/запись ║\ ; ║ 0 - чтение, 255 - запись ║\ ; ╚═══════════════════════════════════╝\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ PUSH HL PUSH BC ;Get RAM Block ID LD A,(ZX_VARS.OPER_DISK) AND 3 LD C,BIOS.GET_DRV_ST CALL EXP_FNS JP C,.ERROR SUB 4 LD C,BIOS.GET_RAMD_ST CALL EXP_FNS JP C,.ERROR ; A = RAM Block ID EX AF,AF' ; POP BC LD C,B ; !TEST накручиваем счётчик r/w секторов LD HL,(ZX_VARS.CONT_SEC) LD A,16 INC C .loop: DEC C JR Z,.next INC L CP L JR NZ,.loop INC H LD L,0 JR .loop .next: ; ; ФИЗИЧЕСКИЙ СЕКТОР -> ЛОГИЧЕСКИЙ LD DE,(ZX_VARS.CONT_SEC) LD A,D RRCA RRCA RRCA RRCA LD D,A AND #F0 OR E LD E,A LD A,D AND #0F LD D,A ; EX (SP),HL ; Get command r/w LD A,(ZX_VARS.RD_WR_COM) EX AF,AF' LD C,BIOS.BLK_RD_WR CALL EXP_FNS POP HL JP C,AUTO_3EE7 ; сохраняем накрученный счётчик LD (ZX_VARS.CONT_SEC),HL RET .ERROR: POP BC POP HL JP AUTO_3EE7 ;Disk error ; ╔════════════════════════════════════════════════╗ ; ║ RD/WR SECTOR ║\ ; ║ HL - BUFER ║\ ; ║ DE - ABS sector в 256b блоках ║\ ; ║ B - число данных в 256b блоках ║\ ; ║ A - block RAM ║\ ; ║ A' - команда чтение/запись/чтение ROM Disk ║\ ; ║ 0 - read, 255 - write, 70 - read ROM DISK ║\ ; ║ ** NOT USED TR-DOS VARS ** ║\ ; ╚════════════════════════════════════════════════╝\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ; RAMD_NEXT_SEC: ; PUSH HL ; LD HL,ZX_VARS.CONT_SEC ; LD A,16 ; INC (HL) ; CP (HL) ; JR NZ,.RAMD_NEXT_1 ; LD (HL),0 ; INC HL ; INC (HL) ; .RAMD_NEXT_1: ; POP HL ; LD BC,#100 ; ADD HL,BC ; RET ENDIF ;***********************************************************************