MODULE DRIVES_DRIVER MODULE_START EQU $ ; 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,BIOS.Error.InvalidSubFunction 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 SCF RET 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,BIOS.Error.InvalidSubFunction SCF RET ; ;!TODO //////////////////////////////////////////////////////////////////////// ; <[NOT USED]> BLOCK #28-$,#C7 ; #C7 - "RST 0" opcode A0028: JP DRV_PAGE.RST_28 //////////////////////////////////////////////////////////////////////// ; DRV_PAGE.RST_28: LD A,BIOS.Error.InvalidSubFunction SCF RET ; //////////////////////////////////////////////////////////////////////// BLOCK #30-$,#C7 ; #C7 - "RST 0" opcode RST_30: JP MOUSE_DRV.API .RET: OUT (SLOT0),A JP MOUSE_HANDLER //////////////////////////////////////////////////////////////////////// ;!FIXIT //////////////////////////////////////////////////////////////////////// ; <[MAIN INT]> ; BLOCK #38-$,#C7 ; /* ;!TEST SIO INT ; reg 0 - error reset IF KEYBOARD_INT_ENABLED && MOUSE_INT_ENABLED == 0 PUSH AF ; reg 0 - error reset LD A,%0011'0000 OUT (Z84.SIO.Ch_A.Ctrl),A ; reg 0 - return from int LD A,%0011'1000 OUT (Z84.SIO.Ch_A.Ctrl),A POP AF ELSEIF MOUSE_INT_ENABLED && KEYBOARD_INT_ENABLED == 0 PUSH AF ; reg 0 - error reset LD A,%0011'0000 OUT (Z84.SIO.Ch_B.Ctrl),A ; reg 0 - return from int LD A,%0011'1000 OUT (Z84.SIO.Ch_B.Ctrl),A POP AF ELSEIF MOUSE_INT_ENABLED && KEYBOARD_INT_ENABLED PUSH AF ; reg 0 - error reset LD A,%0011'0000 OUT (Z84.SIO.Ch_A.Ctrl),A OUT (Z84.SIO.Ch_B.Ctrl),A ; reg 0 - return from int LD A,%0011'1000 OUT (Z84.SIO.Ch_A.Ctrl),A OUT (Z84.SIO.Ch_B.Ctrl),A POP AF ENDIF EI ; RETI ; */ RST_38_DRV: JP .Portal BLOCK RST_38_IM1.Portal - $,0 .Portal: PUSH AF LD A,(DRV_PAGE.MAIN_PAGE_NUMBER) OUT (SLOT0),A 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]> ; BLOCK PORTAL.RSTx18_SWITCH_ADDRESS-$-(PORTAL.out.switch - PORTAL.out),#C7 PORTAL.out: PUSH BC .RETBANK+2: LD BC,SLOT0 + 0*256; ;!!!!! ReScnDRV использует это значение .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 JR NC,PORTAL.out OR DSS_Error.DRV_MASK SCF JP PORTAL.out //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// MOUSE_HANDLER: POP AF CALL MOUSE_DRV.API PUSH AF .CorePage EQU $$$ + 1 LD A,#FF JP RST_30.RET //////////////////////////////////////////////////////////////////////// DRV_PAGE.LDRIVE: DB #00 DISPATCH: LD HL,INTDISK LD (PORTAL.out.ADCALL),HL INITDVC_RET_DRIVE: CALL INITDVC LD A,(DRV_PAGE.LDRIVE) AND A RET INCLUDE 'dss/Drivers/media/shared.asm' INCLUDE 'dss/Drivers/media/ata_atapi-drv.asm' INCLUDE 'dss/Drivers/media/fdd-drv.asm' INCLUDE 'dss/Drivers/media/ram_disk-drv.asm' INCLUDE "dss/Drivers/input/MOUSE.ASM" /////////////////////////// [ DRIVE TABLES ] \\\\\\\\\\\\\\\\\\\\\\\\\\\; ; ;--------------------------[shared.asm table]--------------------------; DEVICE EQU $ .TBL_Entry EQU 3 .Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry .End EQU DEVICE.Size + 1 ; для стоп-байта #FF ;----------------------------------------------------------------------; ; ; ;--------------------------[shared.asm table]--------------------------; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ;+01 LONG SECTOR OFFSET ;+05 LONG SIZE IN SECTORS ;+09 BYTE PARTITION RECORD NUMBER (in drive MBR) ;+10 WORD Sector Size ;+12 BYTE Removable Media Byte flags ;+13_15 FREE ; LOGDRV EQU DEVICE + DEVICE.End .TBL_Entry EQU 16 .Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ;!TODO сделать структурой .PHISICAL_DRV_NUMBER EQU 0 .SECTOR_OFFSET EQU 1 .SIZE_IN_SECTORS EQU 5 .PARTITION_RECORD_NUM EQU 9 .SECTOR_SIZE EQU 10 ; word .MediaParameters EQU 12 ; bit0=1 removable, bit1=1 drive changed, bit7..2 reserved .Reserved_1 EQU 13 .Reserved_2 EQU 14 .Reserved_3 EQU 15 ; ВХОД: L - логический номер в таблице ; ВЫХОД: IY - начало записи ; ПОРТИТ: HL, IY. HL<-->DE ; MACRO LOGDRV_ENTRY_FIND tbl_addr ; LD H,0 ; ADD HL,HL ; ADD HL,HL ; ADD HL,HL ; ADD HL,HL ; ;LD B,H ; ;LD C,L ; EX DE,HL ; LD IY,tbl_addr ; ADD IY,DE ; ENDM ;----------------------------------------------------------------------; ; ; ;-----------------------[ram_disk-drv.asm table]-----------------------; ; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID ; Log Number: DB RAM_Drive_Log_Number, RAM_Drive_ID ;(BIOS 0-15), (Block ID for BIOS) RAMDTBL EQU LOGDRV +DRIVES_DRIVER.LOGDRV.Size .TBL_Entry EQU 2 .Size EQU .TBL_Entry * MAX_RAMDRIVES ; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry ; DB #FF ; EDUP ; .Size EQU $-RAMDTBL ;----------------------------------------------------------------------; ; ////////////////////////////////////////////////////////////////////////; ///////////////////////// [ DRIVE TABLES COPY] \\\\\\\\\\\\\\\\\\\\\\\\\; MODULE OLD_TABLES ; ;--------------------------[shared.asm table]--------------------------; DEVICE EQU @DRIVES_DRIVER.RAMDTBL + @DRIVES_DRIVER.RAMDTBL.Size .TBL_Entry EQU @DRIVES_DRIVER.DEVICE.TBL_Entry .Size: EQU @DRIVES_DRIVER.DEVICE.Size .End EQU @DRIVES_DRIVER.DEVICE.End ;----------------------------------------------------------------------; ; ; ;--------------------------[shared.asm table]--------------------------; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ;+01 LONG SECTOR OFFSET ;+05 LONG SIZE IN SECTORS ;+09 FREE ;+15 LOGDRV EQU DEVICE + DEVICE.End .TBL_Entry EQU @DRIVES_DRIVER.LOGDRV.TBL_Entry .Size EQU @DRIVES_DRIVER.LOGDRV.Size ;----------------------------------------------------------------------; ; ; ;-----------------------[ram_disk-drv.asm table]-----------------------; ; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID ; Log Number: DB RAM_Drive_Log_Number, RAM_Drive_ID ;(BIOS 0-15), (Block ID for BIOS) RAMDTBL EQU LOGDRV + DRIVES_DRIVER.LOGDRV.Size .TBL_Entry EQU @DRIVES_DRIVER.RAMDTBL.TBL_Entry .Size EQU @DRIVES_DRIVER.RAMDTBL.Size ; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry ; DB #FF ; EDUP ; .Size EQU $-RAMDTBL ;----------------------------------------------------------------------; ENDMODULE ;OLD_TABLES ////////////////////////////////////////////////////////////////////////; ;DISPLAY "DEVICE start: ", /H, DEVICE ;DISPLAY "Old DEVICE start: ", /H, OLD_TABLES.DEVICE ;DISPLAY "LOGDRV start: ", /H, LOGDRV ;DISPLAY "Old LOGDRV start: ", /H, OLD_TABLES.LOGDRV ;DISPLAY "RAMDTBL start: ", /H, RAMDTBL ;DISPLAY "Old RAMDTBL start: ", /H, OLD_TABLES.RAMDTBL ; ;DRV_TEMP_BUFFER: MODULE_START.Size EQU (OLD_TABLES.RAMDTBL + OLD_TABLES.RAMDTBL.Size) - MODULE_START DISPLAY "DRV MODULE SIZE: ",/A,MODULE_START.Size ;!TODO ;---------[256 bytes stack for return pages of RST #18 callers]--------; ; #3F00 - #4000 DRV_PAGE.RSTx18_RET_PAGES EQU #4000 ;----------------------------------------------------------------------; ; ASSERT ((#4000-DRV_TEMP_BUFFER-256) > (DEVICE.Size +DRIVES_DRIVER.LOGDRV.Size + RAMDTBL.Size)), "No space for DRV_TEMP_BUFFER in DRV-MAIN page" ; ENDMODULE ; OUTEND ;[END] ENDMODULE ;DRIVES_DRIVER