;[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,CNF_PORT.BIOS OUT (CNF_PORT.vBIOS),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,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 ; //////////////////////////////////////////////////////////////////////// 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_DRV.switch - PORTAL.out_DRV),#C7 PORTAL.out_DRV: 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 JP PORTAL.out_DRV ; //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// 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_DRV.ADCALL),HL INITDVC_RET_DRIVE: CALL INITDVC LD A,(DRV_PAGE.LDRIVE) AND A RET INCLUDE 'crazy estex dss/dss/Drivers/media/shared-drv.asm' INCLUDE 'crazy estex dss/dss/Drivers/media/ide-drv.asm' INCLUDE 'crazy estex dss/dss/Drivers/media/fdd-drv.asm' INCLUDE 'crazy estex dss/dss/Drivers/media/ram_disk-drv.asm' INCLUDE "crazy estex dss/dss/Drivers/input/MOUSE.ASM" /////////////////////////// [ DRIVE TABLES ] \\\\\\\\\\\\\\\\\\\\\\\\\\\; ; ;------------------------[shared-drv.asm table]------------------------; DEVICE EQU $ .TBL_Entry EQU 3 .Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry .End EQU DEVICE.Size + 1 ; для стоп-байта #FF ;----------------------------------------------------------------------; ; ; ;-------------------------[ IDE-DRV.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) ;+09 FREE ;+15 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 ; ВХОД: 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 + 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-drv.asm table]------------------------; DEVICE EQU @RAMDTBL + @RAMDTBL.Size .TBL_Entry EQU @DEVICE.TBL_Entry .Size: EQU @DEVICE.Size .End EQU @DEVICE.End ;----------------------------------------------------------------------; ; ; ;-------------------------[ IDE-DRV.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 @LOGDRV.TBL_Entry .Size EQU @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 + LOGDRV.Size .TBL_Entry EQU @RAMDTBL.TBL_Entry .Size EQU @RAMDTBL.Size ; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry ; DB #FF ; EDUP ; .Size EQU $-RAMDTBL ;----------------------------------------------------------------------; ; ENDMODULE ////////////////////////////////////////////////////////////////////////; ;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: ;---------[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]