From 092e44c62e450a21a37809ce842981b33d8dc317 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 22 Sep 2023 14:13:12 -0700 Subject: [PATCH] RPi Builds & CH375/6 Support - The build process was enhanced by Dean Jenkins to support the Raspberry Pi. Note that the Propeller firmware will not be generated by a RPi build. See Issue #358. - Initial support for USB storage via CH375/6. --- Doc/ChangeLog.txt | 2 + Source/Apps/assign.asm | 9 +- Source/CBIOS/cbios.asm | 4 +- Source/HBIOS/cfg_duo.asm | 12 + Source/HBIOS/cfg_dyno.asm | 2 + Source/HBIOS/cfg_heath.asm | 2 + Source/HBIOS/cfg_master.asm | 12 + Source/HBIOS/cfg_mbc.asm | 2 + Source/HBIOS/cfg_mk4.asm | 2 + Source/HBIOS/cfg_n8.asm | 2 + Source/HBIOS/cfg_rcz180.asm | 12 + Source/HBIOS/cfg_rcz280.asm | 12 + Source/HBIOS/cfg_rcz80.asm | 12 + Source/HBIOS/cfg_rph.asm | 2 + Source/HBIOS/cfg_s100.asm | 2 + Source/HBIOS/cfg_sbc.asm | 2 + Source/HBIOS/cfg_scz180.asm | 12 + Source/HBIOS/cfg_z80retro.asm | 2 + Source/HBIOS/cfg_zeta.asm | 2 + Source/HBIOS/cfg_zeta2.asm | 2 + Source/HBIOS/ch.asm | 1142 +++++++++++++++++++++++++++++++++ Source/HBIOS/hbios.asm | 14 + Source/HBIOS/hbios.inc | 2 + Source/Makefile | 29 + Source/ver.inc | 2 +- Source/ver.lib | 2 +- 26 files changed, 1292 insertions(+), 8 deletions(-) create mode 100644 Source/HBIOS/ch.asm diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 4a2176f7..66972684 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -21,6 +21,8 @@ Version 3.3 - WBW: Fix S100 Z180 LED operation (credit to Jay Cotton for finding this issue) - WBW: QPM system image is now combined with current CBIOS during build - WBW: Added framework for Heath platform +- WBW: Support for USB Disks via CH375/CH376 +- D?J: Support for Raspberry Pi build process Version 3.2.1 ------------- diff --git a/Source/Apps/assign.asm b/Source/Apps/assign.asm index 33fe5937..41cd6007 100644 --- a/Source/Apps/assign.asm +++ b/Source/Apps/assign.asm @@ -31,6 +31,7 @@ ; 2022-02-28 [WBW] Use HBIOS to swap banks under CP/M 3 ; Use CPM3 BDOS direct BIOS call to get DRVTBL adr ; 2023-06-19 [WBW] Update for revised DIODEVICE API +; 2023-09-19 [WBW] Added CHUSB & CHSD device support ;_______________________________________________________________________________ ; ; ToDo: @@ -1920,8 +1921,8 @@ dev09 .db "HDSK",0 dev10 .db "PPA",0 dev11 .db "IMM",0 dev12 .db "SYQ",0 -dev13 .equ devunk -dev14 .equ devunk +dev13 .db "CHUSB",0 +dev14 .db "CHSD",0 dev15 .equ devunk ; devcnt .equ 10 ; 10 devices defined @@ -1942,10 +1943,10 @@ stack .equ $ ; stack top ; Messages ; indent .db " ",0 -msgban1 .db "ASSIGN v1.6 for RomWBW CP/M ",0 +msgban1 .db "ASSIGN v1.7 for RomWBW CP/M ",0 msg22 .db "2.2",0 msg3 .db "3",0 -msbban2 .db ", 16-Jun-2023",0 +msbban2 .db ", 19-Sep-2023",0 msghb .db " (HBIOS Mode)",0 msgub .db " (UBIOS Mode)",0 msgban3 .db "Copyright 2021, Wayne Warthen, GNU GPL v3",0 diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 2a5ec79f..b296bb0d 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -3394,8 +3394,8 @@ DEV09 .DB "HDSK$" DEV10 .DB "PPA$" DEV11 .DB "IMM$" DEV12 .DB "SYQ$" -DEV13 .EQU DEVUNK -DEV14 .EQU DEVUNK +DEV13 .DB "CHUSB$" +DEV14 .DB "CHSD$" DEV15 .EQU DEVUNK ; #ENDIF diff --git a/Source/HBIOS/cfg_duo.asm b/Source/HBIOS/cfg_duo.asm index 3456f31c..354a726b 100644 --- a/Source/HBIOS/cfg_duo.asm +++ b/Source/HBIOS/cfg_duo.asm @@ -230,6 +230,18 @@ SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 1 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $BE ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU FALSE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $FF ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU FALSE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 19e8fb1c..42b453d0 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -247,6 +247,8 @@ SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_heath.asm b/Source/HBIOS/cfg_heath.asm index 1f863b0b..cd8863fa 100644 --- a/Source/HBIOS/cfg_heath.asm +++ b/Source/HBIOS/cfg_heath.asm @@ -251,6 +251,8 @@ SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index f29226eb..04f2a8b2 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -299,6 +299,18 @@ SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 1 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $BE ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU FALSE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $FF ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU FALSE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_mbc.asm b/Source/HBIOS/cfg_mbc.asm index 1e38062b..e74306d7 100644 --- a/Source/HBIOS/cfg_mbc.asm +++ b/Source/HBIOS/cfg_mbc.asm @@ -227,6 +227,8 @@ SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 349c9188..d609ddcd 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -237,6 +237,8 @@ SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU TRUE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 91a0e5a4..4b3e20ab 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -239,6 +239,8 @@ SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 3cdcb827..734c03bf 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -253,6 +253,18 @@ SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 1 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $BE ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU FALSE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $FF ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU FALSE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index d31c0605..2f266bf9 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -257,6 +257,18 @@ SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 1 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $BE ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU FALSE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $FF ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU FALSE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index c136b318..b10a318a 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -251,6 +251,18 @@ SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 1 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $BE ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU FALSE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $FF ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU FALSE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_rph.asm b/Source/HBIOS/cfg_rph.asm index 366c28a3..4de4fe96 100644 --- a/Source/HBIOS/cfg_rph.asm +++ b/Source/HBIOS/cfg_rph.asm @@ -228,6 +228,8 @@ SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU FALSE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_s100.asm b/Source/HBIOS/cfg_s100.asm index 96cd2f9c..e4d68743 100644 --- a/Source/HBIOS/cfg_s100.asm +++ b/Source/HBIOS/cfg_s100.asm @@ -247,6 +247,8 @@ SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 4481aba1..488d3120 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -226,6 +226,8 @@ SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index ef5f56f3..af667270 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -247,6 +247,18 @@ SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 1 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $BE ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU FALSE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $FF ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU FALSE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_z80retro.asm b/Source/HBIOS/cfg_z80retro.asm index 15ac1922..3103c795 100644 --- a/Source/HBIOS/cfg_z80retro.asm +++ b/Source/HBIOS/cfg_z80retro.asm @@ -200,6 +200,8 @@ SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) ; PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index dade2858..75fa1574 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -171,6 +171,8 @@ SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) ; PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index d03f773d..e32964fe 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -182,6 +182,8 @@ SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) ; PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) diff --git a/Source/HBIOS/ch.asm b/Source/HBIOS/ch.asm new file mode 100644 index 00000000..3659256e --- /dev/null +++ b/Source/HBIOS/ch.asm @@ -0,0 +1,1142 @@ +; +;================================================================================================== +; CH375/376 USB/SD DRIVER +;================================================================================================== +; +; https://www.wch-ic.com/ +; +; Thanks and credit to Alan Cox. Much of this driver is based on +; his code in FUZIX (https://github.com/EtchedPixels/FUZIX). +; +; NOTES: +; - There seem to compatibility issues with older USB thumb drives. +; Such drives will complete DISK_INIT successfully, but then return +; an error attempting to do any I/O. The error is $17 indicating +; the CH37x encountered an overflow during communication with the +; device. I found that adding a DISK_MOUNT command (only possible +; on CH376) resolved the issue for some devices, so that has been +; added to the RESET routine when using CH376. +; +; - The CH37x can get in an inconsistent state. The RESET_ALL command +; will clear this, but the RESET_ALL command is very problematic on +; the CH376. On the CH376, the hardware reset takes a very long +; time (much longer than the documentation suggests). It seems to +; work find on the CH375, but since you don't know what chip you +; are dealing with at that point, I have given up on using it. +; +; TODO: +; - Implement auto-recovery on error status. +; +CHUSB_FASTIO .EQU FALSE ; USE INIR/OTIR? +; +; PORT OFFSETS FROM BASE PORT +; +;CH_DATA .EQU 0 ; DATA PORT AT BASE + 0 +;CH_CMD .EQU 1 ; CMD PORT AT BASE + 1 +; +; CH DEVICE TYPES +; +CHTYP_NONE .EQU 0 ; NONE +CHTYP_375 .EQU 1 ; CH375 +CHTYP_376 .EQU 2 ; CH376 +; +; CH375/376 COMMANDS +; +CH_CMD_VER .EQU $01 ; GET IC VER +CH_CMD_RESET .EQU $05 ; FULL CH37X RESET +CH_CMD_EXIST .EQU $06 ; CHECK EXISTS +CH_CMD_PKTSEC .EQU $0B ; SET PACKETS PER SECTOR +CH_CMD_MODE .EQU $15 ; SET USB MODE +CH_CMD_STAT .EQU $22 ; GET STATUS +CH_CMD_RD6 .EQU $27 ; READ USB DATA (375 & 376) +CH_CMD_RD5 .EQU $28 ; READ USB DATA (375) +CH_CMD_WR5 .EQU $2B ; WRITE USB DATA (375) +CH_CMD_WR6 .EQU $2C ; WRITE USB DATA (376) +CH_CMD_DSKMNT .EQU $31 ; DISK MOUNT +CH_CMD_DSKCAP .EQU $3E ; DISK CAPACITY +CH_CMD_AUTOSET .EQU $4D ; USB AUTO SETUP +CH_CMD_DSKINIT .EQU $51 ; DISK INIT +CH_CMD_DSKSIZ .EQU $53 ; DISK SIZE +CH_CMD_DSKRD .EQU $54 ; DISK READ +CH_CMD_DSKRDGO .EQU $55 ; CONTINUE DISK READ +CH_CMD_DSKWR .EQU $56 ; DISK WRITE +CH_CMD_DSKWRGO .EQU $57 ; CONTINUE DISK WRITE +CH_CMD_DSKINQ .EQU $58 ; DISK INQUIRY +CH_CMD_DSKRDY .EQU $59 ; DISK READY +; +; CH DEVICE CONFIGURATION +; +CH_CFGSIZ .EQU 9 ; SIZE OF CFG TBL ENTRIES +; +; CONFIG ENTRY DATA OFFSETS +; +CH_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) +CH_TYPE .EQU 1 ; CH DEVICE TYPE (CHTYP_XXX) +CH_IOBASE .EQU 2 ; IO BASE ADDRESS (BYTE) +CH_USBENABLE .EQU 3 ; ENABLE USB SUB-DRIVER +CH_USBCFG .EQU 4 ; USB SUB-DRIVER CFG ENTRY +CH_SDENABLE .EQU 6 ; ENABLE SD CARD SUB-DRIVER +CH_SDCFG .EQU 7 ; SD CARD SUB-DRIVER CFG ENTRY +; +CH_CFGTBL: +; +#IF (CHCNT >= 1) +CH_CFG0: ; DEVICE 0 + .DB 0 ; DEV NUM + .DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY + .DB CH0BASE ; IO BASE ADDRESS + .DB CH0USBENABLE ; ENABLE USB SUB-DRIVER + .DW CHUSB_CFG0 ; USB SUB-DRIVER INIT ADR + .DB CH0SDENABLE ; ENABLE SD CARD SUB-DRIVER + .DW CHSD_CFG0 ; SD CARD SUB-DRIVER INIT ADR +#ENDIF +; +#IF (CHCNT >= 2) +CH_CFG1: ; DEVICE 1 + .DB 1 ; DEV NUM + .DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY + .DB CH1BASE ; IO BASE ADDRESS + .DB CH1USBENABLE ; ENABLE USB SUB-DRIVER + .DW CHUSB_CFG1 ; USB SUB-DRIVER INIT ADR + .DB CH1SDENABLE ; ENABLE SD CARD SUB-DRIVER + .DW CHSD_CFG1 ; SD CARD SUB-DRIVER INIT ADR +#ENDIF +; +#IF ($ - CH_CFGTBL) != (CHCNT * CH_CFGSIZ) + .ECHO "*** INVALID CH CONFIG TABLE ***\n" +#ENDIF +; + .DB $FF ; END OF TABLE MARKER +; +; GLOBAL CH37X INITIALIZATION +; +CH_INIT: + LD IY,CH_CFGTBL ; POINT TO START OF CONFIG TABLE +; +CH_INIT1: + LD A,(IY) ; LOAD FIRST BYTE TO CHECK FOR END + CP $FF ; CHECK FOR END OF TABLE VALUE + JR NZ,CH_INIT2 ; IF NOT END OF TABLE, CONTINUE + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +CH_INIT2: + CALL NEWLINE ; FORMATTING + PRTS("CH$") ; LABEL FOR IO ADDRESS + LD A,(IY+CH_DEV) ; DEVICE NUMBER + CALL PRTDECB ; PRINT IT + CALL PC_COLON ; FORMATTING +; + PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD A,(IY+CH_IOBASE) ; GET IO BASE ADDRES + CALL PRTHEXBYTE ; DISPLAY IT +; + ;CALL CH_FLUSH ; FLUSH DEVICE OUTPUT QUEUE + ;CALL CH_RESET ; FULL CH37X RESET + CALL CH_DETECT ; DETECT CHIP PRESENCE + JR Z,CH_INIT3 ; GO AHEAD IF CHIP FOUND + LD DE,CH_STR_NOHW ; NOT PRESENT + CALL WRITESTR ; PRINT IT + JR CH_INIT4 ; NEXT ENTRY +; +CH_INIT3: + CALL CH_GETVER ; GET VERSION BYTE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* +; + LD B,A ; SAVE IN REG B + AND $C0 ; ISOLATE CHIP TYPE BITS + LD C,CHTYP_375 ; ASSUME CH375 + LD DE,CH_STR_375 ; STRING FOR CH375 + CP $80 ; 375? + JR Z,CH_INIT3A ; IF SO, RECORD IT + LD C,CHTYP_376 ; ASSUME CH376 + LD DE,CH_STR_376 ; STRING FOR CH376 + CP $40 ; 376? + JR Z,CH_INIT3A ; IF SO, RECORD IT + PRTS(" VER ERR 0x$") ; SHOW VERSION ERROR + LD A,B ; GET VERSION BYTE BACK + CALL PRTHEXBYTE ; PRINT IT + JR CH_INIT4 ; NEXT ENTRY +; +CH_INIT3A: + LD A,C ; CHIP TYPE TO ACCUM + LD (IY+CH_TYPE),A ; SAVE IT + PRTS(" TYPE=$") ; TAG + CALL WRITESTR ; PRINT CHIP TYPE + PRTS(" VER=0x$") ; LABEL FOR CHIP VERSION + LD A,B ; RECOVER VERSION BYTE + AND $3F ; ISOLATE VERSION BITS + CALL PRTHEXBYTE ; PRINT IT +; + ; USB SUB-DRIVER INIT + LD L,(IY+CH_USBCFG+0) ; LSB OF USB CFG ENTRY + LD H,(IY+CH_USBCFG+1) ; MSB OF USB CFG ENTRY + LD A,(IY+CH_USBENABLE) ; USB ENABLED? + PUSH IY ; SAVE IY + OR A ; SET FLAGS + CALL NZ,CHUSB_INIT ; IF SO, DO USB INIT + POP IY ; RESTORE IY +; + ; SD CARD SUB-DRIVER INIT + LD L,(IY+CH_SDCFG+0) ; LSB OF SD CFG ENTRY + LD H,(IY+CH_SDCFG+1) ; MSB OF SD CFG ENTRY + LD A,(IY+CH_SDENABLE) ; SD ENABLED? + PUSH IY ; SAVE IY + OR A ; SET FLAGS + CALL NZ,CHSD_INIT ; IF SO, DO SD INIT + POP IY ; RESTORE IY +; +CH_INIT4: + LD DE,CH_CFGSIZ ; SIZE OF CFG TABLE ENTRY + ADD IY,DE ; BUMP POINTER + JP CH_INIT1 ; AND LOOP +; +; SEND COMMAND IN A +; +CH_CMD: + LD C,(IY+CH_IOBASE) ; BASE PORT + INC C ; BUMP TO CMD PORT + OUT (C),A ; SEND COMMAND + CALL CH_NAP ; *DEBUG* + RET +; +; GET STATUS +; +CH_STAT: + LD C,(IY+CH_IOBASE) ; BASE PORT + INC C ; BUMP TO CMD PORT + IN A,(C) ; READ STATUS + RET +; +; READ A BYTE FROM DATA PORT +; +CH_RD: + LD C,(IY+CH_IOBASE) ; BASE PORT + IN A,(C) ; READ BYTE + RET +; +; WRITE A BYTE TO DATA PORT +; +CH_WR: + LD C,(IY+CH_IOBASE) ; BASE PORT + OUT (C),A ; READ BYTE + RET +; +; SMALL DELAY REQUIRED AT STRATEGIC LOCATIONS +; +CH_NAP: + ;CALL DELAY ; *DEBUG* + ;CALL DELAY ; *DEBUG* + ;CALL DELAY ; *DEBUG* + JP DELAY +; +; POLL WAITING FOR INTERRUPT +; +CH_POLL: + PUSH HL ; SAVE HL + CALL CH_NAP ; SMALL DELAY + LD HL,$8000 ; POLL LOOP COUNTER + LD HL,0 ; *DEBUG* +CH_POLL1: + CALL CH_STAT ; GET INT STATUS + BIT 7,A ; CHECK BIT + JR Z,CH_POLL2 ; IF ZERO, MOVE ON + DEC HL ; DECREMENT COUNTER + LD A,H ; CHECK + OR L ; ... LOOP COUNTER + JR NZ,CH_POLL1 ; LOOP AS NEEDED + ;CALL PC_ASTERISK ; *DEBUG* + POP HL ; RESTORE HL + OR $FF ; FLAG TIMEOUT + RET ; AND RETURN +CH_POLL2: + LD A,CH_CMD_STAT ; GET STATUS + CALL CH_CMD ; SEND IT + CALL CH_NAP ; SMALL DELAY + CALL CH_RD ; GET RESULT + POP HL ; RESTORE HL + RET ; AND RETURN +; +; SEND READ USB DATA COMMAND +; USING BEST OPCODE FOR DEVICE +; +CH_CMD_RD: + LD A,(IY+CH_TYPE) + CP CHTYP_375 + JR NZ,CH_CMD_RD1 +; + ; SEND CH375 READ USB DATA CMD + LD A,CH_CMD_RD5 + JP CH_CMD +; +CH_CMD_RD1: + ; SEND CH376 READ USB DATA CMD + LD A,CH_CMD_RD6 + JP CH_CMD +; +; SEND WRITE USB DATA COMMAND +; USING BEST OPCODE FOR DEVICE +; +CH_CMD_WR: + LD A,(IY+CH_TYPE) + CP CHTYP_375 + JR NZ,CH_CMD_WR1 +; + ; SEND CH375 WRITE USB DATA CMD + LD A,CH_CMD_WR5 + JP CH_CMD +; +CH_CMD_WR1: + ; SEND CH376 WRITE USB DATA CMD + LD A,CH_CMD_WR6 + JP CH_CMD +; +; PERFORM A FULL HARDWARE RESET ON CH37X +; +; WARNING: CH376 CAN TAKE A VERY LONG TIME TO PROCESS THIS +; COMMAND. PROBABLY DON'T WANT TO USE THIS. +; +CH_RESET: + ;PRTS("\r\nHW RESET:$") ; *DEBUG* + PUSH DE + LD A,CH_CMD_RESET + CALL CH_CMD + ; DOC SAYS 40MS, BUT I FOUND THAT TO BE INSUFFICIENT + ;LD DE,2500 ; 16US * 2500 = 40MS + LD DE,10000 ; 16US * 10000 = 160MS + CALL VDELAY + ;CALL CH_RD ; *DEBUG* + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + POP DE + RET +; +; EMPTY THE CH37X OUTPUT QUEUE OF GARBAGE +; +CH_FLUSH: + LD B,$80 +CH_FLUSH1: + CALL CH_RD + DJNZ CH_FLUSH1 + RET +; +; +; +CH_DETECT: + PRTS("\r\nDETECT:$") ; *DEBUG* +CH_DETECT1: + LD A,CH_CMD_EXIST ; LOAD COMMAND + CALL CH_CMD ; SEND COMMAND + LD A,$AA ; LOAD CHECK PATTERN + CALL CH_WR ; SEND IT + CALL CH_NAP ; SMALL DELAY + CALL CH_RD ; GET ECHO + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $55 ; SHOULD BE INVERTED + RET ; RETURN +; +; +; +CH_GETVER: + LD A,CH_CMD_VER ; LOAD COMMAND + CALL CH_CMD ; SEND COMMAND + CALL CH_RD ; GET VERSION BYTE + RET ; DONE +; +; +; +CH_STR_NOHW .TEXT " NOT PRESENT$" +CH_STR_UPGRADE .TEXT " !!!UPGRADE REQUIRED!!!$" +; +CH_STR_375 .TEXT "CH375$" +CH_STR_376 .TEXT "CH376$" +; +;================================================================================================== +; CH375/376 USB SUB-DRIVER +;================================================================================================== +; +; CHUSB DEVICE STATUS +; +CHUSB_STOK .EQU 0 +CHUSB_STNOMEDIA .EQU -1 +CHUSB_STCMDERR .EQU -2 +CHUSB_STIOERR .EQU -3 +CHUSB_STTO .EQU -4 +CHUSB_STNOTSUP .EQU -5 +; +; CH DEVICE CONFIGURATION +; +CHUSB_CFGSIZ .EQU 12 ; SIZE OF USB CFG TBL ENTRIES +; +; CONFIG ENTRY DATA OFFSETS +; +; FIRST 3 BYTES SAME AS CH CONFIG +CHUSB_STAT .EQU 3 ; LAST STATUS (BYTE) +CHUSB_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) +CHUSB_LBA .EQU 8 ; CURRENT LBA (DWORD) +; +CHUSB_CFGTBL: +; +#IF (CHCNT >= 1) +CHUSB_CFG0: + .DB 0 ; DEV NUM, FILLED DYNAMICALLY + .DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY + .DB CH0BASE ; IO BASE ADDRESS + .DB 0 ; DEVICE STATUS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +#ENDIF +; +#IF (CHCNT >= 2) +CHUSB_CFG1: + .DB 0 ; DEV NUM + .DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY + .DB CH1BASE ; IO BASE ADDRESS + .DB 0 ; DEVICE STATUS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +#ENDIF +; +#IF ($ - CHUSB_CFGTBL) != (CHCNT * CHUSB_CFGSIZ) + .ECHO "*** INVALID CHUSB CONFIG TABLE ***\n" +#ENDIF +; + .DB $FF ; END OF TABLE MARKER +; +; +; +CHUSB_INIT: + LD A,(IY+CH_TYPE) ; GET DEVICE TYPE + PUSH HL ; COPY INCOMING HL + POP IY ; ... TO IY + LD (IY+CH_TYPE),A ; SAVE DEVICE TYPE +; + ; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE + LD A,(CHUSB_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN + LD (IY+CH_DEV),A ; UPDATE IT + INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN + LD (CHUSB_DEVNUM),A ; SAVE IT +; + ; ADD UNIT TO GLOBAL DISK UNIT TABLE + LD BC,CHUSB_FNTBL ; BC := FUNC TABLE ADR + PUSH IY ; CFG ENTRY POINTER + POP DE ; COPY TO DE + CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE +; + CALL CHUSB_RESET ; RESET & DISCOVER MEDIA +#IF (CHUSBTRACE <= 1) + CALL NZ,CHUSB_PRTSTAT +#ENDIF + RET NZ ; ABORT ON FAILURE +; + ; START PRINTING DEVICE INFO + CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX +; + ; PRINT STORAGE CAPACITY (BLOCK COUNT) + PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL + LD A,CHUSB_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CAPACITY VALUE + CALL PRTHEX32 ; PRINT HEX VALUE +; + ; PRINT STORAGE SIZE IN MB + PRTS(" SIZE=$") ; PRINT FIELD LABEL + LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB + CALL SRL32 ; RIGHT SHIFT + CALL PRTDEC32 ; PRINT DWORD IN DECIMAL + PRTS("MB$") ; PRINT SUFFIX +; + XOR A ; SIGNAL SUCCESS + RET +; +; DRIVER FUNCTION TABLE +; +CHUSB_FNTBL: + .DW CHUSB_STATUS + .DW CHUSB_RESET + .DW CHUSB_SEEK + .DW CHUSB_READ + .DW CHUSB_WRITE + .DW CHUSB_VERIFY + .DW CHUSB_FORMAT + .DW CHUSB_DEVICE + .DW CHUSB_MEDIA + .DW CHUSB_DEFMED + .DW CHUSB_CAP + .DW CHUSB_GEOM +#IF (($ - CHUSB_FNTBL) != (DIO_FNCNT * 2)) + .ECHO "*** INVALID CHUSB FUNCTION TABLE ***\n" +#ENDIF +; +CHUSB_VERIFY: +CHUSB_FORMAT: +CHUSB_DEFMED: + SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED + RET +; +; +; +CHUSB_READ: + CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR + LD (CHUSB_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + LD A,CH_CMD_DSKRD ; DISK READ COMMAND + CALL CHUSB_RWSTART ; SEND CMD AND LBA +; + ; READ THE SECTOR IN 64 BYTE CHUNKS + LD B,8 ; 8 CHUNKS OF 64 FOR 512 BYTE SECTOR + LD HL,(CHUSB_DSKBUF) ; GET DISK BUF ADR +CHUSB_READ1: + CALL CH_POLL ; WAIT FOR DATA READY + CP $1D ; DATA READY TO READ? + ;CALL PC_LT ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + JP NZ,CHUSB_IOERR ; HANDLE IO ERROR + CALL CH_CMD_RD ; SEND READ USB DATA CMD + CALL CH_RD ; READ DATA BLOCK LENGTH + CP 64 ; AS EXPECTED? + JP NZ,CHUSB_IOERR ; IF NOT, HANDLE ERROR +; +#IF (CHUSB_FASTIO) + ; READ 64 BYTE CHUNK + PUSH BC ; SAVE LOOP CONTROL + LD B,64 ; READ 64 BYTES + LD C,(IY+CH_IOBASE) ; BASE PORT + INIR ; DO IT FAST + POP BC ; RESTORE LOOP CONTROL +#ELSE + ; BYTE READ LOOP + PUSH BC ; SAVE LOOP CONTROL + LD B,64 ; READ 64 BYTES +CHUSB_READ2: + CALL CH_RD ; GET NEXT BYTE + LD (HL),A ; SAVE IT + INC HL ; INC BUF PTR + DJNZ CHUSB_READ2 ; LOOP AS NEEDED + POP BC ; RESTORE LOOP CONTROL +#ENDIF +; + ; PREPARE FOR NEXT CHUNK + LD A,CH_CMD_DSKRDGO ; CONTINUE DISK READ + CALL CH_CMD ; SEND IT + DJNZ CHUSB_READ1 ; LOOP TILL DONE +; + ; FINAL CHECK FOR COMPLETION & SUCCESS + CALL CH_POLL ; WAIT FOR COMPLETION + CP $14 ; SUCCESS? + JP NZ,CHUSB_IOERR ; IF NOT, HANDLE ERROR +; + ; INCREMENT LBA + PUSH HL ; SAVE HL + LD A,CHUSB_LBA ; LBA OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL INC32HL ; INCREMENT THE VALUE + POP HL ; RESTORE HL +; + XOR A ; SIGNAL SUCCESS + RET +; +; +; +CHUSB_WRITE: + CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR + LD (CHUSB_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + LD A,CH_CMD_DSKWR ; DISK READ COMMAND + CALL CHUSB_RWSTART ; SEND CMD AND LBA +; + ; WRITE THE SECTOR IN 64 BYTE CHUNKS + LD B,8 ; 8 CHUNKS OF 64 FOR 512 BYTE SECTOR + LD HL,(CHUSB_DSKBUF) ; GET DISK BUF ADR +CHUSB_WRITE1: + CALL CH_POLL ; WAIT FOR DATA READY + CP $1E ; DATA READY TO WRITE + ;CALL PC_GT ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + JP NZ,CHUSB_IOERR ; HANDLE IO ERROR + CALL CH_CMD_WR ; SEND WRITE USB DATA CMD + LD A,64 ; 64 BYTE CHUNK + CALL CH_WR ; SEND DATA BLOCK LENGTH +; +#IF (CHUSB_FASTIO) + ; WRITE 64 BYTE CHUNK + PUSH BC ; SAVE LOOP CONTROL + LD B,64 ; WRITE 64 BYTES + LD C,(IY+CH_IOBASE) ; BASE PORT + OTIR ; DO IT FAST + POP BC ; RESTORE LOOP CONTROL +#ELSE + ; BYTE WRITE LOOP + PUSH BC ; SAVE LOOP CONTROL + LD B,64 ; WRITE 64 BYTES +CHUSB_WRITE2: + LD A,(HL) ; GET NEXT BYTE + INC HL ; INC BUF PTR + CALL CH_WR ; WRITE NEXT BYTE + DJNZ CHUSB_WRITE2 ; LOOP AS NEEDED + POP BC ; RESTORE LOOP CONTROL +#ENDIF +; + ; PREPARE FOR NEXT CHUNK + LD A,CH_CMD_DSKWRGO ; CONTINUE DISK READ + CALL CH_CMD ; SEND IT + DJNZ CHUSB_WRITE1 ; LOOP TILL DONE +; + ; FINAL CHECK FOR COMPLETION & SUCCESS + CALL CH_POLL ; WAIT FOR COMPLETION + CP $14 ; SUCCESS? + JP NZ,CHUSB_IOERR ; IF NOT, HANDLE ERROR +; + ; INCREMENT LBA + PUSH HL ; SAVE HL + LD A,CHUSB_LBA ; LBA OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL INC32HL ; INCREMENT THE VALUE + POP HL ; RESTORE HL +; + XOR A ; SIGNAL SUCCESS + RET +; +; INITIATE A DISK SECTOR READ/WRITE OPERATION +; A: READ OR WRITE OPCODE +; +CHUSB_RWSTART: + CALL CH_CMD ; SEND R/W COMMAND +; + ; SEND LBA, 4 BYTES, LITTLE ENDIAN + LD A,CHUSB_LBA ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + LD B,4 ; SEND 4 BYTES +CHUSB_RWSTART1: + LD A,(HL) ; GET BYTE + INC HL ; BUMP PTR + CALL CH_WR ; SEND BYTE + DJNZ CHUSB_RWSTART1 ; LOOP AS NEEDED +; + ; REQUEST 1 SECTOR + LD A,1 ; 1 SECTOR + CALL CH_WR ; SEND IT + RET +; +; +; +CHUSB_STATUS: + ; RETURN UNIT STATUS + LD A,(IY+CHUSB_STAT) ; GET STATUS OF SELECTED DEVICE + OR A ; SET FLAGS + RET ; AND RETURN +; +; RESET THE INTERFACE AND REDISCOVER MEDIA +; +CHUSB_RESET: + ;PRTS("\n\rRESET:$") ; *DEBUG* + ;CALL CH_FLUSH ; DISCARD ANY GARBAGE + ;CALL CH_RESET ; FULL CH37X RESET +; + ; RESET THE BUS + LD A,CH_CMD_MODE ; SET MODE COMMAND + CALL CH_CMD ; SEND IT + LD A,7 ; RESET BUS + CALL CH_WR ; SEND IT + CALL CH_NAP ; SMALL WAIT + CALL CH_RD ; GET RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CALL CH_NAP ; SMALL WAIT +; + ; ACTIVATE USB MODE + LD A,CH_CMD_MODE ; SET MODE COMMAND + CALL CH_CMD ; SEND IT + LD A,6 ; USB ENABLED, SEND SOF + CALL CH_WR ; SEND IT + CALL CH_NAP ; SMALL WAIT + CALL CH_RD ; GET RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CALL CH_NAP ; SMALL WAIT +; + ; INITIALIZE DISK + LD B,24 ; TRY A FEW TIMES +CHUSB_RESET1: + LD A,CH_CMD_DSKINIT ; DISK INIT COMMAND + CALL CH_CMD ; SEND IT + LD DE,10000 ; 10000 * 16 = 160MS ??? + CALL VDELAY ; DELAY + CALL CH_POLL ; WAIT FOR RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $14 ; SUCCESS? + JR Z,CHUSB_RESET2 ; IF SO, MOVE ON + CP $16 ; NO MEDIA + JP Z,CHUSB_NOMEDIA ; HANDLE IT + CALL CH_NAP ; SMALL DELAY + DJNZ CHUSB_RESET1 ; LOOP AS NEEDED + JP CHUSB_TO ; HANDLE TIMEOUT +; +CHUSB_RESET2: + ; USE OF CH376 DISK_MOUNT COMMAND SEEMS TO IMPROVE + ; COMPATIBILITY WITH SOME OLDER USB THUMBDRIVES. + LD A,(IY+CH_TYPE) ; CH37X TYPE? + CP CHTYP_376 ; IS CH376? + CALL Z,CHUSB_DSKMNT ; IF SO, ISSUE MOUNT + ;CALL CHUSB_AUTOSET ; *DEBUG* +; + ; GET AND STORE DISK CAPACITY + ;JP CHUSB_RESET2D ; *DEBUG* + ;LD A,(IY+CH_TYPE) ; GET DEVICE TYPE + ;CP CHTYP_375 + ;JR CHUSB_RESET2A + ;CP CHTYP_376 + ;JR CHUSB_RESET2B + ;JP CHUSB_CMDERR +; +CHUSB_RESET2A: + ; CH375 DISK SIZE + LD A,CH_CMD_DSKSIZ ; DISK SIZE COMMAND + CALL CH_CMD ; SEND IT + CALL CH_POLL ; WAIT FOR RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $14 ; SUCCESS? + ;JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR + JR NZ,CHUSB_RESET2D ; FAKE THE CAPACITY + CALL CH_CMD_RD ; SEND READ USB DATA CMD + CALL CH_RD ; GET RD DATA LEN + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $08 ; MAKE SURE IT IS 8 + JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR + LD A,CHUSB_MEDCAP ; MEDIA CAPACITY OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + PUSH HL ; SAVE ADDRESS + CALL CH_RD + LD D,A + CALL CH_RD + LD E,A + CALL CH_RD + LD H,A + CALL CH_RD + LD L,A + CALL CH_RD + CALL CH_RD + CALL CH_RD + CALL CH_RD + POP BC ; RECOVER ADDRESS TO BC + CALL ST32 ; STORE IT + CALL CH_FLUSH ; DISCARD REMAINING CHARS + JR CHUSB_RESET3 ; CONTINUE +; +CHUSB_RESET2B: + ; CH376 DISK CAPACITY + LD A,CH_CMD_DSKCAP ; DISK CAPACITY COMMAND + CALL CH_CMD ; SEND IT + CALL CH_POLL ; WAIT FOR RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $14 ; SUCCESS? + ;JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR + JR NZ,CHUSB_RESET2D ; FAKE THE CAPACITY + CALL CH_CMD_RD ; SEND USB READ DATA + CALL CH_RD ; GET RD DATA LEN + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $04 ; MAKE SURE IT IS 8 + JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR + LD A,CHUSB_MEDCAP ; MEDIA CAPACITY OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL CH_RD + LD B,4 ; 4 BYTES +CHUSB_RESET2C: + LD (HL),A + INC HL + CALL CH_RD + DJNZ CHUSB_RESET2C + JR CHUSB_RESET3 ; CONTINUE +; +CHUSB_RESET2D: + ; OLDER USB STICKS SEEM TO FAIL (PRIMARILY ON CH375). + ; FAILURE TO GET A DISK CAPACITY SHOULD NOT PREVENT THE + ; USE OF THE DISK. SO, WE PUNT, AND JUST PLUG IN 1GB. + LD A,CHUSB_MEDCAP ; MEDIA CAPACITY OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + PUSH HL ; SAVE POINTER + LD DE,$0020 ; 1GB IS $20000 SECTORS + LD HL,$0000 + POP BC ; RECOVER POINTER + CALL ST32 ; SAVE FAKE CAPACITY + ; FALL THRU +; +CHUSB_RESET3: + ;CALL CHUSB_DSKRDY ; *DEBUG* + ;CALL CHUSB_DSKINQ ; *DEBUG* +; + ; SET STATUS AND RETURN + XOR A ; CLEAR STATUS + LD (IY+CHUSB_STAT),A ; RECORD STATUS + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +CHUSB_DEVICE: + LD D,DIODEV_CHUSB ; D := DEVICE TYPE + LD E,(IY+CH_DEV) ; E := PHYSICAL DEVICE NUMBER + LD C,%01110011 ; USB HARD DISK ATTRIBUTES + LD H,(IY+CH_TYPE) ; H := MODE + LD L,(IY+CH_IOBASE) ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +; CHUSB_GETMED +; +CHUSB_MEDIA: + LD A,E ; GET FLAGS + OR A ; SET FLAGS + JR Z,CHUSB_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA + CALL CHUSB_RESET ; RESET CHUSB INTERFACE +; +CHUSB_MEDIA1: + LD A,(IY+CHUSB_STAT) ; GET STATUS + OR A ; SET FLAGS + LD D,0 ; NO MEDIA CHANGE DETECTED + LD E,MID_HD ; ASSUME WE ARE OK + RET Z ; RETURN IF GOOD INIT + LD E,MID_NONE ; SIGNAL NO MEDIA + LD A,ERR_NOMEDIA ; NO MEDIA ERROR + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +CHUSB_SEEK: + BIT 7,D ; CHECK FOR LBA FLAG + CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA + RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) + LD (IY+CHUSB_LBA+0),L ; SAVE NEW LBA + LD (IY+CHUSB_LBA+1),H ; ... + LD (IY+CHUSB_LBA+2),E ; ... + LD (IY+CHUSB_LBA+3),D ; ... + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; +CHUSB_CAP: + LD A,(IY+CHUSB_STAT) ; GET STATUS + PUSH AF ; SAVE IT + LD A,CHUSB_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CURRENT CAPACITY INTO DE:HL + LD BC,512 ; 512 BYTES PER BLOCK + POP AF ; RECOVER STATUS + OR A ; SET FLAGS + RET +; +; +; +CHUSB_GEOM: + ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS + ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE + CALL CHUSB_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC + LD L,H ; DIVIDE BY 256 FOR # TRACKS + LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL + LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT + LD E,16 ; SECTORS / TRACK = 16 + RET ; DONE, A STILL HAS CHUSB_CAP STATUS +; +; CH37X HELPER ROUTINES +; +; +; PERFORM DISK INQUIRY +; BASICALLY THE SCSI INQUIRY COMMAND +; +CHUSB_DSKINQ: + ;PRTS("\n\rINQUIRY:$") ; *DEBUG* + LD A,CH_CMD_DSKINQ ; DISK QUERY + CALL CH_CMD ; DO IT + CALL CH_POLL ; WAIT FOR RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $14 ; SUCCESS? + RET NZ ; ABORT IF NOT + CALL CH_CMD_RD ; SEND READ COMMAND + CALL CH_RD ; GET LENGTH + LD B,A ; LOOP COUNTER + LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA +DSKINQ1: + CALL CH_RD ; GET A BYTE + LD (HL),A ; SAVE IT + INC HL ; BUMP BUF PTR + DJNZ DSKINQ1 ; LOOP FOR ALL DATA +; + ;LD DE,HB_WRKBUF ; *DEBUG* + ;CALL DUMP_BUFFER ; *DEBUG* +; + ;CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX + ;LD HL,HB_WRKBUF + 8 + ;LD B,28 +DSKINQ2: + ;LD A,(HL) + ;INC HL + ;CALL COUT + ;DJNZ DSKINQ2 +; + RET +; +; PERFORM DISK MOUNT +; +CHUSB_DSKMNT: + ;PRTS("\n\rMOUNT:$") ; *DEBUG* + LD A,CH_CMD_DSKMNT ; DISK QUERY + CALL CH_CMD ; DO IT + CALL CH_POLL ; WAIT FOR RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $14 ; SUCCESS? + RET NZ ; ABORT IF NOT + CALL CH_CMD_RD ; SEND READ COMMAND + CALL CH_RD ; GET LENGTH + LD B,A ; LOOP COUNTER + LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA +DSKMNT1: + CALL CH_RD ; GET A BYTE + LD (HL),A ; SAVE IT + INC HL ; BUMP BUF PTR + DJNZ DSKMNT1 ; LOOP FOR ALL DATA +; + ;LD DE,HB_WRKBUF ; *DEBUG* + ;CALL DUMP_BUFFER ; *DEBUG* +; + ;CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX + ;LD HL,HB_WRKBUF + 8 + ;LD B,28 +DSKMNT2: + ;LD A,(HL) + ;INC HL + ;CALL COUT + ;DJNZ DSKMNT2 +; + RET +; +; PERFORM DISK READY +; +CHUSB_DSKRDY: + ;PRTS("\n\rREADY:$") ; *DEBUG* + LD A,CH_CMD_DSKRDY ; DISK READY + CALL CH_CMD ; DO IT + CALL CH_POLL ; WAIT FOR RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* +; + RET +; +; PERFORM AUTO SETUP +; +CHUSB_AUTOSET: + ;PRTS("\n\rAUTOSET:$") ; *DEBUG* + LD A,CH_CMD_AUTOSET ; AUTOMATIC SETUP FOR USB + CALL CH_CMD ; DO IT + CALL CH_POLL ; WAIT FOR RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* +; + RET +; +; ERROR HANDLERS +; +; +CHUSB_NOMEDIA: + LD A,CHUSB_STNOMEDIA + JR CHUSB_ERR +; +CHUSB_CMDERR: + LD A,CHUSB_STCMDERR + JR CHUSB_ERR +; +CHUSB_IOERR: + LD A,CHUSB_STIOERR + JR CHUSB_ERR +; +CHUSB_TO: + LD A,CHUSB_STTO + JR CHUSB_ERR +; +CHUSB_NOTSUP: + LD A,CHUSB_STNOTSUP + JR CHUSB_ERR +; +CHUSB_ERR: + LD (IY+CHUSB_STAT),A ; SAVE NEW STATUS +; +CHUSB_ERR2: +#IF (CHUSBTRACE >= 2) + CALL CHUSB_PRTSTAT +#ENDIF + OR A ; SET FLAGS + RET +; +; +; +CHUSB_PRTERR: + RET Z ; DONE IF NO ERRORS + ; FALL THRU TO CHUSB_PRTSTAT +; +; PRINT FULL DEVICE STATUS LINE +; +CHUSB_PRTSTAT: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+CHUSB_STAT) + CALL CHUSB_PRTPREFIX ; PRINT UNIT PREFIX + CALL PC_SPACE ; FORMATTING + CALL CHUSB_PRTSTATSTR + POP HL + POP DE + POP AF + RET +; +; PRINT STATUS STRING +; +CHUSB_PRTSTATSTR: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+CHUSB_STAT) + NEG + LD HL,CHUSB_STR_ST_MAP + ADD A,A + CALL ADDHLA + LD E,(HL) + INC HL + LD D,(HL) + CALL WRITESTR + POP HL + POP DE + POP AF + RET +; +; PRINT DIAGNONSTIC PREFIX +; +CHUSB_PRTPREFIX: + PUSH AF + CALL NEWLINE + PRTS("CHUSB$") + LD A,(IY+CH_DEV) ; GET CURRENT DEVICE NUM + CALL PRTDECB + CALL PC_COLON + POP AF + RET +; +; DATA STORAGE +; +CHUSB_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT +CHUSB_DSKBUF .DW 0 +; +CHUSB_STR_ST_MAP: + .DW CHUSB_STR_STOK + .DW CHUSB_STR_STNOMEDIA + .DW CHUSB_STR_STCMDERR + .DW CHUSB_STR_STIOERR + .DW CHUSB_STR_STTO + .DW CHUSB_STR_STNOTSUP +; +CHUSB_STR_STOK .TEXT "OK$" +CHUSB_STR_STNOMEDIA .TEXT "NO MEDIA$" +CHUSB_STR_STCMDERR .TEXT "COMMAND ERROR$" +CHUSB_STR_STIOERR .TEXT "IO ERROR$" +CHUSB_STR_STTO .TEXT "TIMEOUT$" +CHUSB_STR_STNOTSUP .TEXT "NOT SUPPORTED$" +CHUSB_STR_STUNK .TEXT "UNKNOWN ERROR$" + +; +;================================================================================================== +; CH375/376 SD CARD SUB-DRIVER +;================================================================================================== +; +; CH DEVICE CONFIGURATION +; +CHSD_CFGSIZ .EQU 12 ; SIZE OF USB CFG TBL ENTRIES +; +; CONFIG ENTRY DATA OFFSETS +; +; FIRST 3 BYTES SAME AS CH CONFIG +CHSD_STAT .EQU 3 ; LAST STATUS (BYTE) +CHSD_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) +CHSD_LBA .EQU 8 ; CURRENT LBA (DWORD) +; +CHSD_CFGTBL: +; +#IF (CHCNT >= 1) +CHSD_CFG0: + .DB 0 ; DEV NUM, FILLED DYNAMICALLY + .DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY + .DB CH0BASE ; IO BASE ADDRESS + .DB 0 ; DEVICE STATUS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +#ENDIF +; +#IF (CHCNT >= 2) +CHSD_CFG1: + .DB 0 ; DEV NUM + .DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY + .DB CH1BASE ; IO BASE ADDRESS + .DB 0 ; DEVICE STATUS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +#ENDIF +; +#IF ($ - CHSD_CFGTBL) != (CHCNT * CHSD_CFGSIZ) + .ECHO "*** INVALID CHSD CONFIG TABLE ***\n" +#ENDIF +; + .DB $FF ; END OF TABLE MARKER +; +; +; +CHSD_INIT: + LD A,(IY+CH_TYPE) ; GET DEVICE TYPE + PUSH HL ; COPY INCOMING HL + POP IY ; ... TO IY + LD (IY+CH_TYPE),A ; SAVE DEVICE TYPE +; + ; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE + LD A,(CHSD_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN + LD (IY+CH_DEV),A ; UPDATE IT + INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN + LD (CHSD_DEVNUM),A ; SAVE IT +; + CALL NEWLINE ; FORMATTING + PRTS("CHSD$") ; LABEL FOR IO ADDRESS + LD A,(IY+CH_DEV) ; GET DEVICE NUM + CALL PRTDECB ; PRINT IT + CALL PC_COLON ; FORMATTING +; + RET + + +CHSD_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT + + + + + +; +;============================================================================= +; DATA STORAGE +;============================================================================= +; +CH_FWVER .DW 0,0 ; MMNNBBB (M=MAJOR, N=MINOR, B=BUILD) +; +CHSD_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS +; +CHSD_DSKBUF .DW 0 +; +CHSD_DSKSTAT .DB 0 +CHSD_ERRCODE .DW 0,0 +CHSD_CSDBUF .FILL 16,0 +; +CHSD_CMD .DB 0 +; +CHSD_TIMEOUT .DW $0000 ; FIX: MAKE THIS CPU SPEED RELATIVE diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 2e499272..5993664a 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -3351,6 +3351,9 @@ HB_INITTBL: #IF (PPPENABLE) .DW PPP_INIT #ENDIF +#IF (CHENABLE) + .DW CH_INIT +#ENDIF #IF (ESPENABLE) .DW ESP_INIT #ENDIF @@ -6525,6 +6528,15 @@ SIZ_PPP .EQU $ - ORG_PPP .ECHO " bytes.\n" #ENDIF ; +#IF (CHENABLE) +ORG_CH .EQU $ + #INCLUDE "ch.asm" +SIZ_CH .EQU $ - ORG_CH + .ECHO "CH occupies " + .ECHO SIZ_CH + .ECHO " bytes.\n" +#ENDIF +; #IF (ESPENABLE) ORG_ESP .EQU $ #INCLUDE "esp.asm" @@ -7398,6 +7410,8 @@ PS_DDHDSK .TEXT "HDSK$" PS_DDPPA .TEXT "PPA$" PS_DDIMM .TEXT "IMM$" PS_DDSYQ .TEXT "SYQ$" +PS_DDCHUSB .TEXT "CHUSB$" +PS_DDCHSD .TEXT "CHSD$" ; ; DISK TYPE STRINGS ; diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index f74d419a..831092c2 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -340,6 +340,8 @@ DIODEV_HDSK .EQU $90 DIODEV_PPA .EQU $A0 DIODEV_IMM .EQU $B0 DIODEV_SYQ .EQU $C0 +DIODEV_CHUSB .EQU $D0 +DIODEV_CHSD .EQU $E0 ; ; RTC DEVICE IDS ; diff --git a/Source/Makefile b/Source/Makefile index b0c4ca2a..85c5fca9 100644 --- a/Source/Makefile +++ b/Source/Makefile @@ -1,8 +1,37 @@ # # order is actually important, because of build dependencies # +BUILDPROP := 1 +UNAME := $(shell uname) +ifeq ($(UNAME), Linux) +# Inhibit building Propeller on unsupported +# Linux host architectures such as ARM eg. Raspberry Pi + BUILDPROP := 0 + ARCH := $(shell uname -m) + ifeq ($(ARCH), x86_64) + BUILDPROP := 1 + endif + ifeq ($(ARCH), i686) + BUILDPROP := 1 + endif + ifeq ($(ARCH), i386) + BUILDPROP := 1 + endif + ifeq ($(ARCH), x86) + BUILDPROP := 1 + endif +# Add here any more supported x86 based +# uname machine strings for building Propeller +endif + SUBDIRS = HDIAG + +ifeq ($(BUILDPROP), 1) SUBDIRS += Prop +else +$(info "Builing Propeller is not supported on this $(ARCH) host Linux OS") +endif + SUBDIRS += Apps SUBDIRS += CBIOS SUBDIRS += Forth diff --git a/Source/ver.inc b/Source/ver.inc index e4e55ddc..4c904f22 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 3 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.3.0-dev.55" +#DEFINE BIOSVER "3.3.0-dev.56" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index d2fd9a2c..c9b9643b 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 3 rup equ 0 rtp equ 0 biosver macro - db "3.3.0-dev.55" + db "3.3.0-dev.56" endm