home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
TURBODSG
/
DSKRAM.A
< prev
next >
Wrap
Text File
|
2000-06-30
|
4KB
|
182 lines
; DSKRAM - A RAMDISK IMPLEMENTATION FOR TURBODOS
; 16 BIT SLAVES WITH SUFFICIENT MEMORY
;
; NOTE: THE logic WAS BORROWED FROM NORMAN KOHN'S DISK DRIVER FOR
; 8 BIT BANKED SLAVES. THE code IS ORIGINAL.
;
; DSKRAM.O IS COPYLEFT ESKAY SOFTWARE. ALL LEFTS REVERSED.
;
MODULE "DSKRAM"
;
LOC Data#
;
; THE FOLLOWING DEFINES A 256K RAMDISK IN A 512K SLAVE
; BE SURE TO SET MEMTBL+3 = {SEGDSK}-0X50 IN THE PAR FILE!
; ALSO READ DSKRAM.DOC!
;
SEGDSK::WORD 0X4000 ; STARTING SEGMENT
NUMSGS::BYTE 4 ; NUMBER OF SEGMENTS
;
DMXSPH: WORD 1 ; MUTUAL EXCLUSION
WORD . ; SEMAPHORE
WORD .-2
;
; DISK SPECIFICATION TABLE
;
DST:
BLKSIZ: BYTE 0XC4 ; 2K, FIXED, 16K EXTENTS
NMBLK: WORD 0 ; CALCULATED BY INIT
BYTE 4 ; 128 DIR ENTRIES
SECSIZ: BYTE 1 ; 256 BYTE SECTORS
SPT: WORD 4 ; 4 SECTORS PER TRACK
NMTRK: WORD 0 ; CALCULATED BY INIT
WORD 0 ; ONE RESERVED TRACK
;
LOC Code#
;
; INITIALIZE WHATEVER THERE HAS TO BE INITED
;
DSKIN_::
PUSH DS ; SAVE DATA SEGMENT
MOV CL,NUMSGS ; GET NUMBER OF SEGMENTS TO CHECK
MOV AX,SEGDSK ; GET POINTER TO DISK START SEG
MOV DS,AX ; MAKE THIS OUR DATA SEG FOR NOW
;
; FIRST SEE IF THIS WAS A COLD BOOT
; (CHECK DIRECTORY LABEL)
;
XOR BX,BX ; POINT TO FIRST BYTE
CMP [BX],=BYTE 0XE5
JNZ __IL ; MUST FORMAT
CMP 12[BX],=BYTE 0X80 ; DIR MUST BE HASHED
JNZ __IL
CMP 15[BX],=BYTE 0XFF
JZ __CALC
__IL: XOR BX,BX ; GET READY TO WIPE THIS SEGMENT
__E5: MOV [BX],=WORD 0XE5E5
INC BX
INC BX
JNZ __E5 ; UNTIL SEGMENT DONE
DEC CL ; DECREMENT SEGMENT COUNTER
JZ __CALC ; DONE, CALCULATE BLIND SPOTS IN DST
MOV BX,DS ; GET DATA SEGMENT
ADD BX,=0X1000 ; MAKE NEXT SEG ADDR
MOV DS,BX
JMPS __IL ; DO AGAIN
;
; CALCULATE NMBLK AND NMTRK
;
__CALC: POP DS ; GET OUR DS BACK
MOV AL,=64 ; 64K PER SEGMENT
MUL NUMSGS ; TIMES THE # OF SEGS
MOV NMTRK,AX ; STORE AS NUMBER OF TRACKS (AT 1K EACH)
SHR AX,=1 ; DIVIDE BY 2
MOV NMBLK,AX ; STORE AS NUMBER OF BLOCKS
RET ; AND QUIT
;
; THIS IS THE ACTUAL RAM DISK DRIVER
;
DSKDR_::
MOV BX,&DMXSPH ; MAKE SURE WE'RE ALONE OUT THERE
CALL WAIT#
CALL __DD
LAHF
PUSH AX
MOV BX,&DMXSPH ; LET THE OTHER GUY BACK IN
CALL SIGNAL#
POP AX
SAHF
RET
;
__DD: MOV AL,0[SI] ; GET FUNCTION NUMBER
OR AL,AL
JZ RDDSK ; FCN 0 = READ DISK
DEC AL
JZ WRDSK ; FCN 1 = WRITE DISK
DEC AL
JZ RETDST ; FCN 2 = RETURN DST
RETFF: MOV AL,=0XFF ; ELSE RETURN FAILURE
RET
;
; RETURN DST
;
RETDST: MOV 14[SI],=WORD DST
JMPS RETFF
;
; READ DISK
;
RDDSK: PUSH ES
PUSH DS
PUSH SI
PUSH DI
CLI ; LET'S NOT GET DISTURBED...
CALL GETADR ; GET ADDRESS IN ES:BX
MOV AX,10[SI] ; GET DMA OFFSET
MOV DX,12[SI] ; GET DMA SEGMENT
MOV CX,8[SI] ; GET BYTE COUNT
PUSH ES ; GET DISK ADDRESS SEGMENT...
POP DS ; ... INTO DS
MOV ES,DX ; DESTINATION SEG INTO ES
MOV DI,AX ; DESTINATION OFFSET INTO DI
MOV SI,BX ; SOURCE ADDRESS INTO SI
CLD ; SET AUTO-INCREMENT
REP
MOVS BYTE ; MOVE THE STUFF
POP DI
POP SI
POP DS
POP ES ; (WISH THIS WAS A '186... PUSHA/POPA!)
STI ; MAY INTERRUPT AGAIN
JMPS RETZZ ; RETURN OK
;
; WRITE DISK
;
WRDSK: PUSH ES
PUSH DS
PUSH SI
PUSH DI
CLI ; LET'S NOT GET DISTURBED...
CALL GETADR ; GET ADDRESS IN ES:BX
MOV AX,10[SI] ; GET DMA OFFSET
MOV DX,12[SI] ; GET DMA SEGMENT
MOV CX,8[SI] ; GET BYTE COUNT
MOV DI,BX ; DESTINATION OFFSET INTO DI
MOV SI,AX ; SOURCE ADDRESS INTO SI
MOV DS,DX ; SOURCE SEGMENT INTO DS
CLD ; SET AUTO-INCREMENT
REP
MOVS BYTE ; MOVE THE STUFF
POP DI
POP SI
POP DS
POP ES ; (WISH THIS WAS A '186... PUSHA/POPA!)
STI ; MAY INTERRUPT AGAIN
RETZZ: XOR AL,AL ; RETURN OK
RET
;
; GET "DISK" ADDRESS IN ES:BX
;
GETADR: MOV AX,2[SI] ; GET TRACK NUMBER
MOV CL,=64 ; 64K PER SEGMENT
DIV CL ; FIGURE WHICH SEGMENT
MOV CL,AL ; PUT SEGMENT NUMBER INTO CH
PUSH CX ; SAVE SEGMENT NUMBER
MOV AL,AH ; GET REMAINDER
MOV AH,=0
MOV CX,=1024 ; 1024 BYTES PER TRACK
MUL CX ; AX IS NOW TRACK ADDRESS IN SEG CL
MOV BX,AX ; TRACK ADDR TO BX
MOV AX,4[SI] ; GET SECTOR
MOV CX,=256 ; BYTES PER SECTOR
MUL CX
ADD BX,AX ; BX NOW HAS FULL OFFSET
MOV AX,=0X1000
POP CX
MOV CH,=0
MUL CX
MOV DX,SEGDSK
ADD DX,AX
MOV ES,DX
RET
END