;[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 ; 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 ; ;!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,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 ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; ;!FIXIT чёт не то тут ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; LD B,#00; ; ; OUT (C),A ; ;--- ; ; POP BC ; ; RET ; ;PORTAL.outDRV: ; ; RET ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; DRV_PAGE.LDRIVE: DB #00 DISPATCH: LD HL,INTDISK LD (ADCALL),HL INITDVC_RET_DRIVE: CALL INITDVC LD A,(DRV_PAGE.LDRIVE) AND A RET 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' /////////////////////////// [ 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 FREE ;+15 LOGDRV EQU DEVICE + DEVICE.End .TBL_Entry EQU 16 .Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ; ВХОД: 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]