From 8965dee742bb71babab003d0539cb11d0eaec128 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 4 Jul 2023 22:57:49 +1000 Subject: [PATCH] =?UTF-8?q?=D0=BD=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/RAM_DRV0.ASM | 613 ----------------------------------------------- 1 file changed, 613 deletions(-) delete mode 100644 DSS/RAM_DRV0.ASM diff --git a/DSS/RAM_DRV0.ASM b/DSS/RAM_DRV0.ASM deleted file mode 100644 index bb2a79d..0000000 --- a/DSS/RAM_DRV0.ASM +++ /dev/null @@ -1,613 +0,0 @@ -; -; SYSPAGE EQU #FE -; SLOT1 EQU #A2 -; SLOT2 EQU #C2 -; SLOT3 EQU #E2 - -; ORG #3CDB -; Disk Driver Specification ver. 2.20 -;[]===========================================================[ 0] -;Procedure : Initialization -; -;Function : Initialization device(s) -; -;Input : C = 00h -; IX - Environment -;Output : A = Amount drive support -; HL = Size driver -;[]===========================================================[ 0] - - -;[]===========================================================[ 1] -;Procedure : Open -; -;Function : Open disk -; -;Input : C = 01h -; A - Drive -;Output : None -; -;[]===========================================================[ 1] - - -;[]===========================================================[ 2] -;Procedure : Close -; -;Function : Close disk -; -;Input : C = 02h -; A - Drive -;Output : None -; -;[]===========================================================[ 2] - - -;[]===========================================================[ 3] -;!TODO -;Procedure : Media check -; -;Function : Checking change line -; -;Input : C = 03h -; A - Drive -;Output : A = 00h disk no changed -; A = 0FFh disk changed -; -;[]===========================================================[ 3] - - -;[]===========================================================[ 4] -;Procedure : Get BPB -; -;Function : Get Block Parameters BIOS -; -;Input : C = 04h -; DE - Address -;Output : None -; -;[]===========================================================[ 4] - - -;[]===========================================================[ 5] -;Procedure : Input -; -;Function : Input from disk -; -;Input : C = 05h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None -; -;[]===========================================================[ 5] - - -;[]===========================================================[ 6] -;Procedure : Output -; -;Function : Output to disk -; -;Input : C = 06h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None -; -;[]===========================================================[ 6] - - -;[]===========================================================[ 7] -;!TODO -;Procedure : Removable -; -;Function : Checking change line -; -;Input : C = 07h -; A - Drive -;Output : A = 00h Removable -; A = FFh Nonremovable -; -;[]===========================================================[ 7] - - -;[]===========================================================[ 8] -;Procedure : Generic IOCTL -; -;Function : Generic Input Output Control -; -;Input : C = 08h -; B - Subcommand -; DE = 55AAh Magic Number -; Subcommand -;---------------------- -; 00h - Get Device Parameters -; 01h - Read track -; 02h - Test track -; 80h - Set Device Parameters -; 81h - Write track -; 82h - Format track -;Output : -; -;[]===========================================================[ 8] - - -;[]===========================================================[ 9] -; RESERVED -;[]===========================================================[ 9] - - -;[]===========================================================[ 10] -;!TODO -;Procedure : Read Long -; -;Function : Reading sectors from disk -; -;Input : C = 0Ah -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -; A'- Page -;Output : A'- Next Page -; HL:IX - Next Logical Block (sector) -; DE - Next Address -; -;[]===========================================================[ 10] - - -;[]===========================================================[ 11] -;!TODO -;Procedure : Write Long -; -;Function : Writing sectors to disk -; -;Input : C = 0Bh -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -; A'- Page -;Output : A'- Next Page -; HL:IX - Next Logical Block (sector) -; DE - Next Address -; -;[]===========================================================[ 11] -; -; Errors: -; 0 (00h) - NO ERRORS -; 1 (01h) - BAD COMMAND -; 2 (02h) - BAD DRIVE NUMBER -; 3 (03h) - UNKNOW FORMAT -; 4 (04h) - NOT READY -; 5 (05h) - SEEK ERROR -; 6 (06h) - SECTOR NOT FOUND -; 7 (07h) - CRC ERROR -; 8 (08h) - WRITE PROTECT -; 9 (09h) - READ ERROR -; 10 (0Ah) - WRITE ERROR -; 11 (0Bh) - FAILURE -; 12 (0Ch) - BUSY (DEVICE OPENED) -; 13 (0Dh) - RESERVED - -RMDRIVE: - INC C - DEC C - JP Z,INIT_RD ; 0 - DEC C - JR Z,RESE_RD ; 1 - DEC C - JR Z,STAT_RD ; 2 - DEC C - JR Z,CHEK_RD ; 3 - DEC C - JR Z,GBPB_RD ; 4 - DEC C - JR Z,READR ; 5 - DEC C - JR Z,WRITER ; 6 - DEC C - JR Z,REMOV_R ; 7 - DEC C - JP Z,IOCTL_R ; 8 - - ; DEC C - ; JP Z,RESR_H ; 9 - ; DEC C - ; JP Z,LREADH ; 10 - ; DEC C - ; JP Z,LWRITEH ; 11 -.error: - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -REMOV_R: -RESE_RD: -STAT_RD: - XOR A - RET - -;!FIXIT сделать в SYS_PAGE для рамдисков переменные и брать оттуда значение -CHEK_RD LD A,#FF - AND A - RET - -;DE - ADDRESS -GBPB_RD LD IX,0 - LD HL,0 - LD B,#01 - ;JP READR -;READ SECTORS -; HL:IX - SECTOR -; DE - ADDRESS -; B - COUNT -; A - DRIVE -READR PUSH BC - PUSH IX - PUSH HL - PUSH BC - CALL RAMADDR - POP BC - LD IX,512 -RAMRLOP PUSH BC - PUSH IX - CALL LRDSEC - POP IX - POP BC - DJNZ RAMRLOP - POP HL - POP IX - POP BC - XOR A - CP B - LD C,B - LD B,A - JR Z,DYEP256 - ADD IX,BC - LD C,B - ADC HL,BC - XOR A - RET - -DYEP256 INC B - ADD IX,BC - LD B,C - ADC HL,BC - XOR A - RET - - -;WRITE SECTORS -; HL:IX - SECTOR -; DE - ADDRESS -; B - COUNT -; A - DRIVE -WRITER PUSH BC - PUSH IX - PUSH HL - PUSH BC - CALL RAMADDR - POP BC - LD IX,512 -RAMWLOP PUSH BC - PUSH IX - CALL WRDSEC - POP IX - POP BC - DJNZ RAMWLOP - POP HL - POP IX - POP BC - XOR A - CP B - LD C,B - LD B,A - JR Z,WYEP256 - ADD IX,BC - LD C,B - ADC HL,BC - XOR A - RET - -WYEP256 INC B - ADD IX,BC - LD B,C - ADC HL,BC - XOR A - RET - - -INIT_RD: -.SectorSize EQU 512 ;!HARDCODE - LD HL,.SectorSize - LD A,#80 -.loop: SRL A - RR H - JR NC,.loop - - LD (S_P_P),A - LD BC,#0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk - LD DE,RAMDTBL - -.initLoop: - PUSH BC - LD A,B - PUSH DE - RST ToBIOS - POP DE - OR A - JR Z,.noDRV - - LD (DE),A - INC DE - POP BC - LD A,B - LD (DE),A - INC DE - JP 1F - -.noDRV: POP BC -1: INC B - LD A,RAMDTBL.Size / 2 - CP B - JR NZ,.initLoop - - LD HL,RAMDTBL - EX DE,HL - AND A - SBC HL,DE - SRL L - LD A,L -; LD HL,ENDDRVR - AND A - RET - -; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID -; DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER -RAMDTBL: DUP MAX_RAMDRIVES * 2 - DB #FF - EDUP -.Size EQU $-RAMDTBL - - -; SECTOR / S_P_P = START PAGE -; INPUT : HL:IX -SECTOR -; OUTPUT: A':HL - ADDRESS -RAMADDR LD BC,RAMDTBL - - SLA A - - ADD A,C - LD C,A - LD A,0 - ADC A,B - LD B,A - LD A,(BC) - EX AF,AF' - LD B,XH - LD C,XL - LD A,(S_P_P) ; (S_P_P) ;SECTORS PER Page -;AGE -DIVR0 RRCA - JR C,DIVR1 - RR H - RR L - RR B - RR C - JR DIVR0 -DIVR1 LD B,C - LD C,#C4 ;GET FIRST PAGE - EX AF,AF' - RST ToBIOS - EX AF,AF' - LD A,(S_P_P) - LD C,A - DEC C - LD A,XL - AND C - INC A - LD HL,#C000 - LD BC,512 - SBC HL,BC -ADDLP ADD HL,BC - DEC A - JR NZ,ADDLP - RET - -S_P_P DB #00 - -; A':HL - ADDRESS SOURCE -; DE - ADDRESS DESTINATION -LRDSEC LD A,D - CP #A0 - LD C,SLOT3 - SET 6,H - JR C,RMDL02 - LD C,SLOT1 - RES 7,H -RMDL02 IN A,(C) - EX AF,AF' - DI - OUT (C),A - LD B,XH - LD XH,C - LD C,XL - LDIR - EX AF,AF' - LD C,XH - OUT (C),A - LD A,H - AND #7F - EI - RET NZ - LD C,SLOT3 ;GET NEXT PAGE - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - EX AF,AF' - LD XH,#C2 - LD XL,A - LD A,(IX) - EX AF,AF' - OUT (C),B - LD H,#C0 - RET - -; A':HL - ADDRESS SOURCE -; DE - ADDRESS DESTINATION - -WRDSEC LD A,D - CP #A0 - LD C,SLOT3 - SET 6,H - JR C,WMDL02 - LD C,SLOT1 - RES 7,H -WMDL02 IN A,(C) - EX AF,AF' - DI - OUT (C),A - LD B,XH - LD XH,C - LD C,XL - EX DE,HL - LDIR - EX DE,HL - EX AF,AF' - LD C,XH - OUT (C),A - LD A,H - AND #7F - EI - RET NZ - LD C,SLOT3 ;GET NEXT PAGE - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - EX AF,AF' - LD XH,#C2 - LD XL,A - LD A,(IX) - EX AF,AF' - OUT (C),B - LD H,#C0 - RET - - - -;; -;; - - -; 00 - GET DEVICE PARAMETERS -; 01 - READ TRACK -; 02 - TEST TRACK -; 80 - SET DEVICE PARAMETERS -; 81 - WRITE TRACK -; 82 - FORMAT TRACK - - -IOCTL_R: - BIT 7,B - JR NZ,.O_CTL_F - INC B - DEC B - JP Z,.RGETPRM -; DEC B -; JP Z,FRDTRAC -; DEC B -; JP Z,FCHTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -.O_CTL_F: - RES 7,B - INC B - DEC B - JP Z,.RSETPRM -; DEC B -; JP Z,FWRTRAC -; DEC B -; JP Z,FFRTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -; HL:DE - SECTORS ON LOGICAL DISK -; HL' - CYLINDERS ON PHISICAL DISK -; DE' - HEADS ON PHISICAL DISK -; BC' - SECTORS PER TRACK ON PHISICAL DISK -; A' - PHISICAL DRIVE NUMBER -; A - EXTENDED INFORMATION -; D0...D3 - "0" RESERVED (MAY BE OTHER) -; D4 - DEVICE MASTER/SLAVE -; D5 - "1" RESERVED -; D6 - ADDRESSING MODE LBA/CHS -; D7 - "1" RESERVED -.RGETPRM: - EX DE,HL - LD BC,#55AA - AND A - SBC HL,BC - LD L,A - LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET NZ - - - EX AF,AF' - LD BC,RAMDTBL - LD A,L - SLA A - ADD A,C - LD C,A - LD A,0 - ADC A,B - LD B,A - INC BC - LD A,(BC) - ADD #60 ;!HARDCODE сделать номера разных устройств через метки - PUSH AF - PUSH AF - EX AF,AF' - - POP AF - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - - PUSH HL ;число головок, число секторов (на целиндр) - PUSH DE ;количество цилиндров - EXX - POP HL ;количество цилиндров - POP BC ;число секторов (на целиндр) - LD D,0 - LD E,B ;число головок - LD B,D - EXX - - LD A,L - - RRA - JR C,.end -.loopShift: - SLA E - RL D - RRA - JR NC,.loopShift - -.end: - EX AF,AF' - POP AF - EX AF,AF' - XOR A - LD L,A - LD H,L - LD A,%10100000 - RET - -;!HARDCODE -.RSETPRM: - AND A - RET - -ENDDRVR EQU $ -;