|
|
@ -119,31 +119,40 @@ SD_NOPULLUP .EQU TRUE ; ASSUME NO PULLUP |
|
|
SD_DEVCNT .EQU 1 ; NUMBER OF PHYSICAL UNITS (SOCKETS) |
|
|
SD_DEVCNT .EQU 1 ; NUMBER OF PHYSICAL UNITS (SOCKETS) |
|
|
SD_OPRREG .EQU RTCIO ; USES RTC LATCHES FOR OPERATION |
|
|
SD_OPRREG .EQU RTCIO ; USES RTC LATCHES FOR OPERATION |
|
|
SD_OPRDEF .EQU %00000001 ; QUIESCENT STATE |
|
|
SD_OPRDEF .EQU %00000001 ; QUIESCENT STATE |
|
|
|
|
|
SD_OPRMSK .EQU %10000111 ; MASK FOR BITS WE OWN IN RTC LATCH PORT |
|
|
SD_INPREG .EQU RTCIO ; INPUT REGISTER IS RTC |
|
|
SD_INPREG .EQU RTCIO ; INPUT REGISTER IS RTC |
|
|
SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT |
|
|
SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT |
|
|
SD_CLK .EQU %00000010 ; RTC:1 IS CLOCK |
|
|
SD_CLK .EQU %00000010 ; RTC:1 IS CLOCK |
|
|
SD_DI .EQU %00000001 ; RTC:0 IS DATA IN (CARD <- CPU) |
|
|
SD_DI .EQU %00000001 ; RTC:0 IS DATA IN (CARD <- CPU) |
|
|
SD_DO .EQU %10000000 ; RTC:7 IS DATA OUT (CARD -> CPU) |
|
|
SD_DO .EQU %10000000 ; RTC:7 IS DATA OUT (CARD -> CPU) |
|
|
|
|
|
; |
|
|
|
|
|
RTCDEF .SET SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF (SDMODE == SDMODE_N8) ; UNMODIFIED N8-2511 |
|
|
#IF (SDMODE == SDMODE_N8) ; UNMODIFIED N8-2511 |
|
|
SD_DEVCNT .EQU 1 ; NUMBER OF PHYSICAL UNITS (SOCKETS) |
|
|
SD_DEVCNT .EQU 1 ; NUMBER OF PHYSICAL UNITS (SOCKETS) |
|
|
SD_OPRREG .EQU RTCIO ; USES RTC LATCHES FOR OPERATION |
|
|
SD_OPRREG .EQU RTCIO ; USES RTC LATCHES FOR OPERATION |
|
|
SD_OPRDEF .EQU %00000001 ; QUIESCENT STATE |
|
|
SD_OPRDEF .EQU %00000001 ; QUIESCENT STATE |
|
|
|
|
|
SD_OPRMSK .EQU %01000111 ; MASK FOR BITS WE OWN IN RTC LATCH PORT |
|
|
SD_INPREG .EQU RTCIO ; INPUT REGISTER IS RTC |
|
|
SD_INPREG .EQU RTCIO ; INPUT REGISTER IS RTC |
|
|
SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT |
|
|
SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT |
|
|
SD_CLK .EQU %00000010 ; RTC:1 IS CLOCK |
|
|
SD_CLK .EQU %00000010 ; RTC:1 IS CLOCK |
|
|
SD_DI .EQU %00000001 ; RTC:0 IS DATA IN (CARD <- CPU) |
|
|
SD_DI .EQU %00000001 ; RTC:0 IS DATA IN (CARD <- CPU) |
|
|
SD_DO .EQU %01000000 ; RTC:6 IS DATA OUT (CARD -> CPU) |
|
|
SD_DO .EQU %01000000 ; RTC:6 IS DATA OUT (CARD -> CPU) |
|
|
|
|
|
; |
|
|
|
|
|
RTCDEF .SET SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF (SDMODE == SDMODE_CSIO) ; N8-2312 |
|
|
#IF (SDMODE == SDMODE_CSIO) ; N8-2312 |
|
|
SD_DEVCNT .EQU 1 ; NUMBER OF PHYSICAL UNITS (SOCKETS) |
|
|
SD_DEVCNT .EQU 1 ; NUMBER OF PHYSICAL UNITS (SOCKETS) |
|
|
SD_OPRREG .EQU RTCIO ; USES RTC LATCHES FOR OPERATION |
|
|
SD_OPRREG .EQU RTCIO ; USES RTC LATCHES FOR OPERATION |
|
|
SD_OPRDEF .EQU %00000000 ; QUIESCENT STATE |
|
|
SD_OPRDEF .EQU %00000000 ; QUIESCENT STATE |
|
|
|
|
|
SD_OPRMSK .EQU %00000100 ; MASK FOR BITS WE OWN IN RTC LATCH PORT |
|
|
SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT |
|
|
SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT |
|
|
SD_CNTR .EQU Z180_CNTR |
|
|
SD_CNTR .EQU Z180_CNTR |
|
|
SD_TRDR .EQU Z180_TRDR |
|
|
SD_TRDR .EQU Z180_TRDR |
|
|
|
|
|
; |
|
|
|
|
|
RTCDEF .SET SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF (SDMODE == SDMODE_PPI) ; PPISD |
|
|
#IF (SDMODE == SDMODE_PPI) ; PPISD |
|
|
@ -165,6 +174,7 @@ SD_DO .EQU %10000000 ; PPIB:7 IS DATA OUT (CARD -> CPU) |
|
|
SD_DEVCNT .EQU 1 ; NUMBER OF PHYSICAL UNITS (SOCKETS) |
|
|
SD_DEVCNT .EQU 1 ; NUMBER OF PHYSICAL UNITS (SOCKETS) |
|
|
SD_OPRREG .EQU SIO_MCR ; UART MCR PORT (OUTPUT: CS, CLK, DIN) |
|
|
SD_OPRREG .EQU SIO_MCR ; UART MCR PORT (OUTPUT: CS, CLK, DIN) |
|
|
SD_OPRDEF .EQU %00001100 ; QUIESCENT STATE |
|
|
SD_OPRDEF .EQU %00001100 ; QUIESCENT STATE |
|
|
|
|
|
SD_OPRMSK .EQU %00101101 ; MASK FOR BITS WE OWN IN RTC LATCH PORT |
|
|
SD_INPREG .EQU SIO_MSR ; INPUT REGISTER IS MSR |
|
|
SD_INPREG .EQU SIO_MSR ; INPUT REGISTER IS MSR |
|
|
SD_CS0 .EQU %00001000 ; UART MCR:3 IS SELECT |
|
|
SD_CS0 .EQU %00001000 ; UART MCR:3 IS SELECT |
|
|
SD_CLK .EQU %00000100 ; UART MCR:2 IS CLOCK |
|
|
SD_CLK .EQU %00000100 ; UART MCR:2 IS CLOCK |
|
|
@ -198,10 +208,13 @@ SD_TRDR .EQU Z180_TRDR |
|
|
SD_DEVCNT .EQU SDCNT ; NUMBER OF PHYSICAL UNITS (SOCKETS) |
|
|
SD_DEVCNT .EQU SDCNT ; NUMBER OF PHYSICAL UNITS (SOCKETS) |
|
|
SD_OPRREG .EQU RTCIO ; USES RTC LATCHES FOR OPERATION |
|
|
SD_OPRREG .EQU RTCIO ; USES RTC LATCHES FOR OPERATION |
|
|
SD_OPRDEF .EQU %00001100 ; QUIESCENT STATE (/CS1 & /CS2 DEASSERTED) |
|
|
SD_OPRDEF .EQU %00001100 ; QUIESCENT STATE (/CS1 & /CS2 DEASSERTED) |
|
|
|
|
|
SD_OPRMSK .EQU %00001100 ; MASK FOR BITS WE OWN IN RTC LATCH PORT |
|
|
SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT FOR PRIMARY SPI CARD |
|
|
SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT FOR PRIMARY SPI CARD |
|
|
SD_CS1 .EQU %00001000 ; RTC:3 IS SELECT FOR SECONDARY SPI CARD |
|
|
SD_CS1 .EQU %00001000 ; RTC:3 IS SELECT FOR SECONDARY SPI CARD |
|
|
SD_CNTR .EQU Z180_CNTR |
|
|
SD_CNTR .EQU Z180_CNTR |
|
|
SD_TRDR .EQU Z180_TRDR |
|
|
SD_TRDR .EQU Z180_TRDR |
|
|
|
|
|
; |
|
|
|
|
|
RTCDEF .SET SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF (SDMODE == SDMODE_MT) ; MT shift register for RC2014 (ref SDMODE_CSIO) |
|
|
#IF (SDMODE == SDMODE_MT) ; MT shift register for RC2014 (ref SDMODE_CSIO) |
|
|
@ -318,6 +331,7 @@ SD_INIT: |
|
|
CALL PRTHEXBYTE |
|
|
CALL PRTHEXBYTE |
|
|
; |
|
|
; |
|
|
LD A,(RTCVAL) ; GET RTC PORT SHADOW VALUE |
|
|
LD A,(RTCVAL) ; GET RTC PORT SHADOW VALUE |
|
|
|
|
|
AND ~SD_OPRMSK ; CLEAR OUR BITS |
|
|
OR SD_OPRDEF ; SET OUR BIT DEFAULTS |
|
|
OR SD_OPRDEF ; SET OUR BIT DEFAULTS |
|
|
LD (RTCVAL),A ; SAVE IT |
|
|
LD (RTCVAL),A ; SAVE IT |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
@ -329,6 +343,7 @@ SD_INIT: |
|
|
CALL PRTHEXBYTE |
|
|
CALL PRTHEXBYTE |
|
|
; |
|
|
; |
|
|
LD A,(RTCVAL) ; GET RTC PORT SHADOW VALUE |
|
|
LD A,(RTCVAL) ; GET RTC PORT SHADOW VALUE |
|
|
|
|
|
AND ~SD_OPRMSK ; CLEAR OUR BITS |
|
|
OR SD_OPRDEF ; SET OUR BIT DEFAULTS |
|
|
OR SD_OPRDEF ; SET OUR BIT DEFAULTS |
|
|
LD (RTCVAL),A ; SAVE IT |
|
|
LD (RTCVAL),A ; SAVE IT |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
@ -349,6 +364,7 @@ SD_INIT: |
|
|
CALL PRTHEXBYTE |
|
|
CALL PRTHEXBYTE |
|
|
; |
|
|
; |
|
|
LD A,(RTCVAL) ; GET RTC PORT SHADOW VALUE |
|
|
LD A,(RTCVAL) ; GET RTC PORT SHADOW VALUE |
|
|
|
|
|
AND ~SD_OPRMSK ; CLEAR OUR BITS |
|
|
OR SD_OPRDEF ; SET OUR BIT DEFAULTS |
|
|
OR SD_OPRDEF ; SET OUR BIT DEFAULTS |
|
|
LD (RTCVAL),A ; SAVE IT |
|
|
LD (RTCVAL),A ; SAVE IT |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
@ -412,6 +428,7 @@ SD_INIT: |
|
|
CALL PRTHEXBYTE |
|
|
CALL PRTHEXBYTE |
|
|
; |
|
|
; |
|
|
LD A,(RTCVAL) ; GET RTC PORT SHADOW VALUE |
|
|
LD A,(RTCVAL) ; GET RTC PORT SHADOW VALUE |
|
|
|
|
|
AND ~SD_OPRMSK ; CLEAR OUR BITS |
|
|
OR SD_OPRDEF ; SET OUR BIT DEFAULTS |
|
|
OR SD_OPRDEF ; SET OUR BIT DEFAULTS |
|
|
LD (RTCVAL),A ; SAVE IT |
|
|
LD (RTCVAL),A ; SAVE IT |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
@ -844,6 +861,12 @@ SD_INITCARD1: |
|
|
CALL SD_PUT ; SEND 8 CLOCKS |
|
|
CALL SD_PUT ; SEND 8 CLOCKS |
|
|
POP BC ; RESTORE LOOP CONTROL |
|
|
POP BC ; RESTORE LOOP CONTROL |
|
|
DJNZ SD_INITCARD1 ; LOOP AS NEEDED |
|
|
DJNZ SD_INITCARD1 ; LOOP AS NEEDED |
|
|
|
|
|
; |
|
|
|
|
|
; MAKE SURE WE FINISH SENDING |
|
|
|
|
|
#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) |
|
|
|
|
|
CALL SD_WAITTX ; WAIT FOR TE TO CLEAR |
|
|
|
|
|
CALL DLY4 ; WAIT A BIT MORE FOR FINAL BIT |
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
; PUT CARD IN IDLE STATE |
|
|
; PUT CARD IN IDLE STATE |
|
|
CALL SD_GOIDLE ; GO TO IDLE |
|
|
CALL SD_GOIDLE ; GO TO IDLE |
|
|
@ -1538,8 +1561,8 @@ SD_SETUP: |
|
|
; |
|
|
; |
|
|
#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) |
|
|
#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) |
|
|
; CSIO SETUP FOR Z180 CSIO |
|
|
; CSIO SETUP FOR Z180 CSIO |
|
|
; LD A,2 ; 18MHz/20 <= 400kHz |
|
|
|
|
|
LD A,6 ; ??? |
|
|
|
|
|
|
|
|
; LD A,2 ; DIV 80, 225KHZ @ 18MHZ CLK |
|
|
|
|
|
LD A,6 ; DIV 1280, 14KHZ @ 18MHZ CLK |
|
|
OUT0 (SD_CNTR),A |
|
|
OUT0 (SD_CNTR),A |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
@ -1556,7 +1579,6 @@ SD_SETUP: |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF (SDMODE == SDMODE_UART) |
|
|
#IF (SDMODE == SDMODE_UART) |
|
|
SD_OPRMSK .EQU (SD_CS0 | SD_CLK | SD_DI) |
|
|
|
|
|
IN A,(SD_OPRREG) ; OPRREG == SIO_MCR |
|
|
IN A,(SD_OPRREG) ; OPRREG == SIO_MCR |
|
|
AND ~SD_OPRMSK ; MASK OFF SD CONTROL BITS |
|
|
AND ~SD_OPRMSK ; MASK OFF SD CONTROL BITS |
|
|
OR SD_OPRDEF ; SET DEFAULT BITS |
|
|
OR SD_OPRDEF ; SET DEFAULT BITS |
|
|
@ -1605,9 +1627,10 @@ SD_CHKWP: |
|
|
; SELECT CARD |
|
|
; SELECT CARD |
|
|
; |
|
|
; |
|
|
SD_SELECT: |
|
|
SD_SELECT: |
|
|
#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) |
|
|
|
|
|
CALL SD_WAITTX |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
|
|
|
; ; FINISH SENDING BEFORE ASSERTING CS! |
|
|
|
|
|
;#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) |
|
|
|
|
|
; CALL SD_WAITTX |
|
|
|
|
|
;#ENDIF |
|
|
; |
|
|
; |
|
|
LD A,(IY+SD_DEV) ; GET CURRENT DEVICE |
|
|
LD A,(IY+SD_DEV) ; GET CURRENT DEVICE |
|
|
OR A ; SET FLAGS |
|
|
OR A ; SET FLAGS |
|
|
@ -1641,6 +1664,22 @@ SD_SELECT2: |
|
|
; DESELECT CARD |
|
|
; DESELECT CARD |
|
|
; |
|
|
; |
|
|
SD_DESELECT: |
|
|
SD_DESELECT: |
|
|
|
|
|
#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) |
|
|
|
|
|
; DON'T REMOVE CS UNTIL WE ARE DONE SENDING! |
|
|
|
|
|
CALL SD_WAITTX ; WAIT FOR TE TO CLEAR |
|
|
|
|
|
; |
|
|
|
|
|
; ACCORDING TO Z180 DOCS, IT MAY TAKE UP TO 1 BIT TIME TO |
|
|
|
|
|
; FINISH SENDING AFTER TE IS CLEARED. THE DELAY BELOW WILL |
|
|
|
|
|
; DO THIS FOR THE SLOWEST POSSIBLE SEND RATE WHICH IS |
|
|
|
|
|
; CLK / 1320, SO DELAY AT LEAST 1320 T-STATES |
|
|
|
|
|
;CALL DLY64 ; DELAY FOR FINAL BIT |
|
|
|
|
|
; |
|
|
|
|
|
; IN PRACTICE, IT LOOKS LIKE THIS WORST CASE SCENARIO NEVER |
|
|
|
|
|
; OCCURS. FOR NOW, USE A SMALL DELAY WHICH SEEMS TO BE MORE |
|
|
|
|
|
; THAN ADEQUATE BASED ON LOGIC ANALYZER TRACES. |
|
|
|
|
|
CALL DLY4 ; DELAY FOR FINAL BIT |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
LD A,(SD_OPRVAL) |
|
|
LD A,(SD_OPRVAL) |
|
|
#IF (SD_DEVCNT > 1) |
|
|
#IF (SD_DEVCNT > 1) |
|
|
AND ~(SD_CS0 | SD_CS1) |
|
|
AND ~(SD_CS0 | SD_CS1) |
|
|
|