;Test program for SD_CARD interface of S100Computers.com Dual SD Card S100 board. ;This short program just checks the handshake signals between the S100 bus and the ESP32 ; ; John Monahan S100Computers.com 12/19/2024 ; ; ;V0.1 12/19/2024 ; First version. It is "rough & ready" with little menu etc. error checking etc. ; PORT ASSIGNMENTS ; FALSE EQU 0 TRUE EQU NOT FALSE DEBUG EQU TRUE ; If TRUE all sector reads will display the actual 512 bytes of data read SD_CARD_STATUS EQU 80H ; We will assume the board uses ports 80H-81H SD_CARD_DATA EQU 81H ; CMD and Data port CMD_SEL_DRIVE EQU 80H ; CMD to select SD card CONSTAT EQU 0H ; Console Status Port CONIN EQU 1H ; Console IN Port CONOUT EQU 1H ; Console OUT Port MONITOR EQU 0F000H ; Location of Z80 ROM monitor when done. DEFAULT_BUFFER EQU 4000H ; Default Sector buffer location ("DMA address") SPACE EQU 20H BELL EQU 07H ESC EQU 1BH CR EQU 0DH LF EQU 0AH ; SD CARD Interface Status:- ORG 100H ;<<<<<<<< LOAD AT 100H START: LD SP,STACK LD HL,SIGNON CALL PMSG START1: LD HL,SIGNON1 ; '-------- Main Menu ------ ' CALL PMSG START2: CALL CRLF LD C,'>' CALL GETCMD CP A,ESC JP Z,MONITOR ; ESC drop back to Z80 monitor CP A,'A' ; Check range (A only) JP NZ,DATA_ERROR JP START_TEST DATA_ERROR: LD HL,DATA_ERROR_MSG ; "Data error" CALL PMSG JP START1 ;-------------------------------------------------------- START_TEST: CALL CRLF LD A,00H OUT (SD_CARD_STATUS),A ;Tell ESP32 no data ready to read IN A,(SD_CARD_DATA) ;Reset U6A XXX: LD C,'@' CALL CO LD C,80H CALL SEND_DATA CALL GET_STRING ;"\r\nGot Data (80h) %x",data LD C,82H CALL SEND_CMD CALL GET_STRING ;>>>> Got CMD %x",data LD C,83H CALL SEND_DATA CALL GET_STRING ;"\r\nGot Data (83H) %x",data CALL GET_DATA ;'#' LD C,A CALL CO CALL GET_DATA ;\r LD C,A CALL CO CALL GET_DATA ;\n LD C,A CALL CO CALL GET_STRING ;Test String CALL GET_STRING ;test String JP XXX ;Repeat test ;------------------------------------------------------------------------------- GET_DATA: IN A,(SD_CARD_STATUS) ;Wait for character (GPIO_3 and GPIO_21) BIT 7,A JR Z,GET_DATA IN A,(SD_CARD_DATA) ;S100 read enable will reset U6B GPIO_21 LD C,A GET_DATA1: IN A,(SD_CARD_STATUS) ;Wait for character (GPIO_3 and GPIO_21) BIT 7,A JR NZ,GET_DATA1 LD A,C RET GET_STRING: CALL GET_DATA OR A RET Z CALL CO JR GET_STRING SEND_DATA: IN A,(SD_CARD_STATUS) ;Wait until tany previous character has been read BIT 0,A JR NZ,SEND_DATA LD A,C ;Send Data, this will raise GPIO_20 OUT (SD_CARD_DATA),A SEND_DATA1: IN A,(SD_CARD_STATUS) ;Wait until the ESP32 has reset U6A with GPIO_2 BIT 0,A JR NZ,SEND_DATA1 RET SEND_CMD: PUSH BC LD C,33H ;All CMD's begin with 33H CALL SEND_DATA POP BC ;CMD is in C CALL SEND_DATA RET ;<<<<<<<<<<<<<<<<<<<<<<<<< SUPPORT ROUTINES >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> PMSG: PUSH BC ; Only [A] and [HL] is changed PMSG1: LD A,(HL) ; A ROUTINE TO PRINT OUT A STRING @ [HL] INC HL ; UP TO THE FIRST 0. OR A,A JP Z,PMSG_DONE LD C,A CALL CO JP PMSG1 PMSG_DONE: POP BC RET CRLF: PUSH AF PUSH BC LD C,CR CALL CO LD C,LF CALL CO POP BC POP AF RET BLANK: PUSH AF ; Send one space to console PUSH BC LD C,' ' CALL CO POP BC POP AF RET ; GET A CHARACTER, convert to UC, ECHO it GETCMD: CALL CI CALL UCASE CP A,ESC RET Z ;Don't echo an ESC PUSH AF ;Save it PUSH BC LD C,A CALL CO ;Echo it POP BC POP AF ;get it back RET ; ;Convert LC to UC UCASE: CP A,'a' ;must be >= lowercase a RET C ; else go back... CP A,'z'+1 ;must be <= lowercase z RET NC ; else go back... SUB A,'a'-'A' ;subtract lowercase bias RET ; Check if next character is a ESC CHECK_ESC: CALL CI CP A,ESC RET ; Return Z if ESC character. ; Check if next character is a CR CHECK_CR: CALL CI CP A,CR RET ; Return Z if ESC character. ; Return with 2 HEX digits in [A]. If abort, Carry flag set + ESC in [A] GET_HEX: PUSH BC CALL GETCMD ;Get a character from keyboard & ECHO CP A,ESC JP Z,HEX_ABORT CP '/' ;check 0-9, A-F JP C,HEX_ABORT CP 'F'+1 JP NC,HEX_ABORT CALL ASBIN ;Convert to binary SLA A SLA A SLA A SLA A ;Shift to high nibble LD B,A ;Store it CALL GETCMD ;Get 2nd character from keyboard & ECHO CP A,ESC JP Z,HEX_ABORT CP '/' ;check 0-9, A-F JP C,HEX_ABORT CP 'F'+1 JP NC,HEX_ABORT CALL ASBIN ;Convert to binary OR A,B ;add in the first digit OR A,A ;To return NC POP BC RET HEX_ABORT: SCF ;Set Carry flag LD A,ESC POP BC RET ; ; ; Put 4 HEX characters in [HL] GET_HEX4: LD H,0000H CALL GET_HEX ;get 2 HEX digits JP C,SCAN_ABORT LD H,A CALL GET_HEX ;get 2 more HEX digits JP C,SCAN_ABORT LD L,A OR A,A ;To return NC RET GET_HEX2: LD L,0 CALL GET_HEX ;get 2 HEX digits JP C,SCAN_ABORT LD L,A OR A,A ;To return NC RET SCAN_ABORT: SCF ;Set Carry flag RET ; ASCII TO BINARY CONVERSION ROUTINE ASBIN: SUB 30H CP 0AH RET M SUB 07H RET ; ; ; PRINT [HL] ON CONSOL PRINT_HL: LD A,H CALL PRINT_A LD A,L PRINT_A: PUSH AF RRCA RRCA RRCA RRCA CALL SF598B POP AF SF598B: CALL CONV JP CO ; CONVERT HEX TO ASCII CONV: AND 0FH ADD A,90H DAA ADC A,40H DAA LD C,A RET ; DISPLAY 8 BITS OF [A] (No registers changed) ; DISPLAY BIT PATTERN IN [A] ZBITS: PUSH AF PUSH BC PUSH DE LD E,A LD B,8 BQ2: SLA E LD A,18H ADC A,A LD C,A CALL CO DJNZ BQ2 POP DE POP BC POP AF RET ;<<<<<<<<<<<<<<<<<<<<<< MAIN CONSOL OUTPUT ROUTINE >>>>>>>>>>>>>>>>>>>>>>>>> ; CO: IN A,(CONSTAT) ; SD SYSTEMS or PROPELLER VIDIO BOARD PORT AND 4H JP Z,CO LD A,C OUT (CONOUT),A RET ; RETURN CHARACTER SENT IN [A] ;<<<<<<<<<<<<<<<<<<< MAIN CONSOL STATUS ROUTINE >>>>>>>>>>>>>>>>>>>>>> ; CSTS: IN A,(CONSTAT) AND 02H RET Z XOR A DEC A ; RETURN WITH 0FFH IN [A] IF SOMETHING RET ;<<<<<<<<<<<<<<<<<<<< MAIN CONSOL INPUT ROUTINE >>>>>>>>>>>>>>>>>>>> ; CI: IN A,(CONSTAT) ; NEED CONSTAT TO CLEAN UP SHIFT KEYS ETC AND 02H JP Z,CI IN A,(CONIN) AND 7FH RET ORG 800H ;--------------------------------------------------------------------------------------- SIGNON: DB CR,LF DB CR,LF,'Test program for SD CARD interface of S100Computers.com Dual SD Card Board' DB CR,LF,'Note: The ESP32 must be programmed with SD_Card_IO_Test_Program.ino' DB CR,LF,'This is only a test for basic S100 <--> ESP32 data Transfers' DB CR,LF,'By John Monahan S100Computers.COM (V0.1) 1/22/2025',0 SIGNON1: DB CR,LF,LF,'----- Main Menu ---- ' DB CR,LF,'A. To Start the IO Continous Test' DB CR,LF,'ESC To Abort the program.',0 DATA_ERROR_MSG: DB CR,LF,'Data Error',CR,LF,'0' DB '>>>>>>>>>>>> DATA STORE >>>>>>>>>>>>>' DS 40H STACK: DB 0H ; END