Compare commits

...

3 Commits

Author SHA1 Message Date
Wayne Warthen
69716abb25 Regen Doc 2023-06-08 12:34:42 -07:00
Wayne Warthen
1f526d440a Add WDATE Command, Final PPA/IMM/SYQ Driver Cleanup
- Added WDATE command courtesy Kevin Boone.  See https://github.com/kevinboone/wdate-cpm for more information.
- Final cleanup of PPA/IMM/SYQ drivers including CPU speed compensated timeouts.
2023-06-08 11:59:07 -07:00
Wayne Warthen
84374c86e6 Cleanup and Optimizations for PPA/IMM/SYQ Drivers 2023-06-06 16:21:56 -07:00
16 changed files with 1032 additions and 627 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -3,7 +3,7 @@
**RomWBW ReadMe** \
Version 3.3 \
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
02 Jun 2023
06 Jun 2023
# Overview

View File

@@ -1,6 +1,6 @@
RomWBW ReadMe
Wayne Warthen (wwarthen@gmail.com)
02 Jun 2023
06 Jun 2023

View File

@@ -51,6 +51,7 @@ found:
| INTTEST | No | Yes | Yes |
| FAT | No | Yes | Yes |
| TUNE | No | Yes | Yes |
| WDATE | No | Yes | Yes |
`\clearpage`{=latex}
@@ -1128,3 +1129,85 @@ can be used to reduce your processor speed.
VGMPLAY is still under development. The source code is provided in the
RomWBW distribution.
`\clearpage`{=latex}
# WDATE
`wdate` is a utility for CP/M systems that have Wayne Warthen's
ROMWBW firmware. It reads or sets the real-time clock, using function
calls in the BIOS. It should work on any RTC device that is supported by
ROMWBW, including the internal interrupt-driven timer that is is available
on some systems.
`wdate` differs from the `rtc.com` utility that is provided with the
ROMWBW version of CP/M in that it only gets and sets the date/time.
`rtc.com` can also manipulate the nonvolatile RAM in certain clock
devices, and modify the charge controller. However, `wdate` is (I would
argue) easier to use, as it takes its input from the command line, which
can be edited, and it's less fussy about the format. It doesn't require
the date to be set if you only want to change the time, for example.
In addition, `wdate` has at least some error checking.
`wdate` displays the day-of-week and month as English text, not
numbers. It calculates the day-of-week from the year, month, and day.
RTC chips usually store a day-of-week value, but it's useless in this
application for two reasons: first, the BIOS does not expose it. Second,
there is no universally-accepted way to interpret it (which day does
the week start on? Is '0' a valid day of the week?)
## Syntax
| `WDATE`
| `WDATE ` *`<hr> <min>`*
| `WDATE ` *`<hr> <min> <sec>`*
| `WDATE ` *`<year> <month> <day> <hr> <min> <sec>`*
## Usage
A> wdate
Saturday 27 May 13:14:39 2023
With no arguments, displays the current date and time.
A> wdate hr min
With two arguments, sets the time in hours and minutes, without changing date
or seconds
A> wdate hr min sec
With three arguments, sets the time in hours, minutes, and seconds, without
changing date
A> wdate year month day hr min sec
With six arguments, sets date and time. All numbers are one or two digits. The
two-digit year starts at 2000.
A> wdate /?
Show a summary of the command-line usage.
## Notes
I've tested this utility with the DS1302 clock board designed by Ed
Brindly, and on the interrupt-driven timer built into my Z180 board.
However, it does not interact with hardware, only BIOS; I would expect
it to work with other hardware.
wdate checks for the non-existence of ROMWBW, and also for failing
operations on the RTC. It will display the terse "No RTC" message in
both cases.
The ROMWBW functions that manipulate the date and time operate on BCD
numbers, as RTC chips themselves usually do. wdate works in decimal, so
that it can check that the user input makes sense. A substantial part of
the program's code is taken up by number format conversion and range
checking.
## Etymology
The `WDATE` application was written and contributed by Kevin Boone.
The source code is available on GitHub at
[https://github.com/kevinboone/wdate-cpm/blob/main/README.md](https://github.com/kevinboone/wdate-cpm/blob/main/README.md).

View File

@@ -7583,6 +7583,52 @@ HB_HASFP .DB 0 ; NON-ZERO MEANS FP EXISTS
;
HB_WRKBUF .FILL 512,0 ; INTERNAL DISK BUFFER
;
;
;
#IFDEF MG014_MAP
;
.FILL 32 - ($ & (32 - 1)) ; ALIGN TO 32 BYTE BOUNDARY
MG014_STATMAPLO:
; LOWER NIBBLE
.DB $08 ; 00
.DB $0C ; 01
.DB $00 ; 02
.DB $04 ; 03
.DB $0A ; 04
.DB $0E ; 05
.DB $02 ; 06
.DB $06 ; 07
.DB $09 ; 08
.DB $0D ; 09
.DB $01 ; 0A
.DB $05 ; 0B
.DB $0B ; 0C
.DB $0F ; 0D
.DB $03 ; 0E
.DB $07 ; 0F
;
MG014_STATMAPHI:
; UPPER NIBBLE
.DB $80 ; 00
.DB $C0 ; 01
.DB $00 ; 02
.DB $40 ; 03
.DB $A0 ; 04
.DB $E0 ; 05
.DB $20 ; 06
.DB $60 ; 07
.DB $90 ; 08
.DB $D0 ; 09
.DB $10 ; 0A
.DB $50 ; 0B
.DB $B0 ; 0C
.DB $F0 ; 0D
.DB $30 ; 0E
.DB $70 ; 0F
;
#ENDIF
;
HB_END .EQU $
;
SLACK .EQU BNKTOP - $

View File

@@ -10,10 +10,13 @@
;
; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS.
; MUCH OF THE CODE IS DERIVED FROM LINUX AND FUZIX (ALAN COX).
; - https://github.com/EtchedPixels/FUZIX
; - https://github.com/torvalds/linux
;
; 5/23/2023 WBW - INITIAL RELEASE
; 5/26/2023 WBW - CLEAN UP, LED ACTIVITY
; 5/27/2023 WBW - ADDED SPP MODE
; 05/23/2023 WBW - INITIAL RELEASE
; 05/26/2023 WBW - CLEAN UP, LED ACTIVITY
; 05/27/2023 WBW - ADDED SPP MODE
; 06/06/2023 WBW - OPTIMIZE BLOCK READ AND WRITE
;
;=============================================================================
;
@@ -71,8 +74,6 @@
;
; TODO:
;
; - OPTIMIZE READ/WRITE LOOPS
;
; NOTES:
;
; - THIS DRIVER IS FOR THE ZIP DRIVE IMM INTERFACE. IT WILL SIMPLY
@@ -80,13 +81,11 @@
; THERE DOES NOT SEEM TO BE A WAY TO VISUALLY DETERMINE IF A ZIP
; DRIVE IS PPA OR IMM. SIGH.
;
; - THERE ARE SOME HARD CODED TIMEOUT LOOPS IN THE CODE. THEY ARE
; WORKING OK ON A 7 MHZ Z80. THEY ARE LIKELY TO NEED TWEAKING ON
; FASTER CPUS.
;
; - THIS DRIVER OPERATES PURELY IN NIBBLE MODE. I SUSPECT IT IS
; POSSIBLE TO USE FULL BYTE MODE (PS2 STYLE), BUT I HAVE NOT
; ATTEMPTED IT.
; - THIS DRIVER OPERATES USES NIBBLE READ MODE. ALTHOUGH THE 8255
; (MG014) CAN READ OR WRITE TO PORT A (DATA), IT "GLITCHES" WHEN
; THE MODE IS CHANGED CAUSING THE CONTROL LINES TO CHANGE AND
; BREAKS THE PROTOCOL. I SUSPECT THE MBC SPP CAN SUPPORT FULL BYTE
; MODE, (PS2 STYLE), BUT I HAVE NOT ATTEMPTED IT.
;
; - RELATIVE TO ABOVE, THIS BEAST IS SLOW. IN ADDITION TO THE
; NIBBLE MODE READS, THE MG014 ASSIGNS SIGNALS DIFFERENTLY THAN
@@ -135,6 +134,12 @@ IMM_LBA .EQU 8 ; OFFSET OF LBA (DWORD)
#DEFINE IMM_WCTL(VAL) LD A,VAL \ CALL IMM_WRITECTRL
#DEFINE IMM_WDATA(VAL) LD A,VAL \ CALL IMM_WRITEDATA
;
; INCLUDE MG014 NIBBLE MAP FOR MG014 MODE
;
#IF (IMMMODE == IMMMODE_MG014)
#DEFINE MG014_MAP
#ENDIF
;
;=============================================================================
; INITIALIZATION ENTRY POINT
;=============================================================================
@@ -190,7 +195,7 @@ IMM_INIT4:
;
CALL IMM_RESET ; RESET/INIT THE INTERFACE
#IF (IMMTRACE <= 1)
CALL IMM_PRTSTAT
CALL NZ,IMM_PRTSTAT
#ENDIF
JR NZ,IMM_INIT6
;
@@ -227,6 +232,8 @@ IMM_DETECT:
#IF (IMMTRACE >= 3)
PRTS("\r\nDETECT:$")
#ENDIF
;
#IF (IMMMODE == IMMMODE_MG014)
; INITIALIZE 8255
LD A,(IY+IMM_IOBASE) ; BASE PORT
ADD A,IMM_IOSETUP ; BUMP TO SETUP PORT
@@ -234,6 +241,7 @@ IMM_DETECT:
LD A,$82 ; CONFIG A OUT, B IN, C OUT
OUT (C),A ; DO IT
CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE
#ENDIF
;
; ATTEMPT TO ESTABLISH A CONNECTION TO THE IMM DEVICE AND
; ISSUE A SCSI BUS RESET. WE DON'T KNOW IF DEVICE IS THERE
@@ -334,6 +342,13 @@ IMM_IO:
JR NZ,IMM_IO3 ; BAIL OUT ON ERROR
;
LD (IMM_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
;
#IF (DSKYENABLE)
LD A,IMM_LBA
CALL LDHLIYA
CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
;
; SETUP LBA
; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN
LD HL,IMM_CMD_RW+1 ; START OF LBA FIELD IN CDB (MSB)
@@ -346,10 +361,9 @@ IMM_IO:
LD A,(IY+IMM_LBA+0)
LD (HL),A
INC HL
;
; DO SCSI IO
LD DE,(IMM_DSKBUF) ; DISK BUFFER TO DE
LD BC,512 ; ONE SECTOR, 512 BYTES
LD A,1 ; BLOCK I/O, ONE SECTOR
LD HL,IMM_CMD_RW ; POINT TO READ/WRITE CMD TEMPLATE
CALL IMM_RUNCMD ; RUN THE SCSI ENGINE
CALL Z,IMM_CHKCMD ; IF EXIT OK, CHECK SCSI RESULTS
@@ -631,8 +645,7 @@ IMM_SELECT:
#ENDIF
IMM_WCTL($0C)
;
LD HL,500 ; TIMEOUT COUNTER
;
LD B,0 ; TIMEOUT COUNTER
IMM_SELECT1:
CALL IMM_READSTATUS
#IF (IMMTRACE >= 3)
@@ -641,11 +654,8 @@ IMM_SELECT1:
#ENDIF
AND $08
JR Z,IMM_SELECT2 ; IF CLEAR, MOVE ON
DEC HL
LD A,H
OR L
JP Z,IMM_CMD_TIMEOUT ; TIMEOUT
JR IMM_SELECT1
DJNZ IMM_SELECT1
JP IMM_CMD_TIMEOUT ; TIMEOUT
;
IMM_SELECT2:
IMM_WCTL($04)
@@ -655,8 +665,7 @@ IMM_SELECT2:
IMM_WCTL($0C)
IMM_WCTL($0D)
;
LD HL,500 ; TIMEOUT COUNTER
;
LD B,0 ; TIMEOUT COUNTER
IMM_SELECT3:
CALL IMM_READSTATUS
#IF (IMMTRACE >= 3)
@@ -665,11 +674,8 @@ IMM_SELECT3:
#ENDIF
AND $08
JR NZ,IMM_SELECT4 ; IF SET, MOVE ON
DEC HL
LD A,H
OR L
JP Z,IMM_CMD_TIMEOUT ; TIMEOUT
JR IMM_SELECT3
DJNZ IMM_SELECT3
JP IMM_CMD_TIMEOUT ; TIMEOUT
;
IMM_SELECT4:
IMM_WCTL($0C)
@@ -754,10 +760,13 @@ IMM_WAIT:
AND $B8
RET ; RETURN W/ RESULT IN A
;
; MAX OBSERVED IMM_WAITLOOP ITERATIONS IS $0116B3
; MAX OBSERVED WAITLOOP ITERATIONS IS $0116B3 @ 7.3728 MHZ ON MG014
; MAX OBSERVED WAITLOOP ITERATIONS IS $028EFE @ 8.000 MHZ ON MBC SPP
;
IMM_LONGWAIT:
LD B,3 ; VALUE???
LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ
SRL A ; DIVIDE BY 2, GOOD ENOUGH
LD B,A ; USE FOR OUTER LOOP COUNT
IMM_WCTL($0C)
IMM_LONGWAIT1:
LD HL,0
@@ -845,21 +854,20 @@ IMM_GETBYTE:
RET
;
; GET A CHUNK OF DATA FROM SCSI BUS. THIS IS SPECIFICALLY FOR
; READ PHASE. IF A LENGTH IS SPECIFIED (NON-ZERO HL), THEN THE
; DATA IS BURST READ. IF NO LENGTH SPECIFIED, DATA IS READ AS
; LONG AS SCSI DEVICE WANTS TO CONTINUE SENDING (NO OVERRUN
; READ PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES)
; OF DATA WILL BE READ. OTHERWISE, DATA IS WRITTEN AS
; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN
; CHECK IN THIS CASE).
;
; THIS IS A NIBBLE READ.
;
; DE=BUFFER
; HL=LENGTH (0 FOR VARIABLE)
; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK)
;
IMM_GETDATA:
; BRANCH TO CORRECT ROUTINE
LD A,H
OR L ; IF ZERO
JR NZ,IMM_GETDATALEN ; DO BURST READ
OR A
JR NZ,IMM_GETBLOCK ; DO BLOCK READ
;
#IF (IMMTRACE >= 3)
PRTS("\r\nGETDATA:$")
@@ -871,7 +879,6 @@ IMM_GETDATA1:
POP HL ; RESTORE BYTE COUNTER
CP $98 ; CHECK FOR READ PHASE
JR NZ,IMM_GETDATA2 ; IF NOT, ASSUME WE ARE DONE
IMM_WCTL($04)
IMM_WCTL($06)
CALL IMM_READSTATUS ; GET FIRST NIBBLE
AND $F0 ; ISOLATE BITS
@@ -889,7 +896,6 @@ IMM_GETDATA1:
INC DE ; NEXT BUFFER POS
INC HL ; INCREMENT BYTES COUNTER
IMM_WCTL($04)
IMM_WCTL($0C)
JR IMM_GETDATA1 ; LOOP TILL DONE
;
IMM_GETDATA2:
@@ -900,57 +906,112 @@ IMM_GETDATA2:
PRTS(" BYTES$")
#ENDIF
;
RET
;
IMM_GETDATALEN:
;
#IF (IMMTRACE >= 3)
PRTS("\r\nGETDLEN:$")
CALL PC_SPACE
CALL PRTHEXWORDHL
PRTS(" BYTES$")
#ENDIF
;
IMM_WCTL($04)
IMM_GETDATALEN1:
IMM_WCTL($06)
CALL IMM_READSTATUS ; GET FIRST NIBBLE
AND $F0 ; ISOLATE BITS
RRCA ; MOVE TO LOW NIBBLE
RRCA
RRCA
RRCA
PUSH AF ; SAVE WORKING VALUE
IMM_WCTL($05)
CALL IMM_READSTATUS ; GET SECOND NIBBLE
AND $F0 ; ISOLATE BITS
POP BC ; RECOVER FIRST NIBBLE
OR B ; COMBINE
LD (DE),A ; SAVE FINAL BYTE VALUE
INC DE ; NEXT BUFFER POS
DEC HL ; DEC LOOP COUNTER
IMM_WCTL($04)
LD A,H ; CHECK LOOP COUNTER
OR L
JR NZ,IMM_GETDATALEN1 ; LOOP IF NOT DONE
IMM_WCTL($0C)
RET
;
IMM_GETBLOCK:
;
#IF (IMMTRACE >= 3)
PRTS("\r\nGETBLK:$")
#ENDIF
;
IMM_WCTL($04)
LD B,0 ; LOOP COUNTER
EXX ; SWITCH TO ALT REGS
EX AF,AF' ; SWITCH TO ALT AF
; SAVE ALT REGS
PUSH AF
PUSH BC
PUSH DE
PUSH HL
; C: PORT C
LD A,(IY+IMM_IOBASE) ; BASE PORT
INC A ; STATUS PORT
LD (IMM_GETBLOCK_A),A ; FILL IN
LD (IMM_GETBLOCK_B),A ; ... DYNAMIC BITS OF CODE
INC A ; CONTROL PORT
LD C,A ; ... TO C
#IF (IMMMODE == IMMMODE_MG014)
; DE: CLOCK VALUES
LD D,$06 ^ ($0B | $80)
LD E,$05 ^ ($0B | $80)
; HL: STATMAP
LD H,MG014_STATMAPLO >> 8
#ENDIF
#IF (IMMMODE == IMMMODE_SPP)
; DE: CLOCK VALUES
LD D,$06
LD E,$05
#ENDIF
EXX ; SWITCH TO PRI REGS
EX AF,AF' ; SWITCH TO PRI AF
CALL IMM_GETBLOCK1 ; LOOP TWICE
CALL IMM_GETBLOCK1 ; ... FOR 512 BYTES
; RESTORE ALT REGS
EXX ; SWITCH TO ALT REGS
EX AF,AF' ; SWITCH TO ALT AF
POP HL
POP DE
POP BC
POP AF
EXX ; SWITCH TO PRI REGS
EX AF,AF' ; SWITCH TO PRI AF
IMM_WCTL($0C)
RET
;
IMM_GETBLOCK1:
EXX ; ALT REGS
OUT (C),D ; SEND FIRST CLOCK
IMM_GETBLOCK_A .EQU $+1
IN A,($FF) ; GET LOW NIBBLE
#IF (IMMMODE == IMMMODE_MG014)
AND $0F ; RELEVANT BITS ONLY
ADD A,MG014_STATMAPLO & $FF ; LOW BYTE OF MAP PTR
LD L,A ; PUT IN L
LD A,(HL) ; LOOKUP LOW NIBBLE VALUE
EX AF,AF' ; ALT AF, SAVE NIBBLE
#ENDIF
#IF (IMMMODE == IMMMODE_SPP)
AND $F0 ; RELEVANT BITS ONLY
RLCA ; MOVE TO LOW NIBBLE
RLCA ; MOVE TO LOW NIBBLE
RLCA ; MOVE TO LOW NIBBLE
RLCA ; MOVE TO LOW NIBBLE
LD L,A ; SAVE NIBBLE IN L
#ENDIF
OUT (C),E ; SEND SECOND CLOCK
IMM_GETBLOCK_B .EQU $+1
IN A,($FF) ; GET HIGH NIBBLE
#IF (IMMMODE == IMMMODE_MG014)
AND $0F ; RELEVANT BITS ONLY
ADD A,MG014_STATMAPHI & $FF ; HIGH BYTE OF MAP PTR
LD L,A ; PUT IN L
EX AF,AF' ; PRI AF, RECOVER LOW NIBBLE VALUE
OR (HL) ; COMBINE WITH HIGH NIB VALUE
#ENDIF
#IF (IMMMODE == IMMMODE_SPP)
AND $F0 ; RELEVANT BITS ONLY
OR L ; COMBINE WITH HIGH NIB VALUE
#ENDIF
EXX ; SWITCH TO PRI REGS
LD (DE),A ; SAVE BYTE
INC DE ; BUMP BUF PTR
DJNZ IMM_GETBLOCK1 ; LOOP
RET ; DONE
;
; PUT A CHUNK OF DATA TO THE SCSI BUS. THIS IS SPECIFICALLY FOR
; WRITE PHASE. IF A LENGTH IS SPECIFIED (NON-ZERO HL), THEN THE
; DATA IS BURST WRITTEN. IF NO LENGTH SPECIFIED, DATA IS WRITTEN AS
; WRITE PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES)
; OF DATA WILL BE WRITTEN. OTHERWISE, DATA IS WRITTEN AS
; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN
; CHECK IN THIS CASE).
;
; READS ARE DONE AS BYTE PAIRS. EACH LOOP READS 2 BYTES.
;
; DE=BUFFER
; HL=LENGTH (0 FOR VARIABLE)
; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK)
;
IMM_PUTDATA:
LD A,H
OR L
JR NZ,IMM_PUTDATALEN
; BRANCH TO CORRECT ROUTINE
OR A
JR NZ,IMM_PUTBLOCK ; DO BLOCK WRITE
;
#IF (IMMTRACE >= 3)
PRTS("\r\nPUTDATA:$")
@@ -962,7 +1023,7 @@ IMM_PUTDATA1:
POP HL ; RESTORE BYTE COUNTER
CP $88 ; CHECK FOR WRITE PHASE
JR NZ,IMM_PUTDATA2 ; IF NOT, ASSUME WE ARE DONE
IMM_WCTL($04)
;IMM_WCTL($04)
LD A,(DE) ; GET NEXT BYTE TO WRITE (FIRST OF PAIR)
CALL IMM_WRITEDATA ; PUT ON BUS
INC DE ; BUMP TO NEXT BUF POS
@@ -986,33 +1047,47 @@ IMM_PUTDATA2:
;
RET
;
IMM_PUTDATALEN:
IMM_PUTBLOCK:
;
#IF (IMMTRACE >= 3)
PRTS("\r\nPUTDLEN:$")
CALL PC_SPACE
CALL PRTHEXWORDHL
PRTS(" BYTES$")
PRTS("\r\nPUTBLK:$")
#ENDIF
;
IMM_WCTL($04)
IMM_PUTDATALEN1:
LD A,(DE) ; GET NEXT BYTE (FIRST OF PAIR)
CALL IMM_WRITEDATA ; PUT ON BUS
INC DE ; INCREMENT BUF POS
DEC HL ; DEC LOOP COUNTER
IMM_WCTL($05)
LD A,(DE) ; GET NEXT BYTE (SECOND OF PAIR)
CALL IMM_WRITEDATA ; PUT ON BUS
INC DE ; INCREMENT BUF POS
DEC HL ; DEC LOOP COUNTER
IMM_WCTL($00)
LD A,H ; CHECK LOOP COUNTER
OR L
JR NZ,IMM_PUTDATALEN1 ; LOOP TILL DONE
LD B,0 ; LOOP COUNTER
LD A,(IY+IMM_IOBASE) ; GET BASE IO ADR
LD (IMM_PUTBLOCK_A),A ; FILL IN
LD (IMM_PUTBLOCK_B),A ; ... DYNAMIC BITS OF CODE
INC A ; STATUS PORT
INC A ; CONTROL PORT
LD C,A ; ... TO C
; HL: CLOCK VALUES
#IF (IMMMODE == IMMMODE_MG014)
LD H,$05 ^ ($0B | $80)
LD L,$00 ^ ($0B | $80)
#ENDIF
#IF (IMMMODE == IMMMODE_SPP)
LD H,$05
LD L,$00
#ENDIF
CALL IMM_PUTBLOCK1 ; ONE LOOP CUZ BYTE PAIRS
IMM_WCTL($04)
RET
;
IMM_PUTBLOCK1:
LD A,(DE) ; GET NEXT BYTE
IMM_PUTBLOCK_A .EQU $+1
OUT ($FF),A ; PUT ON BUS
INC DE ; INCREMENT BUF POS
OUT (C),H ; FIRST CLOCK
LD A,(DE) ; GET NEXT BYTE
IMM_PUTBLOCK_B .EQU $+1
OUT ($FF),A ; PUT ON BUS
INC DE ; INCREMENT BUF POS
OUT (C),L ; SECOND CLOCK
DJNZ IMM_PUTBLOCK1 ; LOOP
RET ; DONE
;
; READ SCSI COMMAND STATUS
;
IMM_GETSTATUS:
@@ -1056,7 +1131,7 @@ IMM_ENDREAD:
;
; HL: COMMAND BUFFER
; DE: TRANSFER BUFFER
; BC: TRANSFER LENGTH (0=VARIABLE)
; A: TRANSFER MODE (0=VARIABLE, 1=BLOCK)
;
IMM_RUNCMD:
; THERE ARE MANY PLACES NESTED WITHIN THE ROUTINES THAT
@@ -1065,7 +1140,7 @@ IMM_RUNCMD:
; SEE IMM_CMD_ERR BELOW.
LD (IMM_CMDSTK),SP ; FOR ERROR ABORTS
LD (IMM_DSKBUF),DE ; SAVE BUF PTR
LD (IMM_XFRLEN),BC ; SAVE XFER LEN
LD (IMM_XFRMODE),A ; SAVE XFER LEN
PUSH HL
CALL IMM_CONNECT ; PARALLEL PORT BUS CONNECT
CALL IMM_SELECT ; SELECT TARGET DEVICE
@@ -1096,7 +1171,7 @@ IMM_RUNCMD_PHASE:
;
IMM_RUNCMD_WRITE:
LD DE,(IMM_DSKBUF) ; XFER BUFFER
LD HL,(IMM_XFRLEN) ; XFER LENGTH
LD A,(IMM_XFRMODE) ; XFER MODE
CALL IMM_PUTDATA ; SEND DATA NOW
JR IMM_RUNCMD_PHASE ; BACK TO DISPATCH
;
@@ -1105,7 +1180,7 @@ IMM_RUNCMD_READ:
CALL IMM_WAIT ; WAIT TILL READY
; CHECK FOR STATUS $98???
LD DE,(IMM_DSKBUF) ; XFER BUFFER
LD HL,(IMM_XFRLEN) ; XFER LENGTH
LD A,(IMM_XFRMODE) ; XFER MODE
CALL IMM_GETDATA ; GET THE DATA NOW
CALL IMM_ENDREAD ; TERMINATE THE READ
JR IMM_RUNCMD_PHASE ; BACK TO DISPATCH
@@ -1162,7 +1237,7 @@ IMM_CHKCMD:
IMM_CHKCMD1:
; USE REQUEST SENSE CMD TO GET ERROR DETAILS
LD DE,HB_WRKBUF ; PUT DATA IN WORK BUF
LD BC,0 ; VARIABLE LENGTH REQUEST
LD A,0 ; VARIABLE LENGTH REQUEST
LD HL,IMM_CMD_SENSE ; REQUEST SENSE CMD
CALL IMM_RUNCMD ; DO IT
JP NZ,IMM_IOERR ; BAIL IF ERROR IN CMD
@@ -1199,6 +1274,8 @@ IMM_CHKERR:
; (RE)INITIALIZE DEVICE
;
IMM_INITDEV:
;
#IF (IMMMODE == IMMMODE_MG014)
; INITIALIZE 8255
LD A,(IY+IMM_IOBASE) ; BASE PORT
ADD A,IMM_IOSETUP ; BUMP TO SETUP PORT
@@ -1206,6 +1283,7 @@ IMM_INITDEV:
LD A,$82 ; CONFIG A OUT, B IN, C OUT
OUT (C),A ; DO IT
CALL DELAY ; SHORT DELAY FOR BUS SETTLE
#ENDIF
;
CALL IMM_DISCONNECT ; DISCONNECT FIRST JUST IN CASE
CALL IMM_CONNECT ; NOW CONNECT TO BUS
@@ -1227,7 +1305,7 @@ IMM_INITDEV1:
;
; REQUEST SENSE COMMAND
LD DE,HB_WRKBUF ; BUFFER FOR SENSE DATA
LD BC,0 ; READ WHATEVER IS SENT
LD A,0 ; READ WHATEVER IS SENT
LD HL,IMM_CMD_SENSE ; POINT TO CMD BUFFER
CALL IMM_RUNCMD ; RUN THE SCSI ENGINE
JR NZ,IMM_INITDEV2 ; CMD PROC ERROR
@@ -1257,7 +1335,7 @@ IMM_INITDEV2:
IMM_INITDEV3:
; READ & RECORD DEVICE CAPACITY
LD DE,HB_WRKBUF ; BUFFER TO CAPACITY RESPONSE
LD BC,0 ; READ WHATEVER IS SENT
LD A,0 ; READ WHATEVER IS SENT
LD HL,IMM_CMD_RDCAP ; POINT TO READ CAPACITY CMD
CALL IMM_RUNCMD ; RUN THE SCSI ENGINE
CALL Z,IMM_CHKCMD ; CHECK AND RECORD ANY ERRORS
@@ -1420,7 +1498,7 @@ IMM_STR_NOHW .TEXT "NOT PRESENT$"
IMM_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT
IMM_CMDSTK .DW 0 ; STACK PTR FOR CMD ABORTING
IMM_DSKBUF .DW 0 ; WORKING DISK BUFFER POINTER
IMM_XFRLEN .DW 0 ; WORKING TRANSFER LENGTH
IMM_XFRMODE .DB 0 ; 0=VARIABLE, 1=BLOCK (512 BYTES)
IMM_CMDSTAT .DB 0, 0 ; CMD RESULT STATUS
;
; SCSI COMMAND TEMPLATES (LENGTH PREFIXED)

View File

@@ -10,10 +10,13 @@
;
; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS.
; MUCH OF THE CODE IS DERIVED FROM LINUX AND FUZIX (ALAN COX).
; - https://github.com/EtchedPixels/FUZIX
; - https://github.com/torvalds/linux
;
; 5/23/2023 WBW - INITIAL RELEASE
; 5/26/3023 WBW - CLEAN UP, LED ACTIVITY
; 5/27/2023 WBW - ADDED SPP MODE
; 05/23/2023 WBW - INITIAL RELEASE
; 05/26/3023 WBW - CLEAN UP, LED ACTIVITY
; 05/27/2023 WBW - ADDED SPP MODE
; 06/06/2023 WBW - OPTIMIZE BLOCK READ AND WRITE
;
;=============================================================================
;
@@ -71,8 +74,6 @@
;
; TODO:
;
; - OPTIMIZE READ/WRITE LOOPS
;
; NOTES:
;
; - THIS DRIVER IS FOR THE ZIP DRIVE PPA INTERFACE. IT WILL SIMPLY
@@ -80,13 +81,11 @@
; THERE DOES NOT SEEM TO BE A WAY TO VISUALLY DETERMINE IF A ZIP
; DRIVE IS PPA OR IMM. SIGH.
;
; - THERE ARE SOME HARD CODED TIMEOUT LOOPS IN THE CODE. THEY ARE
; WORKING OK ON A 7 MHZ Z80. THEY ARE LIKELY TO NEED TWEAKING ON
; FASTER CPUS.
;
; - THIS DRIVER OPERATES PURELY IN NIBBLE MODE. I SUSPECT IT IS
; POSSIBLE TO USE FULL BYTE MODE (PS2 STYLE), BUT I HAVE NOT
; ATTEMPTED IT.
; - THIS DRIVER OPERATES USES NIBBLE READ MODE. ALTHOUGH THE 8255
; (MG014) CAN READ OR WRITE TO PORT A (DATA), IT "GLITCHES" WHEN
; THE MODE IS CHANGED CAUSING THE CONTROL LINES TO CHANGE AND
; BREAKS THE PROTOCOL. I SUSPECT THE MBC SPP CAN SUPPORT FULL BYTE
; MODE, (PS2 STYLE), BUT I HAVE NOT ATTEMPTED IT.
;
; - RELATIVE TO ABOVE, THIS BEAST IS SLOW. IN ADDITION TO THE
; NIBBLE MODE READS, THE MG014 ASSIGNS SIGNALS DIFFERENTLY THAN
@@ -138,6 +137,12 @@ PPA_LBA .EQU 8 ; OFFSET OF LBA (DWORD)
#DEFINE PPA_DPUL(VAL) LD A,VAL \ CALL PPA_DPULSE
#DEFINE PPA_CPUL(VAL) LD A,VAL \ CALL PPA_CPULSE
;
; INCLUDE MG014 NIBBLE MAP FOR MG014 MODE
;
#IF (IMMMODE == IMMMODE_MG014)
#DEFINE MG014_MAP
#ENDIF
;
;=============================================================================
; INITIALIZATION ENTRY POINT
;=============================================================================
@@ -194,7 +199,7 @@ PPA_INIT4:
;
CALL PPA_RESET ; RESET/INIT THE INTERFACE
#IF (PPATRACE <= 1)
CALL PPA_PRTSTAT
CALL NZ,PPA_PRTSTAT
#ENDIF
JR NZ,PPA_INIT6
;
@@ -231,6 +236,8 @@ PPA_DETECT:
#IF (PPATRACE >= 3)
PRTS("\r\nDETECT:$")
#ENDIF
;
#IF (PPAMODE == PPAMODE_MG014)
; INITIALIZE 8255
LD A,(IY+PPA_IOBASE) ; BASE PORT
ADD A,PPA_IOSETUP ; BUMP TO SETUP PORT
@@ -238,6 +245,7 @@ PPA_DETECT:
LD A,$82 ; CONFIG A OUT, B IN, C OUT
OUT (C),A ; DO IT
CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE
#ENDIF
;
PPA_WDATA($AA)
CALL PPA_DISCONNECT
@@ -330,6 +338,13 @@ PPA_IO:
JR NZ,PPA_IO3 ; BAIL OUT ON ERROR
;
LD (PPA_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
;
#IF (DSKYENABLE)
LD A,PPA_LBA
CALL LDHLIYA
CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
;
; SETUP LBA
; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN
LD HL,PPA_CMD_RW+1 ; START OF LBA FIELD IN CDB (MSB)
@@ -345,7 +360,7 @@ PPA_IO:
;
; DO SCSI IO
LD DE,(PPA_DSKBUF) ; DISK BUFFER TO DE
LD BC,512 ; ONE SECTOR, 512 BYTES
LD A,1 ; BLOCK I/O, ONE SECTOR
LD HL,PPA_CMD_RW ; POINT TO READ/WRITE CMD TEMPLATE
CALL PPA_RUNCMD ; RUN THE SCSI ENGINE
CALL Z,PPA_CHKCMD ; IF EXIT OK, CHECK SCSI RESULTS
@@ -599,21 +614,17 @@ PPA_SELECT:
CALL PPA_WRITEDATA
PPA_WCTL($08)
;
LD HL,500 ; TIMEOUT COUNTER
;
LD B,0 ; TIMEOUT COUNTER
PPA_SELECT1:
#IF (PPATRACE >= 3)
CALL PPA_READSTATUS
#IF (PPATRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
AND $40
CP $40
RET Z
DEC HL
LD A,H
OR L
JR NZ,PPA_SELECT1
DJNZ PPA_SELECT1
JP PPA_CMD_TIMEOUT
;
; SEND SCSI CMD BYTE STRING. AT ENTRY, HL POINTS TO START OF
@@ -659,8 +670,6 @@ PPA_SENDCMD1:
RET
;
;
;
;
; WAIT FOR SCSI BUS TO BECOME READY WITH A TIMEOUT.
;
PPA_WAITLOOP:
@@ -677,31 +686,26 @@ PPA_WAIT:
LD HL,500 ; GOOD VALUE???
PPA_WCTL($0C)
CALL PPA_WAITLOOP
;CALL PC_SPACE
;CALL PRTHEXBYTE
JP Z,PPA_CMD_TIMEOUT ; HANDLE TIMEOUT
;PUSH AF
;PPA_WCTL($04)
;IMM_WCTL($04)
;POP AF
AND $F0
RET ; RETURN W/ RESULT IN A
;
; MAX OBSERVED PPA_WAITLOOP ITERATIONS IS $0116B3
; MAX OBSERVED WAITLOOP ITERATIONS IS $0116B3 @ 7.372 MHZ ON MG014
; MAX OBSERVED WAITLOOP ITERATIONS IS $028EFE @ 8.000 MHZ ON MBC SPP
;
PPA_LONGWAIT:
LD B,3 ; VALUE???
LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ
SRL A ; DIVIDE BY 2, GOOD ENOUGH
LD B,A ; USE FOR OUTER LOOP COUNT
PPA_WCTL($0C)
PPA_LONGWAIT1:
LD HL,0
CALL PPA_WAITLOOP
JR NZ,PPA_LONGWAIT2 ; HANDLE SUCCESS
DJNZ PPA_LONGWAIT1 ; LOOP TILL COUNTER EXHAUSTED
;CALL PC_SPACE
;CALL PRTHEXBYTE
JP PPA_CMD_TIMEOUT ; HANDLE TIMEOUT
;
PPA_LONGWAIT2:
@@ -719,10 +723,6 @@ PPA_LONGWAIT2:
#ENDIF
;
;POP AF
;CALL PC_SPACE
;CALL PRTHEXBYTE
AND $F0
RET ; RETURN W/ RESULT IN A
;
@@ -750,21 +750,20 @@ PPA_GETBYTE:
RET
;
; GET A CHUNK OF DATA FROM SCSI BUS. THIS IS SPECIFICALLY FOR
; READ PHASE. IF A LENGTH IS SPECIFIED (NON-ZERO HL), THEN THE
; DATA IS BURST READ. IF NO LENGTH SPECIFIED, DATA IS READ AS
; LONG AS SCSI DEVICE WANTS TO CONTINUE SENDING (NO OVERRUN
; READ PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES)
; OF DATA WILL BE READ. OTHERWISE, DATA IS WRITTEN AS
; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN
; CHECK IN THIS CASE).
;
; THIS IS A NIBBLE READ.
;
; DE=BUFFER
; HL=LENGTH (0 FOR VARIABLE)
; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK)
;
PPA_GETDATA:
; BRANCH TO CORRECT ROUTINE
LD A,H
OR L ; IF ZERO
JR NZ,PPA_GETDATALEN ; DO BURST READ
OR A
JR NZ,PPA_GETBLOCK ; DO BLOCK READ
;
#IF (PPATRACE >= 3)
PRTS("\r\nGETDATA:$")
@@ -805,53 +804,106 @@ PPA_GETDATA2:
PPA_WCTL($0C)
RET
;
PPA_GETDATALEN:
PPA_GETBLOCK:
;
#IF (PPATRACE >= 3)
PRTS("\r\nGETDLEN:$")
CALL PC_SPACE
CALL PRTHEXWORDHL
PRTS(" BYTES$")
PRTS("\r\nGETBLK:$")
#ENDIF
;
PPA_GETDATALEN1:
PPA_WCTL($04)
CALL PPA_READSTATUS ; GET FIRST NIBBLE
AND $F0 ; ISOLATE BITS
PUSH AF ; SAVE WORKING VALUE
PPA_WCTL($06)
CALL PPA_READSTATUS ; GET SECOND NIBBLE
AND $F0 ; ISOLATE BITS
RRCA ; MOVE TO LOW NIBBLE
RRCA
RRCA
RRCA
POP BC ; RECOVER FIRST NIBBLE
OR B ; COMBINE
LD (DE),A ; SAVE FINAL BYTE VALUE
INC DE ; NEXT BUFFER POS
DEC HL ; DEC LOOP COUNTER
LD A,H ; CHECK LOOP COUNTER
OR L
JR NZ,PPA_GETDATALEN1 ; LOOP IF NOT DONE
PPA_WCTL($0C)
LD B,0 ; LOOP COUNTER
EXX ; SWITCH TO ALT
EX AF,AF' ; SWITCH TO ALT AF
; SAVE ALT REGS
PUSH AF
PUSH BC
PUSH DE
PUSH HL
; C: PORT C
LD A,(IY+PPA_IOBASE) ; BASE PORT
INC A ; STATUS PORT
LD (PPA_GETBLOCK_A),A ; FILL IN
LD (PPA_GETBLOCK_B),A ; ... DYNAMIC BITS OF CODE
INC A ; CONTROL PORT
LD C,A ; ... TO C
#IF (PPAMODE == PPAMODE_MG014)
; DE: CLOCK VALUES
LD D,$04 ^ ($0B | $80)
LD E,$06 ^ ($0B | $80)
; HL: STATMAP
LD H,MG014_STATMAPLO >> 8
#ENDIF
#IF (PPAMODE == PPAMODE_SPP)
; DE: CLOCK VALUES
LD D,$04
LD E,$06
#ENDIF
EXX ; SWITCH TO PRI
CALL PPA_GETBLOCK1 ; LOOP TWICE
CALL PPA_GETBLOCK1 ; ... FOR 512 BYTES
; RESTORE ALT REGS
EXX ; SWITCH TO ALT REGS
EX AF,AF' ; SWITCH TO ALT AF
POP HL
POP DE
POP BC
POP AF
EXX ; SWITCH TO PRI REGS
EX AF,AF' ; SWITCH TO PRI AF
RET
;
;
PPA_GETBLOCK1:
EXX ; ALT REGS
OUT (C),D ; SEND FIRST CLOCK
PPA_GETBLOCK_A .EQU $+1
IN A,($FF) ; GET HIGH NIBBLE
#IF (PPAMODE == PPAMODE_MG014)
AND $0F ; RELEVANT BITS ONLY
ADD A,MG014_STATMAPHI & $FF ; HIGH BYTE OF MAP PTR
LD L,A ; PUT IN L
LD A,(HL) ; LOOKUP HIGH NIBBLE VALUE
EX AF,AF' ; SAVE NIBBLE
#ENDIF
#IF (PPAMODE == PPAMODE_SPP)
AND $F0 ; RELEVANT BITS ONLY
LD L,A ; SAVE NIBBLE IN L
#ENDIF
OUT (C),E ; SEND SECOND CLOCK
PPA_GETBLOCK_B .EQU $+1
IN A,($FF) ; GET LOW NIBBLE
#IF (PPAMODE == PPAMODE_MG014)
AND $0F ; RELEVANT BITS ONLY
ADD A,MG014_STATMAPLO & $FF ; LOW BYTE OF MAP PTR
LD L,A ; PUT IN L
EX AF,AF' ; RECOVER HIGH NIBBLE VALUE
OR (HL) ; COMBINE WITH LOW NIB VALUE
#ENDIF
#IF (PPAMODE == PPAMODE_SPP)
AND $F0 ; RELEVANT BITS ONLY
RLCA ; MOVE TO LOW NIBBLE
RLCA ; MOVE TO LOW NIBBLE
RLCA ; MOVE TO LOW NIBBLE
RLCA ; MOVE TO LOW NIBBLE
OR L ; COMBINE WITH HIGH NIB VALUE
#ENDIF
EXX ; SWITCH TO PRI
LD (DE),A ; SAVE BYTE
INC DE ; BUMP BUF PTR
DJNZ PPA_GETBLOCK1 ; LOOP
RET ; DONE
;
; PUT A CHUNK OF DATA TO THE SCSI BUS. THIS IS SPECIFICALLY FOR
; WRITE PHASE. IF A LENGTH IS SPECIFIED (NON-ZERO HL), THEN THE
; DATA IS BURST WRITTEN. IF NO LENGTH SPECIFIED, DATA IS WRITTEN AS
; WRITE PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES)
; OF DATA WILL BE WRITTEN. OTHERWISE, DATA IS WRITTEN AS
; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN
; CHECK IN THIS CASE).
;
; READS ARE DONE AS BYTE PAIRS. EACH LOOP READS 2 BYTES.
;
; DE=BUFFER
; HL=LENGTH (0 FOR VARIABLE)
; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK)
;
PPA_PUTDATA:
LD A,H
OR L
JR NZ,PPA_PUTDATALEN
; BRANCH TO CORRECT ROUTINE
OR A
JR NZ,PPA_PUTBLOCK ; DO BLOCK WRITE
;
#IF (PPATRACE >= 3)
PRTS("\r\nPUTDATA:$")
@@ -882,27 +934,41 @@ PPA_PUTDATA2:
;
RET
;
PPA_PUTDATALEN:
PPA_PUTBLOCK:
;
#IF (PPATRACE >= 3)
PRTS("\r\nPUTDLEN:$")
CALL PC_SPACE
CALL PRTHEXWORDHL
PRTS(" BYTES$")
PRTS("\r\nPUTBLK:$")
#ENDIF
;
PPA_PUTDATALEN1:
LD A,(DE) ; GET NEXT BYTE (FIRST OF PAIR)
CALL PPA_WRITEDATA ; PUT ON BUS
INC DE ; INCREMENT BUF POS
DEC HL ; DEC LOOP COUNTER
PPA_WCTL($0E)
PPA_WCTL($0C)
LD A,H ; CHECK LOOP COUNTER
OR L
JR NZ,PPA_PUTDATALEN1 ; LOOP TILL DONE
LD B,0 ; LOOP COUNTER
LD A,(IY+PPA_IOBASE) ; GET BASE IO ADR
LD (PPA_PUTBLOCK_A),A ; FILL IN
INC A ; STATUS PORT
INC A ; CONTROL PORT
LD C,A ; ... TO C
; HL: CLOCK VALUES
#IF (PPAMODE == PPAMODE_MG014)
LD H,$0E ^ ($0B | $80)
LD L,$0C ^ ($0B | $80)
#ENDIF
#IF (PPAMODE == PPAMODE_SPP)
LD H,$0E
LD L,$0C
#ENDIF
CALL PPA_PUTBLOCK1 ; DO BELOW TWICE
CALL PPA_PUTBLOCK1 ; ... FOR 512 BYTES
RET
;
PPA_PUTBLOCK1:
LD A,(DE) ; GET NEXT BYTE
PPA_PUTBLOCK_A .EQU $+1
OUT ($FF),A ; PUT ON BUS
INC DE ; INCREMENT BUF POS
OUT (C),H ; FIRST CLOCK
OUT (C),L ; SECOND CLOCK
DJNZ PPA_PUTBLOCK1 ; LOOP
RET ; DONE
;
; READ SCSI COMMAND STATUS
;
PPA_GETSTATUS:
@@ -937,7 +1003,7 @@ PPA_GETSTATUS:
;
; HL: COMMAND BUFFER
; DE: TRANSFER BUFFER
; BC: TRANSFER LENGTH (0=VARIABLE)
; A: TRANSFER MODE (0=VARIABLE, 1=BLOCK)
;
PPA_RUNCMD:
; THERE ARE MANY PLACES NESTED WITHIN THE ROUTINES THAT
@@ -946,7 +1012,7 @@ PPA_RUNCMD:
; SEE PPA_CMD_ERR BELOW.
LD (PPA_CMDSTK),SP ; FOR ERROR ABORTS
LD (PPA_DSKBUF),DE ; SAVE BUF PTR
LD (PPA_XFRLEN),BC ; SAVE XFER LEN
LD (PPA_XFRMODE),A ; SAVE XFER LEN
PUSH HL
CALL PPA_CONNECT ; PARALLEL PORT BUS CONNECT
CALL PPA_SELECT ; SELECT TARGET DEVICE
@@ -977,24 +1043,18 @@ PPA_RUNCMD_PHASE:
;
PPA_RUNCMD_WRITE:
LD DE,(PPA_DSKBUF) ; XFER BUFFER
LD HL,(PPA_XFRLEN) ; XFER LENGTH
LD A,(PPA_XFRMODE) ; XFER MODE
CALL PPA_PUTDATA ; SEND DATA NOW
JR PPA_RUNCMD_PHASE ; BACK TO DISPATCH
;
PPA_RUNCMD_READ:
;CALL PPA_NEGOTIATE ; NEGOTIATE FOR READ
;CALL PPA_WAIT ; WAIT TILL READY
LD DE,(PPA_DSKBUF) ; XFER BUFFER
LD HL,(PPA_XFRLEN) ; XFER LENGTH
LD A,(PPA_XFRMODE) ; XFER MODE
CALL PPA_GETDATA ; GET THE DATA NOW
;CALL PPA_ENDREAD ; TERMINATE THE READ
JR PPA_RUNCMD_PHASE ; BACK TO DISPATCH
;
PPA_RUNCMD_END:
;CALL PPA_NEGOTIATE ; NEGOTIATE FOR READ (STATUS)
;CALL PPA_WAIT ; WAIT TILL READY
CALL PPA_GETSTATUS ; READ STATUS BYTES
;CALL PPA_ENDREAD ; TERMINATE THE READ
CALL PPA_DISCONNECT ; PARALLEL PORT BUS DISCONNECT
XOR A ; SIGNAL SUCCESS
RET
@@ -1041,7 +1101,7 @@ PPA_CHKCMD:
PPA_CHKCMD1:
; USE REQUEST SENSE CMD TO GET ERROR DETAILS
LD DE,HB_WRKBUF ; PUT DATA IN WORK BUF
LD BC,0 ; VARIABLE LENGTH REQUEST
LD A,0 ; VARIABLE LENGTH READ
LD HL,PPA_CMD_SENSE ; REQUEST SENSE CMD
CALL PPA_RUNCMD ; DO IT
JP NZ,PPA_IOERR ; BAIL IF ERROR IN CMD
@@ -1078,6 +1138,8 @@ PPA_CHKERR:
; (RE)INITIALIZE DEVICE
;
PPA_INITDEV:
;
#IF (PPAMODE == PPAMODE_MG014)
; INITIALIZE 8255
LD A,(IY+PPA_IOBASE) ; BASE PORT
ADD A,PPA_IOSETUP ; BUMP TO SETUP PORT
@@ -1085,6 +1147,7 @@ PPA_INITDEV:
LD A,$82 ; CONFIG A OUT, B IN, C OUT
OUT (C),A ; DO IT
CALL DELAY ; SHORT DELAY FOR BUS SETTLE
#ENDIF
;
; BUS RESET
CALL PPA_CONNECT
@@ -1106,7 +1169,7 @@ PPA_INITDEV1:
;
; REQUEST SENSE COMMAND
LD DE,HB_WRKBUF ; BUFFER FOR SENSE DATA
LD BC,0 ; READ WHATEVER IS SENT
LD A,0 ; READ WHATEVER IS SENT
LD HL,PPA_CMD_SENSE ; POINT TO CMD BUFFER
CALL PPA_RUNCMD ; RUN THE SCSI ENGINE
JR NZ,PPA_INITDEV2 ; CMD PROC ERROR
@@ -1131,7 +1194,7 @@ PPA_INITDEV2:
PPA_INITDEV3:
; READ & RECORD DEVICE CAPACITY
LD DE,HB_WRKBUF ; BUFFER TO CAPACITY RESPONSE
LD BC,0 ; READ WHATEVER IS SENT
LD A,0 ; READ WHATEVER IS SENT
LD HL,PPA_CMD_RDCAP ; POINT TO READ CAPACITY CMD
CALL PPA_RUNCMD ; RUN THE SCSI ENGINE
CALL Z,PPA_CHKCMD ; CHECK AND RECORD ANY ERRORS
@@ -1295,7 +1358,7 @@ PPA_STR_NOHW .TEXT "NOT PRESENT$"
PPA_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT
PPA_CMDSTK .DW 0 ; STACK PTR FOR CMD ABORTING
PPA_DSKBUF .DW 0 ; WORKING DISK BUFFER POINTER
PPA_XFRLEN .DW 0 ; WORKING TRANSFER LENGTH
PPA_XFRMODE .DB 0 ; 0=VARIABLE, 1=BLOCK (512 BYTES)
PPA_CMDSTAT .DB 0, 0 ; CMD RESULT STATUS
;
; SCSI COMMAND TEMPLATES (LENGTH PREFIXED)

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -2,7 +2,7 @@
#DEFINE RMN 3
#DEFINE RUP 0
#DEFINE RTP 0
#DEFINE BIOSVER "3.3.0-dev.20"
#DEFINE BIOSVER "3.3.0-dev.22"
#define rmj RMJ
#define rmn RMN
#define rup RUP

View File

@@ -3,5 +3,5 @@ rmn equ 3
rup equ 0
rtp equ 0
biosver macro
db "3.3.0-dev.20"
db "3.3.0-dev.22"
endm