;[BEGIN] ;//MODULE: DRV-MAIN AUTHOR: Denis Parinov ;//CREATE: 2003-03-12 ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- ;R00 2003-03-19 DNS Initial version ;--------------------------------------------------------------- ; ORG #0000 ;PAGEDRV EQU 0 ;===============; ;!FIXIT в процедуре которая будет отвечать за переход из этой страницы обратно в MAIN для вызова функций ; ДСС и, возможно, повторному заходу в эту страницу через RST #18 из других страниц (которых пока нет) ; сделать нечто подобное с программным стеком страниц. Эта процедура их сохраняет, примерно такая же ; должна восстанавливать. ; PUSH HL ;.SP+1: LD HL,DRV_PAGE.RSTx18_RET_PAGES ; LD (HL),A ; DEC L ; Не HL, а L - чтоб закольцевать область ; LD (.SP),HL ; POP HL ;===============; ;!TODO ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[NOT USED]> ; A0000: JP RST_00 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; RST_00: LD A,DSS_Error.drv.INVALID_COMMAND SCF RET ; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[BIOS API]> ; BLOCK 8-$,#C7 ; #C7 - "RST 0" opcode A0008: PUSH AF ; LD A,SYS_PORT.PAGE8; OUT (SYS_PORT.ON),A ; POP AF ; RET ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ;!FIXIT ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[DSS API]> ; BLOCK #10-$,#C7 ; #C7 - "RST 0" opcode A0010: ;JP DRV_PAGE.RST_10 ; DI : HALT ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[DRIVE API]> ; BLOCK #18-$,#C7 ; #C7 - "RST 0" opcode ;A0018 JP INTDISK ; A0018: PUSH AF ; PUSH BC ; DRV_PAGE.MAIN_PAGE_NUMBER+2: ; LD BC,0*256 + SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? JP PORTAL.outDRV ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ;!TODO ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[NOT USED]> ; BLOCK #20-$,#C7 ; #C7 - "RST 0" opcode A0020: JP DRV_PAGE.RST_20 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; DRV_PAGE.RST_20: LD A,DSS_Error.drv.INVALID_COMMAND SCF RET ; ;!TODO ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[NOT USED]> ; BLOCK #28-$,#C7 ; #C7 - "RST 0" opcode A0028: JP DRV_PAGE.RST_28 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; DRV_PAGE.RST_28: LD A,DSS_Error.drv.INVALID_COMMAND SCF RET ; ;!TODO ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[NOT USED]> ; BLOCK #30-$,#C7 ; A0030: JP RST_30 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; RST_30: LD A,DSS_Error.drv.INVALID_COMMAND SCF RET ; ;!FIXIT ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[MAIN INT]> ; BLOCK #38-$,#C7 ; A0038: ; ; JP RST_38 ; ; RST_38: ; ; INT_: PUSH AF ; ; EX AF,AF' ; ; PUSH AF ; ; PUSH BC ; ; PUSH DE ; ; PUSH HL ; ; EXX ; ; PUSH BC ; ; PUSH DE ; ; PUSH HL ; ; PUSH IX ; ; PUSH IY ; ; CALL KEYSCAN ; ; LD C,#80 ; ; RST #30 ; ; POP IY ; ; POP IX ; ; POP HL ; ; POP DE ; ; POP BC ; ; EXX ; ; POP HL ; ; POP DE ; ; POP BC ; ; POP AF ; ; EX AF,AF' ; ; POP AF ; EI ; RETI ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; DRV_PAGE.KEYSCAN: RET ;!FIXIT ; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[ NMI ]> ; DRV_PAGE.NMI: RETN ; BLOCK #66-$,#C7; A0066: JP DRV_PAGE.NMI ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ;-------------------------------; ;ADRST10 EQU #00 ; ;!!!!! ;-------------------------------; ;!FIXIT ; DRV_PAGE.RST_10: ; PUSH HL ; LD L,C ; LD H,ADRST10/256 ; LD C,(HL) ; INC H ; LD H,(HL) ; LD L,C ; EX (SP),HL ; RET ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[DRIVE PAGE SWITCH]> ; _mInfoBLOCK PORTAL.RSTx18_SWITCH_ADDRESS-$-(PORTAL.out_DRV.switch - PORTAL.out_DRV),#C7 PORTAL.out_DRV: PUSH BC ; .RETBANK+2: LD BC,0*256+SLOT0 ; .switch: OUT (C),B ; ASSERT $!=84,'-> Portal error!'; ;Entry point from DSS main page LD (.RETBANK),A ; POP BC ; POP AF ; ADCALL+1: CALL DISPATCH ; патчится на INTDISK JP PORTAL.out_DRV ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ;!FIXIT чёт не то тут ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; LD B,#00; ; OUT (C),A ; ;--- ; POP BC ; RET ; PORTAL.outDRV: ; RET ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ; DISPATCH: LD HL,INTDISK LD (ADCALL),HL INITDVC_RET_DRIVE: CALL INITDVC LD A,(DRV_PAGE.LDRIVE) AND A RET ; DRV_PAGE.LDRIVE: DB #00 INCLUDE 'dss/media_drivers/shared-drv.asm' INCLUDE 'dss/media_drivers/ide-drv.asm' INCLUDE 'dss/media_drivers/fdd-drv.asm' INCLUDE 'dss/media_drivers/ram_disk-drv.asm' DEVICE_CFG: DRV_TEMP_BUFFER: ; ; ;---------[256 bytes stack for return pages of RST #18 callers]--------; ; #3F00 - #3FFF DRV_PAGE.RSTx18_RET_PAGES EQU #3FFF ;----------------------------------------------------------------------; ASSERT ((#4000-DRV_TEMP_BUFFER-256) > (DEVICE.Size + LOGDRV.Size + RAMDTBL.Size)), "No space for DRV_TEMP_BUFFER in DRV-MAIN page" ; ENDMODULE ; OUTEND ;[END] /* ; ; NEW RESCAN ;=====================================================================[] ; логический номер устройства + адрес обработчика. ; Порядковый номер * 3 = буква диска + "A" DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF .Size: EQU $-DEVICE ; Логический номер раздела. ;Номер группы = логический номер раздела HDD из DEVICE LOGDRV: BLOCK 16*LD_DSK,0 .Size: EQU $-LOGDRV ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ;+01 LONG SECTOR OFFSET ;+05 LONG SIZE IN SECTORS (SECTORS ON LOGICAL DISK) ;+09 FREE ;+15 ; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID ; DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER RAMDTBL: DUP MAX_RAMDRIVES * 2 DB #FF EDUP .Size EQU $-RAMDTBL INTDISK: ;R01 CP #FF JR NZ,.noNeedRescan CP C JR Z,INITDVC_RET_DRIVE .noNeedRescan: ; PUSH HL PUSH BC ADD A,A ADD A,A LD C,A LD B,0 LD HL,DEVICE ADD HL,BC LD A,(HL) CP #FF JR Z,NODEV INC HL INC HL LD C,(HL) INC HL LD H,(HL) LD L,C POP BC EX (SP),HL RET NODEV: POP BC POP HL LD A,DSS_Error.drv.INVALID_DRIVE SCF RET INITDVC: XOR A LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку LD HL,DEVICE LD (PDEVICE),HL ; восст. ячейку ; FDD девайсы CALL FDDRIVE.INIT ; узнать число FDD-девайсов LD DE,FDDRIVE ; адрес обработчика тек. девайса CALL MAKEDVC ; иниц. таблицу переходов ; HDD девайсы ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET .if_old: CALL INIT_H ;CALL .CHECK_HDD LD DE,HDDRIVE CALL MAKEDVC ; RAM-диски CALL INIT_RD LD DE,RMDRIVE CALL MAKEDVC XOR A RET .CHECK_HDD: RET ;R01 INITDVC_RET_DRIVE: LD DE,DRV_TEMP_BUFFER LD HL,DEVICE LD BC,DEVICE.Size LDIR LD HL,LOGDRV LD BC,LOGDRV.Size LDIR LD HL,RAMDTBL LD BC,RAMDTBL.Size LDIR CALL INITDVC ; Сравниваем старый DEVICE буфер с новым, если в новом нет устройства, то затираем в старых буферах его LD HL,DEVICE LD DE,DRV_TEMP_BUFFER LD B,DEVICE.Size .loop_DEVICE: LD A,(DE) CP (HL) CALL NZ,.FIND_DEV INC HL INC DE DJNZ .loop_DEVICE LD A,(DRV_PAGE.LDRIVE) AND A RET ; DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*4,#FF ;=====================================================================[] ; ; */