Estex-DSS/DSS/DRV-MAIN.ASM

619 lines
14 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;[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 ¨§ ¤à㣨å áâà ­¨æ (ª®â®àëå ¯®ª  ­¥â)
; ᤥ« âì ­¥çâ® ¯®¤®¡­®¥ á ¯à®£à ¬¬­ë¬ á⥪®¬ áâà ­¨æ. <20>â  ¯à®æ¥¤ãà  ¨å á®åà ­ï¥â, ¯à¨¬¥à­® â ª ï ¦¥
; ¤®«¦­  ¢®ááâ ­ ¢«¨¢ âì.
; PUSH HL
;.SP+1: LD HL,DRV_PAGE.RSTx18_RET_PAGES
; LD (HL),A
; DEC L ; <20>¥ 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,SLOT0 + 0*256;
.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 ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
/*
; !!! ‚›‡›‚€’œ ’Ž‹œŠŽ —…<E28094>…‡ RST #10 ¢ DSS-MAIN !!!
RESCAN_DRV:
AND A
LD A,R
PUSH AF
DI
;;
IN A,(SLOT3)
LD (.restore_page),A
LD A,(PORTAL.out_DRV.RETBANK)
OUT (SLOT3),A
LD A,(BOOTDRV+#C000) ; ã§­ «¨ «®£.­®¬¥à boot ¤¨áª 
LD (.BOOT),A ; á®åà ­¨«¨
.restore_page+1:
LD A,0
OUT (SLOT3),A
LD A,(.BOOT)
CP 2
JR C,.Change ; bootdisk - ¤¨áª¥â ?
LD C,A
ADD A
ADD C
LD HL,DEVICE
LD C,A
XOR A
LD B,A
ADC HL,BC
LD DE,.DEVICE
LD BC,3 ;!HARDCODE ¤«¨­  § ¯¨á¨ ¢ DEVICE
LDIR ; á®åà ­¨«¨ § ¯¨áì boot-dsk
;!TODO âãâ ¯®ª  à ¡®â ¥â ¢ à¨ ­â § ¬¥­ë ¡ãª¢ë ¤«ï boot-RAM-DRV ¨ HDD
LD DE,.DEVICE+1
LD HL,HDDRIVE
AND A
SBC HL,DE
JR Z,.HDD_SYS
;
LD HL,RMDRIVE
AND A
SBC HL,DE
JR NZ,.Change
;
.RMD_SYS:
LD A,#60
LD (.BOOT_TYPE),A
LD A,(.DEVICE)
LD HL,RAMDTBL
SLA A
ADD A,L
LD L,A
LD A,0
ADC A,H
LD H,A
;’ãâ ¢ HL  ¤à¥á ¯¥à¢®£® ¡ ©â  § ¯¨á¨ ® boot RAM-DRV
LD DE,.RAMDTBL
LD BC,RAMDTBL.TBL_Entry
LDIR ; á®åà ­¨«¨ § ¯¨áì ® RAM-DRV
JP .Change
;
.HDD_SYS:
LD A,#80
LD (.BOOT_TYPE),A
;
LD A,(.DEVICE)
ADD A,A
ADD A,A
ADD A,A
ADD A,A
LD HL,LOGDRV
ADD A,L
LD L,A
LD A,0
ADC A,H
LD H,A
; ’ãâ ¢ HL  ¤à¥á ¯¥à¢®£® ¡ ©â  § ¯¨á¨ ® boot à §¤¥«¥
LD DE,.LOGDRV
LD BC,LOGDRV.TBL_Entry
LDIR ; á®åà ­¨«¨ § ¯¨áì ® HDD à §¤¥«¥
;JP .Change
.Change: CALL INITDVC_RET_DRIVE
LD A,(.BOOT)
CP 2
JR C,.exit ; bootdisk - ¤¨áª¥â ?
; 3. <20>஢¥à¨âì, ᬥ­¨« áì «¨ ¡ãª¢  boot-drv ¨ ¢ë©â¨, ¥á«¨ ­¥â.
; 4. …᫨ boot HDD ¨ ¥£® ¡ãª¢ã § ­ï« HDD, â® ¬¥­ï¥¬ ¬¥áâ ¬¨ ¨å
; § ¯¨á¨ ¢ â ¡«¨æ å DEVICE ¨ LOGDRV.
; …᫨ boot HDD ¨ ¥£® ¡ãª¢ã § ­ï« RAM Drive, â® ¨¤¨ ­ å¥à, ­¥ ¬®¦¥â ¡ëâì)).
; …᫨ boot FDD â® ­¨å¥à  ­¥ á«ãç¨âáï.
; …᫨ boot CD-ROM, â® ¯®¤ã¬ ¥¬, ª®£¤  ¤® í⮣® ¤®¦¨¢ñ¬.
; …᫨ boot RAM Drive ¨ ¥£® ¡ãª¢ã § ­ï« HDD, â® ­ã¦­® ᬥ­¨âì
; ¨å ¬¥áâ ¬¨ ¢ â ¡«¨æ¥ DEVICE.
; !!!!! çâ® ¡ã¤¥â, ¥á«¨ ¡ãª¢  ¡ãâ-¤¨áª  …,   ¯®á«¥ à¥áª ­ 
; § £àã§®ç­ë© à §¤¥« ®ª § «áï ¥¤¨­á⢥­­ë¬ ¢ á¨á⥬¥?
; € ¥á«¨ áà §ã ¡ã¤ãâ ¨§¬¥­¥­¨ï á RAM ¤¨áª ¬¨ ¨ HDD à §¤¥« ¬¨?
LD A,(.BOOT_TYPE)
CP #60 ;!HARDCODE ram drive
JR NZ,.restore_HDD
.restore_RMD:
LD A,(.RAMDTBL+1)
LD HL,RAMDTBL+1
LD B,RAMDTBL.Size / RAMDTBL.TBL_Entry
.loop_RMD:
CP (HL)
JR Z,.found_RMD ; ZF - ­ è«¨ ¢ ­®¢®© RAMDTBL bootdisk ¯® ¥£® 䨧¨ç¥áª®¬ã ­®¬¥àã
INC HL
INC HL
DJNZ .loop_RMD
JP .BIG_ERROR ; bootdisk died...
.found_RMD:
LD A,RAMDTBL.Size / RAMDTBL.TBL_Entry
SUB B
LD (.DEVICE),A ; new bootdisk log.number in RAMDTBL
DEC HL
LD A,(HL) ; «®£¨ç¥áª¨© ­®¬¥à ¤«ï ¯®¨áª  ¢ DEVICE
LD (.DEVICE_NEW),A ; á®å࠭塞
; ¯®¨áª ­®¬¥à  § ¯¨á¨ ¯® ¥ñ «®£¨ç¥áª®¬ã ¤¨áªã + ¯à®æ¥¤ãॠ®¡à ¡®â稪 
LD HL,DEVICE-DEVICE.TBL_Entry
LD DE,DEVICE.TBL_Entry
LD BC,DEVICE.Size / DEVICE.TBL_Entry
.found_RMD.nxt:
AND A
ADC HL,DE
PUSH HL
EXX
POP HL
LD DE,.DEVICE
LD B,DEVICE.TBL_Entry
CALL COMPARE_BYTES
EXX
JR Z, found entry
DJNZ NZ,.found_RMD.nxt
.BIG_ERROR:
;;;;
LD BC,DEVICE.Size / DEVICE.TBL_Entry
AND A
; ¤«¨­  § ¯¨á¨. áà ¢­¨¢ ¥¬ ­  ¯®«­®¥ ᮢ¯ ¤¥­¨¥ .DEVICE á
; ®¤­®© ¨§ § ¯¨á¥© DEVICE
LD B,DEVICE.TBL_Entry
.rmd_loop_search:
LD A,(DE)
CP (HL)
JR NZ,.nxt_loop_
INC DE
INC HL
DJNZ .rmd_loop_search
POP BC
;JP P,.BIG_ERROR ; ¥á«¨ ¯à®è¥àá⨫¨ §  ¯à¥¤¥«ë â ¡«¨æë
;
JP .exit
;
.restore_HDD:
;JP .exit
;;
.exit: LD HL,.Start_buffer
LD (HL),#FF
LD DE,.Start_buffer+1
LD BC,.Size_buffer-1
LDIR ; ¯®¬ëâì §  ᮡ®î))
POP AF
LD A,(DRV_PAGE.LDRIVE)
RET PO
EI
RET
.Start_buffer:
.BOOT: DB #FF ; «®£¨ç¥áª¨© ­®¬¥à
.BOOT_TYPE: DB #FF ; 00, #60, #80, #C0
.DEVICE: BLOCK 3,#FF
.DEVICE_NEW: BLOCK 3,#FF
.LOGDRV: BLOCK 16,#FF
.RAMDTBL: BLOCK 2,#FF ; «®£ RMD, 䨧 RMD
.Size_buffer EQU $-.Start_buffer
;‚•Ž„: HL,DE -  ¤à¥á  áà ¢­¨¢ ¥¬ëå ¡«®ª®¢, B - ¤«¨­  ¡«®ª 
;‚›•Ž„: ZF - ¡«®ª¨ ®¤¨­ ª®¢ë, ¢ HL ¨ DE  ¤à¥á  á«¥¤ãî饣® ¡ ©â  ¯®á«¥ ᮢ¯ ¢è¥£® ¡«®ª 
; NZ - ¡«®ª¨ ­¥®¤¨­ ª®¢ë.
COMPARE_BYTES:
LD A,(DE)
CP (HL)
RET NZ
INC HL
INC DE
DJNZ COMPARE_BYTES
XOR A
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'
;
;------------------------[shared-drv.asm table]------------------------;
DEVICE: ;BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF
.TBL_Entry EQU 3
.Size: EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ;DB #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.Size
.TBL_Entry EQU 16
.Size EQU .TBL_Entry * DSS_MAX_DRIVES_AMOUNT
;----------------------------------------------------------------------;
;
;
;-----------------------[ram_disk-drv.asm table]-----------------------;
; <E28099>ˆ€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆŠ€ ˆ …ƒŽ RAM-DISK ID
; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER
RAMDTBL EQU $ + DEVICE.Size + 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
;----------------------------------------------------------------------;
;
;
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
;=====================================================================[]
; «®£¨ç¥áª¨© ­®¬¥à ãáâனá⢠ +  ¤à¥á ®¡à ¡®â稪 .
; <20>®à浪®¢ë© ­®¬¥à * 3 = ¡ãª¢  ¤¨áª  + "A"
DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF
.Size: EQU $-DEVICE
; ‹®£¨ç¥áª¨© ­®¬¥à à §¤¥« .
;<3B>®¬¥à £à㯯ë = «®£¨ç¥áª¨© ­®¬¥à à §¤¥«  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
; <E28099>ˆ€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆŠ€ ˆ …ƒŽ 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
;=====================================================================[]
;
;
*/