|
|
@ -471,8 +471,6 @@ GOMON: |
|
|
;================================================================================================== |
|
|
;================================================================================================== |
|
|
; |
|
|
; |
|
|
;__________________________________________________________________________________________________ |
|
|
;__________________________________________________________________________________________________ |
|
|
; |
|
|
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
|
|
CONST: |
|
|
CONST: |
|
|
; CONSOLE STATUS, RETURN $FF IF CHARACTER READY, $00 IF NOT |
|
|
; CONSOLE STATUS, RETURN $FF IF CHARACTER READY, $00 IF NOT |
|
|
; |
|
|
; |
|
|
@ -1223,13 +1221,38 @@ DSK_SELECT: |
|
|
; |
|
|
; |
|
|
; RESTORE DE TO BC (FOR ACCESS TO DRIVE LOGIN BIT) |
|
|
; RESTORE DE TO BC (FOR ACCESS TO DRIVE LOGIN BIT) |
|
|
POP BC ; GET ORIGINAL E INTO B |
|
|
POP BC ; GET ORIGINAL E INTO B |
|
|
; |
|
|
|
|
|
#IFDEF PLTWBW |
|
|
|
|
|
; |
|
|
; |
|
|
; CHECK IF THIS IS LOGIN, IF NOT, BYPASS MEDIA DETECTION |
|
|
; CHECK IF THIS IS LOGIN, IF NOT, BYPASS MEDIA DETECTION |
|
|
; FIX: WHAT IF PREVIOUS MEDIA DETECTION FAILED??? |
|
|
; FIX: WHAT IF PREVIOUS MEDIA DETECTION FAILED??? |
|
|
BIT 0,B ; TEST DRIVE LOGIN BIT |
|
|
BIT 0,B ; TEST DRIVE LOGIN BIT |
|
|
JR NZ,DSK_SELECT2 ; BYPASS MEDIA DETECTION |
|
|
JR NZ,DSK_SELECT2 ; BYPASS MEDIA DETECTION |
|
|
|
|
|
; |
|
|
|
|
|
#IFDEF PLTUNA |
|
|
|
|
|
; |
|
|
|
|
|
LD A,(SEKUNIT) ; GET DISK UNIT |
|
|
|
|
|
LD B,A ; UNIT NUM TO B |
|
|
|
|
|
LD C,$48 ; UNA FUNC: GET DISK TYPE |
|
|
|
|
|
CALL $FFFD ; CALL UNA |
|
|
|
|
|
LD A,D ; MOVE DISK TYPE TO A |
|
|
|
|
|
CP $40 ; RAM/ROM DRIVE? |
|
|
|
|
|
JR Z,DSK_SELECT1 ; HANDLE RAM/ROM DRIVE |
|
|
|
|
|
LD A,MID_HD ; OTHERWISE WE HAVE A HARD DISK |
|
|
|
|
|
JR DSK_SELECT1A ; DONE |
|
|
|
|
|
; |
|
|
|
|
|
DSK_SELECT1: |
|
|
|
|
|
; UNA RAM/ROM DRIVE |
|
|
|
|
|
LD C,$45 ; UNA FUNC: GET DISK INFO |
|
|
|
|
|
LD DE,(DSKBUF) ; 512 BYTE BUFFER |
|
|
|
|
|
CALL $FFFD ; CALL UNA |
|
|
|
|
|
BIT 7,B ; TEST RAM DRIVE BIT |
|
|
|
|
|
LD A,MID_MDROM ; ASSUME ROM |
|
|
|
|
|
JR Z,DSK_SELECT1A ; IS ROM, DONE |
|
|
|
|
|
LD A,MID_MDRAM ; MSUT BE RAM |
|
|
|
|
|
; |
|
|
|
|
|
DSK_SELECT1A: |
|
|
|
|
|
LD (MEDID),A |
|
|
|
|
|
; |
|
|
|
|
|
#ELSE |
|
|
; |
|
|
; |
|
|
; DETERMINE MEDIA IN DRIVE |
|
|
; DETERMINE MEDIA IN DRIVE |
|
|
LD A,(SEKUNIT) ; GET UNIT |
|
|
LD A,(SEKUNIT) ; GET UNIT |
|
|
@ -1242,6 +1265,8 @@ DSK_SELECT: |
|
|
OR A ; SET FLAGS |
|
|
OR A ; SET FLAGS |
|
|
LD HL,0 ; ASSUME FAILURE |
|
|
LD HL,0 ; ASSUME FAILURE |
|
|
RET Z ; BAIL OUT IF NO MEDIA |
|
|
RET Z ; BAIL OUT IF NO MEDIA |
|
|
|
|
|
; |
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
; CLEAR LBA OFFSET (DWORD) |
|
|
; CLEAR LBA OFFSET (DWORD) |
|
|
LD HL,0 ; ZERO |
|
|
LD HL,0 ; ZERO |
|
|
@ -1286,8 +1311,6 @@ DSK_SELECT: |
|
|
LD BC,4 ; 4 BYTES |
|
|
LD BC,4 ; 4 BYTES |
|
|
LDIR ; DO IT |
|
|
LDIR ; DO IT |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
|
|
|
DSK_SELECT2: |
|
|
DSK_SELECT2: |
|
|
LD HL,(SEKDPH) ; HL = DPH ADDRESS FOR CP/M |
|
|
LD HL,(SEKDPH) ; HL = DPH ADDRESS FOR CP/M |
|
|
XOR A ; FLAG SUCCESS |
|
|
XOR A ; FLAG SUCCESS |
|
|
@ -1298,15 +1321,32 @@ DSK_SELECT2: |
|
|
; UPDATE THE PARTITION OFFSET (LBAOFF) AND UPDATE |
|
|
; UPDATE THE PARTITION OFFSET (LBAOFF) AND UPDATE |
|
|
; THE MEDIA ID (MEDID). |
|
|
; THE MEDIA ID (MEDID). |
|
|
; |
|
|
; |
|
|
#IFDEF PLTWBW |
|
|
|
|
|
; |
|
|
|
|
|
DSK_MBR: |
|
|
DSK_MBR: |
|
|
; CHECK MEDIA TYPE, ONLY HARD DISK IS APPLICABLE |
|
|
; CHECK MEDIA TYPE, ONLY HARD DISK IS APPLICABLE |
|
|
LD A,(MEDID) ; GET MEDIA ID |
|
|
LD A,(MEDID) ; GET MEDIA ID |
|
|
CP MID_HD ; HARD DISK? |
|
|
CP MID_HD ; HARD DISK? |
|
|
JR Z,DSK_MBR1 ; IF SO, CONTINUE |
|
|
|
|
|
|
|
|
JR Z,DSK_MBR0 ; IF SO, CONTINUE |
|
|
XOR A ; ELSE, N/A, SIGNAL SUCCESS |
|
|
XOR A ; ELSE, N/A, SIGNAL SUCCESS |
|
|
RET ; AND RETURN |
|
|
RET ; AND RETURN |
|
|
|
|
|
|
|
|
|
|
|
DSK_MBR0: |
|
|
|
|
|
; |
|
|
|
|
|
#IFDEF PLTWBW |
|
|
|
|
|
; SWITCH TO BIOS BANK TO ACCESS DISK BUFFER |
|
|
|
|
|
LD A,(HB_CURBNK) ; GET CUR BANK |
|
|
|
|
|
PUSH AF ; SAVE CUR BANK |
|
|
|
|
|
LD A,(BNKBIOS) ; BIOS BANK |
|
|
|
|
|
CALL HB_BNKSEL ; DO IT |
|
|
|
|
|
CALL DSK_MBR1 ; DO THE WORK |
|
|
|
|
|
; RESTORE BANK |
|
|
|
|
|
PUSH AF ; SAVE RESULT |
|
|
|
|
|
POP HL ; TO HL |
|
|
|
|
|
EX (SP),HL ; RESULT TO TOS, PREV BANK TO H |
|
|
|
|
|
LD A,H ; PREV BANK TO A |
|
|
|
|
|
CALL HB_BNKSEL ; SELECT IT |
|
|
|
|
|
POP AF ; ORIGINAL RESULT BACK |
|
|
|
|
|
RET |
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
DSK_MBR1: |
|
|
DSK_MBR1: |
|
|
; FLUSH DSKBUF TO MAKE SURE IT IS SAFE TO USE IT. |
|
|
; FLUSH DSKBUF TO MAKE SURE IT IS SAFE TO USE IT. |
|
|
@ -1320,14 +1360,11 @@ DSK_MBR1: |
|
|
LD C,A ; PUT IN C |
|
|
LD C,A ; PUT IN C |
|
|
LD DE,0 ; LBA SECTOR ZERO |
|
|
LD DE,0 ; LBA SECTOR ZERO |
|
|
LD HL,0 ; ... |
|
|
LD HL,0 ; ... |
|
|
|
|
|
#IFDEF PLTWBW |
|
|
|
|
|
SET 7,D ; MAKE SURE LBA ACCESS BIT SET |
|
|
|
|
|
#ENDIF |
|
|
CALL DSK_IO2 ; DO IT |
|
|
CALL DSK_IO2 ; DO IT |
|
|
RET NZ ; ABORT ON ERROR |
|
|
RET NZ ; ABORT ON ERROR |
|
|
; |
|
|
|
|
|
; SWITCH TO BIOS BANK TO ACCESS DISK BUFFER |
|
|
|
|
|
LD A,(HB_CURBNK) ; GET CUR BANK |
|
|
|
|
|
PUSH AF ; SAVE CUR BANK |
|
|
|
|
|
LD A,(BNKBIOS) ; BIOS BANK |
|
|
|
|
|
CALL HB_BNKSEL ; DO IT |
|
|
|
|
|
; |
|
|
; |
|
|
; CHECK SIGNATURE |
|
|
; CHECK SIGNATURE |
|
|
LD HL,(DSKBUF) ; DSKBUF ADR |
|
|
LD HL,(DSKBUF) ; DSKBUF ADR |
|
|
@ -1335,11 +1372,11 @@ DSK_MBR1: |
|
|
ADD HL,DE ; POINT TO SIGNATURE |
|
|
ADD HL,DE ; POINT TO SIGNATURE |
|
|
LD A,(HL) ; GET FIRST BYTE |
|
|
LD A,(HL) ; GET FIRST BYTE |
|
|
CP $55 ; CHECK FIRST BYTE |
|
|
CP $55 ; CHECK FIRST BYTE |
|
|
JR NZ,DSK_MBR4 ; NO MATCH, NO PART TABLE |
|
|
|
|
|
|
|
|
JR NZ,DSK_MBR5 ; NO MATCH, NO PART TABLE |
|
|
INC HL ; NEXT BYTE |
|
|
INC HL ; NEXT BYTE |
|
|
LD A,(HL) ; GET SECOND BYTE |
|
|
LD A,(HL) ; GET SECOND BYTE |
|
|
CP $AA ; CHECK SECOND BYTE |
|
|
CP $AA ; CHECK SECOND BYTE |
|
|
JR NZ,DSK_MBR4 ; NO MATCH, NO PART TABLE, ABORT |
|
|
|
|
|
|
|
|
JR NZ,DSK_MBR5 ; NO MATCH, NO PART TABLE, ABORT |
|
|
; |
|
|
; |
|
|
; TRY TO FIND OUR ENTRY IN PART TABLE AND CAPTURE LBA OFFSET |
|
|
; TRY TO FIND OUR ENTRY IN PART TABLE AND CAPTURE LBA OFFSET |
|
|
LD B,4 ; FOUR ENTRIES IN PART TABLE |
|
|
LD B,4 ; FOUR ENTRIES IN PART TABLE |
|
|
@ -1348,19 +1385,16 @@ DSK_MBR1: |
|
|
ADD HL,DE ; POINT TO IT |
|
|
ADD HL,DE ; POINT TO IT |
|
|
DSK_MBR2: |
|
|
DSK_MBR2: |
|
|
LD A,(HL) ; GET PART TYPE |
|
|
LD A,(HL) ; GET PART TYPE |
|
|
CP $52 ; CP/M PARTITION? |
|
|
|
|
|
|
|
|
CP $2E ; CP/M PARTITION? |
|
|
JR Z,DSK_MBR3 ; COOL, GRAB THE LBA OFFSET |
|
|
JR Z,DSK_MBR3 ; COOL, GRAB THE LBA OFFSET |
|
|
LD DE,16 ; PART TABLE ENTRY SIZE |
|
|
LD DE,16 ; PART TABLE ENTRY SIZE |
|
|
ADD HL,DE ; BUMP TO NEXT ENTRY PART TYPE |
|
|
ADD HL,DE ; BUMP TO NEXT ENTRY PART TYPE |
|
|
DJNZ DSK_MBR2 ; LOOP THRU TABLE |
|
|
DJNZ DSK_MBR2 ; LOOP THRU TABLE |
|
|
JR DSK_MBR4 ; TOO BAD, NO CP/M PARTITION |
|
|
|
|
|
|
|
|
JR DSK_MBR5 ; TOO BAD, NO CP/M PARTITION |
|
|
; |
|
|
; |
|
|
DSK_MBR3: |
|
|
DSK_MBR3: |
|
|
; WE HAVE LOCATED A VALID CP/M PARTITION |
|
|
; WE HAVE LOCATED A VALID CP/M PARTITION |
|
|
; HL POINTS TO PART TYPE FIELD OF PART ENTRY |
|
|
; HL POINTS TO PART TYPE FIELD OF PART ENTRY |
|
|
; UPDATE MEDIA ID |
|
|
|
|
|
LD A,MID_HDNEW ; NEW MEDIA ID |
|
|
|
|
|
LD (MEDID),A ; SAVE IT |
|
|
|
|
|
; |
|
|
; |
|
|
; CAPTURE THE LBA OFFSET |
|
|
; CAPTURE THE LBA OFFSET |
|
|
LD DE,4 ; LBA IS 4 BYTES AFTER PART TYPE |
|
|
LD DE,4 ; LBA IS 4 BYTES AFTER PART TYPE |
|
|
@ -1368,14 +1402,39 @@ DSK_MBR3: |
|
|
LD DE,SEKLBA ; LOC TO STORE LBA OFFSET |
|
|
LD DE,SEKLBA ; LOC TO STORE LBA OFFSET |
|
|
LD BC,4 ; 4 BYTES (32 BITS) |
|
|
LD BC,4 ; 4 BYTES (32 BITS) |
|
|
LDIR ; COPY IT |
|
|
LDIR ; COPY IT |
|
|
|
|
|
; |
|
|
|
|
|
; CHECK THAT REQUESTED SLICE IS "INSIDE" PARTITION |
|
|
|
|
|
; SLICE SIZE IS EXACTLY 16,384 SECTORS (8MB), SO WE CAN JUST |
|
|
|
|
|
; RIGHT SHIFT PARTITION SECTOR COUNT BY 14 BITS |
|
|
|
|
|
LD E,(HL) ; HL POINTS TO FIRST BYTE |
|
|
|
|
|
INC HL ; ... OF 32 BIT PARTITION |
|
|
|
|
|
LD D,(HL) ; ... SECTOR COUNT, |
|
|
|
|
|
INC HL ; ... LOAD SECTOR COUNT |
|
|
|
|
|
PUSH DE ; ... INTO DE:HL |
|
|
|
|
|
LD E,(HL) ; ... |
|
|
|
|
|
INC HL ; ... |
|
|
|
|
|
LD D,(HL) ; ... |
|
|
|
|
|
POP HL ; ... DE:HL = PART SIZE IN SECTORS |
|
|
|
|
|
LD B,2 ; DE = DE:HL >> 2 (TRICKY!) |
|
|
|
|
|
CALL RL32 ; DE = SLICECNT |
|
|
|
|
|
EX DE,HL ; HL = SLICECNT |
|
|
|
|
|
LD A,(SLICE) ; GET TARGET SLICE |
|
|
|
|
|
LD C,A ; PUT IN C |
|
|
|
|
|
LD B,0 ; BC := REQUESTED SLICE # |
|
|
|
|
|
SCF ; SET CARRY! |
|
|
|
|
|
SBC HL,BC ; MAX SLICES - SLICE - 1 |
|
|
|
|
|
JR NC,DSK_MBR4 ; NO OVERFLOW, OK TO CONTINUE |
|
|
|
|
|
OR $FF ; SLICE TOO HIGH, SIGNAL ERROR |
|
|
|
|
|
RET ; AND BAIL OUT |
|
|
|
|
|
; |
|
|
|
|
|
DSK_MBR4: |
|
|
; IF BOOT FROM PARTITION, USE NEW SECTORS PER SLICE VALUE |
|
|
; IF BOOT FROM PARTITION, USE NEW SECTORS PER SLICE VALUE |
|
|
LD HL,16384 ; NEW SECTORS PER SLICE |
|
|
LD HL,16384 ; NEW SECTORS PER SLICE |
|
|
LD (SPS),HL ; SAVE IT |
|
|
LD (SPS),HL ; SAVE IT |
|
|
; |
|
|
|
|
|
DSK_MBR4: |
|
|
|
|
|
; RESTORE BANK |
|
|
|
|
|
POP AF ; GET PREV BANK |
|
|
|
|
|
CALL HB_BNKSEL ; SELECT IT |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; UPDATE MEDIA ID |
|
|
|
|
|
LD A,MID_HDNEW ; NEW MEDIA ID |
|
|
|
|
|
LD (MEDID),A ; SAVE IT |
|
|
; |
|
|
; |
|
|
DSK_MBR5: |
|
|
DSK_MBR5: |
|
|
; ADJUST LBA OFFSET BASED ON TARGET SLICE |
|
|
; ADJUST LBA OFFSET BASED ON TARGET SLICE |
|
|
@ -1383,68 +1442,22 @@ DSK_MBR5: |
|
|
LD HL,(SEKLBA) ; SET DE:HL |
|
|
LD HL,(SEKLBA) ; SET DE:HL |
|
|
LD DE,(SEKLBA+2) ; ... TO STARTING LBA |
|
|
LD DE,(SEKLBA+2) ; ... TO STARTING LBA |
|
|
LD BC,(SPS) ; SECTORS PER SLICE |
|
|
LD BC,(SPS) ; SECTORS PER SLICE |
|
|
BOOT6: |
|
|
|
|
|
|
|
|
DSK_MBR6: |
|
|
OR A ; SET FLAGS TO CHECK LOOP CNTR |
|
|
OR A ; SET FLAGS TO CHECK LOOP CNTR |
|
|
JR Z,BOOT8 ; DONE IF COUNTER EXHAUSTED |
|
|
|
|
|
|
|
|
JR Z,DSK_MBR8 ; DONE IF COUNTER EXHAUSTED |
|
|
ADD HL,BC ; ADD ONE SLICE TO LOW WORD |
|
|
ADD HL,BC ; ADD ONE SLICE TO LOW WORD |
|
|
JR NC,BOOT7 ; CHECK FOR CARRY |
|
|
|
|
|
|
|
|
JR NC,DSK_MBR7 ; CHECK FOR CARRY |
|
|
INC DE ; IF SO, BUMP HIGH WORD |
|
|
INC DE ; IF SO, BUMP HIGH WORD |
|
|
BOOT7: |
|
|
|
|
|
|
|
|
DSK_MBR7: |
|
|
DEC A ; DEC LOOP DOWNCOUNTER |
|
|
DEC A ; DEC LOOP DOWNCOUNTER |
|
|
JR BOOT6 ; AND LOOP |
|
|
|
|
|
BOOT8: |
|
|
|
|
|
|
|
|
JR DSK_MBR6 ; AND LOOP |
|
|
|
|
|
DSK_MBR8: |
|
|
; RESAVE IT |
|
|
; RESAVE IT |
|
|
LD (SEKLBA),HL ; LOWORD |
|
|
LD (SEKLBA),HL ; LOWORD |
|
|
LD (SEKLBA+2),DE ; HIWORD |
|
|
LD (SEKLBA+2),DE ; HIWORD |
|
|
; SUCCESSFUL FINISH |
|
|
; SUCCESSFUL FINISH |
|
|
XOR A ; SUCCESS |
|
|
XOR A ; SUCCESS |
|
|
RET ; DONE |
|
|
RET ; DONE |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; ; DIFFERENT ALGORITHM FOR NEW HD FORMAT |
|
|
|
|
|
; LD A,(MEDID) ; GET MEDIA ID |
|
|
|
|
|
; CP MID_HDNEW ; NEW FORMAT? |
|
|
|
|
|
; JR Z,DSK_MBR6 ; IF SO, GO THERE |
|
|
|
|
|
;; |
|
|
|
|
|
; ; OLD HD FORMAT, 65 TRACKS PER SLICE |
|
|
|
|
|
; LD A,(SLICE) ; GET SLICE |
|
|
|
|
|
; LD E,A ; E = SLICE NO |
|
|
|
|
|
; LD H,65 ; H = TRACKS PER SLICE |
|
|
|
|
|
; CALL MULT8 ; HL := H * E (TOTAL TRACK OFFSET) |
|
|
|
|
|
; LD DE,0 ; CLEAR HI WORD |
|
|
|
|
|
; LD B,8 ; 16 SPT, SHIFT 4 BITS |
|
|
|
|
|
; CALL RL32 ; DO IT |
|
|
|
|
|
; JR DSK_MBR7 ; DONE |
|
|
|
|
|
;; |
|
|
|
|
|
;DSK_MBR6: |
|
|
|
|
|
; ; NEW HD FORMAT, MULTIPLY SLICE BY 8MB |
|
|
|
|
|
; LD DE,0 ; CLEAR HIWORD |
|
|
|
|
|
; LD H,0 ; CLEAR HI BYTE OR LOWORD |
|
|
|
|
|
; LD A,(SLICE) ; GET SLICE |
|
|
|
|
|
; LD L,A ; PUT SLICE IN LOW BYTE |
|
|
|
|
|
; LD B,14 |
|
|
|
|
|
; CALL RL32 ; MULTIPLY BY 16384 SECTORS (8MB) |
|
|
|
|
|
;; |
|
|
|
|
|
;DSK_MBR7: |
|
|
|
|
|
; ; ADD IN LBA OFFSET |
|
|
|
|
|
; LD BC,(SEKLBA) ; LBA OFFSET LOWORD |
|
|
|
|
|
; ADD HL,BC |
|
|
|
|
|
; EX DE,HL |
|
|
|
|
|
; LD BC,(SEKLBA+2) ; LBA OFFSET HIWORD |
|
|
|
|
|
; ADC HL,BC |
|
|
|
|
|
; EX DE,HL |
|
|
|
|
|
; SET 7,D ; SET LBA ACCESS BIT |
|
|
|
|
|
; ; RESAVE IT |
|
|
|
|
|
; LD (SEKLBA),HL ; LOWORD |
|
|
|
|
|
; LD (SEKLBA+2),DE ; HIWORD |
|
|
|
|
|
; ; SUCCESSFUL FINISH |
|
|
|
|
|
; XOR A ; SUCCESS |
|
|
|
|
|
; RET ; DONE |
|
|
|
|
|
; |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
@ -1480,54 +1493,12 @@ DSK_WRITE: |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
#IFDEF PLTUNA |
|
|
|
|
|
; |
|
|
|
|
|
DSK_IO: |
|
|
|
|
|
PUSH BC |
|
|
|
|
|
LD DE,(HSTTRK) ; GET TRACK INTO HL |
|
|
|
|
|
LD B,4 ; PREPARE TO LEFT SHIFT BY 4 BITS |
|
|
|
|
|
DSK_IO1: |
|
|
|
|
|
SLA E ; SHIFT DE LEFT BY 4 BITS |
|
|
|
|
|
RL D |
|
|
|
|
|
DJNZ DSK_IO1 ; LOOP TILL ALL BITS DONE |
|
|
|
|
|
LD A,(HSTSEC) ; GET THE SECTOR INTO A |
|
|
|
|
|
AND $0F ; GET RID OF TOP NIBBLE |
|
|
|
|
|
OR E ; COMBINE WITH E |
|
|
|
|
|
LD E,A ; BACK IN E |
|
|
|
|
|
LD HL,0 ; HL:DE NOW HAS SLICE RELATIVE LBA |
|
|
|
|
|
; APPLY OFFSET NOW |
|
|
|
|
|
; OFFSET IS EXPRESSED AS NUMBER OF BLOCKS * 256 TO OFFSET! |
|
|
|
|
|
LD A,(HSTOFF) ; LSB OF SLICE OFFSET TO A |
|
|
|
|
|
ADD A,D ; ADD WITH D |
|
|
|
|
|
LD D,A ; PUT IT BACK IN D |
|
|
|
|
|
LD A,(HSTOFF+1) ; MSB OF SLICE OFFSET TO A |
|
|
|
|
|
CALL ADCHLA ; ADD OFFSET |
|
|
|
|
|
POP BC ; RECOVER FUNCTION IN B |
|
|
|
|
|
LD A,(HSTUNIT) ; GET THE UNIT VALUE |
|
|
|
|
|
LD C,A ; PUT IT IN C |
|
|
|
|
|
; DISPATCH TO DRIVER |
|
|
|
|
|
PUSH BC |
|
|
|
|
|
EX DE,HL ; DE:HL NOW HAS LBA |
|
|
|
|
|
LD B,C ; UNIT TO B |
|
|
|
|
|
LD C,$41 ; UNA SET LBA |
|
|
|
|
|
RST 08 ; CALL UNA |
|
|
|
|
|
CALL NZ,PANIC |
|
|
|
|
|
POP BC ; RECOVER B=FUNC, C=UNIT |
|
|
|
|
|
LD E,C ; UNIT TO E |
|
|
|
|
|
LD C,B ; FUNC TO C |
|
|
|
|
|
LD B,E ; UNIT TO B |
|
|
|
|
|
LD DE,(DSKBUF) ; SET BUFFER ADDRESS |
|
|
|
|
|
LD HL,1 ; 1 SECTOR |
|
|
|
|
|
; DISPATCH TO UBIOS |
|
|
|
|
|
RST 08 |
|
|
|
|
|
OR A ; SET FLAGS BASED ON RESULT |
|
|
|
|
|
RET |
|
|
|
|
|
; |
|
|
|
|
|
#ELSE |
|
|
|
|
|
; |
|
|
|
|
|
DSK_IO: |
|
|
DSK_IO: |
|
|
LD A,(HSTUNIT) ; GET UNIT |
|
|
LD A,(HSTUNIT) ; GET UNIT |
|
|
LD C,A ; UNIT -> C |
|
|
LD C,A ; UNIT -> C |
|
|
|
|
|
; |
|
|
|
|
|
#IFDEF PLTWBW |
|
|
|
|
|
; |
|
|
PUSH BC ; SAVE FUNC/UNIT |
|
|
PUSH BC ; SAVE FUNC/UNIT |
|
|
LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO |
|
|
LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO |
|
|
RST 08 ; GET UNIT INFO, DEVICE TYPE IN D |
|
|
RST 08 ; GET UNIT INFO, DEVICE TYPE IN D |
|
|
@ -1549,9 +1520,9 @@ DSK_IO: |
|
|
RL D ; CARRY BIT (HEAD) INTO D |
|
|
RL D ; CARRY BIT (HEAD) INTO D |
|
|
JR DSK_IO2 ; DO THE DISK I/O |
|
|
JR DSK_IO2 ; DO THE DISK I/O |
|
|
; |
|
|
; |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
LBA_IO: |
|
|
LBA_IO: |
|
|
LD A,(HSTUNIT) ; GET THE UNIT VALUE |
|
|
|
|
|
LD C,A ; PUT IT IN C |
|
|
|
|
|
PUSH BC ; SAVE FUNC/UNIT |
|
|
PUSH BC ; SAVE FUNC/UNIT |
|
|
; GET TRACK AND SHIFT TO MAKE ROOM FOR 4 BIT SECTOR VALUE |
|
|
; GET TRACK AND SHIFT TO MAKE ROOM FOR 4 BIT SECTOR VALUE |
|
|
LD HL,(HSTTRK) ; GET TRACK |
|
|
LD HL,(HSTTRK) ; GET TRACK |
|
|
@ -1569,16 +1540,42 @@ LBA_IO: |
|
|
LD BC,(HSTLBA+2) ; LBA OFFSET HIWORD |
|
|
LD BC,(HSTLBA+2) ; LBA OFFSET HIWORD |
|
|
ADC HL,BC |
|
|
ADC HL,BC |
|
|
EX DE,HL |
|
|
EX DE,HL |
|
|
|
|
|
#IFDEF PLTWBW |
|
|
SET 7,D ; MAKE SURE LBA ACCESS BIT SET |
|
|
SET 7,D ; MAKE SURE LBA ACCESS BIT SET |
|
|
|
|
|
#ENDIF |
|
|
POP BC ; RESTORE FUNC/UNIT |
|
|
POP BC ; RESTORE FUNC/UNIT |
|
|
;JR DSK_IO2 ; DO THE DISK I/O (FALL THRU) |
|
|
;JR DSK_IO2 ; DO THE DISK I/O (FALL THRU) |
|
|
; |
|
|
; |
|
|
|
|
|
#IFDEF PLTUNA |
|
|
|
|
|
; |
|
|
|
|
|
; MAKE UNA UBIOS CALL |
|
|
|
|
|
; HBIOS FUNC SHOULD STILL BE IN B |
|
|
|
|
|
; UNIT SHOULD STILL BE IN C |
|
|
|
|
|
; |
|
|
|
|
|
DSK_IO2: |
|
|
|
|
|
PUSH BC ; SAVE INCOMING FUNCTION, UNIT |
|
|
|
|
|
LD B,C ; UNIT TO B |
|
|
|
|
|
LD C,$41 ; UNA SET LBA |
|
|
|
|
|
RST 08 ; CALL UNA |
|
|
|
|
|
POP BC ; RECOVER B=FUNC, C=UNIT |
|
|
|
|
|
RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A |
|
|
|
|
|
LD E,C ; UNIT TO E |
|
|
|
|
|
LD C,B ; FUNC TO C |
|
|
|
|
|
LD B,E ; UNIT TO B |
|
|
|
|
|
LD DE,(DSKBUF) ; SET BUFFER ADDRESS |
|
|
|
|
|
LD HL,1 ; 1 SECTOR |
|
|
|
|
|
; DISPATCH TO UBIOS |
|
|
|
|
|
RST 08 ; CALL UNA |
|
|
|
|
|
RET ; DONE |
|
|
|
|
|
; |
|
|
|
|
|
#ELSE |
|
|
|
|
|
; |
|
|
; MAKE HBIOS CALL |
|
|
; MAKE HBIOS CALL |
|
|
; HBIOS FUNC SHOULD STILL BE IN B |
|
|
; HBIOS FUNC SHOULD STILL BE IN B |
|
|
; UNIT SHOULD STILL BE IN C |
|
|
; UNIT SHOULD STILL BE IN C |
|
|
; |
|
|
; |
|
|
DSK_IO2: |
|
|
DSK_IO2: |
|
|
PUSH BC ; SAVE INCOMING FUNCTION, DEVICE/UNIT |
|
|
|
|
|
|
|
|
PUSH BC ; SAVE INCOMING FUNCTION, UNIT |
|
|
LD B,BF_DIOSEEK ; SETUP FOR NEW SEEK CALL |
|
|
LD B,BF_DIOSEEK ; SETUP FOR NEW SEEK CALL |
|
|
RST 08 ; DO IT |
|
|
RST 08 ; DO IT |
|
|
POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT |
|
|
POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT |
|
|
@ -1587,7 +1584,6 @@ DSK_IO2: |
|
|
LD A,(BNKBIOS) ; GET BIOS BANK |
|
|
LD A,(BNKBIOS) ; GET BIOS BANK |
|
|
LD D,A ; TRANSFER TO/FROM BIOS BANK |
|
|
LD D,A ; TRANSFER TO/FROM BIOS BANK |
|
|
LD E,1 ; TRANSFER ONE SECTOR |
|
|
LD E,1 ; TRANSFER ONE SECTOR |
|
|
;CALL PC_ASTERISK ; *DEBUG* |
|
|
|
|
|
RST 08 ; DO IT |
|
|
RST 08 ; DO IT |
|
|
OR A ; SET FLAGS |
|
|
OR A ; SET FLAGS |
|
|
RET ; DONE |
|
|
RET ; DONE |
|
|
@ -1820,7 +1816,7 @@ DPB_ROM: |
|
|
; |
|
|
; |
|
|
; RAM DISK: 64 SECS/TRK, 128 BYTES/SEC |
|
|
; RAM DISK: 64 SECS/TRK, 128 BYTES/SEC |
|
|
; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256 |
|
|
; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256 |
|
|
; RAM DISK SIZE = TOTAL RAM - 128K RESERVED FOR SYSTEM USE |
|
|
|
|
|
|
|
|
; RAM DISK SIZE = TOTAL RAM - 256K RESERVED FOR SYSTEM USE |
|
|
; |
|
|
; |
|
|
; ALS_RAM, EXM, DSM MUST BE FILLED DYNAMICALLY: |
|
|
; ALS_RAM, EXM, DSM MUST BE FILLED DYNAMICALLY: |
|
|
; - ALS_RAM := (BANKS * 2) |
|
|
; - ALS_RAM := (BANKS * 2) |
|
|
@ -1837,7 +1833,7 @@ DPB_RAM: |
|
|
.DB 4 ; BSH: BLOCK SHIFT FACTOR |
|
|
.DB 4 ; BSH: BLOCK SHIFT FACTOR |
|
|
.DB 15 ; BLM: BLOCK MASK |
|
|
.DB 15 ; BLM: BLOCK MASK |
|
|
.DB 1 ; EXM: (BLKS <= 256) ? 1 : 0 |
|
|
.DB 1 ; EXM: (BLKS <= 256) ? 1 : 0 |
|
|
.DW 192 - 1 ; DSM: TOTAL STORAGE IN BLOCKS - 1 |
|
|
|
|
|
|
|
|
.DW 128 - 1 ; DSM: TOTAL STORAGE IN BLOCKS - 1 |
|
|
.DW 255 ; DRM: DIR ENTRIES - 1 = 255 |
|
|
.DW 255 ; DRM: DIR ENTRIES - 1 = 255 |
|
|
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE |
|
|
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE |
|
|
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE |
|
|
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE |
|
|
@ -2343,10 +2339,12 @@ MD_INIT: |
|
|
; |
|
|
; |
|
|
#IFDEF PLTWBW |
|
|
#IFDEF PLTWBW |
|
|
LD A,(HCB + HCB_ROMBANKS) ; ROM BANK COUNT |
|
|
LD A,(HCB + HCB_ROMBANKS) ; ROM BANK COUNT |
|
|
|
|
|
SUB 4 ; REDUCE BANK COUNT BY RESERVED PAGES |
|
|
LD IX,DPB_ROM ; ADDRESS OF DPB |
|
|
LD IX,DPB_ROM ; ADDRESS OF DPB |
|
|
CALL MD_INIT1 ; FIX IT UP |
|
|
CALL MD_INIT1 ; FIX IT UP |
|
|
; |
|
|
; |
|
|
LD A,(HCB + HCB_RAMBANKS) ; RAM BANK COUNT |
|
|
LD A,(HCB + HCB_RAMBANKS) ; RAM BANK COUNT |
|
|
|
|
|
SUB 8 ; REDUCE BANK COUNT BY RESERVED PAGES |
|
|
LD IX,DPB_RAM ; ADDRESS OF DPB |
|
|
LD IX,DPB_RAM ; ADDRESS OF DPB |
|
|
CALL MD_INIT1 ; FIX IT UP |
|
|
CALL MD_INIT1 ; FIX IT UP |
|
|
; |
|
|
; |
|
|
@ -2355,7 +2353,6 @@ MD_INIT: |
|
|
MD_INIT1: |
|
|
MD_INIT1: |
|
|
; |
|
|
; |
|
|
; PUT USABLE BANK COUNT IN HL |
|
|
; PUT USABLE BANK COUNT IN HL |
|
|
SUB 4 ; REDUCE BANK COUNT BY RESERVED PAGES |
|
|
|
|
|
LD L,A ; PUT IN LSB OF HL |
|
|
LD L,A ; PUT IN LSB OF HL |
|
|
LD H,0 ; MSB IS ALWAYS ZERO |
|
|
LD H,0 ; MSB IS ALWAYS ZERO |
|
|
; |
|
|
; |
|
|
|