forked from MirrorRepos/RomWBW
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
3.1 KiB
105 lines
3.1 KiB
;************************************************************************
|
|
; S e c t o r T r a n s l a t i o n R o u t i n e
|
|
;
|
|
; 1.0 - 3 Jul 92 - First General Release. HFB
|
|
; 0.0 - 12 Jun 91 - Initial Test Release HFB
|
|
;************************************************************************
|
|
|
|
CSEG
|
|
|
|
; Translate the sector given by BC using the translate table given by DE
|
|
|
|
; SECSHF and SECMSK must be set by SELDSK prior to calling this routine.
|
|
; CALCSK equate in DEF-xx.LIB controls use of this code. If FALSE, the
|
|
; bulk of this module will NOT be used, and a physical skew table will be
|
|
; associated with each DPB.
|
|
|
|
SECTRN:
|
|
IF BANKED
|
|
CALL BIOSTK
|
|
CALL GOSYSB
|
|
JP JBSTRN
|
|
|
|
COMMON /BANK2/
|
|
ENDIF
|
|
|
|
BSTRN: LD (CPMSEC),BC ; Save logical record from Dos for deblocker
|
|
LD A,D
|
|
OR E ; Check if translation required
|
|
LD H,B
|
|
LD L,C ; Sector number to hl
|
|
RET Z ; Return if no translation
|
|
|
|
LD A,C ; Logical record number
|
|
CALL PHYSEC ; Convert to logical host sector
|
|
; Returns with b=0
|
|
IF CALCSK
|
|
; Calculate the skew factor. Skew table contains physical sectors
|
|
; per track (byte) and skew factor (byte)
|
|
|
|
LD B,A ; Logical record number
|
|
LD A,(DE) ; De points to skew table
|
|
AND A ; Test skew factor for <0
|
|
JP P,SEC00 ; Go if positive
|
|
LD A,1 ; Else no skew on read/write
|
|
SEC00: LD H,A ; Skew factor
|
|
INC DE ; Skip starting sector
|
|
INC DE
|
|
LD A,(DE)
|
|
LD C,A ; Physical sectors/track
|
|
INC B ; Lrn+1
|
|
XOR A ; Clear a
|
|
LD E,A
|
|
SUB H ; Initialize a
|
|
SEC0: ADD A,H ; Add SKF
|
|
CP C
|
|
JR C,SEC1 ; Check for wrap
|
|
SUB C ; If wrap
|
|
JR NZ,SEC1 ; Check for repeat
|
|
INC E ; If so, advance by one sector
|
|
SEC1: DJNZ SEC0 ; Dec lrn and continue building the sec #
|
|
ADD A,E ; Add in the number of repeats
|
|
LD L,A ; Save it for now
|
|
ELSE
|
|
|
|
; Look up the sector to get. NOTE: Skew Table is constructed of physical
|
|
; sectors - not 128 byte logical records!
|
|
|
|
EX DE,HL ; Point to skew table
|
|
CALL ADDAHL ; Index to sector needed
|
|
LD L,(HL) ; And get it
|
|
ENDIF ; Calcsk
|
|
|
|
LD H,B ; B=0 from above
|
|
LD A,(SECSHF) ; Get sector shift count (0=128 byte sectors)
|
|
OR A
|
|
RET Z ; ..return If 128 byte sectors, we are finished.
|
|
|
|
LD B,A ; Save shift factor as a counter.
|
|
LD A,L ; Get physical (skewed) sector.
|
|
SEC2: RLA ; Shift it into position
|
|
DJNZ SEC2 ; ..Until B = 0
|
|
LD L,A ; In L
|
|
LD A,(SECMSK) ; Sector mask
|
|
LD C,A ; To C
|
|
LD A,(CPMSEC) ; Logical record
|
|
AND C ; Mask for offset within physical sector
|
|
OR L ; Or them with skewed and shifted physical sec.
|
|
LD L,A ; To L for DOS (H=0 from above)
|
|
RET ; ..back to ZSDOS
|
|
|
|
; Enter with logical record in A, Exit with logical host sector in A
|
|
|
|
PHYSEC: LD C,A ; Save logical record
|
|
LD A,(SECSHF) ; Get sector shift
|
|
LD B,A ; Make loop count
|
|
INC B ; Comp for djnz
|
|
LD A,C ; Restore logical record
|
|
JR PHYLP1 ; Do xlate
|
|
|
|
PHYLOP: SRL A ; Divide by 2
|
|
PHYLP1: DJNZ PHYLOP ; Loop as required
|
|
RET ; Exit w/ logical host sector in A
|
|
|
|
;========================== End of SECTRAN ================================
|
|
|